diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..7dcc1d284 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,32 @@ +# http://editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{py,rst,ini}] +indent_style = space +indent_size = 4 + +[*.{html,css,scss,json,yml,yaml,xml,toml}] +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false +indent_style = space +indent_size = 2 + +[default.conf] +indent_style = space +indent_size = 2 + +["Makefile"] +indent_style = tab + +[*.{diff,patch}] +trim_trailing_whitespace = false diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml deleted file mode 100644 index 3f37c251e..000000000 --- a/.github/workflows/gh-pages.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: GitHub Pages - -on: - push: - branches: - - main # Set a branch to deploy - pull_request: - - -jobs: - deploy: - runs-on: ubuntu-22.04 - concurrency: - group: ${{ github.workflow }}-deploy-${{ github.ref }} - - steps: - - uses: actions/checkout@v3 - with: - - fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod - - - name: Setup Hugo - uses: peaceiris/actions-hugo@v2 - with: - hugo-version: 'latest' - extended: true - - - name: Build - run: | - hugo --minify - echo "opensciencelabs.org" > public/CNAME - - - name: Deploy - uses: peaceiris/actions-gh-pages@v3 - if: ${{ github.ref == 'refs/heads/main' }} - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./public diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml new file mode 100644 index 000000000..8bb26a7c1 --- /dev/null +++ b/.github/workflows/main.yaml @@ -0,0 +1,72 @@ +name: main + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + check-branch: + if: ${{ github.event_name == 'pull_request' }} + runs-on: ubuntu-latest + timeout-minutes: 10 + concurrency: + group: check-pr-${{ github.ref }} + cancel-in-progress: true + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Check if the PR's branch is updated + uses: osl-incubator/gh-check-pr-is-updated@1.0.0 + with: + remote_branch: origin/main + pr_sha: ${{ github.event.pull_request.head.sha }} + + build: + runs-on: ubuntu-latest + concurrency: + group: ci-${{ github.event_name }}-${{ github.ref }} + cancel-in-progress: true + defaults: + run: + shell: bash -l {0} + steps: + - uses: actions/checkout@v3 + + - uses: conda-incubator/setup-miniconda@v3 + with: + miniconda-version: "latest" + environment-file: conda/dev.yaml + channels: conda-forge,nodefaults + activate-environment: osl-web + auto-update-conda: true + conda-solver: libmamba + + - name: Install dependencies + run: | + poetry check + poetry install + python -m nltk.downloader punkt + + - name: Linter + if: ${{ github.event_name == 'pull_request' }} + run: | + pre-commit install + pre-commit run --all-file --verbose + + - name: Build the book + run: | + makim pages.build + echo "opensciencelabs.org" > build/CNAME + + # Push the book's HTML to github-pages + - name: GitHub Pages action + uses: peaceiris/actions-gh-pages@v3.5.9 + if: ${{ github.event_name == 'push' }} + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./build diff --git a/.gitignore b/.gitignore index e48f8a9c6..2ab793ba5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,130 @@ -themes/hugo-clarity/.vscode/ -themes/hugo-clarity/.github/ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class -public \ No newline at end of file +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ +.vscode diff --git a/.hugo_build.lock b/.hugo_build.lock deleted file mode 100644 index e69de29bb..000000000 diff --git a/.makim.yaml b/.makim.yaml index 3d1945102..22f061119 100644 --- a/.makim.yaml +++ b/.makim.yaml @@ -1,10 +1,47 @@ -version: 1.0 groups: pages: - targets: + tasks: + pre-build: + help: pre-build step + backend: bash + run: | + mkdir -p build + # Directory to search for .ipynb files + export SEARCH_DIR="pages/blog" + + # Find all .ipynb files, excluding .ipynb_checkpoints, + # and convert them to Markdown named 'index.md' + find "$SEARCH_DIR" -path "*/.ipynb_checkpoints/*" -prune -o -name \ + "*.ipynb" -exec sh -c \ + 'jupyter nbconvert --to markdown --template=theme/custom-markdown.tpl --output-dir "$(dirname "$0")" --output "index" "$0"' {} \; + + # remove console colors from md files + find "$SEARCH_DIR" -name \ + "index.md" -exec sh -c \ + 'cat "$(dirname "$0")/index.md" | python scripts/clean-output.py > "$(dirname "$0")/temp_index.md" && mv "$(dirname "$0")/temp_index.md" "$(dirname "$0")/index.md"' {} \; + build: - help: build the static page with hugo - run: hugo --minify + help: build the static page + backend: bash + hooks: + pre-run: + - task: pages.pre-build + run: | + find build -mindepth 1 -maxdepth 1 -exec rm -rf {} + + mkdocs build --verbose --clean --strict + mkdir -p build/.well-known + cp pages/.well-known/funding-manifest-urls \ + build/.well-known/funding-manifest-urls + preview: help: preview the web page dynamically - run: hugo server + args: + run-pre-build: + help: Run pre-build task + type: bool + action: store_true + hooks: + pre-run: + - task: pages.pre-build + if: ${{ args.run_pre_build }} + run: mkdocs serve --watch pages --watch theme diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 000000000..2f1d117b6 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,62 @@ +default_stages: + - pre-commit +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: trailing-whitespace + exclude: "pages/blog" + - id: end-of-file-fixer + exclude: "pages/blog" + - id: check-json + - id: check-toml + - id: check-xml + exclude: ".*.svg" + - id: check-builtin-literals + - id: check-case-conflict + - id: check-docstring-first + - id: detect-private-key + exclude: "theme" + + - repo: https://github.com/pre-commit/mirrors-prettier + rev: "v3.0.2" + hooks: + - id: prettier + exclude: "pages/blog|theme" + + - repo: local + hooks: + - id: mkdocs-build + name: mkdocs-build + entry: makim pages.build + files: pages + language: system + pass_filenames: false + + - id: linkcheckmd + name: linkcheckmd + entry: python scripts/check-broken-links-md.py + language: system + pass_filenames: false + + - id: check-internal-links + name: check-internal-links + entry: python scripts/check-broken-links-internal.py + language: system + pass_filenames: false + + - id: ruff-format + name: ruff-format + entry: ruff format + language: system + pass_filenames: true + types: + - python + + - id: ruff-linter + name: ruff-linter + entry: ruff check + language: system + pass_filenames: true + types: + - python diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..1cc39a664 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +docs/changelog.md diff --git a/.prettierrc.yaml b/.prettierrc.yaml new file mode 100644 index 000000000..24d3b9f50 --- /dev/null +++ b/.prettierrc.yaml @@ -0,0 +1,6 @@ +overrides: + - files: "*.md" + options: + parser: remark + proseWrap: always + printWidth: 80 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..88ed9a1d8 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +- Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or advances of + any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email address, + without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +team@opensciencelabs.org. All complaints will be reviewed and investigated +promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..a0dbe1abf --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,95 @@ +# Contributing Guide for Open Science Labs Blog + +## Getting Started + +To contribute to the Open Science Labs blog, you should first fork the +repository and clone it locally. Follow these steps to set up your local +development environment: + +```bash +# Clone your fork of the repository +$ git clone https://github.com/MY-USER-NAME/opensciencelabs.github.io +$ cd opensciencelabs.github.io + +# Add the original project as an upstream remote +$ git remote add upstream https://github.com/opensciencelabs/opensciencelabs.github.io +$ git fetch --all +``` + +_Note: Replace `MY-USER-NAME` with your GitHub username._ + +## Setting Up the Environment + +Set up the Conda environment to manage the dependencies for the blog: + +```bash +# Create and activate the Conda environment +$ mamba env create --file conda/dev.yaml +$ conda activate osl-web +``` + +This will create a new Conda environment named `osl-web` with all necessary +dependencies and activate it. + +## Developing Blog Posts + +### Development Commands + +- **Previewing Changes:** Use `makim pages.preview` to run a local server for + previewing the blog and other pages. +- **Building the Site:** Before pushing changes to GitHub, build the site using + `makim pages.build` to ensure everything is compiled correctly. + +### Creating a New Blog Post + +1. **Prepare the Blog Post:** + + - Navigate to `pages/blog` and create a new folder with a slugified version + of your blog post's title. Use + [https://slugify.online/](https://slugify.online/) to generate a slug. + - Inside this folder, create your blog post file: + - For Markdown: `index.md` + - For Jupyter Notebooks: `index.ipynb` (use Jupyter Lab to create this + directly) + +2. **Include a Header Image:** + - Place a header image (either `header.png` or `header.jpg`) in your blog + post folder. Make sure the image is under a free license. + +### Metadata and Formatting + +- **Markdown Posts:** Add a metadata block at the beginning of your `index.md` + file: + + ```markdown + --- + title: "Title of Your Blog Post" + slug: "slug-of-your-blog-post" + date: YYYY-MM-DD + authors: ["Author Name"] + tags: ["tag1", "tag2"] + categories: ["category1", "category2"] + description: "Short description of the blog post." + thumbnail: "/header.jpg" + template: "blog-post.html" + --- + ``` + +- **Jupyter Notebook Posts:** The first cell of your `index.ipynb` should be in + `raw` mode containing the same metadata as above. + +3. **Building and Viewing:** + - If using a Jupyter Notebook, run `makim pages.build` to convert the + notebook into a Markdown file (`index.md`). + - Add the generated `index.md` to your repository as it will be used to + render the webpage. + +## Final Steps + +Before submitting your blog post: + +- Ensure all files are added to your repository. +- Submit a pull request to the main `opensciencelabs.github.io` repository for + review. + +Thank you for contributing to the Open Science Labs blog! diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..0fec4c821 --- /dev/null +++ b/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2022, Open Science Labs +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. 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. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +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 HOLDER 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. diff --git a/README.md b/README.md index 38e7499f5..fd998402a 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,31 @@ -# osl-hugo.github.io +# opensciencelabs.github.io -A blog page for OpenScienceLabs with Hugo site generator. +A blog page for OpenScienceLabs with mkdocs site generator. ## To deploy locally -Install Hugo via [Homebrew](https://brew.sh/) or you can install it via another options [Install Hugo](https://gohugo.io/getting-started/installing/) +Clone the repository ```bash -brew install hugo +git clone git@github.com:opensciencelabs/opensciencelabs.github.io +cd opensciencelabs.github.io ``` -Clone the repository - ```bash -git clone git@github.com:osl-incubator/osl-hugo.github.io.git +mamba env create -f conda/dev.yaml --yes +conda activate osl-web +poetry install ``` -Run locally - ```bash -cd osl-hugo.github.io -hugo server +makim pages.preview ``` -## To check how it works see the template +## Linter + +Ensure you have installed the pre-commit config locally: -[Hugo Clarity](https://github.com/chipzoller/hugo-clarity) \ No newline at end of file +```bash +# with your conda env active, run: +$ pre-commit install +``` diff --git a/archetypes/default.md b/archetypes/default.md deleted file mode 100644 index 5f7a19ab9..000000000 --- a/archetypes/default.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: "{{ replace .Name "-" " " | title }}" # Title of the blog post. -date: {{ .Date }} # Date of post creation. -description: "Article description." # Description used for search engine. -featured: true # Sets if post is a featured post, making it appear on the sidebar. A featured post won't be listed on the sidebar if it's the current page -draft: true # Sets whether to render this page. Draft of true will not be rendered. -toc: false # Controls if a table of contents should be generated for first-level links automatically. -# menu: main -usePageBundles: false # Set to true to group assets like images in the same folder as this post. -featureImage: "/images/path/file.jpg" # Sets featured image on blog post. -featureImageAlt: 'Description of image' # Alternative text for featured image. -featureImageCap: 'This is the featured image.' # Caption (optional). -thumbnail: "/images/path/thumbnail.png" # Sets thumbnail image appearing inside card on homepage. -shareImage: "/images/path/share.png" # Designate a separate image for social media sharing. -codeMaxLines: 10 # Override global value for how many lines within a code block before auto-collapsing. -codeLineNumbers: false # Override global value for showing of line numbers within code block. -figurePositionShow: true # Override global value for showing the figure label. -showRelatedInArticle: false # Override global value for showing related posts in this series at the end of the content. -categories: - - Technology -tags: - - Tag_name1 - - Tag_name2 ---- - -**Insert Lead paragraph here.** \ No newline at end of file diff --git a/assets/js/code.js b/assets/js/code.js deleted file mode 100644 index bdaff516b..000000000 --- a/assets/js/code.js +++ /dev/null @@ -1,277 +0,0 @@ -const codeActionButtons = [ - { - icon: 'copy', - id: 'copy', - title: 'Copy Code', - show: true - }, - { - icon: 'order', - id: 'lines', - title: 'Toggle Line Numbers', - show: true - }, - { - icon: 'carly', - id: 'wrap', - title: 'Toggle Line Wrap', - show: false - }, - { - icon: 'expand', - id: 'expand', - title: 'Toggle code block expand', - show: false - } -]; - -const body = elem('body'); -const maxLines = parseInt(body.dataset.code); -const copyId = 'panel_copy'; -const wrapId = 'panel_wrap'; -const linesId = 'panel_lines'; -const panelExpand = 'panel_expand'; -const panelExpanded = 'panel_expanded'; -const panelHide = 'panel_hide'; -const panelFrom = 'panel_from'; -const panelBox = 'panel_box'; -const fullHeight = 'initial'; -const highlightWrap = 'highlight_wrap' - -function wrapOrphanedPreElements() { - const pres = elems('pre'); - Array.from(pres).forEach(function(pre){ - const parent = pre.parentNode; - const isOrpaned = !containsClass(parent, 'highlight'); - if(isOrpaned) { - const preWrapper = createEl(); - preWrapper.className = 'highlight'; - const outerWrapper = createEl(); - outerWrapper.className = highlightWrap; - wrapEl(pre, preWrapper); - wrapEl(preWrapper, outerWrapper); - } - }) - /* - @Todo - 1. Add UI control to orphaned blocks - */ -} - -wrapOrphanedPreElements(); - -function codeBlocks() { - const markedCodeBlocks = elems('code'); - const blocks = Array.from(markedCodeBlocks).filter(function(block){ - return hasClasses(block) && !Array.from(block.classList).includes('noClass'); - }).map(function(block){ - return block - }); - return blocks; -} - -function codeBlockFits(block) { - // return false if codeblock overflows - const blockWidth = block.offsetWidth; - const highlightBlockWidth = block.parentNode.parentNode.offsetWidth; - return blockWidth <= highlightBlockWidth ? true : false; -} - -function maxHeightIsSet(elem) { - let maxHeight = elem.style.maxHeight; - return maxHeight.includes('px') -} - -function restrainCodeBlockHeight(lines) { - const lastLine = lines[maxLines-1]; - let maxCodeBlockHeight = fullHeight; - if(lastLine) { - const lastLinePos = lastLine.offsetTop; - if(lastLinePos !== 0) { - maxCodeBlockHeight = `${lastLinePos}px`; - const codeBlock = lines[0].parentNode; - const outerBlock = codeBlock.closest('.highlight'); - const isExpanded = containsClass(outerBlock, panelExpanded); - if(!isExpanded) { - codeBlock.dataset.height = maxCodeBlockHeight; - codeBlock.style.maxHeight = maxCodeBlockHeight; - } - } - } -} - -const blocks = codeBlocks(); - -function collapseCodeBlock(block) { - const lines = elems(lineClass, block); - const codeLines = lines.length; - if (codeLines > maxLines) { - const expandDot = createEl() - pushClass(expandDot, panelExpand); - pushClass(expandDot, panelFrom); - expandDot.title = "Toggle code block expand"; - expandDot.textContent = "..."; - const outerBlock = block.closest('.highlight'); - window.setTimeout(function(){ - const expandIcon = outerBlock.nextElementSibling.lastElementChild; - deleteClass(expandIcon, panelHide); - }, 150) - - restrainCodeBlockHeight(lines); - const highlightElement = block.parentNode.parentNode; - highlightElement.appendChild(expandDot); - } -} - -blocks.forEach(function(block){ - collapseCodeBlock(block); -}) - -function actionPanel() { - const panel = createEl(); - panel.className = panelBox; - - codeActionButtons.forEach(function(button) { - // create button - const btn = createEl('a'); - btn.href = '#'; - btn.title = button.title; - btn.className = `icon panel_icon panel_${button.id}`; - button.show ? false : pushClass(btn, panelHide); - // load icon inside button - btn.style.backgroundImage = `url(${baseURL}${iconsPath}${button.icon}.svg)`; - // append button on panel - panel.appendChild(btn); - }); - - return panel; -} - -function toggleLineNumbers(elems) { - elems.forEach(function (elem, index) { - // mark the code element when there are no lines - modifyClass(elem, 'pre_nolines') - }); - restrainCodeBlockHeight(elems); -} - -function toggleLineWrap(elem) { - modifyClass(elem, 'pre_wrap'); - // retain max number of code lines on line wrap - const lines = elems(lineClass, elem); - restrainCodeBlockHeight(lines); -} - -function copyCode(codeElement) { - lineNumbers = elems('.ln', codeElement); - // remove line numbers before copying - if(lineNumbers.length) { - lineNumbers.forEach(function(line){ - line.remove(); - }); - } - - const codeToCopy = codeElement.textContent; - // copy code - copyToClipboard(codeToCopy); -} - -function disableCodeLineNumbers(block){ - const lines = elems(lineClass, block) - toggleLineNumbers(lines); -} - -(function codeActions(){ - const blocks = codeBlocks(); - - const highlightWrapId = highlightWrap; - blocks.forEach(function(block){ - // disable line numbers if disabled globally - const showLines = elem('body').dataset.lines; - parseBoolean(showLines) === false ? disableCodeLineNumbers(block) : false; - - const highlightElement = block.parentNode.parentNode; - // wrap code block in a div - const highlightWrapper = createEl(); - highlightWrapper.className = highlightWrapId; - wrapEl(highlightElement, highlightWrapper); - - const panel = actionPanel(); - // show wrap icon only if the code block needs wrapping - const wrapIcon = elem(`.${wrapId}`, panel); - codeBlockFits(block) ? false : deleteClass(wrapIcon, panelHide); - - // append buttons - highlightWrapper.appendChild(panel); - }); - - function isItem(target, id) { - // if is item or within item - return target.matches(`.${id}`) || target.closest(`.${id}`); - } - - function showActive(target, targetClass,activeClass = 'active') { - const active = activeClass; - const targetElement = target.matches(`.${targetClass}`) ? target : target.closest(`.${targetClass}`); - - deleteClass(targetElement, active); - setTimeout(function() { - modifyClass(targetElement, active) - }, 50) - } - - doc.addEventListener('click', function(event){ - // copy code block - const target = event.target; - const isCopyIcon = isItem(target, copyId); - const isWrapIcon = isItem(target, wrapId); - const isLinesIcon = isItem(target, linesId); - const isExpandIcon = isItem(target, panelExpand); - const isActionable = isCopyIcon || isWrapIcon || isLinesIcon || isExpandIcon; - - if(isActionable) { - event.preventDefault(); - showActive(target, 'icon'); - const codeElement = target.closest(`.${highlightWrapId}`).firstElementChild.firstElementChild; - let lineNumbers = elems(lineClass, codeElement); - - isWrapIcon ? toggleLineWrap(codeElement) : false; - - isLinesIcon ? toggleLineNumbers(lineNumbers) : false; - - if (isExpandIcon) { - let thisCodeBlock = codeElement.firstElementChild; - const outerBlock = thisCodeBlock.closest('.highlight'); - if(maxHeightIsSet(thisCodeBlock)) { - thisCodeBlock.style.maxHeight = fullHeight; - // mark code block as expanded - pushClass(outerBlock, panelExpanded) - } else { - thisCodeBlock.style.maxHeight = thisCodeBlock.dataset.height; - // unmark code block as expanded - deleteClass(outerBlock, panelExpanded) - } - } - - if(isCopyIcon) { - // clone code element - const codeElementClone = codeElement.cloneNode(true); - copyCode(codeElementClone); - } - } - }); - - (function addLangLabel() { - const blocks = codeBlocks(); - blocks.forEach(function(block){ - let label = block.dataset.lang; - label = label === 'sh' ? 'bash' : label; - if(label !== "fallback") { - const labelEl = createEl(); - labelEl.textContent = label; - pushClass(labelEl, 'lang'); - block.closest(`.${highlightWrap}`).appendChild(labelEl); - } - }); - })(); -})(); diff --git a/assets/js/custom.js b/assets/js/custom.js deleted file mode 100644 index 11b1d8225..000000000 --- a/assets/js/custom.js +++ /dev/null @@ -1 +0,0 @@ -// add custom js in this file \ No newline at end of file diff --git a/assets/js/functions.js b/assets/js/functions.js deleted file mode 100644 index 59b9e7946..000000000 --- a/assets/js/functions.js +++ /dev/null @@ -1,284 +0,0 @@ -// global variables -const doc = document.documentElement; -const inline = ":inline"; -// variables read from your hugo configuration -let showImagePosition = "{{ .Site.Params.figurePositionShow }}"; - -const showImagePositionLabel = '{{ .Site.Params.figurePositionLabel }}'; - -function isObj(obj) { - return (obj && typeof obj === 'object' && obj !== null) ? true : false; -} - -function createEl(element = 'div') { - return document.createElement(element); -} - -function elem(selector, parent = document){ - let elem = parent.querySelector(selector); - return elem != false ? elem : false; -} - -function elems(selector, parent = document) { - let elems = parent.querySelectorAll(selector); - return elems.length ? elems : false; -} - -function pushClass(el, targetClass) { - if (isObj(el) && targetClass) { - elClass = el.classList; - elClass.contains(targetClass) ? false : elClass.add(targetClass); - } -} - -function hasClasses(el) { - if(isObj(el)) { - const classes = el.classList; - return classes.length - } -} - -(function markInlineCodeTags(){ - const codeBlocks = elems('code'); - if(codeBlocks) { - codeBlocks.forEach(function(codeBlock){ - // Fix for orgmode inline code, leave 'verbatim' alone as well - containsClass(codeBlock, 'verbatim') ? pushClass(codeBlock, 'noClass') :false; - hasClasses(codeBlock) ? false: pushClass(codeBlock, 'noClass'); - }); - } -})(); - -function deleteClass(el, targetClass) { - if (isObj(el) && targetClass) { - elClass = el.classList; - elClass.contains(targetClass) ? elClass.remove(targetClass) : false; - } -} - -function modifyClass(el, targetClass) { - if (isObj(el) && targetClass) { - elClass = el.classList; - elClass.contains(targetClass) ? elClass.remove(targetClass) : elClass.add(targetClass); - } -} - -function containsClass(el, targetClass) { - if (isObj(el) && targetClass && el !== document ) { - return el.classList.contains(targetClass) ? true : false; - } -} - -function elemAttribute(elem, attr, value = null) { - if (value) { - elem.setAttribute(attr, value); - } else { - value = elem.getAttribute(attr); - return value ? value : false; - } -} - -function wrapEl(el, wrapper) { - el.parentNode.insertBefore(wrapper, el); - wrapper.appendChild(el); -} - -function deleteChars(str, subs) { - let newStr = str; - if (Array.isArray(subs)) { - for (let i = 0; i < subs.length; i++) { - newStr = newStr.replace(subs[i], ''); - } - } else { - newStr = newStr.replace(subs, ''); - } - return newStr; -} - -function isBlank(str) { - return (!str || str.trim().length === 0); -} - -function isMatch(element, selectors) { - if(isObj(element)) { - if(selectors.isArray) { - let matching = selectors.map(function(selector){ - return element.matches(selector) - }) - return matching.includes(true); - } - return element.matches(selectors) - } -} - -function copyToClipboard(str) { - let copy, selection, selected; - copy = createEl('textarea'); - copy.value = str; - copy.setAttribute('readonly', ''); - copy.style.position = 'absolute'; - copy.style.left = '-9999px'; - selection = document.getSelection(); - doc.appendChild(copy); - // check if there is any selected content - selected = selection.rangeCount > 0 ? selection.getRangeAt(0) : false; - copy.select(); - document.execCommand('copy'); - doc.removeChild(copy); - if (selected) { // if a selection existed before copying - selection.removeAllRanges(); // unselect existing selection - selection.addRange(selected); // restore the original selection - } -} - -const iconsPath = '{{ default "icons/" .Site.Params.iconsDir }}'; - -function getMobileOperatingSystem() { - let userAgent = navigator.userAgent || navigator.vendor || window.opera; - - if (/android/i.test(userAgent)) { - return "Android"; - } - - if (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) { - return "iOS"; - } - - return "unknown"; -} - -function horizontalSwipe(element, func, direction) { - // call func if result of swipeDirection() 👇🏻 is equal to direction - let touchstartX = 0; - let touchendX = 0; - let swipeDirection = null; - - function handleGesure() { - return (touchendX + 50 < touchstartX) ? 'left' : (touchendX < touchstartX + 50) ? 'right' : false; - } - - element.addEventListener('touchstart', e => { - touchstartX = e.changedTouches[0].screenX - }); - - element.addEventListener('touchend', e => { - touchendX = e.changedTouches[0].screenX - swipeDirection = handleGesure() - swipeDirection === direction ? func() : false; - }); - -} - -function parseBoolean(string) { - let bool; - string = string.trim().toLowerCase(); - switch (string) { - case 'true': - return true; - case 'false': - return false; - default: - return undefined; - } -}; - -function forEach(node, callback) { - node ? Array.prototype.forEach.call(node.childNodes, callback) : false; -} - -function findQuery(query = 'query') { - const urlParams = new URLSearchParams(window.location.search); - if(urlParams.has(query)){ - let c = urlParams.get(query); - return c; - } - return ""; -} - -function wrapText(text, context, wrapper = 'mark') { - let open = `<${wrapper}>`; - let close = ``; - let escapedOpen = `%3C${wrapper}%3E`; - let escapedClose = `%3C/${wrapper}%3E`; - function wrap(context) { - let c = context.innerHTML; - let pattern = new RegExp(text, "gi"); - let matches = text.length ? c.match(pattern) : null; - - if(matches) { - matches.forEach(function(matchStr){ - c = c.replaceAll(matchStr, `${open}${matchStr}${close}`); - context.innerHTML = c; - }); - - const images = elems('img', context); - - if(images) { - images.forEach(image => { - image.src = image.src.replaceAll(open, '').replaceAll(close, '').replaceAll(escapedOpen, '').replaceAll(escapedClose, ''); - }); - } - } - } - - const contents = ["h1", "h2", "h3", "h4", "h5", "h6", "p", "code", "td"]; - - contents.forEach(function(c){ - const cs = elems(c, context); - if(cs.length) { - cs.forEach(function(cx, index){ - if(cx.children.length >= 1) { - Array.from(cx.children).forEach(function(child){ - wrap(child); - }) - wrap(cx); - } else { - wrap(cx); - } - // sanitize urls and ids - }); - } - }); - - const hyperLinks = elems('a'); - if(hyperLinks) { - hyperLinks.forEach(function(link){ - link.href = link.href.replaceAll(encodeURI(open), "").replaceAll(encodeURI(close), ""); - }); - } -} - -function emptyEl(el) { - while(el.firstChild) - el.removeChild(el.firstChild); -} - -function matchTarget(element, selector) { - if(isObj(element)) { - let matches = false; - const isExactMatch = element.matches(selector); - const exactTarget = element.closest(selector); - matches = isExactMatch ? isExactMatch : exactTarget; - return { - exact: isExactMatch, // is exact target - valid: matches, - actual: exactTarget - }; - } -} - -function goBack(target) { - const matchCriteria = matchTarget(target, `.${goBackClass}`); - - if(matchCriteria.valid) { - history.back(); - } -} - -(function() { - const bodyElement = elem('body'); - const platform = navigator.platform.toLowerCase(); - if(platform.includes("win")) { - pushClass(bodyElement, 'windows'); - } -})(); diff --git a/assets/js/fuse.js b/assets/js/fuse.js deleted file mode 100644 index df9910e73..000000000 --- a/assets/js/fuse.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Fuse.js v6.5.3 - Lightweight fuzzy-search (http://fusejs.io) - * - * Copyright (c) 2021 Kiro Risk (http://kiro.me) - * All Rights Reserved. Apache Software License 2.0 - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - var e,t;e=this,t=function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,n=new Map,r=Math.pow(10,t);return{get:function(t){var i=t.match(C).length;if(n.has(i))return n.get(i);var o=1/Math.pow(i,.5*e),c=parseFloat(Math.round(o*r)/r);return n.set(i,c),c},clear:function(){n.clear()}}}var $=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.getFn,i=void 0===n?I.getFn:n,o=t.fieldNormWeight,c=void 0===o?I.fieldNormWeight:o;r(this,e),this.norm=E(c,3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return o(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,g(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();g(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?I.getFn:r,o=n.fieldNormWeight,c=void 0===o?I.fieldNormWeight:o,a=new $({getFn:i,fieldNormWeight:c});return a.setKeys(e.map(_)),a.setSources(t),a.create(),a}function F(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,c=t.expectedLocation,a=void 0===c?0:c,s=t.distance,u=void 0===s?I.distance:s,h=t.ignoreLocation,f=void 0===h?I.ignoreLocation:h,l=r/e.length;if(f)return l;var d=Math.abs(a-o);return u?l+d/u:d?1:l}function N(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:I.minMatchCharLength,n=[],r=-1,i=-1,o=0,c=e.length;o=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}var P=32;function W(e){for(var t={},n=0,r=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,c=void 0===o?I.location:o,a=i.threshold,s=void 0===a?I.threshold:a,u=i.distance,h=void 0===u?I.distance:u,f=i.includeMatches,l=void 0===f?I.includeMatches:f,d=i.findAllMatches,v=void 0===d?I.findAllMatches:d,g=i.minMatchCharLength,y=void 0===g?I.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?I.isCaseSensitive:p,k=i.ignoreLocation,M=void 0===k?I.ignoreLocation:k;if(r(this,e),this.options={location:c,threshold:s,distance:h,includeMatches:l,findAllMatches:v,minMatchCharLength:y,isCaseSensitive:m,ignoreLocation:M},this.pattern=m?t:t.toLowerCase(),this.chunks=[],this.pattern.length){var b=function(e,t){n.chunks.push({pattern:e,alphabet:W(e),startIndex:t})},x=this.pattern.length;if(x>P){for(var w=0,L=x%P,S=x-L;w3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?I.location:i,c=r.distance,a=void 0===c?I.distance:c,s=r.threshold,u=void 0===s?I.threshold:s,h=r.findAllMatches,f=void 0===h?I.findAllMatches:h,l=r.minMatchCharLength,d=void 0===l?I.minMatchCharLength:l,v=r.includeMatches,g=void 0===v?I.includeMatches:v,y=r.ignoreLocation,p=void 0===y?I.ignoreLocation:y;if(t.length>P)throw new Error(w(P));for(var m,k=t.length,M=e.length,b=Math.max(0,Math.min(o,M)),x=u,L=b,S=d>1||g,_=S?Array(M):[];(m=e.indexOf(t,L))>-1;){var O=F(t,{currentLocation:m,expectedLocation:b,distance:a,ignoreLocation:p});if(x=Math.min(O,x),L=m+k,S)for(var j=0;j=z;q-=1){var B=q-1,J=n[e.charAt(B)];if(S&&(_[B]=+!!J),K[q]=(K[q+1]<<1|1)&J,R&&(K[q]|=(A[q+1]|A[q])<<1|1|A[q+1]),K[q]&$&&(C=F(t,{errors:R,currentLocation:B,expectedLocation:b,distance:a,ignoreLocation:p}))<=x){if(x=C,(L=B)<=b)break;z=Math.max(1,2*b-L)}}if(F(t,{errors:R+1,currentLocation:b,expectedLocation:b,distance:a,ignoreLocation:p})>x)break;A=K}var U={isMatch:L>=0,score:Math.max(.001,C)};if(S){var V=N(_,d);V.length?g&&(U.indices=V):U.isMatch=!1}return U}(e,n,i,{location:c+o,distance:a,threshold:s,findAllMatches:u,minMatchCharLength:h,includeMatches:r,ignoreLocation:f}),p=y.isMatch,m=y.score,k=y.indices;p&&(g=!0),v+=m,p&&k&&(d=[].concat(l(d),l(k)))}));var y={isMatch:g,score:g?v/this.chunks.length:1};return g&&r&&(y.indices=d),y}}]),e}(),z=function(){function e(t){r(this,e),this.pattern=t}return o(e,[{key:"search",value:function(){}}],[{key:"isMultiMatch",value:function(e){return D(e,this.multiRegex)}},{key:"isSingleMatch",value:function(e){return D(e,this.singleRegex)}}]),e}();function D(e,t){var n=e.match(t);return n?n[1]:null}var K=function(e){a(n,e);var t=f(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=e===this.pattern;return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}}],[{key:"type",get:function(){return"exact"}},{key:"multiRegex",get:function(){return/^="(.*)"$/}},{key:"singleRegex",get:function(){return/^=(.*)$/}}]),n}(z),q=function(e){a(n,e);var t=f(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=-1===e.indexOf(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-exact"}},{key:"multiRegex",get:function(){return/^!"(.*)"$/}},{key:"singleRegex",get:function(){return/^!(.*)$/}}]),n}(z),B=function(e){a(n,e);var t=f(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}}],[{key:"type",get:function(){return"prefix-exact"}},{key:"multiRegex",get:function(){return/^\^"(.*)"$/}},{key:"singleRegex",get:function(){return/^\^(.*)$/}}]),n}(z),J=function(e){a(n,e);var t=f(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=!e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-prefix-exact"}},{key:"multiRegex",get:function(){return/^!\^"(.*)"$/}},{key:"singleRegex",get:function(){return/^!\^(.*)$/}}]),n}(z),U=function(e){a(n,e);var t=f(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[e.length-this.pattern.length,e.length-1]}}}],[{key:"type",get:function(){return"suffix-exact"}},{key:"multiRegex",get:function(){return/^"(.*)"\$$/}},{key:"singleRegex",get:function(){return/^(.*)\$$/}}]),n}(z),V=function(e){a(n,e);var t=f(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=!e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-suffix-exact"}},{key:"multiRegex",get:function(){return/^!"(.*)"\$$/}},{key:"singleRegex",get:function(){return/^!(.*)\$$/}}]),n}(z),G=function(e){a(n,e);var t=f(n);function n(e){var i,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},c=o.location,a=void 0===c?I.location:c,s=o.threshold,u=void 0===s?I.threshold:s,h=o.distance,f=void 0===h?I.distance:h,l=o.includeMatches,d=void 0===l?I.includeMatches:l,v=o.findAllMatches,g=void 0===v?I.findAllMatches:v,y=o.minMatchCharLength,p=void 0===y?I.minMatchCharLength:y,m=o.isCaseSensitive,k=void 0===m?I.isCaseSensitive:m,M=o.ignoreLocation,b=void 0===M?I.ignoreLocation:M;return r(this,n),(i=t.call(this,e))._bitapSearch=new T(e,{location:a,threshold:u,distance:f,includeMatches:d,findAllMatches:g,minMatchCharLength:p,isCaseSensitive:k,ignoreLocation:b}),i}return o(n,[{key:"search",value:function(e){return this._bitapSearch.searchIn(e)}}],[{key:"type",get:function(){return"fuzzy"}},{key:"multiRegex",get:function(){return/^"(.*)"$/}},{key:"singleRegex",get:function(){return/^(.*)$/}}]),n}(z),H=function(e){a(n,e);var t=f(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){for(var t,n=0,r=[],i=this.pattern.length;(t=e.indexOf(this.pattern,n))>-1;)n=t+i,r.push([t,n-1]);var o=!!r.length;return{isMatch:o,score:o?0:1,indices:r}}}],[{key:"type",get:function(){return"include"}},{key:"multiRegex",get:function(){return/^'"(.*)"$/}},{key:"singleRegex",get:function(){return/^'(.*)$/}}]),n}(z),Q=[K,H,B,J,V,U,q,G],X=Q.length,Y=/ +(?=([^\"]*\"[^\"]*\")*[^\"]*$)/;function Z(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.split("|").map((function(e){for(var n=e.trim().split(Y).filter((function(e){return e&&!!e.trim()})),r=[],i=0,o=n.length;i1&&void 0!==arguments[1]?arguments[1]:{},i=n.isCaseSensitive,o=void 0===i?I.isCaseSensitive:i,c=n.includeMatches,a=void 0===c?I.includeMatches:c,s=n.minMatchCharLength,u=void 0===s?I.minMatchCharLength:s,h=n.ignoreLocation,f=void 0===h?I.ignoreLocation:h,l=n.findAllMatches,d=void 0===l?I.findAllMatches:l,v=n.location,g=void 0===v?I.location:v,y=n.threshold,p=void 0===y?I.threshold:y,m=n.distance,k=void 0===m?I.distance:m;r(this,e),this.query=null,this.options={isCaseSensitive:o,includeMatches:a,minMatchCharLength:u,findAllMatches:d,ignoreLocation:f,location:g,threshold:p,distance:k},this.pattern=o?t:t.toLowerCase(),this.query=Z(this.pattern,this.options)}return o(e,[{key:"searchIn",value:function(e){var t=this.query;if(!t)return{isMatch:!1,score:1};var n=this.options,r=n.includeMatches;e=n.isCaseSensitive?e:e.toLowerCase();for(var i=0,o=[],c=0,a=0,s=t.length;a-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function ve(e,t){t.score=e.score}function ge(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?I.includeMatches:r,o=n.includeScore,c=void 0===o?I.includeScore:o,a=[];return i&&a.push(de),c&&a.push(ve),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return a.length&&a.forEach((function(t){t(e,r)})),r}))}var ye=function(){function e(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2?arguments[2]:void 0;r(this,e),this.options=t(t({},I),i),this.options.useExtendedSearch,this._keyStore=new S(this.options.keys),this.setCollection(n,o)}return o(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof $))throw new Error("Incorrect 'index' type");this._myIndex=t||R(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){k(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n1&&void 0!==arguments[1]?arguments[1]:{},n=t.limit,r=void 0===n?-1:n,i=this.options,o=i.includeMatches,c=i.includeScore,a=i.shouldSort,s=i.sortFn,u=i.ignoreFieldNorm,h=g(e)?g(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return le(h,{ignoreFieldNorm:u}),a&&h.sort(s),y(r)&&r>-1&&(h=h.slice(0,r)),ge(h,this._docs,{includeMatches:o,includeScore:c})}},{key:"_searchStringList",value:function(e){var t=re(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(k(n)){var c=t.searchIn(n),a=c.isMatch,s=c.score,u=c.indices;a&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:u}]})}})),r}},{key:"_searchLogical",value:function(e){var t=this,n=function(e,t){var n=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).auto,r=void 0===n||n,i=function e(n){var i=Object.keys(n),o=ue(n);if(!o&&i.length>1&&!se(n))return e(fe(n));if(he(n)){var c=o?n[ce]:i[0],a=o?n[ae]:n[c];if(!g(a))throw new Error(x(c));var s={keyId:j(c),pattern:a};return r&&(s.searcher=re(a,t)),s}var u={children:[],operator:i[0]};return i.forEach((function(t){var r=n[t];v(r)&&r.forEach((function(t){u.children.push(e(t))}))})),u};return se(e)||(e=fe(e)),i(e)}(e,this.options),r=function e(n,r,i){if(!n.children){var o=n.keyId,c=n.searcher,a=t._findMatches({key:t._keyStore.get(o),value:t._myIndex.getValueForItemAtKeyId(r,o),searcher:c});return a&&a.length?[{idx:i,item:r,matches:a}]:[]}for(var s=[],u=0,h=n.children.length;u1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?I.getFn:n,i=t.fieldNormWeight,o=void 0===i?I.fieldNormWeight:i,c=e.keys,a=e.records,s=new $({getFn:r,fieldNormWeight:o});return s.setKeys(c),s.setIndexRecords(a),s},ye.config=I,function(){ne.push.apply(ne,arguments)}(te),ye},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Fuse=t(); \ No newline at end of file diff --git a/assets/js/highlight.js b/assets/js/highlight.js deleted file mode 100644 index 39c07a0d2..000000000 --- a/assets/js/highlight.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! highlight.js v9.17.1 | BSD3 License | git.io/hljslicense */ -!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"==typeof exports||exports.nodeType?n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs})):e(exports)}(function(a){var f=[],o=Object.keys,N={},g={},_=!0,n=/^(no-?highlight|plain|text)$/i,E=/\blang(?:uage)?-([\w-]+)\b/i,t=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,r={case_insensitive:"cI",lexemes:"l",contains:"c",keywords:"k",subLanguage:"sL",className:"cN",begin:"b",beginKeywords:"bK",end:"e",endsWithParent:"eW",illegal:"i",excludeBegin:"eB",excludeEnd:"eE",returnBegin:"rB",returnEnd:"rE",variants:"v",IDENT_RE:"IR",UNDERSCORE_IDENT_RE:"UIR",NUMBER_RE:"NR",C_NUMBER_RE:"CNR",BINARY_NUMBER_RE:"BNR",RE_STARTERS_RE:"RSR",BACKSLASH_ESCAPE:"BE",APOS_STRING_MODE:"ASM",QUOTE_STRING_MODE:"QSM",PHRASAL_WORDS_MODE:"PWM",C_LINE_COMMENT_MODE:"CLCM",C_BLOCK_COMMENT_MODE:"CBCM",HASH_COMMENT_MODE:"HCM",NUMBER_MODE:"NM",C_NUMBER_MODE:"CNM",BINARY_NUMBER_MODE:"BNM",CSS_NUMBER_MODE:"CSSNM",REGEXP_MODE:"RM",TITLE_MODE:"TM",UNDERSCORE_TITLE_MODE:"UTM",COMMENT:"C",beginRe:"bR",endRe:"eR",illegalRe:"iR",lexemesRe:"lR",terminators:"t",terminator_end:"tE"},C="",m="Could not find the language '{}', did you forget to load/include a language module?",O={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},c="of and for in not or if then".split(" ");function B(e){return e.replace(/&/g,"&").replace(//g,">")}function d(e){return e.nodeName.toLowerCase()}function R(e){return n.test(e)}function i(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function p(e){var a=[];return function e(n,t){for(var r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?t+=r.nodeValue.length:1===r.nodeType&&(a.push({event:"start",offset:t,node:r}),t=e(r,t),d(r).match(/br|hr|img|input/)||a.push({event:"stop",offset:t,node:r}));return t}(e,0),a}function v(e,n,t){var r=0,a="",i=[];function o(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function l(e){a+=""}function u(e){("start"===e.event?c:l)(e.node)}for(;e.length||n.length;){var s=o();if(a+=B(t.substring(r,s[0].offset)),r=s[0].offset,s===e){for(i.reverse().forEach(l);u(s.splice(0,1)[0]),(s=o())===e&&s.length&&s[0].offset===r;);i.reverse().forEach(c)}else"start"===s[0].event?i.push(s[0].node):i.pop(),u(s.splice(0,1)[0])}return a+B(t.substr(r))}function l(n){return n.v&&!n.cached_variants&&(n.cached_variants=n.v.map(function(e){return i(n,{v:null},e)})),n.cached_variants?n.cached_variants:function e(n){return!!n&&(n.eW||e(n.starts))}(n)?[i(n,{starts:n.starts?i(n.starts):null})]:Object.isFrozen(n)?[i(n)]:[n]}function u(e){if(r&&!e.langApiRestored){for(var n in e.langApiRestored=!0,r)e[n]&&(e[r[n]]=e[n]);(e.c||[]).concat(e.v||[]).forEach(u)}}function M(n,t){var i={};return"string"==typeof n?r("keyword",n):o(n).forEach(function(e){r(e,n[e])}),i;function r(a,e){t&&(e=e.toLowerCase()),e.split(" ").forEach(function(e){var n,t,r=e.split("|");i[r[0]]=[a,(n=r[0],(t=r[1])?Number(t):function(e){return-1!=c.indexOf(e.toLowerCase())}(n)?0:1)]})}}function x(r){function s(e){return e&&e.source||e}function f(e,n){return new RegExp(s(e),"m"+(r.cI?"i":"")+(n?"g":""))}function a(a){var i,e,o={},c=[],l={},t=1;function n(e,n){o[t]=e,c.push([e,n]),t+=new RegExp(n.toString()+"|").exec("").length-1+1}for(var r=0;r')+n+(t?"":C)}function o(){R+=null!=E.sL?function(){var e="string"==typeof E.sL;if(e&&!N[E.sL])return B(p);var n=e?S(E.sL,p,!0,d[E.sL]):T(p,E.sL.length?E.sL:void 0);return 0")+'"');if("end"===n.type){var r=s(n);if(null!=r)return r}return p+=t,t.length}var g=D(n);if(!g)throw console.error(m.replace("{}",n)),new Error('Unknown language: "'+n+'"');x(g);var r,E=e||g,d={},R="";for(r=E;r!==g;r=r.parent)r.cN&&(R=c(r.cN,"",!0)+R);var p="",v=0;try{for(var M,b,h=0;E.t.lastIndex=h,M=E.t.exec(i);)b=t(i.substring(h,M.index),M),h=M.index+b;for(t(i.substr(h)),r=E;r.parent;r=r.parent)r.cN&&(R+=C);return{relevance:v,value:R,i:!1,language:n,top:E}}catch(e){if(e.message&&-1!==e.message.indexOf("Illegal"))return{i:!0,relevance:0,value:B(i)};if(_)return{relevance:0,value:B(i),language:n,top:E,errorRaised:e};throw e}}function T(t,e){e=e||O.languages||o(N);var r={relevance:0,value:B(t)},a=r;return e.filter(D).filter(L).forEach(function(e){var n=S(e,t,!1);n.language=e,n.relevance>a.relevance&&(a=n),n.relevance>r.relevance&&(a=r,r=n)}),a.language&&(r.second_best=a),r}function b(e){return O.tabReplace||O.useBR?e.replace(t,function(e,n){return O.useBR&&"\n"===e?"
":O.tabReplace?n.replace(/\t/g,O.tabReplace):""}):e}function s(e){var n,t,r,a,i,o,c,l,u,s,f=function(e){var n,t,r,a,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",t=E.exec(i)){var o=D(t[1]);return o,o?t[1]:"no-highlight"}for(n=0,r=(i=i.split(/\s+/)).length;n/g,"\n"):n=e,i=n.textContent,r=f?S(f,i,!0):T(i),(t=p(n)).length&&((a=document.createElement("div")).innerHTML=r.value,r.value=v(t,p(a),i)),r.value=b(r.value),e.innerHTML=r.value,e.className=(o=e.className,c=f,l=r.language,u=c?g[c]:l,s=[o.trim()],o.match(/\bhljs\b/)||s.push("hljs"),-1===o.indexOf(u)&&s.push(u),s.join(" ").trim()),e.result={language:r.language,re:r.relevance},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.relevance}))}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll("pre code");f.forEach.call(e,s)}}var w={disableAutodetect:!0};function D(e){return e=(e||"").toLowerCase(),N[e]||N[g[e]]}function L(e){var n=D(e);return n&&!n.disableAutodetect}return a.highlight=S,a.highlightAuto=T,a.fixMarkup=b,a.highlightBlock=s,a.configure=function(e){O=i(O,e)},a.initHighlighting=h,a.initHighlightingOnLoad=function(){window.addEventListener("DOMContentLoaded",h,!1),window.addEventListener("load",h,!1)},a.registerLanguage=function(n,e){var t;try{t=e(a)}catch(e){if(console.error("Language definition for '{}' could not be registered.".replace("{}",n)),!_)throw e;console.error(e),t=w}u(N[n]=t),t.rawDefinition=e.bind(null,a),t.aliases&&t.aliases.forEach(function(e){g[e]=n})},a.listLanguages=function(){return o(N)},a.getLanguage=D,a.requireLanguage=function(e){var n=D(e);if(n)return n;throw new Error("The '{}' language is required, but not loaded.".replace("{}",e))},a.autoDetection=L,a.inherit=i,a.debugMode=function(){_=!1},a.IR=a.IDENT_RE="[a-zA-Z]\\w*",a.UIR=a.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*",a.NR=a.NUMBER_RE="\\b\\d+(\\.\\d+)?",a.CNR=a.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",a.BNR=a.BINARY_NUMBER_RE="\\b(0b[01]+)",a.RSR=a.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",a.BE=a.BACKSLASH_ESCAPE={b:"\\\\[\\s\\S]",relevance:0},a.ASM=a.APOS_STRING_MODE={cN:"string",b:"'",e:"'",i:"\\n",c:[a.BE]},a.QSM=a.QUOTE_STRING_MODE={cN:"string",b:'"',e:'"',i:"\\n",c:[a.BE]},a.PWM=a.PHRASAL_WORDS_MODE={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},a.C=a.COMMENT=function(e,n,t){var r=a.inherit({cN:"comment",b:e,e:n,c:[]},t||{});return r.c.push(a.PWM),r.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",relevance:0}),r},a.CLCM=a.C_LINE_COMMENT_MODE=a.C("//","$"),a.CBCM=a.C_BLOCK_COMMENT_MODE=a.C("/\\*","\\*/"),a.HCM=a.HASH_COMMENT_MODE=a.C("#","$"),a.NM=a.NUMBER_MODE={cN:"number",b:a.NR,relevance:0},a.CNM=a.C_NUMBER_MODE={cN:"number",b:a.CNR,relevance:0},a.BNM=a.BINARY_NUMBER_MODE={cN:"number",b:a.BNR,relevance:0},a.CSSNM=a.CSS_NUMBER_MODE={cN:"number",b:a.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},a.RM=a.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[a.BE,{b:/\[/,e:/\]/,relevance:0,c:[a.BE]}]},a.TM=a.TITLE_MODE={cN:"title",b:a.IR,relevance:0},a.UTM=a.UNDERSCORE_TITLE_MODE={cN:"title",b:a.UIR,relevance:0},a.METHOD_GUARD={b:"\\.\\s*"+a.UIR,relevance:0},[a.BE,a.ASM,a.QSM,a.PWM,a.C,a.CLCM,a.CBCM,a.HCM,a.NM,a.CNM,a.BNM,a.CSSNM,a.RM,a.TM,a.UTM,a.METHOD_GUARD].forEach(function(e){!function n(t){Object.freeze(t);var r="function"==typeof t;Object.getOwnPropertyNames(t).forEach(function(e){!t.hasOwnProperty(e)||null===t[e]||"object"!=typeof t[e]&&"function"!=typeof t[e]||r&&("caller"===e||"callee"===e||"arguments"===e)||Object.isFrozen(t[e])||n(t[e])});return t}(e)}),a});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},a={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,relevance:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],relevance:0},e.HCM,a,{cN:"",b:/\\"/},{cN:"string",b:/'/,e:/'/},t]}});hljs.registerLanguage("shell",function(s){return{aliases:["console"],c:[{cN:"meta",b:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{e:"$",sL:"bash"}}]}});hljs.registerLanguage("ruby",function(e){var c="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",b={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},r={cN:"doctag",b:"@[A-Za-z]+"},a={b:"#<",e:">"},n=[e.C("#","$",{c:[r]}),e.C("^\\=begin","^\\=end",{c:[r],relevance:10}),e.C("^__END__","\\n$")],s={cN:"subst",b:"#\\{",e:"}",k:b},t={cN:"string",c:[e.BE,s],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{b:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,rB:!0,c:[{b:/<<[-~]?'?/},{b:/\w+/,endSameAsBegin:!0,c:[e.BE,s]}]}]},i={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:b},l=[t,a,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(n)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:c}),i].concat(n)},{b:e.IR+"::"},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",relevance:0},{cN:"symbol",b:":(?!\\s)",c:[t,{b:c}],relevance:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{cN:"params",b:/\|/,e:/\|/,k:b},{b:"("+e.RSR+"|unless)\\s*",k:"unless",c:[a,{cN:"regexp",c:[e.BE,s],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(n),relevance:0}].concat(n);s.c=l;var d=[{b:/^\s*=>/,starts:{e:"$",c:i.c=l}},{cN:"meta",b:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{e:"$",c:l}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:b,i:/\/\*/,c:n.concat(d).concat(l)}});hljs.registerLanguage("yaml",function(e){var b="true false yes no null",a={cN:"string",relevance:0,v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/\S+/}],c:[e.BE,{cN:"template-variable",v:[{b:"{{",e:"}}"},{b:"%{",e:"}"}]}]};return{cI:!0,aliases:["yml","YAML","yaml"],c:[{cN:"attr",v:[{b:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{b:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{b:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{cN:"meta",b:"^---s*$",relevance:10},{cN:"string",b:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{b:"<%[%=-]?",e:"[%-]?%>",sL:"ruby",eB:!0,eE:!0,relevance:0},{cN:"type",b:"!"+e.UIR},{cN:"type",b:"!!"+e.UIR},{cN:"meta",b:"&"+e.UIR+"$"},{cN:"meta",b:"\\*"+e.UIR+"$"},{cN:"bullet",b:"\\-(?=[ ]|$)",relevance:0},e.HCM,{bK:b,k:{literal:b}},{cN:"number",b:e.CNR+"\\b"},a]}}); diff --git a/assets/js/index.js b/assets/js/index.js deleted file mode 100644 index 66f72772b..000000000 --- a/assets/js/index.js +++ /dev/null @@ -1,496 +0,0 @@ -(function toggleColorModes(){ - const light = 'lit'; - const dark = 'dim'; - const storageKey = 'colorMode'; - const key = '--color-mode'; - const data = 'data-mode'; - const bank = window.localStorage; - - function currentMode() { - let acceptableChars = light + dark; - acceptableChars = [...acceptableChars]; - let mode = getComputedStyle(doc).getPropertyValue(key).replace(/\"/g, '').trim(); - - mode = [...mode].filter(function(letter){ - return acceptableChars.includes(letter); - }); - - return mode.join(''); - } - - function changeMode(isDarkMode) { - if(isDarkMode) { - bank.setItem(storageKey, light) - elemAttribute(doc, data, light); - } else { - bank.setItem(storageKey, dark); - elemAttribute(doc, data, dark); - } - } - - function setUserColorMode(mode = false) { - const isDarkMode = currentMode() == dark; - const storedMode = bank.getItem(storageKey); - if(storedMode) { - if(mode) { - changeMode(isDarkMode); - } else { - elemAttribute(doc, data, storedMode); - } - } else { - if(mode === true) { - changeMode(isDarkMode) - } - } - } - - setUserColorMode(); - - doc.addEventListener('click', function(event) { - let target = event.target; - let modeClass = 'color_choice'; - let animateClass = 'color_animate'; - let isModeToggle = containsClass(target, modeClass); - if(isModeToggle) { - pushClass(target, animateClass); - setUserColorMode(true); - } - }); -})(); - -function fileClosure(){ - - (function updateDate() { - const date = new Date(); - const year = date.getFullYear(); - const yearEl = elem('.year'); - yearEl ? yearEl.innerHTML = `${year}` : false; - })(); - - (function makeExternalLinks(){ - let links = elems('a'); - if(links) { - Array.from(links).forEach(function(link){ - let target, rel, blank, noopener, attr1, attr2, url, isExternal; - url = elemAttribute(link, 'href'); - isExternal = (url && typeof url == 'string' && url.startsWith('http')) && !url.startsWith(baseURL) ? true : false; - if(isExternal) { - target = 'target'; - rel = 'rel'; - blank = '_blank'; - noopener = 'noopener'; - attr1 = elemAttribute(link, target); - attr2 = elemAttribute(link, rel); - - attr1 ? false : elemAttribute(link, target, blank); - attr2 ? false : elemAttribute(link, rel, noopener); - } - }); - } - })(); - - let headingNodes = [], results, link, icon, current, id, - tags = ['h2', 'h3', 'h4', 'h5', 'h6']; - - current = document.URL; - - tags.forEach(function(tag){ - const article = elem('.post_content'); - if (article) { - results = article.getElementsByTagName(tag); - Array.prototype.push.apply(headingNodes, results); - } - }); - - headingNodes.forEach(function(node){ - link = createEl('a'); - link.className = 'link icon'; - id = node.getAttribute('id'); - if(id) { - link.href = `${current}#${id}`; - node.appendChild(link); - pushClass(node, 'link_owner'); - } - }); - - let inlineListItems = elems('ol li'); - if(inlineListItems) { - inlineListItems.forEach(function(listItem){ - let firstChild = listItem.children[0] - let containsHeading = isMatch(firstChild, tags); - containsHeading ? pushClass(listItem, 'align') : false; - }) - } - - function copyFeedback(parent) { - const copyText = document.createElement('div'); - const yanked = 'link_yanked'; - copyText.classList.add(yanked); - copyText.innerText = 'Link Copied'; - if(!elem(`.${yanked}`, parent)) { - parent.appendChild(copyText); - setTimeout(function() { - parent.removeChild(copyText) - }, 3000); - } - } - - (function copyHeadingLink() { - let deeplink, deeplinks, newLink, parent, target; - deeplink = 'link'; - deeplinks = elems(`.${deeplink}`); - if(deeplinks) { - document.addEventListener('click', function(event) - { - target = event.target; - parent = target.parentNode; - if (target && containsClass(target, deeplink) || containsClass(parent, deeplink)) { - event.preventDefault(); - newLink = target.href != undefined ? target.href : target.parentNode.href; - copyToClipboard(newLink); - target.href != undefined ? copyFeedback(target) : copyFeedback(target.parentNode); - } - }); - } - })(); - - (function copyLinkToShare() { - let copy, copied, excerpt, isCopyIcon, isInExcerpt, link, postCopy, postLink, target; - copy = 'copy'; - copied = 'copy_done'; - excerpt = 'excerpt'; - postCopy = 'post_copy'; - postLink = 'post_card'; - - doc.addEventListener('click', function(event) { - target = event.target; - isCopyIcon = containsClass(target, copy); - let isWithinCopyIcon = target.closest(`.${copy}`); - if (isCopyIcon || isWithinCopyIcon) { - let icon = isCopyIcon ? isCopyIcon : isWithinCopyIcon; - isInExcerpt = containsClass(icon, postCopy); - if (isInExcerpt) { - link = target.closest(`.${excerpt}`).previousElementSibling; - link = containsClass(link, postLink)? elemAttribute(link, 'href') : false; - } else { - link = window.location.href; - } - if(link) { - copyToClipboard(link); - pushClass(icon, copied); - } - } - const yankLink = '.link_yank'; - const isCopyLink = target.matches(yankLink); - const isCopyLinkIcon = target.closest(yankLink); - - if(isCopyLink || isCopyLinkIcon) { - event.preventDefault(); - const yankContent = isCopyLinkIcon ? elemAttribute(target.closest(yankLink), 'href') : elemAttribute(target, 'href'); - copyToClipboard(yankContent); - isCopyLink ? copyFeedback(target) : copyFeedback(target.parentNode); - } - }); - })(); - - (function hideAside(){ - let aside, title, posts; - aside = elem('.aside'); - title = aside ? aside.previousElementSibling : null; - if(aside && title.nodeName.toLowerCase() === 'h3') { - posts = Array.from(aside.children); - posts.length < 1 ? title.remove() : false; - } - })(); - - (function goBack() { - let backBtn = elem('.btn_back'); - let history = window.history; - if (backBtn) { - backBtn.addEventListener('click', function(){ - history.back(); - }); - } - })(); - - function showingImagePosition(){ - // whether or not to track image position for non-linear images within the article body element. - const thisPage = document.documentElement; - let showImagePositionOnPage = thisPage.dataset.figures; - - if(showImagePositionOnPage) { - showImagePosition = showImagePositionOnPage; - } - return showImagePosition === "true" ? true : false; - } - - function populateAlt(images) { - let imagePosition = 0; - - images.forEach((image) => { - let alt = image.alt; - const figure = image.parentNode.parentNode; - - // Image classes, including ::round - const altArr = alt.split('::').map(x => x.trim()) - if (altArr.length > 1) { - altArr[1].split(' ').filter(Boolean).forEach(cls =>{ - pushClass(image, cls); - alt = altArr[0] - }) - } - - // Image alignment (floating) - const modifiers = [':left', ':right']; - modifiers.forEach(function(modifier){ - const canModify = alt.includes(modifier); - if(canModify) { - pushClass(figure, `float_${modifier.replace(":", "")}`); - alt = alt.replace(modifier, ""); - } - }); - - // Inline images - const isInline = alt.includes(":inline"); - alt = alt.replace(":inline", ""); - if(isInline) { - modifyClass(figure, 'inline'); - } - - // Image captions - let addCaption = true - let captionText = '' - - if(image.title.trim().length) { - captionText = image.title.trim() - } else { - if(image.title === " ") { - addCaption = false - } else { - captionText = alt - } - } - - // Don't add a caption for featured images, inline images, or empty text - if( - image.matches(`.${featuredImageClass}`) || - containsClass(image, 'alt' && !isInline) || - !captionText.length - ) { - addCaption = false - } - - if (addCaption) { - let desc = document.createElement('figcaption'); - desc.classList.add(imageAltClass); - - // Add figure numbering - imagePosition += 1; - image.dataset.pos = imagePosition; - const showImagePosition = showingImagePosition(); - const thisImgPos = image.dataset.pos; - captionText = showImagePosition ? `${showImagePositionLabel} ${thisImgPos}: ${captionText}` : captionText; - desc.textContent = captionText; - - // If a caption exists, remove it - if(image.nextElementSibling) { - image.nextElementSibling.remove(); - } - - // Insert caption - image.insertAdjacentHTML('afterend', desc.outerHTML); - } - }); - - hljs.initHighlightingOnLoad(); - } - - function largeImages(baseParent, images = []) { - if(images) { - images.forEach(function(image) { - window.setTimeout(function(){ - let actualWidth = image.naturalWidth; - let parentWidth = baseParent.offsetWidth; - let actionableRatio = actualWidth / parentWidth; - - if (actionableRatio > 1) { - pushClass(image.parentNode.parentNode, imageScalableClass); - image.parentNode.parentNode.dataset.scale = actionableRatio; - } - }, 100) - }); - } - } - - (function AltImage() { - let post = elem('.post_content'); - let images = post ? post.querySelectorAll('img') : false; - images ? populateAlt(images) : false; - largeImages(post, images); - })(); - - doc.addEventListener('click', function(event) { - let target = event.target; - isClickableImage = target.matches(`.${imageScalableClass}`) || target.closest(`.${imageScalableClass}`) ; - - if(isClickableImage) { - let hasClickableImage = containsClass(target.children[0], imageScalableClass); - if(hasClickableImage) { - modifyClass(target, scaleImageClass); - } - } - - if(isClickableImage) { - let figure = target.closest('figure'); - modifyClass(figure, scaleImageClass); - } - - goBack(target); - }); - - const tables = elems('table'); - if (tables) { - const scrollable = 'scrollable'; - tables.forEach(function(table) { - const wrapper = createEl(); - wrapper.className = scrollable; - wrapEl(table, wrapper); - }); - } - - function toggleTags(target = null) { - const tagsButtonClass = 'post_tags_toggle'; - const tagsButtonClass2 = 'tags_hide'; - const tagsShowClass = 'jswidgetopen'; - const postTagsWrapper = elem(`.${tagsShowClass}`); - target = target === null ? postTagsWrapper : target; - const showingAllTags = target.matches(`.${tagsShowClass}`); - const isExandButton = target.matches(`.${tagsButtonClass}`); - const isCloseButton = target.matches(`.${tagsButtonClass2}`) || target.closest(`.${tagsButtonClass2}`); - const isButton = isExandButton || isCloseButton; - const isActionable = isButton || showingAllTags; - - if(isActionable) { - if(isButton) { - if(isExandButton) { - let allTagsWrapper = target.nextElementSibling - pushClass(allTagsWrapper, tagsShowClass); - } else { - deleteClass(postTagsWrapper, tagsShowClass); - } - } else { - isActionable ? deleteClass(target, tagsShowClass) : false; - } - } - } - - (function showAllPostTags(){ - doc.addEventListener('click', function(event){ - const target = event.target; - toggleTags(target) - }); - - horizontalSwipe(doc, toggleTags, 'left'); - })(); - - (function navToggle() { - doc.addEventListener('click', function(event){ - const target = event.target; - const open = 'jsopen'; - const navCloseIconClass = '.nav_close'; - const navClose = elem(navCloseIconClass); - const isNavToggle = target.matches(navCloseIconClass) || target.closest(navCloseIconClass); - const harmburgerIcon = navClose.firstElementChild.firstElementChild; - if(isNavToggle) { - event.preventDefault(); - modifyClass(doc, open); - modifyClass(harmburgerIcon, 'isopen'); - } - - if(!target.closest('.nav') && elem(`.${open}`)) { - modifyClass(doc, open); - let navIsOpen = containsClass(doc, open); - !navIsOpen ? modifyClass(harmburgerIcon, 'isopen') : false; - } - - const navItem = 'nav_item'; - const navSub = 'nav_sub'; - const showSub = 'nav_open'; - const isNavItem = target.matches(`.${navItem}`); - const isNavItemIcon = target.closest(`.${navItem}`) - - if(isNavItem || isNavItemIcon) { - const thisItem = isNavItem ? target : isNavItemIcon; - const hasNext = thisItem.nextElementSibling - const hasSubNav = hasNext ? hasNext.matches(`.${navSub}`) : null; - if (hasSubNav) { - event.preventDefault(); - Array.from(thisItem.parentNode.parentNode.children).forEach(function(item){ - const targetItem = item.firstElementChild; - targetItem != thisItem ? deleteClass(targetItem, showSub) : false; - }); - modifyClass(thisItem, showSub); - } - } - }); - })(); - - function isMobileDevice() { - const agent = navigator.userAgent.toLowerCase(); - const isMobile = agent.includes('android') || agent.includes('iphone'); - return isMobile; - }; - - (function ifiOS(){ - // modify backto top button - const backToTopButton = elem('.to_top'); - const thisOS = getMobileOperatingSystem(); - const ios = 'ios'; - if(backToTopButton && thisOS === 'iOS') { - pushClass(backToTopButton, ios); - } - // precisely position back to top button on large screens - const buttonParentWidth = backToTopButton.parentNode.offsetWidth; - const docWidth = doc.offsetWidth; - let leftOffset = (docWidth - buttonParentWidth) / 2; - const buttonWidth = backToTopButton.offsetWidth; - leftOffset = leftOffset + buttonParentWidth - buttonWidth; - if(!isMobileDevice()){ - backToTopButton.style.left = `${leftOffset}px`; - } - })(); - - (function sortTags() { - doc.addEventListener('click', function(event){ - const active = 'active'; - const target = event.target; - const isSortButton = target.matches('.tags_sort') || target.matches('.tags_sort span'); - if(isSortButton) { - const tagsList = target.closest('.tags_list'); - const sortButton = elem('.tags_sort', tagsList); - modifyClass(sortButton, 'sorted'); - const tags = elems('.post_tag', tagsList); - Array.from(tags).forEach(function(tag){ - const order = tag.dataset.position; - const reverseSorting = containsClass(tag, active); - tag.style.order = reverseSorting ? 0 : -order; - modifyClass(tag, active); - }) - } - }) - })(); - - (function shareViaLinkedin() { - doc.addEventListener('click', function(event){ - const linkedin = '.linkedin'; - const target = event.target; - if(target.matches(linkedin) || target.closest(linkedin)) { - window.open('http://www.linkedin.com/shareArticle?mini=true&url='+encodeURIComponent(window.location.href), '', 'left=0,top=0,width=650,height=420,personalbar=0,toolbar=0,scrollbars=0,resizable=0'); - } - }); - })(); - - // add new code above this line -} - -window.addEventListener(pageHasLoaded, fileClosure()); diff --git a/assets/js/search.js b/assets/js/search.js deleted file mode 100644 index 8bdac52f1..000000000 --- a/assets/js/search.js +++ /dev/null @@ -1,241 +0,0 @@ -function initializeSearch(index) { - const searchKeys = ['title', 'link', 'body', 'id', 'section', 'tags']; - - const searchPageElement = elem('#searchpage'); - - const searchOptions = { - ignoreLocation: true, - findAllMatches: true, - includeScore: true, - shouldSort: true, - keys: searchKeys, - threshold: 0.0 - }; - - index = new Fuse(index, searchOptions); - - function minQueryLen(query) { - query = query.trim(); - const queryIsFloat = parseFloat(query); - const minimumQueryLength = queryIsFloat ? 1 : 2; - return minimumQueryLength; - } - - function searchResults(results=[], query="", passive = false) { - let resultsFragment = new DocumentFragment(); - let showResults = elem('.search_results'); - if(passive) { - showResults = searchPageElement; - } - emptyEl(showResults); - - const queryLen = query.length; - const requiredQueryLen = minQueryLen(query); - - if(results.length && queryLen >= requiredQueryLen) { - let resultsTitle = createEl('h3'); - resultsTitle.className = 'search_title'; - resultsTitle.innerText = quickLinks; - - let goBackButton = createEl('button'); - goBackButton.textContent = 'Go Back'; - goBackButton.className = goBackClass; - if(passive) { - resultsTitle.innerText = searchResultsLabel; - } - if(!searchPageElement) { - results = results.slice(0,8); - } else { - resultsFragment.appendChild(goBackButton); - results = results.slice(0,12); - } - resultsFragment.appendChild(resultsTitle); - - results.forEach(function(result){ - let item = createEl('a'); - item.href = `${result.link}?query=${query}`; - item.className = 'search_result'; - item.style.order = result.score; - if(passive) { - pushClass(item, 'passive'); - let itemTitle = createEl('h3'); - itemTitle.textContent = result.title; - item.appendChild(itemTitle); - - // let itemDescription = createEl('p'); - // // position of first search term instance - // let queryInstance = result.body.indexOf(query); - // itemDescription.textContent = `${result.body.substring(queryInstance, queryInstance + 200)}`; - // item.appendChild(itemDescription); - } else { - item.textContent = result.title; - } - resultsFragment.appendChild(item); - }); - } - - if(queryLen >= requiredQueryLen) { - if (!results.length) { - showResults.innerHTML = `${noMatchesFound}`; - } - } else { - showResults.innerHTML = `` - } - - showResults.appendChild(resultsFragment); - } - - function search(searchTerm, scope = null, passive = false) { - if(searchTerm.length) { - let rawResults = index.search(searchTerm); - rawResults = rawResults.map(function(result){ - const score = result.score; - const resultItem = result.item; - resultItem.score = (parseFloat(score) * 50).toFixed(0); - return resultItem ; - }) - - if(scope) { - rawResults = rawResults.filter(resultItem => { - return resultItem.section == scope; - }); - } - - passive ? searchResults(rawResults, searchTerm, true) : searchResults(rawResults, searchTerm); - - } else { - passive ? searchResults([], "", true) : searchResults(); - } - } - - function liveSearch() { - const searchField = elem(searchFieldClass); - - if (searchField) { - const searchScope = searchField.dataset.scope; - searchField.addEventListener('input', function() { - const searchTerm = searchField.value.trim().toLowerCase(); - search(searchTerm, searchScope); - }); - - if(!searchPageElement) { - searchField.addEventListener('search', function(){ - const searchTerm = searchField.value.trim().toLowerCase(); - if(searchTerm.length) { - const scopeParameter = searchScope ? `&scope=${searchScope}` : ''; - window.location.href = new URL(baseURL + `search/?query=${searchTerm}${ scopeParameter }`).href; - } - }); - } - } - } - - function passiveSearch() { - if(searchPageElement) { - const searchTerm = findQuery(); - const searchScope = findQuery('scope'); - // search actively after search page has loaded - const searchField = elem(searchFieldClass); - - search(searchTerm, searchScope, true); - - if(searchField) { - searchField.addEventListener('input', function() { - const searchTerm = searchField.value.trim().toLowerCase(); - search(searchTerm, true); - wrapText(searchTerm, main); - }); - } - } - } - - function hasSearchResults() { - const searchResults = elem('.results'); - if(searchResults) { - const body = searchResults.innerHTML.length; - return [searchResults, body]; - } - return false - } - - function clearSearchResults() { - let searchResults = hasSearchResults(); - if(searchResults) { - searchResults = searchResults[0]; - searchResults.innerHTML = ""; - // clear search field - const searchField = elem(searchFieldClass); - searchField.value = ""; - } - } - - function onEscape(fn){ - window.addEventListener('keydown', function(event){ - if(event.code === "Escape") { - fn(); - } - }); - } - - let main = elem('main'); - if(!main) { - main = elem('.main'); - } - - searchPageElement ? false : liveSearch(); - passiveSearch(); - - highlightSearchTerms(findQuery(), '.post_body', 'mark', 'search-term'); - - onEscape(clearSearchResults); - - window.addEventListener('click', function(event){ - const target = event.target; - const isSearch = target.closest(searchClass) || target.matches(searchClass); - if(!isSearch && !searchPageElement) { - clearSearchResults(); - } - }); -} - -function highlightSearchTerms(search, context, wrapper = 'mark', cssClass = '') { - const query = findQuery() - if(query){ - - let container = elem(context); - let reg = new RegExp("(" + search + ")", "gi"); - - function searchInNode(parentNode, search) { - forEach(parentNode, function (node) { - if (node.nodeType === 1) { - searchInNode(node, search); - } else if ( - node.nodeType === 3 && - reg.test(node.nodeValue) - ) { - let string = node.nodeValue.replace(reg, `<${wrapper} class="${cssClass}">$1`); - let span = document.createElement("span"); - span.dataset.searched = "true"; - span.innerHTML = string; - parentNode.replaceChild(span, node); - } - }); - }; - - searchInNode(container, search); - - } -} - -window.addEventListener('load', function() { - const pageLanguage = elem('body').dataset.lang; - const searchIndexLangSlug = pageLanguage === 'es' ? '': `${pageLanguage}/`; - const searchIndex = `${searchIndexLangSlug}index.json`; - fetch(new URL(baseURL + searchIndex).href) - .then(response => response.json()) - .then(function(data) { - data = data.length ? data : []; - initializeSearch(data); - }) - .catch((error) => console.error(error)); -}); diff --git a/assets/js/variables.js b/assets/js/variables.js deleted file mode 100644 index 93dc40a95..000000000 --- a/assets/js/variables.js +++ /dev/null @@ -1,18 +0,0 @@ -const featuredImageClass = 'image_featured'; -const imageScalableClass = 'image-scalable'; -const scaleImageClass = 'image-scale'; -const pageHasLoaded = 'DOMContentLoaded'; -const imageAltClass = 'img_alt' - -const baseURL = '{{ .Site.BaseURL }}'; -const searchFieldClass = '.search_field'; -const searchClass = '.search'; -const goBackClass = 'button_back'; -const lineClass = '.line'; - -// defined in i18n / translation files -const quickLinks = '{{ T "quick_links" }}'; -const searchResultsLabel = '{{ T "search_results_label" }}'; -const shortSearchQuery = '{{ T "short_search_query" }}' -const typeToSearch = '{{ T "type_to_search" }}'; -const noMatchesFound = '{{ T "no_matches" }}'; diff --git a/assets/sass/_base.sass b/assets/sass/_base.sass deleted file mode 100644 index 3ab12057f..000000000 --- a/assets/sass/_base.sass +++ /dev/null @@ -1,156 +0,0 @@ -* - box-sizing: border-box - -webkit-appearance: none - margin: 0 - padding: 0 - -body, html - scroll-behavior: smooth - -webkit-text-size-adjust: 100% - font-kerning: normal - -webkit-font-feature-settings: "kern" 1 - text-rendering: optimizeLegibility - text-rendering: geometricPrecision - -webkit-text-size-adjust: 100% - font-size: 100% - scroll-padding-top: 4.5rem - &::-webkit-scrollbar-corner - background-color: transparent -body - font-family: var(--font) - background: var(--choice-bg) - color: var(--text) - font-size: 1.1rem - line-height: 1.5 - max-width: 1920px - margin: 0 auto - position: relative - display: flex - flex-direction: column - justify-content: space-between - min-height: 100vh - font-kerning: normal - -webkit-font-smoothing: antialiased - -moz-osx-font-smoothing: grayscale -a - text-decoration: none - color: inherit - &:focus, &:focus-within - outline: none !important - -h1,h2,h3,h4,h5 - font-family: inherit - font-weight: 300 - padding: 5px 0 - margin: 15px 0 - color: var(--header-text) - line-height: 1.35 - &:hover .link - opacity: 1 - -h1 - font-size: 200% - font-weight: 400 -h2 - font-size: 175% -h3 - font-size: 150% -h4 - font-size: 125% -h5 - font-size: 120% -h6 - font-size: 100% -img, svg - max-width: 100% - vertical-align: middle -img - height: auto - margin: 1rem auto - padding: 0 - &:focus, &:focus-within - outline: none !important - border: none !important - -main - flex: 1 - -ul - list-style: none - -webkit-padding-start: 0 - -moz-padding-start: 0 - -em - font-weight: 500 - -b, strong - font-weight: 700 - -hr - border: none - padding: 1px - background: darken($haze, 7.5%) - opacity: 0.5 - margin: 1rem 0 - @media (prefers-color-scheme: dark) - background: var(--theme) - -aside - h3 - position: relative - margin: 0 !important - ul - list-style: initial - padding-left: 1rem - li - padding: 0.25rem 0 - -table - width: 100% - border-collapse: collapse - background: var(--table-haze) - // border-style: hidden - margin-bottom: 1.5rem - &:not(.ln-table) t - background: var(--table-bg) - -td, th - padding: 0.5rem 1rem - border: 1px solid var(--table-border) - -td, -th - padding: 0.5rem 1rem - font-weight: 400 - &:not(:first-child) - padding-left: 1.5rem - -th - font-weight: 700 - -tbody - padding: 0 - tr - &:nth-child(even) - background-color: var(--table-haze) - &:nth-child(odd) - background-color: var(--table-bg) - -blockquote - margin: 25px auto - quotes: '\201C''\201D''\2018''\2019' - padding: 1.5rem - color: #555555 - padding: 1rem 1.5rem - border-left: 0.2rem solid $theme - position: relative - background: var(--haze) - + .highlight_wrap - margin-top: 2.25rem -p - padding: 0.8rem 0 - -picture - display: block - width: 100% - diff --git a/assets/sass/_components.sass b/assets/sass/_components.sass deleted file mode 100644 index 35820c796..000000000 --- a/assets/sass/_components.sass +++ /dev/null @@ -1,774 +0,0 @@ -%upcaret - width: 0 - height: 0 - border-left: 0.33rem solid transparent - border-right: 0.33rem solid transparent - top: -0.5rem - left: 1rem -.nav - color: $haze - display: flex - justify-content: space-between - @include content - &_active - background-color: rgba($light, 0.05) - border-radius: 0.25rem - &, &_body - &_icon - width: 0.7rem - margin-left: 0.33rem - transition: transform 0.3s var(--ease) - transform-origin: 50% 50% - &_body - display: flex - flex: 1 - &_header - background-color: $bg - padding: 0 1.5rem - position: fixed - width: 100% - z-index: 99 - left: 0 - &_item - padding: 0.5rem 1rem - display: inline-flex - align-items: center - &_sub - width: 100% - left: 0 - position: absolute - z-index: 20 - border-radius: 0 0 0.5rem 0.5rem - top: 3rem - transition: height 0.3s ease-in-out - height: 0 - overflow: hidden - padding: 0.96rem 0 0 - background: transparent - - &_parent - position: relative - display: flex - align-items: center - margin: 0.25rem 0 - border-radius: 0.5rem - - &_open + &_sub &_child - padding-top: 0.5rem - padding-bottom: 0.5rem - z-index: 3 - & + a - @media screen and (min-width: $mobile-menu-breakpoint) - padding-top: 0 - &:not(:first-child) - position: relative - &:first-child::before - position: absolute - content: "" - @extend %upcaret - border-bottom: 0.5rem solid var(--translucent-light) - z-index: 2 - &_open + &_sub - height: initial - z-index: 999 - overflow: initial - border-radius: 0.5rem - padding-bottom: 0.5rem - @media screen and (min-width: $mobile-menu-breakpoint) - color: var(--text) - &::before, &::after - content: "" - position: absolute - &::before - @extend %upcaret - z-index: 1 - @media screen and (min-width: $mobile-menu-breakpoint) - border-bottom: 0.5rem solid var(--choice-bg) - &::after - top: 0 - left: 0 - right: 0 - bottom: 0 - background: var(--translucent-light) - border-radius: 0.5rem - box-shadow: 0 1rem 3rem rgba(0,0,0,0.25) - @media screen and (min-width: $mobile-menu-breakpoint) - background: var(--choice-bg) - width: auto - white-space: nowrap; - &_open &_icon - transform: rotate(180deg) - - &_sub &_item - &:not(.nav_child) - position: relative - z-index: 5 - display: block - padding-top: 0.75rem - padding-bottom: 0.75rem - transition: background 0.3s ease-out - margin: 0 - - &_brand - img - max-width: 15rem - margin: 0 - @media screen and (min-width: $mobile-menu-breakpoint) - padding-left: 0 - // margin-left: -16rem - // transform: translateX(50rem) - img - background: transparent !important - - &_center - display: none - @media screen and (min-width: $mobile-menu-breakpoint) - display: flex - flex: 1 - align-items: center - justify-content: center - + .follow - flex: initial - - &_hide - @media screen and (min-width: $mobile-menu-breakpoint) - display: none - &_close - display: none - -.content, .footer - padding: 1.5rem - @media screen and (min-width: 1441px) - padding: 1.5rem 0 - -.content - padding-top: 5rem - @include content - -.footer - // border-top: 1px solid $xhaze - background: var(--footer-bg) - margin-top: 2rem - font-size: 0.9rem - &_inner - @include content - display: flex - justify-content: center - // grid-template-columns: 7rem 1fr - align-items: center - position: relative - -.button - background-color: $theme - color: $light - display: inline-flex - padding: 0.5rem 1.5rem - text-transform: uppercase - border: 1px solid $theme - border-radius: 1.5rem - font-size: 0.9rem - align-items: center - user-select: none - &_back - color: $light - outline: none - border: none - appearance: none - background-color: $theme - font-size: 1rem - cursor: pointer - padding: 0.5rem 1rem - margin-bottom: 1.33rem - border-radius: 1.5rem - &:hover, &:focus - background-color: darken($theme, 20%) - color: $light - border: 1px solid darken($theme, 20%) - - &_translucent - background-color: rgba($theme, 0.15) - color: $theme - border: 1px solid transparent - &_tally - padding: 0 0.75rem - border-radius: 0.5rem - background-color: $theme - display: inline-flex - justify-content: center - align-items: center - color: $light - margin: 0.1rem 0 0.1rem 0.2rem - font-size: 0.7rem - -.post - &_link, &_title - margin-bottom: 0 - &_link - line-height: 1 - > a - display: block - line-height: 1.35 - &s - margin-top: 2rem - &_header - height: 50vh - max-height: 35rem - background-color: $bg - // background-image: url(#{$imagesPath}island.jpg) - background-size: cover - background-position: center - margin-top: 4.2rem - @media screen and (max-width: 992px) - height: 40vh - margin-top: 3rem - @media screen and (max-width: 667px) - height: 30vh - & + .content - padding-top: 0 - &_item - // box-shadow: 0 2.25rem 1.25rem -1.25rem var(--shadow) - margin-bottom: 3rem - border-radius: 0.5rem - background: var(--post-bg) - &_tag - padding: 0.2rem 0.8rem - font-size: 0.8rem - &s - display: none - &.jswidgetopen - display: initial - position: fixed - top: 0 - left: 0 - height: 100vh - overflow-y: auto - width: 100vw - padding: 5rem 1.5rem - background: var(--translucent-light) - cursor: pointer - z-index: 999 - overflow-y: auto - &_toggle - margin-top: 0.5rem - margin-left: 0.5rem - cursor: pointer - &_tag, &_share - margin: 0.5rem - &_share - display: inline-flex - &_meta - align-items: stretch - &, span - display: inline-flex - flex-flow: row wrap - span - align-items: center - margin-bottom: 0.5rem - @media screen and (min-width: 557px) - gap: 0.5rem 0 - &:last-of-type - @media screen and (max-width: 667px) - margin-top: -0.5rem - .button - @media screen and (min-width: 667px) - margin: 0 0.5rem - - &_date - margin-right: 0.5rem - margin-left: 0.25rem - &_featured - display: block - margin: 1rem auto - &_content - a:not(.button) - color: $theme - ul, ol - list-style: initial - padding: 0.5rem 1.25rem - li - padding-top: 0.25rem - ol - list-style: decimal - -.scrollable - display: grid - width: 100% - max-width: 100% - overflow-x: auto - -.to-top - position: fixed - bottom: 2rem - @media screen and (max-width: 667px) - bottom: 2.25rem - right: 1.5rem - height: 2.25rem - width: 2.25rem - background-color: $theme - display: flex - align-items: center - justify-content: center - border: none - -webkit-appearance: none - border-radius: 50% - color: $light !important - text-decoration: none !important - font-size: 1.25rem - cursor: pointer - &, &:focus - outline: none - -.mb-0 - margin-bottom: 0 !important - -.tag - &s - &_list - cursor: initial - background: var(--choice-bg) - padding: 4.5rem 1.5rem 1.5rem 1.5rem - border-radius: 1rem - max-width: 720px - margin: 0 auto - box-shadow: 0 0.5rem 1.5rem rgba(0,0,0,0.12) - position: relative - display: flex - flex-flow: row wrap - &_nav - position: relative - &_hide - position: absolute - top: 1rem - right: 1.5rem - padding: 0.5rem - border-radius: 50% - cursor: pointer - @media screen and (min-width: 992px) - display: none - &_sort - font-size: 1rem - color: var(--light) - background: var(--theme) - position: absolute - top: 1.5rem - left: 1.5rem - border-radius: 1.5rem - padding: 0.1rem - &, span - user-select: none - span - display: inline-flex - justify-content: center - align-items: center - height: 2rem - position: relative - z-index: 5 - cursor: pointer - width: 5rem - font-weight: 500 - &::before - content: "" - position: absolute - width: 4.5rem - top: 0.25rem - bottom: 0.25rem - left: 0.25rem - z-index: 3 - background: var(--bg) - opacity: 0.5 - border-radius: 1.5rem - transition: 0.25s transform var(--ease) - &.sorted - &::before - transform: translateX(5rem) - &-title - border-bottom: none !important - display: inline-block !important - position: relative - font-size: 2rem - margin-bottom: -1rem - &::after - content: attr(data-count) - margin-left: 1.5rem - background-color: #eee - padding: 0.25rem 1rem - border-radius: 15% - font-size: 1.5rem - -.icon - display: inline-flex - justify-content: center - align-items: center - margin: 0 0.5rem - &, img, svg - width: 1.1rem - height: 1.1rem - &_2 - width: 5rem - height: 4rem -.link - opacity: 0 - position: relative - &_owner - .icon - background-image: url('#{$iconsPath}link.svg') - background-size: 100% - background-repeat: no-repeat - background-position: center right - &_yank - opacity: 1 - &ed - position: absolute - right: -1rem - top: -2rem - background-color: $theme - color: $light - width: 7rem - padding: 0.25rem 0.5rem - font-size: 0.9rem - border-radius: 1rem - text-align: center - &::after - position: absolute - top: 1rem - content: "" - border-color: $theme transparent - border-style: solid - border-width: 1rem 1rem 0 1rem - height: 0 - width: 0 - transform-origin: 50% 50% - transform: rotate(145deg) - right: 0.45rem - -.excerpt - &_header, &_footer - padding: 1rem - &_footer - padding: 0 1rem 2.25rem 1rem - &_thumbnail - min-height: 10rem - display: none - @media screen and (min-width: $mobile-menu-breakpoint) - display: block - border-radius: 0.5rem - &_footer - &.partition - display: grid - @media screen and (min-width: $mobile-menu-breakpoint) - grid-template-columns: 2fr 1fr - grid-gap: 1rem -.sidebar - &_inner - position: relative - &::before - content: "" - padding: 0.5px - top: 0 - bottom: 0 - // background: var(--light) - background: linear-gradient(to bottom, var(--haze), var(--light), var(--haze)) - position: absolute - left: -2rem - // display: none - -.author - &_header - display: grid - grid-template-columns: 3rem 1fr - grid-gap: 1rem - &_bio - a - color: $theme - -.pagination - display: flex - -.page - &-item - padding: 0.2rem - &.disabled - opacity: 0.7 - &:first-child, &:last-child - display: none - &.active a - background-color: darken($theme, 20%) - &-link - padding: 0.25rem 0.75rem - background-color: $theme - color: $light - border-radius: 1rem - &_only - display: none !important - & &_only - display: initial !important - -.round - border-radius: 50% - max-width: 100% - height: auto - padding: 0 - vertical-align: middle - -.float - &_left - float: left - margin-right: 1rem - + p - padding-top: 0 - &_right - float: right - margin-left: 1rem - &_left, &_right - &::after - clear: both - -.follow - display: flex - align-items: center - flex: 1 - justify-content: flex-end - svg - fill: $haze - margin-left: 0.75rem - -figcaption - font-style: italic - opacity: 0.67 - font-size: 0.9rem - -.to - &_top - background-color: $theme - width: 2.75rem - height: 2.75rem - display: flex - justify-content: center - align-items: center - cursor: pointer - border-radius: 50% - position: fixed - bottom: 1.5rem - right: 1.5rem - z-index: 99 - &.ios - position: absolute - bottom: 0.75rem - right: 0 - &:hover - background-color: $theme - svg - fill: $light - opacity: 0.5 - transition: 0.3s opacity var(--ease) - &:hover svg - opacity: 1 - -.color - &_mode - // width: 3rem - height: 1.5rem - display: grid - align-items: center - margin: 0 0.5rem - @media screen and (min-width: $mobile-menu-breakpoint) - margin: 0 1.5rem - grid-template-columns: 1fr - - &_choice - width: 3rem - background-color: var(--translucent-light) - border-radius: 1rem - height: 1.5rem - outline: none - border: none - -webkit-appearance: none - cursor: pointer - position: relative - position: relative - overflow: hidden - box-shadow: 0 0.25rem 1rem rgba(0,0,0,0.15) - &::after - content: "" - position: absolute - top: 0.1rem - left: 0.1rem - width: 1.3rem - height: 1.3rem - background-image: url("#{$imagesPath}sun.svg") - background-position: center - background-size: cover - border-radius: 50% - z-index: 2 - &_animate - transition: transform 0.5s cubic-bezier(0.075, 0.82, 0.165, 1) - &::after - transition: transform 0.5s cubic-bezier(.19,1,.22,1) - will-change: transform - -.taxonomy - text-transform: capitalize - -.image - &-scale - position: fixed - z-index: 999999 - left: 0 - right: 0 - height: 100vh - top: 0 - padding: 1.5rem - background-color: var(--bg) - display: grid - align-items: center - overflow: auto - &-scale &-scalable - background-color: var(--text) - &-scalable - cursor: pointer - transition: transform 0.3s var(--ease) - &_featured - display: block - margin-left: auto !important - margin-right: auto !important - &_thumbnail - margin: 0 - -.video - overflow: hidden - padding-bottom: 56.25% - position: relative - height: 0 - margin: 1.5rem 0 - border-radius: 0.6rem - background-color: var(--bg) - box-shadow: 0 1rem 2rem rgba(0,0,0,0.17) - iframe - left: 0 - top: 0 - height: 100% - width: 100% - border: none - position: absolute - transform: scale(1.02) - -.notices - border-top-width: 2rem - border-top-style: solid - color: #666 - margin: 2rem 0 - padding-bottom: .1px - padding-left: 1rem - padding-right: 1rem - .label - color: #fff - margin-top: -1.75rem - font-weight: bold - &:first-child::before - font-weight: 900 - margin-left: -.35rem - margin-right: .35rem - &.info - border-color: var(--notice-info-border-color) - background: var(--notice-info-background) - &.warning - border-color: var(--notice-warning-border-color) - background: var(--notice-warning-background) - &.image-warning - margin: 0 - &.note - border-color: var(--notice-note-border-color) - background: var(--notice-note-background) - &.tip - border-color: var(--notice-tip-border-color) - background: var(--notice-tip-background) - .highlight_wrap - background: var(--notice-code-bg) !important - - -// search - -.search - flex: 1 - display: flex - justify-content: flex-end - position: relative - max-width: 25rem - margin: 0.5rem 0 0 - --border: transparent - &_field - padding: 0.5rem 1rem - width: 100% - outline: none - color: var(--text) - background: var(--post-bg) - border: 1px solid var(--border) - border-radius: 8px - font-size: 1rem - box-shadow: 0 0.25rem 1rem rgba(0,0,0,0.1) - &:hover, &:focus - // background: var(--search-bg) - &_field:focus + &_label - opacity: 0 - &_label - position: absolute - z-index: 9 - opacity: 0.67 - right: 0.67rem - top: 0.25rem - width: 1rem - height: 1rem - svg - width: 100% - height: 100% - fill: #7C849B - &_result - padding: 0.5rem 1rem - &:not(.passive):hover - background-color: var(--code-bg) - color: $light - &.passive - display: grid - &s - width: 100% - background-color: var(--choice-bg) - color: var(--text) - border-radius: var(--radius) - box-shadow: 0 1rem 4rem rgba(0,0,0,0.17) !important - position: absolute - top: 125% - display: grid - overflow: hidden - z-index: 3 - &:empty - display: none - &_title - padding: 0.25rem 1rem !important - background-color: $theme - color: var(--light) - margin: 0 - font-size: 1.25rem - &:empty - display: none - &_submit - position: absolute - --margin: 3px - right: var(--margin) - top: var(--margin) - bottom: var(--margin) - z-index: 9 - cursor: pointer - border-radius: calc(var(--radius) / 2) - -#results - .search - &_title, &_result - padding: 0.5rem 0 - -.openstreetmap - border: none - -.post_content - max-width: 65rem - margin-left: auto - margin-right: auto \ No newline at end of file diff --git a/assets/sass/_custom.sass b/assets/sass/_custom.sass deleted file mode 100644 index 2d22745db..000000000 --- a/assets/sass/_custom.sass +++ /dev/null @@ -1,4 +0,0 @@ -// add customs styles and general overrides here -// due to the cascading nature of css, if you try to override theme css variables in this file, those changes will not apply. Instead, override css variables in the `override.sass` file -// we recommend not editing this file directly. Instead, create an `assets/sass/_custom.sass` file at the root level of your site. -// if you edit this file directly, you will have to resolve git conflicts when and if you decide to pull changes we make on the theme diff --git a/assets/sass/_fonts.sass b/assets/sass/_fonts.sass deleted file mode 100644 index 12cbf241a..000000000 --- a/assets/sass/_fonts.sass +++ /dev/null @@ -1,69 +0,0 @@ -@font-face - font-family: 'Metropolis' - font-style: normal - font-weight: 200 - src: local('Metropolis Extra Light'), local('Metropolis-Light'), url('#{$fontsPath}Metropolis-ExtraLight.woff2') format('woff2'), url('#{$fontsPath}Metropolis-ExtraLight.woff') format('woff') - font-display: swap - -@font-face - font-family: 'Metropolis' - font-style: italic - font-weight: 200 - src: local('Metropolis Extra Light Italic'), local('Metropolis-ExtraLightItalic'), url('#{$fontsPath}Metropolis-ExtraLightItalic.woff2') format('woff2'), url('#{$fontsPath}Metropolis-ExtraLightItalic.woff') format('woff') - font-display: swap - -@font-face - font-family: 'Metropolis' - font-style: normal - font-weight: 300 - src: local('Metropolis Light'), local('Metropolis-Light'), url('#{$fontsPath}Metropolis-Light.woff2') format('woff2'), url('#{$fontsPath}Metropolis-Light.woff') format('woff') - font-display: swap - -@font-face - font-family: 'Metropolis' - font-style: italic - font-weight: 300 - src: local('Metropolis Light Italic'), local('Metropolis-LightItalic'), url('#{$fontsPath}Metropolis-LightItalic.woff2') format('woff2'), url('#{$fontsPath}Metropolis-LightItalic.woff') format('woff') - font-display: swap - -@font-face - font-family: 'Metropolis' - font-style: normal - font-weight: 400 - src: local('Metropolis Regular'), local('Metropolis-Regular'), url('#{$fontsPath}Metropolis-Regular.woff2') format('woff2'), url('#{$fontsPath}Metropolis-Regular.woff') format('woff') - font-display: swap - -@font-face - font-family: 'Metropolis' - font-style: italic - font-weight: 400 - src: local('Metropolis Regular Italic'), local('Metropolis-RegularItalic'), url('#{$fontsPath}Metropolis-RegularItalic.woff2') format('woff2'), url('#{$fontsPath}Metropolis-RegularItalic.woff') format('woff') - font-display: swap - -@font-face - font-family: 'Metropolis' - font-style: normal - font-weight: 500 - src: local('Metropolis Medium'), local('Metropolis-Medium'), url('#{$fontsPath}Metropolis-Medium.woff2') format('woff2'), url('#{$fontsPath}Metropolis-Medium.woff') format('woff') - font-display: swap - -@font-face - font-family: 'Metropolis' - font-style: italic - font-weight: 500 - src: local('Metropolis Medium Italic'), local('Metropolis-MediumItalic'), url('#{$fontsPath}Metropolis-MediumItalic.woff2') format('woff2'), url('#{$fontsPath}Metropolis-MediumItalic.woff') format('woff') - font-display: swap - -@font-face - font-family: 'Metropolis' - font-style: normal - font-weight: 700 - src: local('Metropolis Bold'), local('Metropolis-Bold'), url('#{$fontsPath}Metropolis-Bold.woff2') format('woff2'), url('#{$fontsPath}Metropolis-Bold.woff') format('woff') - font-display: swap - -@font-face - font-family: 'Metropolis' - font-style: italic - font-weight: 700 - src: local('Metropolis Bold Italic'), local('Metropolis-BoldItalic'), url('#{$fontsPath}Metropolis-BoldItalic.woff2') format('woff2'), url('#{$fontsPath}Metropolis-BoldItalic.woff') format('woff') - font-display: swap diff --git a/assets/sass/_mobile.sass b/assets/sass/_mobile.sass deleted file mode 100644 index adf50fc91..000000000 --- a/assets/sass/_mobile.sass +++ /dev/null @@ -1,80 +0,0 @@ -@media screen and (max-width: $mobile-menu-breakpoint) - .nav - // padding-bottom: 2rem - &, &_body - flex-direction: column - &_body - position: fixed - width: 90% - max-width: 16.5rem - top: 0 - bottom: 0 - background-color: $bg - transition: transform 0.3s var(--easing) - &_right - transform: translateX(100vw) - right: 0 - &_left - transform: translateX(-100vw) - left: 0 - - &_close - width: 3rem - position: absolute - right: -4rem - top: 0 - bottom: 0 - height: 100% - cursor: pointer - z-index: 1000 - display: flex - justify-content: center - align-items: center - svg - width: 1.25rem - fill: var(--light) - height: 1.25rem - display: none - &:first-child - display: initial - &.isopen - display: none - + svg - display: initial - - &_brand - position: relative - z-index: 999 - width: calc(100% - 3rem) - padding-left: 0 - - &_parent - display: grid - &_sub - position: relative - top: initial - padding-top: 0 - - .jsopen - &::after - content: "" - position: fixed - z-index: 2 - background-color: rgba(0,0,0,0.3) - top: 0 - left: 0 - right: 0 - bottom: 0 - .nav - &_body - transform: translateX(0) - padding-left: 1.5rem - padding-right: 1.5rem - &_parent - &:first-child - margin-top: 4.4rem - - .follow - justify-content: flex-start - flex: initial - margin-top: 0.75rem diff --git a/assets/sass/_override.sass b/assets/sass/_override.sass deleted file mode 100644 index 7808b6487..000000000 --- a/assets/sass/_override.sass +++ /dev/null @@ -1,78 +0,0 @@ -// override clarity theme's _variables.sass file. -// we recommend not editing this file directly. Instead, create an `assets/sass/_override.sass` file at the root level of your site. -// if you edit this file directly, you will have to resolve git conflicts when and if you decide to pull changes we make on the theme -.landing-content - // background-image: url(/image/background.svg) - margin: 0 - padding: 2rem - gap: 10px - // height: 90vh - max-width: 100% - // border: solid blue 1px - display: grid - align-content: center - justify-content: center - margin: 15px auto - - div - text-align: center - h3 - max-width: 1000px - -.info - max-width: 65rem - margin: 15px auto - - - -$light: #e6f4f1//#fff -$haze: #fafafa -$xhaze: darken($haze, 11%) -$bg: #374955//#002a57//#002538 -$theme: #0ca5de//#0077b8 -$mobile-menu-breakpoint: 769px -$single-column-breakpoint: 42rem - -html - --color-mode: 'lit' - --light: #fff - --dark: #102723//#000 - --bg: #374955//#002a57//#002538 - --haze: #f2f2f2 - --gray: #020202 - --accent: var(--gray) - --text: #575757 - --header-text: var(--dark) - --font: Metropolis, sans-serif - --theme: #0077b8 - --ease: cubic-bezier(.19,1,.22,1) - --code-bg: var(--bg) - --table-bg: var(--light) - --table-haze: var(--haze) - --table-border: #dedede - --footer-bg: var(--haze) - --shadow: rgba(0,0,0,0.12) - --translucent: rgba(0,0,0,0.05) - --translucent-light: rgba(255,255,255,0.05) - --post-bg: var(--light) - --choice-bg: var(--haze) - --ease: cubic-bezier(0.39, 0.575, 0.565, 1) - --easing: cubic-bezier(.19,1,.22,1) - --notice-code-bg: var(--bg) - --notice-info-border-color: #6AB0DE - --notice-info-background: #E7F2FA - --notice-note-border-color: #F0B37E - --notice-note-background: #FFF2DB - --notice-tip-border-color: rgba(92, 184, 92, 0.8) - --notice-tip-background: #E6F9E6 - --notice-warning-border-color: rgba(217, 83, 79, 0.8) - --notice-warning-background: #FAE2E2 - -.logo - height: 50px - -h3 > a - color: #0ca5de - -.author_name - font-weight: 500 diff --git a/assets/sass/_syntax.sass b/assets/sass/_syntax.sass deleted file mode 100644 index 7adb615d3..000000000 --- a/assets/sass/_syntax.sass +++ /dev/null @@ -1,239 +0,0 @@ -@keyframes pulse - 0% - opacity: 1 - 75% - opacity: 0.1 - 100% - opacity: 1 - -code - font-size: 85% - font-weight: 400 - overflow-y: hidden - display: block - font-family: 'Monaco', monospace - word-break: break-all - &.noClass - --inlineColor: rgb(194, 29, 0) - color: var(--inlineColor) - display: inline - line-break: anywhere -.windows .highlight - overflow-x: hidden - &:hover - overflow-x: auto - -.highlight - display: grid - width: 100% - border-radius: 0 0.2rem 0.2rem 0 - overflow-x: auto - // @media screen and (min-width: 1240px) - // overflow-x: hidden - // &:hover - // overflow-x: auto - position: relative - &_wrap - background: var(--code-bg) !important - border-radius: 0.5rem - position: relative - padding: 0 1rem - margin: 1.5rem auto 1rem auto - & + & - margin-top: 2.25rem - &:hover > div - opacity: 1 - .lang - position: absolute - // background-color: var(--bg) - top: 0 - right: 0 - text-align: right - width: 7.5rem - padding: 0.5rem 1rem - font-style: italic - text-transform: uppercase - font-size: 67% - opacity: 0.5 - color: var(--light) - &:hover .lang - opacity: 0.1 - & & - margin: 0 - pre - color: var(--light) !important - border-radius: 4px - font-family: 'Monaco', monospace - padding-top: 1.5rem - padding-bottom: 2rem - - table - display: grid - max-width: 100% - margin-bottom: 0 - background: transparent - td, th - padding: 0 - - .lntd - width: 100% - border: none - &:first-child - &, pre - width: 2.5rem !important - padding-left: 0 - padding-right: 0 - color: rgba(255,255,255,0.5) - user-select: none - - pre - width: 100% - display: flex - align-items: center - flex-direction: column - -.err - color: #a61717 - background-color: #e3d2d2 -.hl - width: 100% - background-color: rgba(255,255,255,0.25) -.ln, .lnt - margin-right: 0.75rem - padding: 0 - transition: opacity 0.3s var(--ease) - &, span - color: hsla(0,0%,100%,0.5) - user-select: none - -.k, .kc, .kd, .kn, .kp, .kr, .kt, .nt - color: #6ab825 - font-weight: 500 - -.kn, .kp - font-weight: 400 - -.nb, .no, .nv - color: #24909d - -.nc, .nf, .nn - color: #447fcf - -.s, .sa, .sb, .sc, .dl, .sd, .s2, .se, .sh, .si, .sx, .sr, .s1, .ss - color: #ed9d13 - -.m, .mb, .mf, .mh, .mi, .il, .mo - color: #3677a9 - -.ow - color: #6ab825 - font-weight: 500 - -.c, .ch, .cm, .c1 - color: #999 - font-style: italic - -.cs - color: #e50808 - background-color: #520000 - font-weight: 500 - -.cp, .cpf - color: #cd2828 - font-weight: 500 - -.gd, .gr - color: #d22323 - -.ge - font-style: italic - -.gh, .gu, .nd, .na, .ne - color: #ffa500 - font-weight: 500 - -.gi - color: #589819 - -.go - color: #ccc - -.gp - color: #aaa - -.gs - font-weight: 500 - -.gt - color: #d22323 -.w - color: #666 - -.hljs - &-string - color: #6ab825 - &-attr - color: #ed9d13 - .p &-attr - color: var(--light) - -.pre - &_wrap - white-space: pre-wrap - white-space: -moz-pre-wrap - white-space: -pre-wrap - white-space: -o-pre-wrap - word-wrap: break-word - - &_nolines.line .ln - display: none - -// crayon-like widget styles -.panel - &_box - display: inline-flex - // grid-template-columns: repeat(3, 1fr) - // max-width: 10rem - perspective: 300px - grid-gap: 0.5rem - transition: opacity 0.3s var(--easing) - background: var(--code-bg) - padding: 0.5rem 1.5rem - border-radius: 2rem - align-items: center - position: absolute - right: 0rem - top: -2.1rem - opacity: 0 - &_icon - display: inline-flex - align-items: center - justify-content: center - cursor: pointer - // transition: opacity 0.3s var(--easing) - padding: 0.1rem - transform-origin: 50% 50% - // opacity: 0.7 - background-size: 100% - background-repeat: no-repeat - &.active - animation: pulse 0.1s linear - svg - fill: var(--light) - width: 1.5rem - height: 1.5rem - &_hide - // hide icon if not needed - display: none - &_from - position: absolute - color: var(--theme) - bottom: 0 - font-size: 1.5rem - font-weight: 500 - padding: 0.5rem 0 - cursor: pointer - letter-spacing: 0.1px - z-index: 19 - &_expanded &_from - display: none diff --git a/assets/sass/_utils.sass b/assets/sass/_utils.sass deleted file mode 100644 index fa3584c67..000000000 --- a/assets/sass/_utils.sass +++ /dev/null @@ -1,66 +0,0 @@ -@for $i from 1 through 2 - $size: $i * 1.5rem - $x-size: $size * 0.5 - .pt-#{$i} - padding-top: $size - - .pb-#{$i} - padding-bottom: $size - - .mt-#{$i} - margin-top: $size - - .mb-#{$i} - margin-bottom: $size - -.flex - display: flex - flex-direction: column - align-items: center - -.shadow - box-shadow: 0 0 60px rgba(0, 0, 0, 0.17) - -@media screen and (min-width: $single-column-breakpoint) - %grid - display: grid - grid-template-columns: 1fr - - [class*='grid-'] - grid-gap: 2rem - - .grid-2, .grid-3, .grid-4, .grid-auto, .grid-inverse - @extend %grid - .grid-inverse - grid-template-columns: 70% 1fr - grid-column-gap: 4rem - .grid-2 - grid-template-columns: 1fr 1fr - .grid-3 - grid-template-columns: repeat(auto-fit, minmax(19rem, 1fr)) - .grid-4 - grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)) - -$sites: ("facebook": #325c94, "twitter": #00abdc,"linkedin": #007bb6) - -@each $item, $color in $sites - .#{$item} - svg - fill: $color - -// 404 page -.never - height: 75vh - display: flex - justify-content: center - align-items: center - flex-direction: column - padding: 1.5rem - text-align: center - -.inline - display: inline - margin: 0 - -.hidden - display: none \ No newline at end of file diff --git a/assets/sass/_variables.sass b/assets/sass/_variables.sass deleted file mode 100644 index e4ac25308..000000000 --- a/assets/sass/_variables.sass +++ /dev/null @@ -1,123 +0,0 @@ -$light: #fff -$haze: #fafafa -$xhaze: darken($haze, 11%) -$bg: #002538 -$theme: #0077b8 -$mobile-menu-breakpoint: 769px -$single-column-breakpoint: 42rem - -@mixin content() - --maxWidth: 1440px - // --maxWidth: 65rem - max-width: var(--maxWidth) - margin-left: auto - margin-right: auto - -@mixin viewport($width: 1024px, $margin: 25px) - max-width: $width - margin: $margin auto - @content - -@mixin shadow($opacity: 0.17) - box-shadow: 0 0 3rem rgba(0,0,0,$opacity) - &:hover - box-shadow: 0 0 5rem rgba(0,0,0, (1.5 * $opacity)) - -html - --color-mode: 'lit' - --light: #fff - --dark: #000 - --bg: #002538 - --haze: #f2f2f2 - --gray: #020202 - --accent: var(--gray) - --text: #575757 - --header-text: var(--dark) - --font: Metropolis, sans-serif - --theme: #0077b8 - --ease: cubic-bezier(.19,1,.22,1) - --code-bg: var(--bg) - --table-bg: var(--light) - --table-haze: var(--haze) - --table-border: #dedede - --footer-bg: var(--haze) - --shadow: rgba(0,0,0,0.12) - --translucent: rgba(0,0,0,0.05) - --translucent-light: rgba(255,255,255,0.05) - --post-bg: var(--light) - --choice-bg: var(--haze) - --ease: cubic-bezier(0.39, 0.575, 0.565, 1) - --easing: cubic-bezier(.19,1,.22,1) - --notice-code-bg: var(--bg) - --notice-info-border-color: #6AB0DE - --notice-info-background: #E7F2FA - --notice-note-border-color: #F0B37E - --notice-note-background: #FFF2DB - --notice-tip-border-color: rgba(92, 184, 92, 0.8) - --notice-tip-background: #E6F9E6 - --notice-warning-border-color: rgba(217, 83, 79, 0.8) - --notice-warning-background: #FAE2E2 - - &.page - --choice-bg: var(--light) - @mixin darkmode - --light: hsla(0,0%,100%,0.87) - --color-mode: 'dim' - --text: var(--light) - --accent: var(--bubble) - --choice-bg: var(--bg) - --code-bg: var(--translucent-light) - --header-text: var(--light) - --table-bg: var(--code-bg) - --table-haze: rgba(255,255,255,0.1) - --table-border: var(--code-bg) - --footer-bg: var(--bg) - --post-bg: var(--translucent-light) - * - // box-shadow: none !important - - &[data-mode="dim"] - @include darkmode - blockquote - background: var(--translucent-light) - color: #dedede - svg.icon - fill: var(--light) - .icon - img - background: none - svg - fill: #fafafa - .sidebar - &_inner - &::before - display: none - .color - &_choice - &::after - background-image: url("#{$imagesPath}night-moon.jpg") - transform: translateX(1.4rem) - - @media (prefers-color-scheme: dark) - - &:not([data-mode="lit"]) - @include darkmode - blockquote - background: var(--translucent-light) - color: #dedede - svg.icon - fill: var(--light) - .icon - img - background: none - svg - fill: #fafafa - .sidebar - &_inner - &::before - display: none - .color - &_choice - &::after - background-image: url("#{$imagesPath}night-moon.jpg") - transform: translateX(1.4rem) diff --git a/assets/sass/main.sass b/assets/sass/main.sass deleted file mode 100644 index cd7db7264..000000000 --- a/assets/sass/main.sass +++ /dev/null @@ -1,16 +0,0 @@ -$baseURL: '{{ .Site.BaseURL }}' -$fontsPath: '{{ printf "../%s" (default "fonts/" .Site.Params.fontsDir) }}' -$imagesPath: '{{ printf "../%s" (default "images/" .Site.Params.imagesDir) }}' -$iconsPath: '{{ printf "../%s" (default "icons/" .Site.Params.iconsDir) }}' -@import 'variables' -@import 'override' -// include static fonts only when they're not overriden -{{- if ne .Site.Params.customFonts true }} -@import 'fonts' -{{- end }} -@import 'base' -@import 'components' -@import 'utils' -@import 'mobile' -@import 'syntax' -@import 'custom' diff --git a/content/programs/ambassadors/index.md b/bkp/affiliations/ambassadors/index.md similarity index 93% rename from content/programs/ambassadors/index.md rename to bkp/affiliations/ambassadors/index.md index 94fd1788a..5767d6a68 100644 --- a/content/programs/ambassadors/index.md +++ b/bkp/affiliations/ambassadors/index.md @@ -1,12 +1,9 @@ -+++ -title = "Ambassadors Program" -description = "Ambassadors Program" -date = "2023-08-27" -aliases = ["ambassadors"] -author = "OSL Team" -sidebar = false -singlecolumn = true -+++ +--- +title: "Ambassadors Program" +description: "Ambassadors Program" +date: "2023-08-27" +authors: ["OSL Team"] +--- # Open Science Labs (OSL) Ambassadors Program diff --git a/bkp/affiliations/index.md b/bkp/affiliations/index.md new file mode 100644 index 000000000..8d0135ea4 --- /dev/null +++ b/bkp/affiliations/index.md @@ -0,0 +1,35 @@ +--- +title: Affiliations +template: main.html +--- + +# Affiliations at Open Science Labs + +Open Science Labs (OSL) believes in the power of collaboration and community to +drive forward the mission of open science. Our affiliations are designed to +foster strong connections between individuals, projects, and organizations, +creating a vibrant ecosystem where open-source and scientific research can +flourish. Through our affiliation options, we aim to provide a supportive +network that enables shared learning, development, and growth. Currently, OSL is +proud to offer some distinct pathways for affiliation: + +- **Project Affiliation** is tailored for open-source projects seeking support + and visibility within the OSL community. This affiliation provides projects + with resources, mentorship, and access to a network of like-minded individuals + committed to the advancement of open science. + +- **Partnership** is designed for organizations and institutions that align with + OSL's goals and values. Through collaborative efforts, partnerships enhance + the reach and impact of open science initiatives, contributing to a broader + community of practice and knowledge sharing. + +- **OpenHub** offers local and regional groups a platform to connect, share + resources, and collaborate on projects. This affiliation fosters community + engagement and allows for the exchange of ideas and best practices on a more + intimate level. + +Each affiliation option is crafted to meet the diverse needs of our community +members, from individual contributors to large institutions. By joining forces +under these affiliations, we can collectively work towards a future where open +science is the norm, not the exception. Explore our affiliation opportunities to +find out how you can become an integral part of the Open Science Labs ecosystem. diff --git a/content/programs/affiliation/index.md b/bkp/affiliations/membership/index.md similarity index 91% rename from content/programs/affiliation/index.md rename to bkp/affiliations/membership/index.md index eb6d7f37b..c57f25008 100644 --- a/content/programs/affiliation/index.md +++ b/bkp/affiliations/membership/index.md @@ -1,14 +1,11 @@ -+++ -title = "Affiliation Program" -description = "Affiliation Program" -date = "2023-08-27" -aliases = ["affiliation"] -author = "OSL Team" -sidebar = false -singlecolumn = true -+++ - -# Open Science Labs (OSL) Affiliation Program +--- +title: "Member Affiliation Program" +description: "Member Affiliation Program" +date: "2023-08-27" +authors: ["OSL Team"] +--- + +# Open Science Labs Member Affiliation Program ## Connect, Collaborate, and Contribute to the Future of Open Science and Open Source Projects diff --git a/bkp/affiliations/open-hub/index.md b/bkp/affiliations/open-hub/index.md new file mode 100644 index 000000000..cbb10c411 --- /dev/null +++ b/bkp/affiliations/open-hub/index.md @@ -0,0 +1,80 @@ +--- +title: "OSL Open Hub" +description: "OSL Open Hub" +date: "2024-02-07" +authors: ["OSL Team"] +--- + +# OSL OpenHub: Local and Regional Open Science Labs Communities + +## What is OSL OpenHub? + +OSL OpenHub represents a global network of local and regional communities under +the Open Science Labs (OSL) umbrella, dedicated to fostering open science, +technology, and innovation at a grassroots level. Each OpenHub serves as a local +nexus for individuals passionate about open science and technology, providing a +space for collaboration, learning, and community engagement. + +OpenHubs are designed to: + +- Promote open science principles and practices within local communities. +- Facilitate knowledge exchange and collaborative projects. +- Organize local events, workshops, and meetups. +- Support local members in contributing to open source projects. + +## Becoming an OSL OpenHub + +Local groups interested in becoming an official OSL OpenHub are invited to apply +for affiliation, embracing the opportunity to be part of a vibrant, global +network committed to the open science movement. Here’s how: + +### Step 1: Gather Your Community + +Form a local group of individuals passionate about open science and technology. +Your group should have a clear mission aligned with the goals of OSL and a +commitment to fostering an inclusive, collaborative environment. + +### Step 2: Prepare Your Application + +Compile an application proposal that includes: + +- A brief description of your group and its mission. +- Information about the core members and their roles. +- A summary of past and planned activities or events. +- A statement on how your group plans to contribute to the broader OSL mission + and goals. +- Any social media or website links related to your group. + +### Step 3: Submit Your Application + +Send your application to `opensciencelabs+openhub@gmail.com`. Please title your +email "OSL OpenHub Application - [Your Group Name]". + +### Step 4: Review and Approval + +Your application will be reviewed by the OSL team. This process includes +assessing your group's alignment with OSL’s mission, the impact potential of +your activities, and the inclusiveness of your community. Approved groups will +be notified and provided with further instructions on officially becoming an OSL +OpenHub. + +### Step 5: Official Affiliation + +Upon approval, your group will be officially recognized as an OSL OpenHub. +You’ll receive a category inside to OSL discord server where you will be able to +create channels for organize your OSL OpenHub. + +## Benefits of Being an OSL OpenHub + +As an OSL OpenHub, you’ll gain: + +- Recognition as part of a global network of open science enthusiasts. +- Access to resources and support from OSL for organizing events and activities. +- Opportunities for collaboration with other OpenHubs and the broader OSL + community. +- Visibility through OSL’s platforms, helping to attract new members and + partners. + +OSL OpenHubs play a crucial role in expanding the reach and impact of open +science practices worldwide. We look forward to welcoming new OpenHubs into our +community and together, driving the future of open science and technology. diff --git a/content/blog/algunos-proyectos-de-ciencia-e-inteligencia-ciudadana-para-atender-la-pandemia-del-covid-19/header.png b/bkp/blogs/algunos-proyectos-de-ciencia-e-inteligencia-ciudadana-para-atender-la-pandemia-del-covid-19/header.png similarity index 100% rename from content/blog/algunos-proyectos-de-ciencia-e-inteligencia-ciudadana-para-atender-la-pandemia-del-covid-19/header.png rename to bkp/blogs/algunos-proyectos-de-ciencia-e-inteligencia-ciudadana-para-atender-la-pandemia-del-covid-19/header.png diff --git a/bkp/blogs/algunos-proyectos-de-ciencia-e-inteligencia-ciudadana-para-atender-la-pandemia-del-covid-19/index.md b/bkp/blogs/algunos-proyectos-de-ciencia-e-inteligencia-ciudadana-para-atender-la-pandemia-del-covid-19/index.md new file mode 100644 index 000000000..9a610d017 --- /dev/null +++ b/bkp/blogs/algunos-proyectos-de-ciencia-e-inteligencia-ciudadana-para-atender-la-pandemia-del-covid-19/index.md @@ -0,0 +1,200 @@ +--- +title: + "Algunos proyectos de ciencia e inteligencia ciudadana para atender la + pandemia del COVID-19" +slug: algunos-proyectos-de-ciencia-e-inteligencia-ciudadana-para-atender-la-pandemia-del-covid-19 +date: 2020-04-16 +authors: ["Yurely Camacho"] +tags: [covid19, proyectos, ciencia ciudadana] +categories: [ciencia abierta] +description: | + La enfermedad COVID-19 causada por el coronavirus SARS-CoV-2 actualmente + es una pandemia mundial. Por tal motivo su prevención resulta sumamente + importante, y para esto es indispensable nuestra participación activa + como ciudadanos. El rápido aumento de casos de COVID-19 ha llevado a + personas de distintos lugares a organizarse en proyectos de ciencia e + inteligencia colectiva o ciudadana para enfrentar esta enfermedad. + Puedes consultar más información sobre ciencia ciudadana en nuestro + artículo *Qué es ciencia ciudadana* (enlace a artículo + queescienciaciudadana). +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +La enfermedad COVID-19 causada por el coronavirus SARS-CoV-2 actualmente es una +pandemia mundial. Por tal motivo su prevención resulta sumamente importante, y +para esto es indispensable nuestra participación activa como ciudadanos. El +rápido aumento de casos de COVID-19 ha llevado a personas de distintos lugares a +organizarse en proyectos de ciencia e inteligencia colectiva o ciudadana para +enfrentar esta enfermedad. Puedes consultar más información sobre ciencia +ciudadana en nuestro artículo _Qué es ciencia ciudadana_ (enlace a artículo +queescienciaciudadana). + + + +En este post mencionamos algunas iniciativas de ciencia e inteligencia ciudadana +que se han desarrollado en distintas partes del mundo, relacionados con la +atención al COVID-19: + +## Frena la curva + +Es una plataforma ciudadana desarrollada para canalizar y organizar la energía +social y la resiliencia cívica ante el Covid-19. Nació como una iniciativa del +Gobierno de Aragón y luego se convirtió en una plataforma ciudadana donde +participan gran cantidad de voluntarios, activistas, emprendedores, empresas, +organizaciones y laboratorios públicos de innovación abierta provenientes de +España y Latinoamérica. + +Frena la curva se originó como una respuesta de la sociedad civil sirviendo de +complemento a las medidas gubernamentales. En esta plataforma los ciudadanos +aprenden, comparten consejos y ayudan a otros a prevenir la enfermedad. Conoce +más en https://frenalacurva.net/. + +## Algunos proyectos en Barcelona-España + +### Barcelona desde casa + +Este proyecto nace de la rápida organización de la ciudadanía, agrupa distintas +iniciativas en cuatro ámbitos: cuidados colectivos y apoyo mutuo, cultura, +recursos educativos y para hacer deporte en casa. Algunas de ellas son: fondo +documental de las bibliotecas, equipamientos culturales y festivales literarios, +foro de experiencias y emociones, compartir ejercicios para hacer en casa, +juegos, recetas de cocina y otras actividades. + +[Barcelona desde casa](https://www.decidim.barcelona) ofrece también recursos +digitales en abierto para que las personas puedan acceder durante los días de +aislamiento, busca ser compartida con la familia, amigos y/o vecinos. La +iniciativa estará activa mientras duren el período de excepcionalidad y las +medidas de aislamiento en España. + +### Barcelona Cultura + +Es una plataforma digital accesible desde +https://www.barcelona.cat/barcelonacultura/es, donde se muestran y difunden +actividades que mantienen presente el tejido cultural y el + +espíritu de los equipamientos públicos y privados de la ciudad, así como las +iniciativas culturales individuales. Aquí se observan actividades donde se +informa sobre museos, recursos literarios, blibliotecas, entre otras. + +### Proyecto Radars + +Es una iniciativa comunitaria que tiene como propósito mejorar la calidad de +vida de las personas mayores, ofreciéndoles soluciones para una parte de sus +necesidades cotidianas. Los voluntarios son personas que no forman parte de +colectivos de riesgo y prestan apoyo en actividades como: llevarles los +alimentos cuando van a comprar, sacar la basura, pasear perros, entre otras. Si +deseas consultar más información, visita +https://ajuntament.barcelona.cat/serveissocials/ca/canal/projecte-daccio-comunitaria-radars. + +## Covid-19 SG + +Es una web que muestra información de Singapur sobre los casos de infección, la +calle donde vive y trabaja la persona infectada, el hospital al que ingresa, el +tiempo promedio de recuperación, entre otros detalles. Es una iniciativa del +gobierno el cual ha adoptado el enfoque abierto sobre los datos oficiales de las +infecciones y manifiesta que esta es la mejor manera de ayudar a las personas a +tomar decisiones y controlarse frente al Covid-19. Puedes acceder a esta +información en https://co.vid19.sg/. + +## Minería en redes sociales + +Ciudadanos de China y Hong Kong actúan ante la información poco fiable sobre el +Covid-19. Estas personas han estado archivando y traduciendo datos de relatos +personales de las redes sociales (Weibo, WeChat y Douban) desde China para crear +crónicas de testimonios de los afectados, antes de que sean censurados por el +gobierno, ya que no hay prensa libre. Luego de seleccionada y contrastada la +información con fuentes oficiales o noticias creíbles, proceden a traducirlas o +subtitularlas al inglés y las publican en plataformas como Imgur, Reddit, +Twitter y YouTube. + +También han creado grupos de WhatsApp y Telegran para mantener comunicadas a las +personas ante la desconfianza de las fuentes oficiales. Otras personas han +desarrollado un mapa en vivo del virus, junto con los titulares de las +principales fuentes de noticias. Accede a información más completa en +https://www.technologyreview.com/2020/02/02/349163/coronavirus-china-wuhan-hong-kong-misinformation-censorship/. + +## Juego de rompecabezas + +La Universidad de Washington adoptó un enfoque innovador para combatir el +Covid-19. Creó un juego de rompecabezas en el cuál el jugador debe construir una +proteína que pueda bloquear el virus para que no se filtre en las células +humanas, lo puede jugar cualquier persona, científicos y público en general. Las +ideas generadas por el juego que se consideren mejor fundamentadas, serán +probadas y posiblemente fabricadas por el Instituto de Diseño de Proteínas de +esta Universidad. Más información en: +https://www.geekwire.com/2020/university-washington-coronavirus-puzzle-game-aims-crowdsource-cure/ + +## Chatbot Carina + +Es un asistente virtual basado en inteligencia artificial, desarrollado en +España por la empresa [1MillionBot](https://1millionbot.com) para atender a +millones de personas sobre inquietudes acerca del Covid-19. Aparte de España, +otros países como Colombia, Chile o Guatemala se han unido a Carina para +fomentar la difusión de información sobre coronavirus. El chatbot contesta +preguntas básicas y algunas especializadas con respecto a contagio, síntomas, +prevención y medidas derivadas de la alarma del gobierno. + +Carina está a disposición de cualquier organismo público y entidades que lo +soliciten para contar con ella en sus páginas web o servicios de información. La +base de datos que maneja Carina está basada en información de la Organización +Mundial de la Salud (OMS), el Ministerio de Sanidad y normativas +gubernamentales, el Center For Disease, Control and Prevention, artículos +científicos e información de artículos de prensa certificados. Encontrarás +información adicional sobre Carina en +https://1millionbot.com/chatbot-coronavirus/ + +## OpenWHO + +Es una plataforma interactiva de la OMS que proporciona cursos en línea a las +personas que trabajan o se preparan para trabajar en epidemias, pandemias y +emergencias sanitarias. La plataforma cuenta, entre otros, con un canal llamado +COVID-19 que brinda recursos de aprendizaje para los profesionales de la salud, +los responsables de la adopción de decisiones y el público en general sobre esta +enfermedad. Encuéntralo en https://openwho.org/channels/covid-19. + +De acuerdo a la evolución de la enfermedad la plataforma actualizará los cursos, +los cuales están disponibles en varios idiomas en el canal de idiomas nacionales +de COVID-19 en la misma plataforma. + +## Ayuda Innovadora a la Respiración (AIRE) + +Es un foro Español donde los participantes recopilan información, en forma +colectiva, en búsqueda de alternativas de código abierto, fáciles de fabricar y +baratas para desarrollar sistemas de ventilación en pacientes con COVID-19. El +proyecto surge como una actividad solidaria totalmente desinteresada y es +similar a otras ideas como +[Open Source Ventilator](https://hackaday.com/2020/03/12/ultimate-medical-hackathon-how-fast-can-we-design-and-deploy-an-open-source-ventilator). + +Al foro se han ido incorporando muchos voluntarios, como ingenieros, +fabricantes, emprendedores y médicos. Encuentra más información en +https://foro.coronavirusmakers.org/. + +Finalmente, destacamos que la ciencia e inteligencia ciudadana está siendo un +gran método para luchar contra el COVID-19, empleándose en todo el mundo por +comunidades y gobiernos para dar respuesta a esta situación. Te animamos a que +seas partícipe de cualquier proyecto de ciencia ciudadana en tu comunidad, o te +permitas emprender uno propio. + +### Referencias + +- [Proyecto Frena la Curva](https://frenalacurva.net/) + +- [Decidim Barcelona](https://www.decidim.barcelona) + +- [Barcelona Cultura](https://www.barcelona.cat/barcelonacultura/es) + +- [Proyecto Radars](https://ajuntament.barcelona.cat/serveissocials/ca/canal/projecte-daccio-comunitaria-radars) + +- [Covid-SG](https://co.vid19.sg/) + +- [Juego de rompecabezas Universidad de Washington](https://www.geekwire.com/2020/university-washington-coronavirus-puzzle-game-aims-crowdsource-cure/) + +- [Chatbot Carina](https://1millionbot.com/chatbot-coronavirus/) + +- [OpenWHO](https://openwho.org/channels/covid-19) + +- [AIRE](https://foro.coronavirusmakers.org/) diff --git a/content/blog/algunos-proyectos-entretenidos-de-codigo-abierto/header.png b/bkp/blogs/algunos-proyectos-entretenidos-de-codigo-abierto/header.png similarity index 100% rename from content/blog/algunos-proyectos-entretenidos-de-codigo-abierto/header.png rename to bkp/blogs/algunos-proyectos-entretenidos-de-codigo-abierto/header.png diff --git a/bkp/blogs/algunos-proyectos-entretenidos-de-codigo-abierto/index.md b/bkp/blogs/algunos-proyectos-entretenidos-de-codigo-abierto/index.md new file mode 100644 index 000000000..0a7419944 --- /dev/null +++ b/bkp/blogs/algunos-proyectos-entretenidos-de-codigo-abierto/index.md @@ -0,0 +1,138 @@ +--- +title: "Algunos proyectos entretenidos de código abierto" +slug: algunos-proyectos-entretenidos-de-codigo-abierto +date: 2020-01-10 +authors: ["Rainer Palm"] +tags: [código, proyectos] +categories: [ciencia abierta, código abierto] +description: | + Alrededor del mundo, gracias a la importancia del sector tecnológico a nivel + global, existe una gran cantidad de programadores, todos con sus destrezas, + afinidades y aspiraciones particulares que hacen de sus proyectos colaborativos + algo interesante y único, contribuyendo con su toque personal. Debido a la gran + prevalencia de prácticas de código abierto en plataformas tales como Github, + utilizadas por la mayoría de los desarrolladores de software existentes, se + puede ver en ocasiones cómo el proceso mediante el cual proyecto se llevó a cabo + y cómo pensaron respecto a ciertos problemas que se presentaron, cómo previeron + cada mínimo detalle necesario para reproducir y crear de manera independiente el + producto final, ya sea una pieza de software, un diseño de hardware, o inclusive + algo tan común pero no menos importante como lo es una foto o un sonido, + reproducibles en todo sentido de la palabra. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Alrededor del mundo, gracias a la importancia del sector tecnológico a nivel +global, existe una gran cantidad de programadores, todos con sus destrezas, +afinidades y aspiraciones particulares que hacen de sus proyectos colaborativos +algo interesante y único, contribuyendo con su toque personal. Debido a la gran +prevalencia de prácticas de código abierto en plataformas tales como Github, +utilizadas por la mayoría de los desarrolladores de software existentes, se +puede ver en ocasiones cómo el proceso mediante el cual proyecto se llevó a cabo +y cómo pensaron respecto a ciertos problemas que se presentaron, cómo previeron +cada mínimo detalle necesario para reproducir y crear de manera independiente el +producto final, ya sea una pieza de software, un diseño de hardware, o inclusive +algo tan común pero no menos importante como lo es una foto o un sonido, +reproducibles en todo sentido de la palabra. + + + +Todo esto puede hacer el proceso de ver que tipos de proyectos la gente ha +realizado, algo bastante interesante, inclusive más allá de la útilidad que el +producto final te podría aportar. Ver como otros desarrolladores han pensado en +torno a problemas específicos es algo que puede resultar increíblemente +productivo a la larga, ya que te permite reconfigurar tu mente y encontrar +métodos de resolución de problemas en los cuales quizás no hayas pensado, y +quizás te des cuenta de que existen otros problemas en la forma en la que +comunmente planteas tu flujo de trabajo. + +Para encontrar cualquier cantidad de proyectos increíbles en todo tipo de áreas +(ya sea inteligencia artificial, ingeniería eléctrica, la física, los +videojuegos o el procesamiento de imágenes y sonido) solo hace falta un poco de +curiosidad y algo de tiempo libre. A pesar de que existen muchas iniciativas que +pueden llegar a parecer algo sencillas o no muy claras, hay muchas personas cuyo +trabajo está lleno de pasión, y realmente se merece tu atención. Desde lectores +digitales de tinta electrónica D.I.Y. hasta inteligencia artificial que compone +canciones basadas en tu estilo, te sorprenderá la cantidad de creatividad que +pueden mostrar. + +## Handmade Hero + +Handmade Hero[1] es un proyecto en marcha que intenta "crear un juego completo, +de calidad profesional, acompañado por videos que expliquen cada línea de su +codigo fuente". Se trata de directos de dos horas cada uno, hasta la fecha, han +habido 609, mediante los cuales el programador (Casey Muratori) explica paso a +paso cómo él crea un juego desde cero, desde la creación del entorno de +programación en el cual se va a compilar el coóigo, pasando por una multitud de +temas relacionados a escritura de código multiplataforma, salida de sonido, +arquitectura del juego, manejo de memoría, renderización de gráficos, procesos +de debugging, uso de OpenGL, voxeles, entre muchos otros más. En cuanto se lance +el juego al mercado, éste se venderá junto al código fuente, el cual estará +disponible bajo una licencia de acceso público después de dos años. + +## The Open Book + +The Open Book[2] es un proyecto disponible en GitHub que busca crear una +alternativa completamente libre y abierta a aquellos dispositivos que están +especializados para la lectura de libros y otros documentos digitales. Tal como +lo plantean en la pagina del proyecto: "Los libros están entre los documentos +más importantes de nuestra cultura, pero aún asi, todos los dispositivos de +lectura - el Kobo, el Nook, la Kindle e inclusive el iPad son todos dispositivos +cerrados, operando como piezas pequeñas autónomas de plataformas grandes y +cerradas cuyos dueños no suelen tener los mismos intereses que sus lectores". +Para este propósito, el Open Book esta diseñado de tal forma que el usuario +pueda fácilmente añadir o quitar accesorios o pedazos de código según sea +adecuado para sus necesidades, y tiene una documentación extensa en la cual se +detalla tanto la preparación del circuito Arduino como las piezas necesarias y +cómo ensamblarlas. + +## LifeTrac + +Formando parte de la iniciativa Open Source Ecology[3], como parte de un +conjunto de modelos abiertos (llamado GVCS, o Global Village Construction +Set[4]) que buscan ofrecer versiones de libre acceso de "aquellas 50 máquinas +que se requieren para que exista la vida contemporánea", el LifeTrac[5] se +trata, tal como su nombre lo indica, de un tractor multipropósito completamente +abierto y de bajo costo. Resalta, además, por su diseño modular, con motores +desmontables y partes que se comparten entre las demas máquinas de este +conjunto, permitiendo que tenga la habilidad de 'cambiar' de forma rápida entre +éstas. Este acercamiento al modelo le otorga además una vida útíl más larga +debido a que le da una mayor facilidad de reparación. En su wiki ofrecen +diagramas y planos detallados que permiten a cualquiera con las herramientas +adecuadas fabricar cada pieza y ensamblarla sín restricción alguna respecto a su +uso. + +## Magenta + +Magenta[6] es un proyecto de investigación multimedia utilizando Python y +TensorFlow para "explorar el rol del _machine learning_ en el proceso de +creación del arte y la música". Similar a otras iniciativas de inteligencia +artificial, tales como MuseNet[7], buscan crear algoritmos de entrenamiento y +refuerzo profundo para la generación no solamente de archivos de audio, sino +también de imágenes, dibujos, y otros materiales, con el propósito no tanto de +"estorbar" o quizás "remplazar" artistas y músicos ya existentes, sino +simplemente de proporcionarles herramientas inteligentes que actuén como una +extensión de su flujo de trabajo actual. Si quieres ver los frutos de su +investigación, puedes ver tanto los modelos que han creado hasta ahora en su +GitHub como una lista de aplicaciones y demostraciones[8] que han preparado los +autores del proyecto, los cuales incluyen un percusionista que genera ritmos +basados en las melodías que toques[9], una inteligencia artificial que intenta +emular tu estilo de composición[10], y inclusive similares aplicaciones que +funcionan como plugins de Ableton Live[11]. + +[1]: https://handmadehero.org/ "Handmade Hero" +[10]: https://magenta.tensorflow.org/midi-me "MidiMe" +[11]: https://magenta.tensorflow.org/studio-announce "Magenta Studio" +[2]: https://github.com/joeycastillo/The-Open-Book "The Open Book" +[3]: https://www.opensourceecology.org/about-overview/ "Open Source Ecology" +[4]: + https://wiki.opensourceecology.org/wiki/Global_Village_Construction_Set + "Global Village Construction Set" +[5]: https://wiki.opensourceecology.org/wiki/LifeTrac "LifeTrac" +[6]: https://github.com/magenta/magenta "Magenta" +[7]: https://openai.com/blog/musenet/ "MuseNet" +[8]: https://magenta.tensorflow.org/demos/web/ "Web apps built with Magenta.js" +[9]: https://magenta.tensorflow.org/drumbot "DrumBot" diff --git a/content/blog/apache-superset/EpiGraphHub.jpg b/bkp/blogs/apache-superset/EpiGraphHub.jpg similarity index 100% rename from content/blog/apache-superset/EpiGraphHub.jpg rename to bkp/blogs/apache-superset/EpiGraphHub.jpg diff --git a/content/blog/apache-superset/Superset.jpg b/bkp/blogs/apache-superset/Superset.jpg similarity index 100% rename from content/blog/apache-superset/Superset.jpg rename to bkp/blogs/apache-superset/Superset.jpg diff --git a/content/blog/apache-superset/header.png b/bkp/blogs/apache-superset/header.png similarity index 100% rename from content/blog/apache-superset/header.png rename to bkp/blogs/apache-superset/header.png diff --git a/bkp/blogs/apache-superset/index.md b/bkp/blogs/apache-superset/index.md new file mode 100644 index 000000000..bf8be0398 --- /dev/null +++ b/bkp/blogs/apache-superset/index.md @@ -0,0 +1,233 @@ +--- +title: + "Crea una aplicación web eficiente y atractiva para el manejo, exploración y + visualización de datos con Apache Superset" +slug: apache-superset +date: 2022-10-26 +authors: ["Yurely Camacho"] +tags: [apache superset, datos, visualización de datos, dashboard] +categories: [ciencia de datos, SQL] +description: | + Si eres analista o científico de datos, investigador, trabajas en un + equipo de inteligencia de negocios o simplemente estás buscando una + plataforma atractiva que te permita explorar y visualizar tus datos de + manera rápida y eficiente a gran escala; aquí te presentamos Apache + Superset. Conoce con nosotros sus características más importantes, las + funcionalidades que ofrece, algunas empresas que lo utilizan y cómo + hacer tu primer gráfico y dashboard. +thumbnail: "/header.png" +template: "blog-post.html" +--- + +Fuente:[Apache Superset](https://superset.apache.org/) + +Si eres analista o científico de datos, investigador, trabajas en un equipo de +inteligencia de negocios o simplemente estás buscando una plataforma atractiva +que te permita explorar y visualizar tus datos de manera rápida y eficiente a +gran escala; aquí te presentamos Apache Superset. Conoce con nosotros sus +características más importantes, las funcionalidades que ofrece, algunas +empresas que lo utilizan y cómo hacer tu primer gráfico y dashboard. + + + +## ¿Qué es Apache Superset? + +Es una plataforma moderna muy utilizada en equipos de inteligencia de negocios. +Una aplicación web de código abierto implementada en Python que está en período +de incubación en [The Apache Software Foundation (ASF)](https://www.apache.org/) +y es patrocinada por [Apache Incubator](https://incubator.apache.org/). Cuenta +con una interfaz simple y permite al usuario crear y compartir dashboards, +explorar, filtrar y organizar datos a gran escala, esto significa que puedes +modificar la aplicación según tus necesidades. + +Esta iniciativa comenzó en Airbnb en 2015 como un proyecto de hackathon y se +unió al programa Apache Incubator en 2017. Para 2021, la Apache Software +Foundation anunció que Superset era un proyecto de alto nivel. Puedes encontrar +el proyecto alojado en [GitHub](https://github.com/apache/superset). + +## Características y funcionalidades + +- Es intuitivo y rápido. + +- Brinda una amplia variedad de opciones de gráficos y consultas que facilitan + la exploración y visualización de datos. Así como la creación de reportes. + +- Es utilizado por usuarios con todo tipo de conocimientos. No necesitas ser + experto en programación o SQL para usarlo. + +- Permite la creación de dashboards interactivos y gráficos sin escribir código. + +- Es compatible con la mayoría de fuentes de datos basadas en SQL a través de + SQLAlchemy, entre ellas: + [Amazon Redshift](https://aws.amazon.com/es/redshift/), + [druid](https://druid.apache.org/), [ClickHouse](https://clickhouse.com/), + [databricks](https://www.databricks.com/), [MySQL](https://www.mysql.com/), + [SQLServer](https://www.microsoft.com/en-us/sql-server), + [SQLite](https://www.sqlite.org/index.html), + [PostgreSQL](https://www.postgresql.org/), entre otras. Puedes consultar esta + [lista con todas las fuentes de datos que soporta Superset](https://superset.apache.org/docs/databases/installing-database-drivers/). + +- Ofrece un entorno llamado **SQL Lab** que permite hacer consultas SQL para la + exploración de los datos antes de la representación gráfica. + +- Proporciona un sencillo e intuitivo constructor de visualizaciones sin código + que te permite personalizar tus gráficos. + +- Tiene una arquitectura nativa de la nube. Permite escalar a grandes entornos + distribuidos y funciona bien dentro de contenedores. Es flexible y permite + elegir el servidor web, motor de base de datos, cola de mensajes, backend de + resultados y capa de almacenamiento en caché. + +- Su instalación y configuración es rápida. + +- Permite trabajar con grandes configuraciones de _data lake_ y _data + warehouse_. + +- Brinda un modelo de seguridad con reglas complejas que pueden configurarse de + acuerdo a quién puede acceder y a qué características. + +- Tiene la posibilidad de añadir plugins de visualizaciones personalizados. + +Hemos visto una gran cantidad de ventajas y funcionalidades que ofrece Superset. +Debido a esto, existe una gran variedad de industrias y empresas que lo utilizan +en sus tareas, entre ellas se encuentran: [Airbnb](https://es.airbnb.org/), +[American Express](https://www.americanexpress.com/), +[Netflix](https://www.netflix.com/), [Udemy](https://www.udemy.com/), +[Twitter](https://twitter.com/). Puedes consultar una lista más amplia +[aquí](https://github.com/apache/superset/blob/master/RESOURCES/INTHEWILD.md) + +## EpiGraphHub: un ejemplo de Superset + +[EpiGraphHub](https://dash.epigraphhub.org/superset/welcome/) es una aplicación +web para el manejo y visualización de datos de salud pública. + +![EpiGraphHub](EpiGraphHub.jpg) +Fuente:[EpigraphHub Superset](https://dash.epigraphhub.org/superset/welcome/) + +Allí puedes crear una cuenta o ingresar con la cuenta de invitado para la cual +el usuario y la contraseña es _guest_. EpiGrapHub Superset te ofrece una +variedad de dashboards referentes, entre otras cosas, a datos de COVID en +distintos países y continentes. Allí se visualizan características importantes +en cada caso (sexo, fecha, grupos de edad, número de casos positivos, división +política, estado de salud, entre otras). Podemos explorar estos datos a través +de sus servidores. + +A continuación te mostramos un dashboard en el Superset de EpiGraphHub. + +![Superset](Superset.jpg) +Fuente:[EpigraphHub Superset](https://dash.epigraphhub.org/superset/welcome/) + +Puedes conocer más sobre EpiGrapHub en nuestro artículo: +[EpiGraphHub: un proyecto de código abierto para el análisis de datos de calidad](/blog/epigraphhub-un-proyecto-de-c%C3%B3digo-abierto-para-el-analisis-de-datos-de-calidad/) + +## Cómo iniciar con Superset + +A continuación te presentamos algunas formas diferentes de empezar con Superset: + +- Descarga el + [código fuente del sitio web de The Apache Foundation](https://dist.apache.org/repos/dist/release/superset/) + +- Descarga la + [última versión de Superset desde Pypi](https://pypi.org/project/apache-superset/) + +- Configura Superset localmente con un comando usando + [_Docker Compose_](https://superset.apache.org/docs/installation/installing-superset-using-docker-compose/) + +- Descarga el _Docker image_ desde + [Dockerhub](https://hub.docker.com/r/apache/superset) + +- Instala la + [última versión de Superset desde GitHub](https://github.com/apache/superset/tree/latest) + +Puedes consultar sobre la instalación y configuración de Superset +[aquí](https://superset.apache.org/docs/installation/installing-superset-using-docker-compose). + +## Una introducción a cómo crear tu primer dashboard + +Si vas a utilizar Superset para tu flujo de trabajo de análisis y exploración de +datos, a continuación te mostramos algunos pasos necesarios que te permitirán +crear un gráfico y guardarlo en un dashboard en esta aplicación. Puedes +consultar un paso a paso más detallado sobre esto en la +[documentación oficial de Superset](https://superset.apache.org/docs/creating-charts-dashboards/creating-your-first-dashboard/). + +- **Conectar Superset a una nueva base de datos**. Como Superset no puede + guardar los datos, debe conectarse a una base de datos existente que soporte + SQL. Inicialmente debemos añadir las credenciales de conexión a esa base de + datos para poder consultar y visualizar los datos. + + Este paso puede obviarse si se utiliza Superset localmente a través de Docker + compose. Esto se debe a que está incluida, preconfigurada y disponible una + base de datos Postgres, llamada _examples_. + + Para hacer la conexión, seleccionamos la opción _Databases_ del menú _Data_ y + seguimos los pasos para crear y probar la conexión. + +- **Registrar una tabla en la base de datos**. Ahora seleccionamos las tablas + específicas (denominadas _datasets_ en Superset) que deseemos explorar. Esto + lo hacemos seleccionando la opción _Data_, luego _Datasets_ y nuevo dataset + (en la esquina superior derecha). Seleccionamos la base de datos, el esquema, + la tabla y añadimos estos cambios. + +- **Personalizar las propiedades de las columnas**. Se configuran las + propiedades de las columnas como: tipo de dato, si la columna es temporal, si + debe ser filtrada, si es dimensional, cómo debe tratarla Superset si es una + columna de fecha-hora, entre otras. Esto se hace para saber cómo deben + manejarse las columnas del _dataset_ al momento de la exploración. + +- **Capa semántica de Superset**. Esta capa nos ofrece mejoras como analistas, + puede almacenar 2 tipos de datos calculados: + + 1. _Métricas virtuales_: podemos escribir consultas SQL con funciones de + agregación para varias columnas y colocar los resultados como nuevas + columnas disponibles para la visualización. + + 2. _Columnas calculadas virtuales_: también podemos hacer consultas SQL que + involucren cambios en la apariencia o el comportamiento de una columna + específica, por ejemplo, cambiar el tipo de dato que almacena. No debemos + usar funciones de agregación, como SUM, en las columnas calculadas. + +- **Crear gráficos en la vista de exploración**. En Superset podemos explorar + los datos utilizando dos interfaces: + + 1. _Explore_: es un constructor de visualizaciones sin código. Es tan simple + como seleccionar el _dataset_, el tipo de gráfico que corresponda, lo + personalizamos y lo publicamos. + + 2. _SQL Lab_: es un IDE (Entorno de Desarrollo Integrado) que nos permite + preparar y unir los datos que son tomados en el flujo de trabajo de + _Explore_. + + Para crear un gráfico, si estamos en la pestaña _Datasets_ hacemos clic en el + nombre del dataset y así inicamos el flujo de trabajo de la vista _Explore_. + Aquí se muestra _una vista del dataset_ con una lista de las columnas y las + métricas (en el lado izquierdo). También se observa una _vista previa de los + datos_ en la parte inferior. Esta vista contiene las pestañas _Data_ y + _Customize_ (datos y personalizar, respectivamente), a partir de allí podemos + interactuar cambiando el tipo de visualización, seleccionando distintas + métricas para mostrar los datos y personalizando la estética del gráfico. Cabe + resaltar que cada vez que hacemos un cambio, debemos ejecutarlo haciendo clic + en el botón _RUN_ de la parte superior. + +- **Guardar un gráfico en un dashboard**. Luego de crear el gráfico lo guardamos + haciendo clic en el botón _Save_ en la parte superior de la vista. Podemos + guardarlo y añadirlo a un dashboard existente o a uno nuevo. Para publicarlo, + hacemos clic en _Save and goto Dashboard_. Podemos cambiar el tamaño del + gráfico, haciendo clic en el botón del lápiz en la esquina superior derecha. + +Y !Esto es todo! hemos creado un gráfico y lo añadimos a un dashboard en +Superset. Existen muchas opciones de configuración y visualización de datasets, +es cuestión de que comiences a probar y explorar y te sorprenderás de lo que +puedes lograr con esta plataforma. + +### Otros recursos + +- Consulta el + [CONTRIBUTING.md](https://github.com/apache/superset/blob/master/CONTRIBUTING.md) + del proyecto si estás interesado en contribuir. Este contiene también una guía + detallada sobre cómo configurar un entorno de desarrollo. + +### Referencias + +- [Website de Apache Superset](https://superset.apache.org/) + +- [Documentación oficial de Apache Superset](https://superset.apache.org/docs/intro/) diff --git a/content/blog/aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta/header.png b/bkp/blogs/aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta/header.png similarity index 100% rename from content/blog/aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta/header.png rename to bkp/blogs/aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta/header.png diff --git a/bkp/blogs/aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta/index.md b/bkp/blogs/aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta/index.md new file mode 100644 index 000000000..6c7ca06f5 --- /dev/null +++ b/bkp/blogs/aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta/index.md @@ -0,0 +1,179 @@ +--- +title: "Aspectos clave en el manejo de equipos de ciencia abierta" +slug: aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta +date: 2020-01-20 +authors: ["Rainer Palm"] +tags: [investigación colaborativa] +categories: [organización, gestión de equipos] +description: | + Ya sea por temas de financiamiento, el uso de tecnologías de comunicación más + avanzadas, o la necesidad de realizar proyectos interdisciplinarios, la + investigación colaborativa es una práctica bastante frecuente. A pesar del + enfoque histórico y el tratamiento en medios de comunicación, hacia + descubrimientos individuales, y pese a la presencia de ciertos personajes + carismáticos, la realidad hoy en día es otra: la gran mayoría de los científicos + trabajan dentro de grupos donde los involucrados aportan al resultado final + gracias a la retroalimentación constante, por encima de que muchas veces ni + siquiera comparten la misma disciplina entre los investigadores vinculados. La + eficiencia de la cooperación se hace notar por si sola, y la necesidad de dar + resultados rápidos en proyectos cada vez más grandes, requiere de la creación de + grupos con flujos de trabajos disciplinados y metodologías ágiles. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Ya sea por temas de financiamiento, el uso de tecnologías de comunicación más +avanzadas, o la necesidad de realizar proyectos interdisciplinarios, la +investigación colaborativa es una práctica bastante frecuente. A pesar del +enfoque histórico y el tratamiento en medios de comunicación, hacia +descubrimientos individuales, y pese a la presencia de ciertos personajes +carismáticos, la realidad hoy en día es otra: la gran mayoría de los científicos +trabajan dentro de grupos donde los involucrados aportan al resultado final +gracias a la retroalimentación constante, por encima de que muchas veces ni +siquiera comparten la misma disciplina entre los investigadores vinculados. La +eficiencia de la cooperación se hace notar por si sola, y la necesidad de dar +resultados rápidos en proyectos cada vez más grandes, requiere de la creación de +grupos con flujos de trabajos disciplinados y metodologías ágiles. + + + +Las prácticas de ciencia abierta (libre distribución de la información, +disponibilidad de métodos, datos y herramientas usadas, colaboración abierta), +son atractivas no solo por cuestiones éticas, sino también porque sirven de +maravilla para el problema de organización de equipos. Además del uso de +herramientas como Git para compartir código fuente y la información dentro de un +grupo pequeño de investigadores para que todos puedan trabajar partiendo del +mismo punto, el uso de los recursos compartidos libremente por otros y los +posibles aportes o sugerencias de gente interesada en tu investigación puede +resultar bastante significativo para tus proyectos. + +¿Cuáles son, entonces, las principales herramientas de una investigación +colaborativa de ciencia abierta? Tomando en cuenta que necesitamos rapidez, +disciplina, coordinación, y libre disponibilidad y colaboración entre todos los +posibles integrantes de nuestro grupo, podemos afirmar que, por lo general, +debemos usar las siguientes: + +## Control de versiones + +El uso de software de control de versiones y de plataformas que alojen sus +respectivos repositorios en la nube (como Github, Gitlab, Docker, etc.) se ha +vuelto bastante esencial tanto para cuestiones de ciencia abierta como para +desarrollo de todo tipo de software, desde scripts pequeños de procesamiento de +archivos hasta videojuegos o modelado 3D. La seguridad que te otorga el sistema +de respaldo, el alojar tus archivos en la nube, y la facilidad con la que te +deja colaborar con tus colegas, añadiendo juntos archivos y revisiones al +repositorio de una forma orgánica, lo hace una herramienta indispensable para +todo tipo de proyecto que utilice código. + +El libre acceso a tus proyectos mediante sus repositorios facilita también las +tareas de divulgación de tu trabajo, localización de colaboradores, corrección +errores en tu procedimiento, reproducción de tu investigación, y añadir tus +proyectos a tu curriculum. + +## Manejo de equipos en tus repositorios + +Muchas plataformas que utilizan control de versiones, suelen ofrecer también +herramientas para el manejo de equipos como la creación de cuentas, permitiendo +restringir acceso a ciertas carpetas del repositorio, los cambios que hagan +otros necesitan aprobación, se pueden asignar miembros del equipo para que +revisen los cambios, etc. Si no posees de manera explícita esta forma organizar +tu equipo, te cuento que puede resultarte bastante beneficioso, especialmente si +trabajas con colegas en distintas disciplinas. Sitios como Github permiten +anexar grupos, establecer una jerarquía clara entre grupos, administrar +automáticamente la membresía del equipo de Github mediante un proveedor de +identidad (o IdP, tal como Azure AD), además de ofrecer una plataforma donde +pueden debatir y discutir. Aprovechar estas herramientas al máximo es crucial a +la hora de organizar grupos que no puedan verse en persona. + +## Metodología ágil + +El método ágil se refiere principalmente a un conjunto de prácticas que +implementan los principios descritos en el +[manifiesto ágil](http://agilemanifesto.org/iso/es/manifesto.html), creado en el +2001 por personas que querían innovar en los modos tradicionales de gestionar +proyectos de software. En términos generales, estas metodologías intentan +enfocar el desarrollo del software hacia las necesidades de las personas y las +interacciones cliente-desarrollador, apuntando hacia la 'entrega temprana y +continua de software con valor'. De esta forma, se logra mantener un desarrollo +constante, funcional y transparente, entregando software funcional regularmente +mediante un flujo de trabajo sencillo y eficaz. + +Existen múltiples implementaciones de este método, una de las más populares +siendo [Scrum](https://www.scrum.org/), un framework de procesos ágiles diseñado +para manejar problemas complejos y adaptativos sin sacrificar valor, creatividad +o productividad. Principalmente pensado para equipos pequeños de 10 miembros o +menos, reemplaza un acercamiento algorítmico preprogramado, por uno heurístico +que valora la capacidad de las personas de adaptarse y auto-organizarse en torno +a problemas complejos emergentes. Para este objetivo, busca girar el proceso de +trabajo en torno a 'sprints' que duren alrededor de un mes, donde, tras un +proceso de planificación, se crea un producto usable (llamado un 'incremento') y +se realiza una revisión del sprint. Se trata de una de las más famosas +implementaciones gracias a que su efectividad ha sido comprobada empíricamente, +para revisar esto puedes revisar el artículo +[Scrum and CMMI – Going from Good to Great](https://sci-hub.se/10.1109/agile.2009.31). +Scrum es comúnmente utilizado en empresas que desarrollan software, su uso en +investigaciones científicas ya está siendo explorado. + +## Entrenamiento en políticas de ciencia abierta + +Uno de los principales problemas a la hora de llevar a cabo proyectos de ciencia +abierta es que, debido a su relativa novedad, muchas empresas e instituciones no +tienen un esquema de trabajo o de políticas orientadas hacia su logro, mucho +menos personas capacitadas en el área que puedan ayudar. Además, una cantidad +importante científicos consideran que la forma más práctica de aprender a usar +estas herramientas es trabajando con ellas. + +Por lo tanto, es crucial para los proyectos de ciencia abierta capacitar a sus +integrantes para desarrollar implementaciones de estas políticas mientras +trabajan, basándose en cómo se realizan en otras instituciones (ya sean empresas +o gobiernos). Revisando temas de derechos de autor, propiedad intelectual, +acceso abierto, o datos de investigación, aclarando la disponibilidad tanto de +la investigación como los datos y métodos utilizados. Para leer más sobre esto +puede visitar +[Open Science overview in Europe](https://www.openaire.eu/member-states-overview) +y +[Guidelines to the Rules on Open Access to Scientific Publications and Open Access to Research Datain Horizon 2020](https://ec.europa.eu/research/participants/data/ref/h2020/grants_manual/hi/oa_pilot/h2020-hi-oa-pilot-guide_en.pdf). + +## Incentivo a la ciencia abierta + +Muchos científicos pueden tener dudas respecto a los métodos de remuneración o +el financiamiento que pueden recibir por una investigación que se ate a +principios de ciencia abierta. Actualmente buena parte de la comunidad +científica no conoce en detalle el concepto de ciencia abierta, y por lo general +se toma el libre acceso a publicaciones como principal requerimiento para que +una investigación sea 'abierta'. También, desconocen si las instituciones de +investigación y cuerpos de financiamiento tienen lineamientos y directrices en +cuanto a acceso libre en cuanto a las publicaciones se refiere. + +Por lo tanto, es necesario para todo grupo u organización interesado en la +realización de ciencia abierta establecer reglas y políticas claras, y altamente +recomendado que establezcan incentivos (tales como criterios de contratación que +busquen individuos anteriormente involucrados en investigaciones abiertas o +incorporación de ciencia abierta en el desarrollo, apoyo y evaluación de +personal científico, que son recomendaciones de una organización danesa, +[National Platform Open Science](https://www.openscience.nl/)) para integrar mas +investigadores dentro de esta esfera. + +Un artículo donde puedes leer más al respecto es +[Open science report: How to provide the skills researchers need?](https://www.zbw-mediatalk.eu/2017/08/report-wie-bekommen-forschende-die-qualifikationen-fur-open-science/). + +## Referencias + +- Manifiesto por el Desarrollo Ágil de Software. (s. f.). + http://agilemanifesto.org/iso/es/manifesto.html +- Home. (s. f.). Scrum.org. https://www.scrum.org/ +- Jakobsen, C. R., & Sutherland, J. (2009). Scrum and CMMI Going from Good to + Great. 2009 Agile Conference. doi:10.1109/agile.2009.31 +- Open Science overview in Europe. OpenAire. + https://www.openaire.eu/os-eu-countries +- "Guidelines to the Rules on Open Access to Scientific Publications and Open + Access to Research Datain Horizon 2020" + https://ec.europa.eu/research/participants/data/ref/h2020/grants_manual/hi/oa_pilot/h2020-hi-oa-pilot-guide_en.pdf +- Fingerle, B. (2022, 25 marzo). Open Science Report: How to Provide the Skills + Researchers Need? ZBW MediaTalk. + https://www.zbw-mediatalk.eu/2017/08/report-wie-bekommen-forschende-die-qualifikationen-fur-open-science/ +- Open Science – Nationaal Programma Open Science. (s. f.). + https://www.openscience.nl/ diff --git a/content/blog/automatizacion-de-tareas-via-bash/header.png b/bkp/blogs/automatizacion-de-tareas-via-bash/header.png similarity index 100% rename from content/blog/automatizacion-de-tareas-via-bash/header.png rename to bkp/blogs/automatizacion-de-tareas-via-bash/header.png diff --git a/content/blog/automatizacion-de-tareas-via-bash/index.md b/bkp/blogs/automatizacion-de-tareas-via-bash/index.md similarity index 77% rename from content/blog/automatizacion-de-tareas-via-bash/index.md rename to bkp/blogs/automatizacion-de-tareas-via-bash/index.md index a67e3923d..5e57b6850 100644 --- a/content/blog/automatizacion-de-tareas-via-bash/index.md +++ b/bkp/blogs/automatizacion-de-tareas-via-bash/index.md @@ -2,47 +2,42 @@ title: "Automatización de tareas vía bash" slug: automatizacion-de-tareas-via-bash date: 2020-06-21 -author: Anavelyz Pérez +authors: ["Anavelyz Pérez"] tags: [bash, automatización] categories: [desarrollo de software] -draft: false -usePageBundles: true +description: | + Bash es un shell, o intérprete de lenguaje de comandos, para el sistema operativo + GNU. Su nombre es un acrónimo de "*Bourne-Again SHell*", un juego de palabras + sobre Stephen Bourne, el autor del antepasado directo del actual shell de Unix + sh, que apareció en la séptima edición de la versión de *Bell Labs Research* de + Unix. thumbnail: "/header.png" -featureImage: "/header.png" +template: "blog-post.html" --- - - - - - - ¿Qué es Bash? Es un shell, o intérprete de lenguaje de comandos, para el sistema operativo -GNU. Su nombre es un acrónimo de "*Bourne-Again SHell*", un juego de palabras +GNU. Su nombre es un acrónimo de "_Bourne-Again SHell_", un juego de palabras sobre Stephen Bourne, el autor del antepasado directo del actual shell de Unix -sh, que apareció en la séptima edición de la versión de *Bell Labs Research* de +sh, que apareció en la séptima edición de la versión de _Bell Labs Research_ de Unix. - - -El shell también es conocido como **terminal**; una interfaz entre el usuario -y el propio sistema operativo. Podemos acceder a él a través del menú o una +El shell también es conocido como **terminal**; una interfaz entre el usuario y +el propio sistema operativo. Podemos acceder a él a través del menú o una combinación teclas. Linux proporciona por defecto seis terminales de este tipo, de Control+Alt+F1 a Control+Alt+F6. Si queremos volver al modo gráfico lo hacemos con Alt+F7 (estos atajos pueden variar según la distribución). Es importante destacar que el sistema operativo GNU proporciona otros shell sin -embargo, Bash es el shell por defecto. Este, al igual que otros programas de GNU, -es bastante portátil. Actualmente funciona en casi todas las versiones de Unix y -otros sistemas operativos como Mac OS X Tiger. También se ha llevado a Microsoft -Windows por el proyecto Cygwin. - -Ahora bien, cuando desde una distribución Linux abrimos o activamos un terminal se indica que estamos en -nuestro home mediante el signo ~.Veremos en pantalla algo similar a: +embargo, Bash es el shell por defecto. Este, al igual que otros programas de +GNU, es bastante portátil. Actualmente funciona en casi todas las versiones de +Unix y otros sistemas operativos como Mac OS X Tiger. También se ha llevado a +Microsoft Windows por el proyecto Cygwin. -![Terminal](terminal1.png) +Ahora bien, cuando desde una distribución Linux abrimos o activamos un terminal +se indica que estamos en nuestro home mediante el signo ~.Veremos en pantalla +algo similar a: El home es el sitio donde se pueden aplicar inicialmente las tareas. @@ -61,18 +56,14 @@ y la palabra de la cual tenemos duda. Por ejemplo si tecleamos `info bash` o `man bash`, tenemos la posibilidad de leer un texto sobre lo que es bash y sus características principales. -![Comandos man e info](ayuda.gif) - ## Crear, eliminar y editar carpetas o directorios -Entre las tareas que podemos realizar con bash están crear, eliminar y editar +Entre las tareas que podemos realizar con bash están crear, eliminar y editar carpetas o directorios. Algunos de los comandos asociados a estas son: `pwd` nos indica el directorio en el que estamos actualmente. Si probamos este comando en el home obtendremos algo similar a -![pwd en home](pwd.png) - `ls` nos permite ver la lista de los directorios, carpetas y archivos contenidos en el sitio o carpeta en la que estemos. `ls -a` nos muestra todos los archivos incluyendo los ocultos. @@ -82,8 +73,8 @@ la que se desea ir nos permitirá realizar esta tarea. De modo que `cd /` te llevara a la raíz, `cd ~` al home ( `cd` solo hace lo mismo), `cd /usr/doc` te lleva al directorio de documentación del sistema. -Si quieres crear una carpeta (o varias) lo puedes hacer en tu home, usando `mkdir` -y el nombre de la carpeta que quieres crear, luego entra en ella con cd. +Si quieres crear una carpeta (o varias) lo puedes hacer en tu home, usando +`mkdir` y el nombre de la carpeta que quieres crear, luego entra en ella con cd. Para borrar una carpeta escribe `rmdir` seguido por un espacio y el nombre, pero la carpeta tiene que estar vacía y contar con permiso para borrarla. @@ -94,18 +85,18 @@ El comando `mv`, permite dos operaciones. Cambiar un fichero de sitio, para lo cual es necesario que se tenga permiso de escritura sobre ese fichero y el lugar de destino. Se utiliza simplemente indicando mv nombre_origen ruta_destino. -*Con este comando también es posible mover directorios, o todos los ficheros de -un directorio.* +_Con este comando también es posible mover directorios, o todos los ficheros de +un directorio._ -La otra operación que se puede realizar con `mv` es el cambio de nombre, así basta con -indicar el nombre de un fichero o directorio, y luego su nuevo nombre. +La otra operación que se puede realizar con `mv` es el cambio de nombre, así +basta con indicar el nombre de un fichero o directorio, y luego su nuevo nombre. -*Los comandos cat, more y less sirven para mostrar el contenido de ficheros de -texto.* +_Los comandos cat, more y less sirven para mostrar el contenido de ficheros de +texto._ -El comando `rm` se utiliza para borrar ficheros. Es importante destacar que estos -ficheros no se envían a una papelera así que NO SE PUEDEN RECUPERAR UNA VEZ -BORRADOS. +El comando `rm` se utiliza para borrar ficheros. Es importante destacar que +estos ficheros no se envían a una papelera así que NO SE PUEDEN RECUPERAR UNA +VEZ BORRADOS. Otro comando útil es `cp` sirve para copiar ficheros. En el proceso de copia intervienen tres elementos: lo que se copia, la ruta de origen y la ruta de @@ -151,7 +142,7 @@ Puedes consultar más de los comandos en https://ss64.com/bash/index.html ## Referencias -Manual Práctico de Linux con ejercicios por Luis José Sánchez González. -Manual de Linux por Álvaro Alea Fdz. +Manual Práctico de Linux con ejercicios por Luis José Sánchez González. Manual +de Linux por Álvaro Alea Fdz. [EcuRed-Terminal](https://www.ecured.cu/Terminal_de_GNU/Linux) [EcuRed-Bash](https://www.ecured.cu/Bash) diff --git a/bkp/blogs/call-for-interns-2024-01/header.jpg b/bkp/blogs/call-for-interns-2024-01/header.jpg new file mode 100644 index 000000000..1ef5a9f04 Binary files /dev/null and b/bkp/blogs/call-for-interns-2024-01/header.jpg differ diff --git a/bkp/blogs/call-for-interns-2024-01/index.md b/bkp/blogs/call-for-interns-2024-01/index.md new file mode 100644 index 000000000..1703591cb --- /dev/null +++ b/bkp/blogs/call-for-interns-2024-01/index.md @@ -0,0 +1,297 @@ +--- +title: "Call for Interns 2024-01" +slug: call-for-interns-2024-01 +date: 2024-01-09 +authors: + - Daniela Iglesias Rocabado +tags: + - community + - internship + - OpenScienceLabs + - Technology Stydents +categories: + - internship + - community + - Technological Collaboration + - Open Source + - Mentors + - Technology Students +description: > + The Open Science Labs (OSL) has announced its Internship and Learning Program + for the first cycle of 2024, in collaboration with The GRAPH Network. +thumbnail: "/header.jpg" +template: "blog-post.html" +--- + + + + + +This program presents valuable opportunities for both mentors and +student/collaborators to engage and grow, despite being an unpaid initiative. + +## Initial Guidelines for Internship Program Candidates: + +--- + +Candidates are encouraged to thoroughly explore project options aligning with +their skills and interests. This involves a careful review of project ideas and +documentation. + +Once a candidate identifies a preferred project, they should initiate contact +with the mentor via email. The email should include: + +- Personal Introduction +- Curriculum Vitae +- The project name +- Project idea name +- Motivation for wanting to collaborate on that specific project. + +Additionally, candidates must confirm their availability for the entire 3-month +duration of the project. + +Upon mentor acceptance, candidates will be assigned preliminary tasks, such as +documentation updates and bug fixes. This step enables the mentor to assess the +candidate's capability to handle the project tasks effectively. + +Successful completion of these initial assignments will prompt the mentor to +guide the candidate in applying for the Open Science Labs Internship Program +through . + +Candidates are reminded of the importance of having prior knowledge of Git. +Additionally, candidates should join the +[OSL Discord](https://opensciencelabs.org/discord) to stay updated on +announcements related to the Internship Program. + +Recognizing the value of skill enhancement, Open Science Labs organizes study +groups that candidates are encouraged to participate in, further refining their +abilities. + +## Guidelines for Approved Interns: + +--- + +- **Communication:** Proactive communication is encouraged, with frequent + updates through appropriate channels. Approved interns should use OSL Blog to + document their experiences. +- **Continuous Learning:** Interns are advised to study project technologies, + participate in study groups, and regularly write about their experiences on + the OSL Blog. +- **Evaluations:** The internship includes midterm and final evaluations, + allowing mentors to assess progress and students/collaborators to evaluate + their contributions. + > **Information:** For more details about internships, you can + > [click here](https://opensciencelabs.org/opportunities/internships/oss/cycles/2024-01/#osl-web-page) + +## Timeline + +--- + +| Date | Activity | +| ------------------------ | -------------------------------------------------------------------------------------------- | +| **January 9, 2024** | Call for Interns/Apprentices opens. | +| **February 2, 2024** | Deadline for Interns/Apprentices applications. | +| **February 14, 2024** | Announcement of approved Interns/Apprentices. | +| **February 24-25, 2024** | Integration Phase – interns engage with mentors and familiarize themselves with the project. | +| **February 26, 2024** | Official Start Date. | +| **April 8, 2024** | Mid-term Evaluation. | +| **May 20, 2024** | Final Evaluation. | +| **May 27-31, 2024** | Interns present their work. | +| **June 3, 2024** | Official End Date; Certification process begins. | + +## List of Participating Projects + +--- + +Below is the list of projects participating in the current internship cycle. +Each project includes key details to help candidates understand the scope and +requirements. + +### ArtBox + +- **Description:** ArtBox is a tool set for handling multimedia files with a + bunch of useful functions. +- **Category:** Multimedia Processing. +- **Organization/Project Webpage URL:** + [https://mediatoolbox-org.github.io/artbox/](https://mediatoolbox-org.github.io/artbox/) +- **Contact:** Ivan Ogasawara + [ivan.ogasawara@gmail.com](mailto:ivan.ogasawara@gmail.com) +- **Project Ideas URL:** + [https://github.com/osl-incubator/artbox/issues/10](https://github.com/osl-incubator/artbox/issues/10) + +### ArxLang/ASTx + +- **Description:** ASTx is an agnostic expression structure for AST. It is + agnostic because it is not specific to any language, neither to the ArxLang + project, although its main focus is to provide all needed feature for ArxLang. +- **Categories:** AST, Compiler +- **Organization/Project Webpage URL:** + [https://astx.arxlang.org/](https://astx.arxlang.org/) +- **Contact:** Ivan Ogasawara + [ivan.ogasawara@gmail.com](mailto:ivan.ogasawara@gmail.com) +- **Project Ideas URL:** + [https://github.com/arxlang/astx/issues/21](https://github.com/arxlang/astx/issues/21) + +### Envers + +- **Description:** Envers is a command-line tool (CLI) designed to manage and + version environment variables for different deployment stages such as staging, + development, and production. It provides a secure and organized way to handle + environment-specific configurations. +- **Categories:** DevOps, Environment Management +- **Organization/Project Webpage URL:** + [https://osl-incubator.github.io/envers/](https://osl-incubator.github.io/envers/) +- **Contact:** Ivan Ogasawara + [ivan.ogasawara@gmail.com](mailto:ivan.ogasawara@gmail.com) +- **Project Ideas URL:** + [https://github.com/osl-incubator/envers/issues/18](https://github.com/osl-incubator/envers/issues/18) + +### fqlearn + +- **Description:** This Project aims to facilitate the teaching of unit + operations and thermodynamics. +- **Categories:** Mathematical Modeling, Educational +- **Organization/Project Webpage URL:** + [https://osl-pocs.github.io/fqlearn/](https://osl-pocs.github.io/fqlearn/) +- **Contact:** John Ever Vino Duran + [evervino00@gmail.com](mailto:evervino00@gmail.com) +- **Project Ideas URL:** + [https://github.com/osl-pocs/fqlearn/issues/30](https://github.com/osl-pocs/fqlearn/issues/30) + +### Makim + +- **Description:** Makim (or makim) is based on make and focus on improve the + way to define targets and dependencies. Instead of using the Makefile format, + it uses yaml format. +- **Categories:** DevOps, Automation +- **Organization/Project Webpage URL:** + [https://osl-incubator.github.io/makim/](https://osl-incubator.github.io/makim/) +- **Contact:** Ivan Ogasawara + [ivan.ogasawara@gmail.com](mailto:ivan.ogasawara@gmail.com) +- **Project Ideas URL:** + [https://github.com/osl-incubator/makim/issues/74](https://github.com/osl-incubator/makim/issues/74) + +### noWorkflow + +- **Description:** The noWorkflow project aims at allowing scientists to benefit + from provenance data analysis even when they don't use a workflow system. It + transparently collects provenance from Python scripts and notebooks and + provide tools to support the analysis and management of the provenance. +- **Categories:** Provenance, Software Engineering +- **Organization/Project Webpage URL:** + [https://gems-uff.github.io/noworkflow/](https://gems-uff.github.io/noworkflow/) +- **Contact:** João Felipe Nicolaci Pimentel + [joaofelipenp@gmail.com](mailto:joaofelipenp@gmail.com) +- **Project Ideas URL:** + [https://gist.github.com/JoaoFelipe/ce4cb232deb2c71d4f39afc5cbeefe2b](https://gist.github.com/JoaoFelipe/ce4cb232deb2c71d4f39afc5cbeefe2b) + +### OSL Web Page + +- **Description:** OpenScienceLabs web page, is a project that serves as a way + to present OSL to the world through a web page. +- **Category:** Web Development +- **Organization/Project Webpage URL:** + [https://opensciencelabs.org//](https://opensciencelabs.org/) +- **Contact:** John Ever Vino Duran + [evervino00@gmail.com](mailto:evervino00@gmail.com) +- **Project Ideas URL:** + [https://github.com/osl-pocs/fqlearn/issues/43](https://github.com/osl-pocs/fqlearn/issues/43) + +### PyDataStructs + +- **Description:** PyDataStructs project aims to be a Python package for various + data structures and algorithms (including their parallel implementations). +- **Categories:** Data Structures, Algorithms +- **Organization/Project Webpage URL:** + [https://pydatastructs.readthedocs.io/en/latest/](https://pydatastructs.readthedocs.io/en/latest/) +- **Contact:** Gagandeep Singh [gdp.1807@gmail.com](mailto:gdp.1807@gmail.com) +- **Project Ideas URL:** + [https://github.com/codezonediitj/pydatastructs/wiki/Planned-Features-for-v1.0.1](https://github.com/codezonediitj/pydatastructs/wiki/Planned-Features-for-v1.0.1) + +### SciCookie + +- **Description:** SciCookie is a template developed by + [OpenScienceLabs](https://opensciencelabs.org/) that creates projects from + project templates. +- **Category:** Project Templates, Scientific Software +- **Organization/Project Webpage URL:** + [https://osl-incubator.github.io/scicookie](https://osl-incubator.github.io/scicookie) +- **Contact:** Ivan Ogasawara + [ivan.ogasawara@gmail.com](mailto:ivan.ogasawara@gmail.com) +- **Project Ideas URL:** + [https://github.com/osl-incubator/scicookie/issues/192](https://github.com/osl-incubator/scicookie/issues/192) + +### Sugar + +- **Description:** Sugar aims to organize your stack of containers, gathering + some useful scripts and keeping this information centralized in a + configuration file. So the command line would be very simple. +- **Categories:** DevOps, Container Management +- **Organization/Project Webpage URL:** + [https://osl-incubator.github.io/sugar/e](https://osl-incubator.github.io/sugar/) +- **Contact:** Ivan Ogasawara + [ivan.ogasawara@gmail.com](mailto:ivan.ogasawara@gmail.com) +- **Project Ideas URL:** + [https://github.com/osl-incubator/sugar/issues/105](https://github.com/osl-incubator/sugar/issues/105) + +### Useful Materials and Courses + +--- + +- **Software Carpentry Lessons:** Offering tutorials on Git, Bash, Python, R, + and more, these lessons are invaluable for building a strong foundation in + software development. Access the lessons at Software Carpentry. +- **Udacity CS212 - Design of Computer Programs:** This course, taught by Peter + Norvig, delves into advanced programming topics and is an excellent way to + deepen your understanding of computer programs. Enroll in the course at + Udacity CS212. +- **The GRAPH Network Courses:** Explore a range of courses offered by The GRAPH + Network, tailored to various aspects of data analysis. Find the courses at The + GRAPH Network Courses. These resources provide a great opportunity to prepare + effectively for the Internship Program and to develop a broad skill set in + software development and data analysis. diff --git a/content/blog/caracteristicas-y-tips-utiles-que-te-ayudaran-sacar-el-maximo-provecho-de-conda/header.png b/bkp/blogs/caracteristicas-y-tips-utiles-que-te-ayudaran-sacar-el-maximo-provecho-de-conda/header.png similarity index 100% rename from content/blog/caracteristicas-y-tips-utiles-que-te-ayudaran-sacar-el-maximo-provecho-de-conda/header.png rename to bkp/blogs/caracteristicas-y-tips-utiles-que-te-ayudaran-sacar-el-maximo-provecho-de-conda/header.png diff --git a/bkp/blogs/caracteristicas-y-tips-utiles-que-te-ayudaran-sacar-el-maximo-provecho-de-conda/index.md b/bkp/blogs/caracteristicas-y-tips-utiles-que-te-ayudaran-sacar-el-maximo-provecho-de-conda/index.md new file mode 100644 index 000000000..1f560eb40 --- /dev/null +++ b/bkp/blogs/caracteristicas-y-tips-utiles-que-te-ayudaran-sacar-el-maximo-provecho-de-conda/index.md @@ -0,0 +1,107 @@ +--- +title: + "Características y tips útiles que te ayudarán a sacar el máximo provecho de + CONDA" +slug: caracteristicas-y-tips-utiles-que-te-ayudaran-sacar-el-maximo-provecho-de-conda +date: 2020-12-14 +authors: ["Yurely Camacho"] +tags: [conda, empaquetado, paquetes, entorno virtual] +categories: [ciencia abierta, código abierto, desarrollo de software, DevOps] +description: | + Si posees algún conocimiento sobre conda o visitaste anteriormente + nuestro artículo sobre Cómo instalar y comenzar a utilizar Conda (enlace + a artículo) donde dimos una breve definición sobre este potente gestor + de paquetes y entornos; puedes ahora, con el presente post, nutrirte de + más información pues mencionamos algunas características y + recomendaciones para que conozcas los usos de conda y puedas usarla de + manera eficiente y sin complicaciones. + +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Si posees algún conocimiento sobre conda o visitaste anteriormente nuestro +artículo sobre Cómo instalar y comenzar a utilizar Conda (enlace a artículo) +donde dimos una breve definición sobre este potente gestor de paquetes y +entornos; puedes ahora, con el presente post, nutrirte de más información pues +mencionamos algunas características y recomendaciones para que conozcas los usos +de conda y puedas usarla de manera eficiente y sin complicaciones. + + + +**Si usas Conda** + +- Puedes crear y configurar entornos virtuales solo con teclear unos pocos + comandos. Te recomendamos crear un entorno virtual para cada proyecto que + ejecutes o cada actividad donde los requerimientos sean distintos. + Específicamente el comando que permite crear el entorno es + `conda create --name nombre_entorno python x.x`, donde x.x es la versión de + python que deseas correr en ese entorno. + +- Este gestor analiza tu entorno actual, en lo referente a los paquetes + instalados y a las limitaciones de versión de los paquetes que especifiques y + analiza la forma de instalar dependencias compatibles. Si esto no es posible, + te informa que no puede ejecutar tu petición. Esta es una ventaja muy + importante en comparación con otros gestores de paquetes como + [pip](https://pip.pypa.io/en/stable/), el cual instala el paquete que + especifiques y sus dependencias, sin antes verificar cualquier inconveniente + que pueda llegar hasta dañar otros paquetes. + +- Puedes abreviar muchas opciones de los comandos que usas con frecuencia las + cuales están precedidas por dos guiones (--) a sólo un guión y la primera + letra. Por ejemplo, `--name` y `-n`, `--envs` y `-e` son lo mismo, es decir, + si escribes uno u otro se ejecuta la misma acción. + +- Para consultar los entornos virtuales que haz creado, ejecuta el comando + `conda info --envs`. Si tienes varios creados, el que aparezca con un + asterisco (\*) al lado del nombre es el que tienes activado actualmente. + +- Para trabajar en cualquiera de los entornos virtuales que tengas disponibles + debes primero activarlo. Esto se realiza con el comando + `conda activate nombre_entorno` y cuando necesites salir del entorno ejecuta + `conda deactivate`. + +- Si deseas remover un paquete específico del entorno de trabajo actual, ejecuta + el comando `conda remove nombre_paquete` y si deseas eliminar un paquete de + otro entorno entonces ejecuta `conda remove -n nombre_entorno nombre_paquete`. + +- Para ver una lista de los paquetes que tienes instalados en el entorno actual + ejecuta `conda list` y para consultar los paquetes instalados en otros + entornos teclea `conda list -n nombre_entorno`. También puedes acceder a la + ayuda de los comandos de conda tecleando `--help` o `-h` al final del comando. + Por ejemplo, para mostrar la ayuda de cómo instalar un paquete ejecuta + `conda install -h`. + +- La documentación oficial de conda proporciona gran variedad de comandos de + conda para que puedas manejar paquetes y entornos virtuales, accede a esta + información en + [este enlace](https://docs.conda.io/projects/conda/en/latest/commands.html). + En los enlaces de la página señalada encontrarás ayuda para cada uno de los + comandos. + +- Recomendamos que accedas a [Bioconda](https://bioconda.github.io/), un canal + popular de conda que ofrece una gran variedad de distribuciones de software + para biología computacional. + +- Si te surgen dudas sobre el significado de algunas palabras referentes a lo + que es y lo que hace conda, puedes acceder a este + [Glosario](https://docs.conda.io/projects/conda/en/latest/glossary.html#) para + aclararlas. + +A continuación encontrarás enlaces con información y comandos que te serán de +gran ayuda para el manejo de paquetes y entornos virtuales con conda. + +- [Cheat sheets de terceros](https://kapeli.com/cheat_sheets/Conda.docset/Contents/Resources/Documents/index) + +- [Cheat sheets de Continuum Analytics, compañía creadora de conda](https://docs.conda.io/projects/conda/en/latest/_downloads/843d9e0198f2a193a3484886fa28163c/conda-cheatsheet.pdf) + +En OpenScienceLabs te invitamos a indagar y a que comiences a usar conda. Con la +ayuda de este post y los recursos que hemos señalado, estamos seguros que +sacarás el mayor provecho de conda en tus proyectos. + +### Referencias + +- [Documentación Conda](https://conda.io/en/latest/) diff --git a/content/blog/ciencia-abierta/header.png b/bkp/blogs/ciencia-abierta/header.png similarity index 100% rename from content/blog/ciencia-abierta/header.png rename to bkp/blogs/ciencia-abierta/header.png diff --git a/bkp/blogs/ciencia-abierta/index.md b/bkp/blogs/ciencia-abierta/index.md new file mode 100644 index 000000000..159b66d90 --- /dev/null +++ b/bkp/blogs/ciencia-abierta/index.md @@ -0,0 +1,148 @@ +--- +title: "5 proyectos de inteligencia artificial que te sorprenderán" +slug: ciencia-abierta +date: 2021-02-08 +authors: ["Rainer Palm"] +tags: ["datos"] +categories: [ciencia abierta, ciencia de datos, inteligencia artificial] +description: | + Una de las areas de investigación mas prometedoras de la ultima decada es sín + duda la inteligencia artificial. No solamente reune una increible cantidad de + regiones del conocimiento que, superficialmente, son demasiado dispares (tales + como la filosofía de la mente, la psicología, la biología, la robotíca, la + lógica pura, entre muchas otras), sino que también los resultados de sus + publicaciones se vuelven relevantes de forma retroactiva para las areas de la + ciencia de cuya historia se nutre. El estudio y la utilización de las redes + neuronales y el aprendizaje automático (o machine learning) ha demostrado ser + increiblemente utíl no solamente a la hora de realizar investigaciones regulares + con estas tecnícas, sino también para crear nuevas herramientas de simulación y + experimentación, tanto para uso científico como el particular o comercial. +thumbnail: "/header.png" +template: "blog-post.html" +--- + +Una de las areas de investigación mas prometedoras de la ultima decada es sín +duda la inteligencia artificial. No solamente reune una increible cantidad de +regiones del conocimiento que, superficialmente, son demasiado dispares (tales +como la filosofía de la mente, la psicología, la biología, la robotíca, la +lógica pura, entre muchas otras), sino que también los resultados de sus +publicaciones se vuelven relevantes de forma retroactiva para las areas de la +ciencia de cuya historia se nutre. El estudio y la utilización de las redes +neuronales y el aprendizaje automático (o machine learning) ha demostrado ser +increiblemente utíl no solamente a la hora de realizar investigaciones regulares +con estas tecnícas, sino también para crear nuevas herramientas de simulación y +experimentación, tanto para uso científico como el particular o comercial. + +Aunque el machine learning aun tiene sus problemas y misterios por resolver, ya +como area de investigación ha producido muchos hallazgos y descubrimientos de +increible importancia para la ingeneria de sistemas y demás areas relacionadas +con la informatica. Ya para aquellos que trabajan día a día haciendo +experimentos con librerias tales como [TensorFlow](https://www.tensorflow.org/) +se vuelve una cuestión de suma importancia el andar pendiente de que nuevos +artículos se publican o que nuevas aplicaciones se descubren para el machine +learning, por no decir de que nuevas e increibles mejoras se podrían realizar a +proyectos anteriores, tales como los llamados 'deep fake'. + +Muchas de las herramientas desarrolladas con inteligencia artificial poseen +codigo fuente y bases de datos libremente disponibles para el publico. Ya sea +para fines comerciales o simplemente como demostración, estan aquellas que a su +vez poseen una aplicación web mediante la cual puedes interactuar con los +scripts de una forma directa, realizando manipulación y generación de audio, +imagenes o demás de una forma directa y sencilla, pero no por eso menos eficaz. +De esta manera los usuarios pueden ver el funcionamiento del programa sin +necesidad de compilarlo o de que el autór cree demostraciones, además que ayuda +a difundir el proyecto si se permite la creación de contenidos independientes. + +## Tacotron2: Generación de audios donde se leen textos con las voces de personas reales + +[Tacotron2](https://github.com/Rayhane-mamah/Tacotron-2) se trata de una +implementación por TensorFlow de una arquitectura de redes neuronales profunda +que busca sintetizar habla a partir de texto. Enlazada a un modelo generativo de +formas de ondas llamado WaveNet, el cual fue utilizado anteriormente para el +mismo proposito, Tacotron2 entrena la red neuronal utilizando una base de datos +de voces anteriormente grabadas para crear espectrogramas en la escala Mel, lo +cual a su vez permite su utilización para emular las voces de personas vivas o +inclusive ya muertas, dado que tengan la suficiente cantidad de grabaciones +disponibles. Los resultados son impresionantes, y se pueden ver, por ejemplo, en +el canal de YouTube llamado +[Vocal Synthesis](https://www.youtube.com/channel/UCRt-fquxnij9wDnFJnpPS2Q), +donde se leen copypastas y demas textos con las voces de Ronald Reagan, The +Notorious B.I.G., Ayn Rand, o inclusive la Reina Elizabeth, o en el sitio +[fifteen.ai](https://fifteen.ai/), donde se pueden generar audios con las voces +de personajes de series animadas. + +## Animación de imagénes a partir de un video + +En el paper +[First Order Motion Model for Image Animation](https://aliaksandrsiarohin.github.io/first-order-model-website/) +creado por Siarohin et al. en el 2019, se demostró un framework que permite la +creación de animaciónes a partir de una imagén base "fuente" y un video que +"conduce" la animación, mediante el entrenamiento de una red neuronal con videos +de una misma 'categoria'. Lo que esto permite es realizar cosas tales como +cambiar las caras de las personas presentes en una grabación por las de otras, +alterar el estilo de una animación, cambiar la ropa que tiene puesta una persona +en un video, entre otras. Como te podrás imaginar, esto permite la creación +tanto de deepfakes o videos promocionales 'falsos' como de otras alteraciones +(dar vida a la Mona Lisa, por ejemplo), y es increiblemente convincente con la +edición adecuada, como se puede observar en el video suplementario que muestran +[First Order Motion Model for Image Animation](https://www.youtube.com/watch?v=u-0cQ-grXBQ). + +## MuseNet: Una red neuronal que 'continua' tu música + +[MuseNet](https://openai.com/blog/musenet/) es un proyecto muy simple: se trata +simplemente de una red neuronal profunda que fue creada con el proposito de +crear música. Sus creadores afirman que es capaz de crear piezas de 4 minutos +con 10 instrumentos distintos, "y que puede combinar estilos desde el country +hasta inclusive Mozart o los Beetles". Ya que ha sido entrenada a encontrar +"patrones de armonia, ritmo y estilo aprendiendo a predecir el siguiente token +en cientos de miles de archivos MIDI", se le puede pedir que, por ejemplo, +utilize las primeras 6 notas de un Nocturne de Chopin para generar una pieza con +una instrumentación pop rock, el cual es un ejemplo que se ve en la pagina. +Además, OpenAI permite que cualquiera pruebe la generación de audio mediante +esta red desde la pagina del proyecto para que cualquiera cree nuevas +composiciones. + +## Una inteligencia artificial que 'mira' a traves de las paredes mediante señales WiFi + +En este paper [RF-Pose](https://rfpose.csail.mit.edu/#Paper) publicado por Zhao +et al. se presenta una aplicación llamada RF-Pose que analiza las señales radio +en las frecuencias WiFi, aprovechandose que estas señales inalambricas traspasan +las paredes y se reflejan del cuerpo humano, para estimar poses 2D. Para estimar +la pose, unicamente es necesaria la señal inalambrica, siendo aspectos +relevantes del individuo tales como altura o anchura predichos a partir de esta. +Por lo tanto, aunque sea igualmente eficaz para predecir poses 2D como lo es la +visión humana, la diferencia radica en que es capaz de predecir estas inclusive +si su 'vision' esta siendo interferida por un obstaculo, tal como una pared. Los +resultados en +[AI Senses People Through Walls](https://www.youtube.com/watch?v=HgDdaMy8KNE) +llegan a ser asombrosos, y a la vez, algo perturbadores. + +## Detección de cancer de seno mediante un sistema de inteligencia artificial + +La mamografía es la principal herramienta que tienen los medicos a mano para +identificar y prevenir el cancer de seno antes de que síntomas mas serios +ocurran. Sin embargo, exige que hayan expertos que identífiquen y interpreten +dentro de las imagenes generadas por este proceso ciertas anormalidades, lo cual +esta sujeto al error humano y, por lo tanto, sufre de tasas subóptimas de falsos +positivos y negativos. Por lo tanto, en este paper +[International evaluation of an AI system for breast cancer screening](https://www.nature.com/articles/s41586-019-1799-6) +publicado por Etemadi et al. en el 2020 se buscó crear un sistema que utilizara +la inteligencia artificial para ayudar a los medicos a identíficarlo, y +sorprendentemente, se encontro que el sistema no solamente funcionaba, sino que +reducia los errores de manera significativa, aunque obviamente no era immune a +ellos. También, los autores creen que con este tipo de sistemas se podrían +realizar de una forma mucho mas eficaz esta detección en los paises que no +posean los recursos necesarios para realizarla en números mayores. + +## Referencias + +- [TensorFlow](https://www.tensorflow.org/) +- [Tacotron2](https://github.com/Rayhane-mamah/Tacotron-2) +- [Vocal Synthesis](https://www.youtube.com/channel/UCRt-fquxnij9wDnFJnpPS2Q) +- [fifteen.ai](https://fifteen.ai/) +- [First Order Motion Model for Image Animation](https://aliaksandrsiarohin.github.io/first-order-model-website/) +- [First Order Motion Model for Image Animation](https://www.youtube.com/watch?v=u-0cQ-grXBQ) +- [MuseNet](https://openai.com/blog/musenet/) +- [RF-Pose](https://rfpose.csail.mit.edu/#Paper) +- [AI Senses People Through Walls](https://www.youtube.com/watch?v=HgDdaMy8KNE) +- [International evaluation of an AI system for breast cancer screening](https://www.nature.com/articles/s41586-019-1799-6) diff --git a/content/blog/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-datos-abiertos/header.png b/bkp/blogs/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-datos-abiertos/header.png similarity index 100% rename from content/blog/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-datos-abiertos/header.png rename to bkp/blogs/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-datos-abiertos/header.png diff --git a/content/blog/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-datos-abiertos/index.md b/bkp/blogs/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-datos-abiertos/index.md similarity index 92% rename from content/blog/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-datos-abiertos/index.md rename to bkp/blogs/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-datos-abiertos/index.md index 4281854f2..7033fd879 100644 --- a/content/blog/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-datos-abiertos/index.md +++ b/bkp/blogs/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-datos-abiertos/index.md @@ -2,17 +2,17 @@ title: "Cinco cosas que no debes olvidar al trabajar con datos abiertos" slug: cinco-cosas-que-no-debes-olvidar-al-trabajar-con-datos-abiertos date: 2020-02-21 -author: Anavelyz Perez +authors: ["Anavelyz Perez"] tags: [datos] categories: [ciencia abierta, datos abiertos] - -draft: false -usePageBundles: true +description: | + Cada vez es más común leer o escuchar sobre datos abiertos, pero puede que no + sepamos del todo lo que esto significa. Por ello, vamos a revisar inicialmente + este concepto. thumbnail: "/header.png" -featureImage: "/header.png" +template: "blog-post.html" --- - @@ -31,11 +31,12 @@ en cuanto a quien lo puede ver), y que según sea apropiado, permita además uso comercial. Esto deriva en tres particularidades que los datos deben cumplir para que sean -abiertos, tal como es expresado en https://ceweb.br/guias/dados-abertos/es/capitulo-2/. +abiertos, tal como es expresado en +https://ceweb.br/guias/dados-abertos/es/capitulo-2/. - Disponibilidad y acceso: los datos deben estar disponibles de manera integral - y en una forma en que no genere costos exhorbitantes para la parte interesada en - copiarlos. El escenario más favorable es poner los datos a disposición para + y en una forma en que no genere costos exhorbitantes para la parte interesada + en copiarlos. El escenario más favorable es poner los datos a disposición para que sean descargados a través de Internet. Asimismo, los datos deben ofrecerse en un formato conveniente y modificable. diff --git a/content/blog/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-markdown/header.png b/bkp/blogs/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-markdown/header.png similarity index 100% rename from content/blog/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-markdown/header.png rename to bkp/blogs/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-markdown/header.png diff --git a/bkp/blogs/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-markdown/index.md b/bkp/blogs/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-markdown/index.md new file mode 100644 index 000000000..8bebcf75f --- /dev/null +++ b/bkp/blogs/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-markdown/index.md @@ -0,0 +1,144 @@ +--- +title: "Cinco cosas que no debes olvidar al trabajar con Markdown" +slug: cinco-cosas-que-no-debes-olvidar-al-trabajar-con-markdown +date: 2020-01-24 +authors: ["Yurely Camacho"] +tags: [markdown] +categories: [ciencia de datos] +description: | + Si eres una persona que escribe constantemente artículos para blogs o informes, + utilizando para ello editores de texto convencionales, detente en este momento y + pregúntate: ¿Qué pasaría con todo el trabajo que he venido escribiendo con mi + editor de texto si ya no pudiera volver a utilizarlo? ¿Te asusta verdad?, y si + no es tu caso imagínate, ¿si esto le ocurre a una persona que por años ha estado + escribiendo un libro? Para combatir esa incertidumbre, puedes comenzar a + escribir en texto plano y darle formato con la ayuda de **Markdown**. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Si eres una persona que escribe constantemente artículos para blogs o informes, +utilizando para ello editores de texto convencionales, detente en este momento y +pregúntate: ¿Qué pasaría con todo el trabajo que he venido escribiendo con mi +editor de texto si ya no pudiera volver a utilizarlo? ¿Te asusta verdad?, y si +no es tu caso imagínate, ¿si esto le ocurre a una persona que por años ha estado +escribiendo un libro? Para combatir esa incertidumbre, puedes comenzar a +escribir en texto plano y darle formato con la ayuda de **Markdown**. + + + +Markdown es una herramienta creada en 2004 con la finalidad de convertir +(**texto plano**)[https://es.wikipedia.org/wiki/Archivo_de_texto] a formato HTML +(HyperText Markup Language)[https://es.wikipedia.org/wiki/HTML], usando para +ello una serie de caracteres en diferentes casos, guiones o asteriscos por +ejemplo, para iniciar una lista, entre otros. También es denominado como un +(**Lenguaje de marcado**)[https://es.wikipedia.org/wiki/Lenguaje_de_marcado] que +emplea texto plano y te permite obtener texto con formato, esto es, títulos, +imágenes, negritas, cursivas, enlaces, entre otros. Markdown combina las +ventajas que proporciona el texto plano con la necesidad de darle formato a lo +que escribes y reducir los inconvenientes si la finalidad es exportar el +contenido a la web. + +Cuando te encuentres con un archivo `.md` significa que está escrito en +Markdown. Puedes escribir texto en Markdown en cualquier editor (por ejemplo, en +Windows con el Bloc de notas). El proceso de transformar o interpretar el +Markdown a formato HTML, PDF u otro tipo de formato, se realiza con editores de +texto creados específicamente para manejar este lenguaje. Los cuales están +disponibles para que trabajes online u offline. + +Esta herramienta está siendo ampliamente utilizada en la actualidad por las +personas que escribimos artículos para la web regularmente. Y te decimos +_escribimos_ porque los artículos de este blog están editados con Markdown. + +A continuación vamos a mencionar, sin orden de importancia, cinco cosas que no +debes olvidar al trabajar con Markdown: + +## 1. Existen editores para cualquier sistema operativo (SO) + +El sistema operativo de tu computador, ya sea Windows, Linux o Mac OS, no es una +limitante para usar Markdown. Puedes leer o editar texto en Markdown donde +quieras o usar estos útiles editores que te sugerimos, que van destinados a +usuarios iniciados y profesionales en el uso del lenguaje: + +### Para trabajar online + +- [**Dillinger**](https://dillinger.io/) +- [**StackEdit**](https://stackedit.io/) + +### Según el Sistema Operativo + +- [**Typora**](https://www.typora.io/) (cualquier SO) +- [**WriteMonkey**](https://writemonkey.com/) (Windows) +- [**Laverna**](https://laverna.cc/) (cualquier SO) +- [**Haroopad**](http://pad.haroopress.com/) (cualquier SO) +- [**Caret**](https://caret.io/) (cualquier SO) +- [**ReText**](https://github.com/retext-project/retext) (Linux) +- [**Boostnote**](https://boostnote.io/) (cualquier SO) +- [**Mark Text**](https://marktext.app/) (cualquier SO) +- [**VSCode**](https://code.visualstudio.com/) (cualquier SO) + +## 2. Dile adiós a la engorrosa sintaxis HTML + +Si aún no utilizas Markdown, puedes comenzar ahora mismo, su sintaxis es simple +y legible. Sabemos que al escribir en HTML estamos propensos a cometer errores +debido a las famosas etiquetas de apertura y cierre y a la legibilidad en la +estructura del texto. Incluso puedes emplear Markdown sin tener conocimientos +sobre HTML. Atrévete, sácale provecho al uso de este lenguaje quedarás +impresionado. + +## 3. Puedes hacer diferentes cosas + +El Markdown no es solamente usado para escribir y publicar artículos en la web. +Puedes implementarlo para distintas tareas, tales como: tomar notas y apuntes, +escribir informes, un libro, tesis, foros, entre otros. + +## 4. Accesible y compatible + +Puedes trabajar con Markdown en editores online y offline, como te mencionamos +anteriormente. Por tal motivo, puedes acceder y editar archivos `.md` desde +distintos dispositivos: tablets, computadores de escritorio, teléfonos +inteligentes. Puedes leer este tipo de archivos de texto independientemente del +editor, esto quiere decir que Markdown es compatible con otros formatos. De la +misma manera, puedes ejecutar código, comentarlo y escribir texto en Markdown al +mismo tiempo. Por ejemplo, utilizando Cuadernos de Jupyter o RMarkdown, entre +otras herramientas. + +Si deseas conocer más acerca de los cuadernos de Jupyter, te invito a que +revises nuestro artículo +[¿Ya has probado los Cuadernos de Jupyter? Te explicamos qué son y cómo te ayudarán en tu próxima investigación.](/blog/ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion/). + +## 5. Usando caracteres le das formato al texto + +Así como lo acabas de leer, el formato en archivos Markdown se especifica +mediante algunos caracteres como #, \*, -, !, (), [], "", ?, entre otros. Por +ejemplo, si al comienzo de una línea dejas un espacio, luego de colocar una +almohadilla (#) se activa el formato de título, donde el número de almohadillas +seguidas indica el nivel del título. Asimismo, si escribes una palabra entre +asteriscos el resultado de la conversión a HTML es la palabra en cursivas, si la +encierras con dos asteriscos en negrita y tres en negrita y cursiva a la vez. +Estos son algunos ejemplos. En los archivos Markdown puedes también añadir +enlaces e imágenes a tu escrito. + +Puedes aprovechar desde ahora mismo el potencial de Markdown para tu vida +académica y/o profesional, para comenzar cualquier proyecto colaborativo o +simplemente tomar apuntes. Hay que resaltar que el usuario final, por ejemplo, +las personas que leen tus artículos, no notan que escribes con Markdown. Sin +embargo, el lenguaje está pensado para garantizar la comodidad y eficiencia del +escritor. + +Acá te dejamos algunos enlaces a manuales e información importante sobre +Markdown: + +- Guía rápida Markdown (https://tutorialmarkdown.com/guia) +- Información sobre Markdown (https://markdown.es/) +- Blog (https://joedicastro.com/pages/markdown.html) + +### Referencias + +[Página del proyecto Markdown, John Gruber](https://daringfireball.net/projects/markdown/) + +[Blog sobre Markdown](https://markdown.es/) +(https://markdown.es/editores-markdown/) diff --git a/content/blog/cinco-cosas-que-te-ayudaran-gestionar-mejor-los-datos-de-tus-proximos-proyectos/header.png b/bkp/blogs/cinco-cosas-que-te-ayudaran-gestionar-mejor-los-datos-de-tus-proximos-proyectos/header.png similarity index 100% rename from content/blog/cinco-cosas-que-te-ayudaran-gestionar-mejor-los-datos-de-tus-proximos-proyectos/header.png rename to bkp/blogs/cinco-cosas-que-te-ayudaran-gestionar-mejor-los-datos-de-tus-proximos-proyectos/header.png diff --git a/bkp/blogs/cinco-cosas-que-te-ayudaran-gestionar-mejor-los-datos-de-tus-proximos-proyectos/index.md b/bkp/blogs/cinco-cosas-que-te-ayudaran-gestionar-mejor-los-datos-de-tus-proximos-proyectos/index.md new file mode 100644 index 000000000..697c51b2c --- /dev/null +++ b/bkp/blogs/cinco-cosas-que-te-ayudaran-gestionar-mejor-los-datos-de-tus-proximos-proyectos/index.md @@ -0,0 +1,171 @@ +--- +title: + "Cinco cosas que te ayudarán a gestionar mejor los datos de tus próximos + proyectos" +slug: cinco-cosas-que-te-ayudaran-gestionar-mejor-los-datos-de-tus-proximos-proyectos +date: 2020-01-19 +authors: ["Yurely Camacho"] +tags: [datos, proyectos, gestión] +categories: [ciencia de datos, investigación abierta] +description: | + Los datos se consideran, y así debe ser, la materia prima para realizar + distintas actividades como la investigación, la toma de decisiones + basadas en estadísticas, la divulgación de información, la colaboración + entre proyectos y otras. Por tal motivo si estás manejando datos + (independientemente de la cantidad) lo mejor es garantizar una buena gestión de ellos. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Los datos se consideran, y así debe ser, la materia prima para realizar +distintas actividades como la investigación, la toma de decisiones basadas en +estadísticas, la divulgación de información, la colaboración entre proyectos y +otras. Por tal motivo si estás manejando datos (independientemente de la +cantidad) lo mejor es garantizar una buena gestión de ellos. + + + +Si estás leyendo esto es porque algo te motivó a conocer más sobre la gestión de +datos y lo que debes poner en práctica para lograrlo. Comencemos por decir que +**gestión de datos** está relacionada con el manejo de datos durante todo su +ciclo de vida, es decir, desde que son recopilados o tomados de otras fuentes, +hasta que se culminan las operaciones con ellos y/o son depositados finalmente +para que sean utilizados por otros. La gestión de datos comprende una serie de +prácticas, procedimientos, procesos y manejo de sistemas informáticos para +ejercer control sobre los datos disponibles, ya sea en una organización, para un +proyecto de investigación o en cualquier actividad donde la base fundamental sea +el tratamiento de datos. + +En este post no vamos a conocer en profundidad el amplio tema de la gestión de +datos, pero si te daremos algunas sugerencias y recomendaciones para que, si +estás ejecutando un proyecto, estas por iniciar alguno o hasta ahora tienes +pensado hacerlo, puedas gestionar mejor los datos que se generen en este +proceso. Los tips que te mostramos a continuación están basados fundamentalmente +en la gestión de datos de investigación, pero pueden ser replicados fácilmente +en otras actividades donde el protagonista sean los datos. Comencemos. + +1. **Selecciona y organiza tus datos** + +En cualquier proceso investigativode investigación se reúnen diversos conjuntos +de datos, los cuales en la mayoría de ocasiones son de dimensiones grandes. El +principal objetivo es garantizar que tus datos adopten los principios +[FAIR](https://www.go-fair.org/fair-principles/) (Fáciles de encontrar +(findable), accesibles, interoperables y reusables). Inicialmente necesitas +organizar los datos por carpetas de acuerdo a cada tema que consideres. Teniendo +en cuenta que al final de la investigación te aconsejamos que tengas una carpeta +donde se encuentren los datos "crudos", datos procesados y resultados. + +Resulta importante que decidas los datos que verdaderamente son necesarios de +preservar a largo plazo y qué datos eliminar, para lo cual te sugerimos limpiar +tus datos y eligir aquellos que pueden ser útiles. Si en ocasiones necesitas +llevar un control sobre todas las operaciones o cambios en tus datos, puedes +utilizar herramientas como Git (enlace a artículo Git de cero a cien) para +llevar un control de versiones. + +2. **Documenta y cita los conjuntos de datos que utilices** + +Al igual que con cualquier recurso bibliográfico, los conjuntos de datos que +utilices en tus proyectos que sean provenientes de terceros, deben ser citados +siguiendo los estándares de acuerdo al tema que estes tratando. La citación +adecuada de los datos de investigación brinda distintos beneficios, entre ellos: +La investigación tiene mayor publicidad, promueves la reutilización de datos y +puedes recibir un estímulo por usar y publicar los conjuntos de datos. Asimismo +puedes comparar distintas publicaciones que usen el mismo conjunto de datos y +sustentar las conclusiones de los investigadores o encontrar disimilaridades en +los resultados. + +Un tema realmente importante en el mundo de los datos abiertos, el código +abierto, y en fin, en la Ciencia abierta, es el de la **documentación de los +datos**. La tarea de documentar es básicamente generar, preservar y dar acceso a +toda la información sobre el contexto de los datos, su contenido y estructura, +el proceso de generación o recopilación,la forma como van a ser utilizados +(operaciones a ser realizadas), las transformaciones a las que han sido +sometidos, entre otras operaciones que garanticen su reutilización e +interpretación adecuada, ya sea por parte de las personas que los han creado o +por otras personas interesadas en ello. Sugerimos que esta actividad comience +junto con la investigación, para que no se obvie información importante. + +No se podría hablar de documentar datos sin mencionar a los **metadatos**. +Podemos referirnos a ellos como _"datos sobre los datos"_ y nos permiten +describirlos de forma estructurada y normalizada para lo cual existen estándares +generales y especializados. + +3 **Garantiza la seguridad y la reutilización de los datos** + +Los datos siempre están expuestos a amenazas de seguridad, por ejemplo, acceso y +manejo no autorizado, corrupción del conjunto de datos y también su pérdida +parcial o total. Las siguientes alternativas podrán ayudarte a proteger tus +datos: + +- Contar con un repositorio personal (respaldo) para los datos y el proyecto + general, por ejemplo, utilizando unidades en red dentro de la institución, un + repositorio institucional (si es el caso) o un repositorio personal (por + ejemplo, en GitHub). +- Guardar los datos en la nube. +- Nunca olvides el uso de contraseñas robustas, capaces de resistir ataques + informáticos. + +4 **Guarda tus datos en repositorios** + +Para facilitar el acceso, preservación, reutilización y seguridad de los datos, +te recomendamos que los deposites en repositorios creados para esto, o puedes +crear tu propio repositorio. Esto no excluye la posibilidad de compartir los +datos de tus proyectos de manera informal, por ejemplo, mediante una solicitud +de correo electrónico. Sin embargo, esta no es la manera adecuada de hacerlo, ya +que existen plataformas que te brindan la posibilidad de que tus datos estén a +la disposición de cualquiera, por ejemplo, [GitHub](https://github.com/). Si +usamos estas herramientas hacemos que otros investigadores puedan utilizar +nuestros datos, o en otros casos hacer que un proyecto de investigación sea +colaborativo (enlace a artículo investigacion_colaborativa e +investigacion_colaborativa con git). + +De la misma manera, puedes depositar tus datos en algunos repositorios que se +encuentran disponibles de acuerdo al tema de estudio, para lo cual debes +informarte sobre sus políticas y tomar una decisión sobre distintas alternativas +que tengas, donde te garanticen los derechos como recolector de datos y la +seguridad de los mismos. + +Si almacenas los datos de tu proyecto en un repositorio puedes conseguir +financiamiento, ya que actualmente crece la cantidad de empresas que tienen esto +como un requisito. Asimismo puedes protegerlos y hacer que tu tiempo y recursos +invertidos estén de alguna manera "compensados". + +5 **Forma parte de la promoción en la apertura y licenciamiento de datos** + +Como se mencionó al inicio, debes garantizar en la medida de lo posible, que tus +datos sigan los principios FAIR. Para promover esa apertura existen condiciones +referentes a la reutilización de un conjunto de datos, las cuales varían +dependiendo del tipo de investigación y de cada caso en particular. Sin embargo, +la ciencia abierta (enlace a artículo de ciencia_abierta) promueve el máximo +grado posible de apertura de los datos de investigación, esto quiere decir que +si tu propósito es "hacer ciencia abierta" necesitas comenzar por asignar +licencias abiertas a tus datos, o con la menor cantidad de restricciones +posibles. + +Las licencias especifican claramente las condiciones bajo las cuales se pueden +reutilizar los conjuntos de datos y las operaciones que se pueden realizar con +estos, además de las condiciones con respecto a la propiedad intelectual. +Existen estándares de +[licencias para la apertura de los datos](https://help.data.world/hc/en-us/articles/115006114287-Common-license-types-for-datasets) +las cuales pueden ser usadas libremente. + +Ya te hemos dado algunas sugerencias para que manejes mejor los datos de tus +proyectos, recuerda que esto puede ser replicado para cualquier tipo de proyecto +que estés realizando o tengas pensado ejecutar. Si continuas indagando sobre el +tema de la gestión de datos, puedes toparte con algo denominado **Plan de +Gestión de Datos**, el cual es un documento formal donde se plazma toda la +información referente a los procesos y tareas a los cuales serán sometidos los +datos durante todo su ciclo de vida. En resumen, es un documento que debe tomar +en cuenta todos los aspectos que te mencionamos anteriormente. + +Esperamos que te haya servido esta información y de ahora en adelante comiences +a ponerla en práctica en el manejo de datos de tus proyectos. + +**Referencias** + +[Comunidad global de gestión de datos](https://dama.org/) +[Gestión de datos de investigación](https://biblioguias.cepal.org/c.php?g=495473&p=3390849) +[Recomendaciones para la gestión de datos de investigación](http://digital.csic.es/bitstream/10261/173801/1/Maredata-recomendaciones-ESP.pdf) diff --git a/content/blog/cinco-tips-para-aumentar-tu-productividad-con-git/header.png b/bkp/blogs/cinco-tips-para-aumentar-tu-productividad-con-git/header.png similarity index 100% rename from content/blog/cinco-tips-para-aumentar-tu-productividad-con-git/header.png rename to bkp/blogs/cinco-tips-para-aumentar-tu-productividad-con-git/header.png diff --git a/bkp/blogs/cinco-tips-para-aumentar-tu-productividad-con-git/index.md b/bkp/blogs/cinco-tips-para-aumentar-tu-productividad-con-git/index.md new file mode 100644 index 000000000..5f5185f6b --- /dev/null +++ b/bkp/blogs/cinco-tips-para-aumentar-tu-productividad-con-git/index.md @@ -0,0 +1,166 @@ +--- +title: "Cinco tips para aumentar tu productividad con Git" +slug: cinco-tips-para-aumentar-tu-productividad-con-git +date: 2020-02-05 +authors: ["Yurely Camacho"] +tags: [git, ramas, repositorios, cambios] +categories: [desarrollo de software, control de versiones, aprendizaje] +description: | + En otros de nuestros artículos publicados, te hablamos sobre Git de 0 a + 100 e investigación colaborativa con + Git. Allí hemos repasado sobre las bondades de este sistema y su uso actual en la + colaboración en proyectos abiertos, grandes o pequeños, manejándolos con mayor + eficiencia e inspección al ser un sistema de control de versiones distribuido, lo + que indica que cada desarrollador tiene el historial completo de su repositorio + de manera local y existe una copia central. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +En otros de nuestros artículos publicados, te hablamos sobre +[Git de 0 a 100](/blog/git-de-en-diez-sencillos-pasos/) e +[investigación colaborativa con Git](/blog/investigacion-colaborativa-con-git/). +Allí hemos repasado sobre las bondades de este sistema y su uso actual en la +colaboración en proyectos abiertos, grandes o pequeños, manejándolos con mayor +eficiencia e inspección al ser un sistema de control de versiones distribuido, +lo que indica que cada desarrollador tiene el historial completo de su +repositorio de manera local y existe una copia central. + + + +No solo los desarrolladores de software utilizan Git. Esta herramienta es útil +en los casos donde necesites llevar a cabo proyectos colaborativos: por ejemplo, +si tienes un blog, puedes gestionar los artículos y almacenarlos en un +repositorio de Git. + +En este post te presentamos algunos tips para que tu trabajo en git sea más +productivo, posiblemente, que lo que ha sido hasta ahora. + +1. **Maneja las ramas adecuadamente** + +Como te mencionamos en nuestro artículo +[Git de 0 a 100 en diez sencillos pasos](/blog/git-de-en-diez-sencillos-pasos/) +puedes manejar distintas ramas en tu repositorio. En cada rama, se registran +todos los cambios hechos por quienes la utilizan y también puedes realizar +operaciones entre las ramas como su fusión, por ejemplo. Generalmente, las ramas +son empleadas para desarrollar funcionalidades aisladas unas de otras. Por +defecto el repositorio se crea con una rama, denominada "master". + +En el manejo de ramas debes considerar, entre otras cosas, lo siguiente: + +- Cualquier repositorio tiene o debería tener mínimo dos ramas: una conocida + como _master_, que es la rama de producción, y la segunda rama, que se deriva + de master, en la cual se desarrollan nuevas funciones o se corrigen fallos + encontrados en master. A esta rama se le suele denominar _develop_. + +- Puedes crear ramas derivadas de _develop_ para desarrollar otras + funcionalidades y/o corregir detalles de esta rama, suelen denominarse + _features_. + +- En la rama _master_ solo deben estar las modificaciones definitivas del + proyecto, es decir, no debes "tocarla" hasta que estés seguro que los cambios + en el proyecto no arrojen problemas al momento de hacer pruebas. + +- Debes mantener actualizada la rama donde trabajes con la rama de donde se + derivó. + +- Evita mezclar cambios de diferentes ramas. + +- Verifica la rama donde te encuentras al momento de editar cualquier archivo, + así evitas realizar cambios y subirlos a la rama equivocada y afectar el + desarrollo de todo el equipo de trabajo. Esto es sumamente necesario. + +2. **Crea alias para los comandos de git que más utilices** + +Con Git, a diario tecleas cierta cantidad de comandos, algunos que pueden +tornarse repetitivos. Además, esta herramienta no ofrece la función de +autocompletado. Puedes ser más productivo, si creas _alias_ para aquellos que +más utilices. El alias es un "nombre" que, en este caso, le asignamos a un +comando de Git para que sea más corto, esto nos permite ejecutar la misma acción +tecleando menos, es decir, nos ayuda a ahorrar tiempo y son más fáciles de +recordar. + +Para fijar alias a los comandos utiliza `git config --global`. Por ejemplo: + +``` +$ git config --global alias.br branch +$ git config --global alias.st status +$ git config --global alias.ci commit +``` + +De ahora en adelante escribes `git br` en lugar de `git branch` y así para los +demás del ejemplo. No existe un estándar para la creación de alias, todo +dependerá de que te sientas a gusto con ellos. A medida que aumentes tu trabajo +con Git, utilizarás frecuentemente otros comandos, si te sientes a gusto no +dudes en crear alias para ellos. + +3. **Juntar commits en uno solo** + +En la mayoría de ocasiones existen proyectos con muchas ramas, varios +colaboradores y, por tanto, muchos commits. Para ahorrar tiempo y hacer el +trabajo menos tedioso, puedes unir los commits. + +Esta alternativa requiere que tomes en cuenta algunas cosas: + +- No se recomienda mezclar cambios de diferentes ramas. + +- Evita, en la medida de lo posible, que los cambios sean de distinto tipo (por + ejemplo, un cambio en un archivo de texto y otro en uno de código), + previniendo inconvenientes si por algún motivo debes luego deshacer los + cambios. + +4. **Puedes utilizar alguna interfaz gráfica para manejar Git** + +Tal vez usar el terminal para gestionar Git puede resultarte al principio algo +complejo, mayormente si estás iniciándote con el control de versiones. Por eso +puede resultarte conveniente emplear algunos clientes gráficos de Git, para +gestionar los proyectos de una forma visual e intuitiva y acelerar tu trabajo. +Muchos de ellos son totalmente gratuitos, de código abierto y los hay para +cualquier sistema operativo. + +En la wiki de Git puedes encontrar una lista más completa de los +[clientes de Git](https://git.wiki.kernel.org/index.php/Interfaces,_frontends,_and_tools#Graphical_Interfaces) + +Las interfaces gráficas se adaptan a distintos flujos de trabajo, es decir, +algunas incluyen más funcionalidades que otras. No obstante, ninguna puede +considerarse mejor que otra, solamente que cada una se ajusta a las necesidades +de los usuarios. Vamos, ¡anímate a usar alguna de ellas! + +5. **Más sobre los commits y otras recomendaciones** + +- Al comenzar una nueva sesión de trabajo, deberías hacer un `fetch` o un `pull` + para traerte los últimos cambios. De esta manera, evitas conflictos en el + futuro al sobrescribir el trabajo de los demás sin necesidad. + +- Haz commit con frecuencia, no tengas miedo de hacer commits con cosas sin + terminar y que se muestren así en el histórico. + +- Cada vez que tengas código que deseas guardar puedes hacer commit. Ten + presente que al hacerlo no necesariamente debes hacer un push. Puedes hacer + commits en tu repositorio local para proteger y llevar un control de tu + trabajo. + +- Revisa siempre los cambios antes de subirlos y asegúrate de confirmar en el + commit lo que realmente necesites. + +- El mensaje de commit debe ser conciso pero al mismo tiempo informativo. + +- No subas cambios directamente a la rama _master_, siempre y cuando no lo + amerite. + +Te hemos presentado algunos tips para que tengas un mejor manejo y mayor +productividad al utilizar git en tus proyectos. Tal vez muchas de ellas son +evidentes; sin embargo, por más mínimas que nos puedan parecer, debemos tenerlas +presentes para evitar molestias en el proyecto y en el grupo de trabajo y +aumentar así nuestra productividad en el control de versiones con Git. + +**Referencias** + +- [Git Book](https://git-scm.com/book/es/v2) + +- [Domina Git desde cero](https://sargantanacode.es/post/using-git-aliases-to-increase-our-productivity) + +- [Los 10 mandamientos del control de código fuente](https://www.campusmvp.es/recursos/post/los-10-mandamientos-del-control-de-codigo-fuente.aspx) diff --git a/content/blog/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/codeabbey.png b/bkp/blogs/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/codeabbey.png similarity index 100% rename from content/blog/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/codeabbey.png rename to bkp/blogs/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/codeabbey.png diff --git a/content/blog/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/header.png b/bkp/blogs/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/header.png similarity index 100% rename from content/blog/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/header.png rename to bkp/blogs/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/header.png diff --git a/bkp/blogs/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/index.md b/bkp/blogs/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/index.md new file mode 100644 index 000000000..f214a1a63 --- /dev/null +++ b/bkp/blogs/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/index.md @@ -0,0 +1,126 @@ +--- +title: "Code Abbey una plataforma para mejorar tu habilidad en programación" +slug: code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion +date: 2022-03-22 +authors: ["Ever Vino"] +tags: [codeabbey, retos de programación] +categories: [programación] +description: | + Alguna vez te has pregundado, ¿Cómo puedo mejorar mis habilidades de + programación?. Este artículo tiene la respuesta, te mostraremos una de las + mejores plataformas para que puedas practicar programación resolviendo + problemas. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + +Alguna vez te has pregundado, ¿Cómo puedo mejorar mis habilidades de +programación?. Este artículo tiene la respuesta, te mostraremos una de las +mejores plataformas para que puedas practicar programación resolviendo +problemas. + + + +## ¿Qué es Code Abbey ? + +> Creemos que hay tres cosas que nos guían al éxito: Practica, Practica y +> ¡Practica! + +[Code Abbey](https://www.codeabbey.com/) es una plataforma, impulsada y +mantenida por Rodion Gorkovenko con ayuda de la comunidad de Code Abbey, +contiene gran cantidad de problemas con dificultad variable, desde una simples +sumas, hasta algunas donde tienes que aplicar conceptos de Inteligencia +Artificial. Puedes resolver los problemas en varios lenguajes: C, C++, C#, +Python, Java, JavaScript e incluso con algunos menos conocidos como: Turing y +Brainf\*\*k. + +## ¿Cómo funciona? + +Puedes registrarte con una cuenta de gmail, facebook o de GitHub. + +![Portada CodeAbbey](codeabbey.png) + +Un vez hecho el **Login** puedes ver los problemas haciendo click en la pestaña +**Problems**. Seleccionado el problema se te abrira la siguiente ventana: + +![Portada CodeAbbey problemas](problems1.png) + +La primera sección podrás ver el enunciado del problema y un ejemplo de entrada +y salida de lo solicitado. Cuando tengas la resolución del problema (script o +código), lo haces correr con los datos de entrada del test (**Test Data**). + +![Portada CodeAbbey problemas](problems2.png) + +La solución que arroje tu programa la copias en el espacio vacio de de **You +Answer**. Luego le puedes dar click a **Submit**, una vez se haya comprobado que +la respuesta es correcta, la resolución del problema será dada como válida. + +Otra forma de verificar que tu código arroja la respuesta correcta es pegar el +código a la plataforma en el espacio vacio que encuentra por encima del boton +**Submit**, y hacerla correr con los botones que se encuentran en la parte +inferior derecha, haciendo click en el botón de tu lenguaje de programación hará +correr el script con los datos de test data y escribira la solución en la parte +de **Your Answer** y guardará tu código en la plataforma. Es recomendable +guardar el código en la plataforma incluso si no haces correr y sólo subes la +respuesta manualmente, esto permite la compobracion para lo administradores de +Code Abbey de que estas resolviendo los problemas por tu cuenta. + +Una vez tu solución haya sido validada se te añadiran puntos de _Enlightment_ +(que están calculados en base a la cantidad de personas que resolvieron el mismo +problema) y con base a los problemas resueltos se te asignará un rango dentro de +la comunidad. + +> **Zealus Coder rank** Cuando resuelvas 120 problemas de los marcados con +> negrita o con la etiqueta c-1, puedes reclamar el certificado de **CodeAbbey +> Zealous Coder**, que certificará que resolviste los problemas difíciles de la +> plataforma. Como forma de motivar a que más mujeres entren al mundo de la +> programación, Code Abbey da un diploma honorario a las chicas que resuelvan 85 +> problemas y el rango de **Fanatic Girl-Coder**. + +## ¿Por qué resolver problemas en Code Abbey? + +Muy aparte de la satifacción de resolver problemas, ascender rangos, pertenecer +a una comunidad y/o obtener un certificado que puedas presumir en tus redes. Se +tiene que tener en cuenta que la resolución de estos problemas, ayudan a afinar +tus habilidades en programación, porque para la resolución de los problemas se +requieren conocimientos de conceptos básicos, estadística, estructura de datos, +algoritmos de busqueda, ordenación, criptografía, teoría de números, entre +otros. Estos problemas, pueden ayudarte a prepararte para entrevistas y/o para +mejorar tu propio código, viendo cómo lo han resuelto los demás (esta opción se +habilita cuando tu solución sea tomada como válida). + +## ¿Qué hacer cuando un problema es muy complicado? + +Puedes ir a la sección de **Volumes** de la plataforma y darle una leida, y si +no basta puedes darle un vistazo a los siguientes recursos: + +- [**CS50X**](https://pll.harvard.edu/course/cs50-introduction-computer-science?delta=0): + Curso gratuito, ideal para los que empiezan a programar. +- **Python Crash Course - Eric Matthes**: Libro para iniciantes en python. +- [**Learn X in Y**](https://learnxinyminutes.com/). Recurso web para aprender + cualquier lenguaje de programación. +- **Grokking algorithms- Aditya Bhargava**: Libro para preparte en problemas + complicados. +- **Craking the Coding interview - Gayle Laskmann**: Libro para preparte en + problemas complicados. + +Libros para mejorar tus matemáticas + +- **Mathematics for Computer Science - Eric Lehman and Tom Leighton** +- **Introduction to algorithms - Thomas H. Cormen** +- **Algorithm Design - Jon Kleinberg** + +## ¿Sitios similares? + +- [ROSALIND](https://rosalind.info/problems/locations/) Orientado a problemas de + programación en Bioinformática. +- [Project Euler](https://projecteuler.net/) Contiene poblemas matemáticos y de + programación. +- [algo.is](https://algo.is/) Problemas de competición de programación. +- [exercism](https://exercism.org/) Contiene problemas variados de programación. + +## Referencias + +[Code Abbey](https://www.codeabbey.com/) diff --git a/content/blog/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/problems1.png b/bkp/blogs/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/problems1.png similarity index 100% rename from content/blog/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/problems1.png rename to bkp/blogs/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/problems1.png diff --git a/content/blog/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/problems2.png b/bkp/blogs/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/problems2.png similarity index 100% rename from content/blog/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/problems2.png rename to bkp/blogs/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/problems2.png diff --git a/content/blog/como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto/header.png b/bkp/blogs/como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto/header.png similarity index 100% rename from content/blog/como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto/header.png rename to bkp/blogs/como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto/header.png diff --git a/bkp/blogs/como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto/index.md b/bkp/blogs/como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto/index.md new file mode 100644 index 000000000..8384ef55c --- /dev/null +++ b/bkp/blogs/como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto/index.md @@ -0,0 +1,129 @@ +--- +title: + "¿Cómo aplicar la investigación reproducible a proyectos de código abierto?" +slug: como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto +date: 2020-03-09 +authors: ["Yurely Camacho"] +tags: [código, reproducibilidad] +categories: [ciencia abierta, investigación abierta, código abierto] +description: | + Los avances en la ciencia están fuertemente relacionados con la reproducibilidad + en las investigaciones. Resulta muy importante lograr que otras personas puedan + reproducir nuestros trabajos. ¡Imagínate la aceptación que tendría una + investigación si todos los intentos posteriores de ratificar los resultados + fracasan! +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Los avances en la ciencia están fuertemente relacionados con la reproducibilidad +en las investigaciones. Resulta muy importante lograr que otras personas puedan +reproducir nuestros trabajos. ¡Imagínate la aceptación que tendría una +investigación si todos los intentos posteriores de ratificar los resultados +fracasan! + + + +De acuerdo con estudios y encuestas online, como la realizada por la revista +internacional semanal sobre ciencia [Nature](https://www.nature.com/) acerca de +la [reproducibilidad en la investigación](https://youtu.be/j7K3s_vi_1Y), más del +70% de los 1576 investigadores participantes en la encuesta, no han podido +reproducir las investigaciones de otros científicos, y más del 50% han fallado +en la reproducción de sus propios experimentos. De allí que el tema de la +reproducibilidad es considerado como uno de los principales retos de los +científicos y de las revistas que publican dichas investigaciones, en especial +para garantizar su veracidad. Otro resultado relevante de dicho estudio, es que +el 52% de los investigadores encuestados respondieron afirmativamente a la +consideración de que, hoy día, hay una significativa _crisis de +reproducibilidad_ actual. + +De manera general, consideramos a una investigación como reproducible, si el +desarrollo conceptual de la misma tiene adjunto y abierto el _código +informático_ con la documentación mínima necesaria e instrucciones que permitan +repetir los cálculos realizados para obtener los resultados en el documento, es +decir, que pueda ser reproducida a partir de los datos originales. Asimismo, +permite auditar el procedimiento de cálculo y los métodos estadísticos +empleados. Este concepto debe diferenciarse del término replicabilidad, que se +refiere a la posibilidad de repetir el mismo estudio con la información +proporcionada en la investigación pero con nuevos datos. + +Bajo el enfoque de código abierto y reproducibilidad en las investigaciones, lo +que se quiere hacer es que las herramientas implementadas en la investigación y +el código generado para el procesamiento de los datos (para aquellas +investigaciones que lo generen), sea "abierto" para cualquiera que esté +interesado en reproducir nuestra investigación. Recordemos que uno de los +principios de la investigación reproducible, mencionado en nuestro artículo +[¿Cuáles son los principios de la investigación reproducible?](/blog/cuales-son-los-principios-de-la-investigacion-reproducible/), +es la _metodología abierta_ que, básicamente, busca compartir el procedimiento +llevado a cabo antes, durante y después de la investigación, lo cual da +confianza a la hora de compartir los resultados y también anima a revisar los +pasos de tu investigación y permite a otros verificarlo. + +Otro aspecto valioso a tomar en cuenta si la investigación tiene código y +queremos que sea reproducible, es la documentación. Como lo mencionamos en +[nuestro artículo sobre Documentación de código abierto](/blog/si-ya-usas-codigo-abierto-te-contamos-como-puedes-sacarle-mayor-provecho-tu-documentacion-para-tus-articulos-y-publicaciones/), +este es un factor muy importante a la hora de crear proyectos accesibles e +inclusivos y también debe considerarse como un aspecto importante para hacer +reproducible el proyecto de código abierto. Junto con la documentación resulta +necesario listar los requerimientos para la ejecución del código, donde se +incluya la especificación de las plataformas para que funcione el código, las +versiones de paquetes o dependencias que se requieran para la interpretación y +usabilidad del código a mediano y largo plazo, todo esto garantiza el principio +de _transparencia_ de una investigación reproducible que contiene código. + +Para que un proyecto de código abierto sea reproducible, también debe estar +depositado en un repositorio de acceso abierto bajo plataformas como GitLab o +GitHub, las cuales permiten llevar un control de versiones sobre las +actualizaciones y cambios que se realizan al cabo del tiempo en el proyecto, +para que cualquiera pueda conocer su trayecto y pueda o no, colaborar en él. +Como lo mencionamos en +[nuestro artículo sobre código abierto](/blog/que-es-el-codigo-abierto-y-como-puede-ayudarte/) +una de las comunidades más grandes de código abierto a nivel internacional es +[GitHub](https://github.com/), que nos permite crear y consultar repositorios +sobre investigaciones previas, pudiendo necesitar reproducir alguna de ellas o +alojar nuestro proyecto para que sea reproducible y colaborativo. + +Bajo el mismo enfoque, la utilización de +[cuadernos de Jupyter](https://jupyter.org), por ejemplo, es altamente +recomendado porque permite en un mismo espacio, hacer el análisis y a la vez +mostrar comentarios sobre los pasos del experimento. La decisión de implementar +o no una herramienta, depende de la decisión del investigador, no obstante bajo +el pensamiento de ciencia abierta, se debe buscar en la medida de lo posible, +que dichas herramientas se encuentren bajo los estándares de esta "forma de +hacer ciencia". + +Otro concepto que se maneja en el ámbito de código abierto e investigación +reproducible es el de _Software de investigación abierto o Software de +investigación de Código Abierto_, que según el +[Manual de capacitación sobre ciencia abierta de la FOSTER](https://book.fosteropenscience.eu/es/) +se refiere al uso y desarrollo de software para el análisis, la simulación y la +visualización cuyo código fuente completo está disponible, compartiéndose con +una licencia que perita su redistribución y modificación. Mediante la +implementación de este tipo de software, se garantiza la reproducibilidad en la +investigación, poniendo a disposición de cualquiera los datos junto con el +código generado en la investigación y permitiendo también la reutilización de +este software para otras investigaciones. + +Si haces que tu investigación sea reproducible, poniendo en práctica los +elementos que te hemos mencionado en este post, aumentará la probabilidad de +aceptación de investigadores, harás que tu código pueda ser ejecutado por otras +personas en tareas repetitivas, reducirás el riesgo de errores, facilitarás la +colaboración de otros investigadores, la detección de errores y la revisión. Si +publicas el código, facilitas la comprensión del artículo y evita malas +interpretaciones, aumentarás el impacto de las publicaciones: citas, +reconocimiento, reutilización, coautorías, y ahorrarás tiempo y esfuerzo al +reutilizar código en otros proyectos. + +Garantiza que tu investigación sea reproducible, no formes parte de la crisis +actual de reproducibilidad. ¡Haz la diferencia! + +### Referencias + +- [Ciencia reproducible, qué, por qué, cómo](https://revistaecosistemas.net/index.php/ecosistemas/article/view/1178) + +- [Manual de capacitación sobre ciencia abierta de la FOSTER](https://book.fosteropenscience.eu/es/) + +- [Nature, reproducibilidad](https://www.nature.com/news/1-500-scientists-lift-the-lid-on-reproducibility-1.19970) diff --git a/content/blog/como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones/header.png b/bkp/blogs/como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones/header.png similarity index 100% rename from content/blog/como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones/header.png rename to bkp/blogs/como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones/header.png diff --git a/bkp/blogs/como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones/index.md b/bkp/blogs/como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones/index.md new file mode 100644 index 000000000..0f0e29b01 --- /dev/null +++ b/bkp/blogs/como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones/index.md @@ -0,0 +1,129 @@ +--- +title: "¿Cómo aplicar los principios de acceso abierto en tus investigaciones?" +slug: como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones +date: 2020-03-30 +authors: Anavelyz Perez +tags: [open science] +category: [open access] +description: | + Al realizar una investigación estamos sujetos a distintos panoramas en los + cuales nuestro criterio tiene un papel muy importante, porque de ello va a + depender cosas tales como la difusión, edición y evaluación del proyecto. De + acuerdo con esto, los trabajos de investigación han venido adoptando esquemas + formales y estructuras de manera tal que se conviertan en estándares para todos. + Al principio, para lograr esto, se recurría al asesoramiento de editores que por + lo general estaban adscritos a una revista específica. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Al realizar una investigación estamos sujetos a distintos panoramas en los +cuales nuestro criterio tiene un papel muy importante, porque de ello va a +depender cosas tales como la difusión, edición y evaluación del proyecto. De +acuerdo con esto, los trabajos de investigación han venido adoptando esquemas +formales y estructuras de manera tal que se conviertan en estándares para todos. +Al principio, para lograr esto, se recurría al asesoramiento de editores que por +lo general estaban adscritos a una revista específica. + + + +Con el paso del tiempo y la inclusión en la sociedad de distintas herramientas +tales como la Internet, han surgido nuevas maneras para que el investigador o +grupo de trabajo publiquen los resultados finales, una de ellas es la +publicación bajo acceso abierto. Este enfoque logra que los proyectos estén +disponibles de forma libre y gratuita, en Internet o cualquier otro medio. +Además se permite copiar, utilizar o distribuir el contenido de nuestras +investigaciones. Cosa que puede no ocurrir bajo otro enfoque, donde las +limitaciones son mayores y los costos de la investigación tienen una alta +probabilidad de aumentar. Asimismo, se cuenta con personas profesionales +dedicadas a editar o algún software que estandariza el contenido de manera +gratuita o a un costo más bajo en comparación a la forma inicial de las +publicaciones. + +En España, por ejemplo, cuando se desea difundir bajo acceso abierto contamos +con dos opciones: ruta verde (repositorios) y ruta dorada (revistas doradas y +revistas híbridas). La ruta verde implica el depósito y difusión en acceso +abierto de resultados de investigación en repositorios (institucionales, como +DIGITAL.CSIC, temáticos, como arXiv, o generalistas como Zenodo). La ruta dorada +hace referencia a la publicación de artículos revisados por pares en revistas de +acceso abierto [https://digital.csic.es/dc/accesoAbierto.jsp]. + +## ¿Cómo se organiza el acceso abierto? + +El acceso abierto tiene varios principios que permiten que se pueda llevar a +cabo de la mejor manera. Comencemos dándole un vistazo al principio de promover +el conocimiento. + +La **promoción del conocimiento** consiste en lograr que más personas reciban el +mensaje de la investigación, de manera que se fortalezca la relación entre el +bienestar de la población y el conocimiento científico. + +¿Cómo lo podemos aplicar? A través de actividades, incentivos y difusión de la +información en distintos medios con un lenguaje que todos manejen. Además de +ello, podemos incluir la estrategia de proporcionar herramientas y asistencia a +los académicos para depositar sus artículos revisados por pares en repositorios +electrónicos abiertos. Este proceso también se fundamenta en los distintos +recursos tangibles o intangibles que se pueden impartir, estos recursos son +principalmente revistas y repositorios. + +Otro principio es la **integración de diferentes disciplinas** tanto en las +investigaciones como de manera individual en repositorios. Esto implicaría que +los archivos publicados estén claramente definidos por el tipo de disciplina(s) +que abarcan. Para aplicarlo se recomienda utilizar etiquetas que representen con +certeza los temas que son tratados en la investigación. A su vez se tienen +algunas investigaciones hechas bajo la ayuda de varios profesionales de +distintas áreas. + +El **respeto de los derechos de autor** y otras herramientas para garantizar el +acceso abierto permanente a todos los artículos que se publican, son otros +principios que se deben tener muy presentes porque aseguran que los elementos +del Acceso Abierto estén en orden y complementen un buen trabajo. Para aplicar +esto se conocen algunos casos en los que se tienen prácticas de autoarchivo: los +investigadores depositan y difunden documentos en repositorios institucionales o +temáticos. Y como resultado de la segunda estrategia, hemos visto la creación de +revistas de acceso abierto que brindan acceso gratuito a los lectores y permiten +la reutilización de sus contenidos con muy pocas restricciones. + +El acceso abierto debe brindar, en un contexto general, información para que +logre exponer grandes investigaciones así como, cultivar el conocimiento en la +sociedad a través del tiempo e incentivar el proceso de investigación futuro. +Las herramientas son brindadas por distintas organizaciones y equipos de +trabajo. Casos que lo demuestran son los diferentes repositorios como: + +- ACS (American Chemical Association) +- arXiv +- BioMed Central +- Cambridge University Press +- Copernicus Publications +- F1000Research +- Frontiers +- IntechOpen +- Knowledge Unlatched +- MDPI +- Open Library of Humanities +- Oxford University Press +- PeerJ. +- Pensoft Publishers +- PLOS ONE +- PNAS +- Royal Society of Chemistry (RSC) +- SCOAP3 +- Springer Open + +Que brindan opciones para que los investigadores puedan hacer visibles sus +resultados. + +Referencias: + +http://bibliotecas.csic.es/publicacion-en-acceso-abierto + +[DIGITAL.CSIC Ciencia Abierta](https://digital.csic.es/dc/accesoAbierto.jsp) + +[Universidad de Jaén](https://libereurope.eu/wp-content/uploads/2017/09/OpenAccess5Principlesposter.jpg) + +[UCRIndex](https://ucrindex.ucr.ac.cr/?page_id=896) + +[Manifiesto de Ciencia Abierta y Colaborativa](https://ocsdnet.org/wp-content/uploads/2015/04/Manifesto-Infographic-Spanish-1.pdf) diff --git a/content/blog/como-documentar-tu-proyecto-de-ciencia-abierta/header.png b/bkp/blogs/como-documentar-tu-proyecto-de-ciencia-abierta/header.png similarity index 100% rename from content/blog/como-documentar-tu-proyecto-de-ciencia-abierta/header.png rename to bkp/blogs/como-documentar-tu-proyecto-de-ciencia-abierta/header.png diff --git a/bkp/blogs/como-documentar-tu-proyecto-de-ciencia-abierta/index.md b/bkp/blogs/como-documentar-tu-proyecto-de-ciencia-abierta/index.md new file mode 100644 index 000000000..582e8f458 --- /dev/null +++ b/bkp/blogs/como-documentar-tu-proyecto-de-ciencia-abierta/index.md @@ -0,0 +1,142 @@ +--- +title: "¿Cómo documentar tu proyecto de ciencia abierta?" +slug: como-documentar-tu-proyecto-de-ciencia-abierta +date: 2020-05-04 +authors: ["Yurely Camacho"] +tags: [proyectos, documentación] +categories: [ciencia abierta, desarrollo de software] +description: | + Para hacer reproducible una investigación y que ésta pueda ser verificada a + largo plazo, debes contar con un registro donde tomes nota de todos los pasos + realizados durante este proceso, lo cual servirá, al mismo tiempo, para que tu + proyecto sea comprensible por personas ajenas a él y así puedan desarrollar + algún interés sobre el mismo. A todo el proceso de registro de esa información + se le conoce como **Documentación**. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Para hacer reproducible una investigación y que ésta pueda ser verificada a +largo plazo, debes contar con un registro donde tomes nota de todos los pasos +realizados durante este proceso, lo cual servirá, al mismo tiempo, para que tu +proyecto sea comprensible por personas ajenas a él y así puedan desarrollar +algún interés sobre el mismo. A todo el proceso de registro de esa información +se le conoce como **Documentación**. + + + +La documentación es una buena práctica de la investigación y es de suma +importancia en cualquier proyecto de ciencia abierta. Si no documentamos, al +pasar el tiempo las personas tendrán que comenzar de cero y terminarán sin +entender el contenido de nuestro proyecto. Además, estando bajo los estándares +de la ciencia abierta, el «no documentar» sería una falta grave a sus +principios. + +De una manera un poco formal, podemos decir que la documentación es un proceso o +una práctica que consiste en registrar y/o informar sobre la ejecución de +ciertas tareas en algún tema determinado. La documentación de un proyecto se +fundamenta, en última instancia, en la realización de varios documentos +explicativos que van a depender del alcance y la temática del proyecto en +desarrollo. + +En cualquier proyecto de ciencia abierta que desarrolles o participes, debes +tener presente la importancia de contar con una buena documentación que respalde +e informe las labores durante todo el proceso, es decir, un registro de +actividades, herramientas y recursos que comprende desde la conceptualización +del proyecto, planificación, recolección de los datos, herramientas +computacionales y recursos utilizados, la metodología del procesamiento de los +datos, los resultados, cuadernos de investigación y otros. Esto quiere decir +que, en general, debes documentar toda la metodología utilizada en el desarrollo +del proyecto, es decir, la manera cómo se va a realizar cada paso dentro de la +misma, incluyendo los resultados. + +En lo que respecta a los datos, es necesaria información descriptiva de los +conjuntos de datos utilizados, el código informático resultante de su +procesamiento estadístico (puedes usar [Jupyter](https://jupyter.org/) para +juntar el código informático con texto), las pautas de la gestión de datos (o +propiamente un _Plan de Gestión de datos_) donde se reflejen la normativa para +hacer que el proyecto se lleve a cabo bajo los estándares de la ciencia abierta +(plataformas de acceso abierto empleadas para la disponibilidad de los datos, +licencia utilizada, entre otras). En pocas palabras te recomendamos el registro +de toda la información referente a la investigación para lograr, además, que los +datos de investigación cumplan los principios +[FAIR](https://www.go-fair.org/fair-principles/), es decir, sean **localizables, +accesibles, interoperables y reutilizables**. + +El proceso de documentación generalmente lo lleva a cabo solo una persona y lo +comparte con las demás, o se reparten esta tarea entre varios miembros del +proyecto. Sea cual sea la persona que lo hace, los documentos varían a lo largo +del tiempo y como deben estar compartidos, te recomendamos usar cualquier opción +para el control de versiones con [Git](https://git-scm.com/) para centralizar la +información, implementando también otra herramienta para la gestión de los +documentos como [Sphinx](https://www.sphinx-doc.org/en/master/). + +La documentación de un proyecto de ciencia abierta, en general, debe estar +estructurada de la siguiente manera: una introducción de todos los apartados de +la documentación y que sirva como una visión general de todo el contenido +incluyendo el problema, enfoque, objetivos, requisitos y producto final. Debe +incluir un desglose de las funciones que cada persona tiene dentro del proyecto +y las tareas que debe realizar para cumplir los objetivos propuestos, con fechas +tentativas de entrega de resultados para llevar un control efectivo de las +tareas y sus datos de contacto. Asimismo debe incorporarse en el documento +información referente a las herramientas informáticas utilizadas en el proyecto, +el tipo de licencia asignada al proyecto, el lugar donde se guardarán los datos +(según corresponda) del proyecto, siempre cumpliendo con los principios de la +ciencia abierta. Y no debes olvidar incluir toda la información referente a los +conjuntos de datos, código informático generado y los resultados obtenidos. + +La documentación no sólo es importante para la reproducibilidad sino que también +aumenta la probabilidad que las personas ajenas al proyecto puedan entenderlo, +interesarse en él y, además, realizar aportes. Si, por ejemplo, se está +ejecutando un proyecto de desarrollo, la documentación del código es muy +importante para que, pasado el tiempo, el mismo equipo de desarrollo pueda +recordar lo que hicieron en algún momento o intentar replicar el código escrito +por otros. Información adicional sobre la documentación en este tipo de +proyectos puedes consultarla en este post sobre +[Documentación con Sphinx y Python](https://medium.com/qu4nt/documentaci%C3%B3n-con-sphinx-y-python-9a777403cb68). + +A continuación, te dejamos tips y comentarios adicionales que consideramos +pueden ser útiles para elaborar la documentación de tu proyecto de ciencia +abierta: + +- Si estás en un proyecto y no has comenzado a documentarlo te recomendamos que + empieces pronto, la documentación aunque es un proceso que requiere dedicación + y tiempo, al final te ahorrará muchos inconvenientes. + +- Resulta más fácil documentar el material de un proyecto, si se hace en + correspondencia con cada etapa del proceso. + +- Si necesitas hacer visible tu proyecto, en muchas ocasiones, es una buena + práctica documentar en inglés, debido a la gran cantidad de investigaciones y + organismos financiadores que se encuentran en países de habla inglesa. + +- Al momento de documentar debes usar un lenguaje claro y comprensible. El + documento final debe ser lo suficientemente extenso para especificar todas las + características del proyecto pero también contar con la mayor precisión + posible. + +- Cuando documentes, todo debe estar detallado, no deben existir las obviedades. + Cosas que para ti son obvias, no lo son para los demás. + +- Los documentos deben estar escritos empleando un lenguaje adecuado para las + personas que lo utilizarán. + +- La documentación puede incluir todos los gráficos, bosquejos y esquemas que + ayuden a complementar la información. + +En líneas generales, la documentación te ayudará a organizar las tareas, delegar +funciones, establecer fechas y tener un control sobre la metodología, recursos y +resultados antes, durante y después de la finalización del proyecto. Asimismo +servirá de soporte, permitirá su trascendencia en el tiempo y facilitará su +reproducción o replicación En OpenScienceLabs te animamos a que comiences a +documentar tu proyecto y que tomes en cuenta esta buena práctica para futuros +desafíos. + +## Referencias + +[Manual de Capacitación sobre Ciencia abierta](<(https://book.fosteropenscience.eu/es/)>) +[Guía de expertos en Gestión de Datos](https://www.cessda.eu/Training/Training-Resources/Library/Data-Management-Expert-Guide) +[5 reglas básicas y 5 pasos para documentar tu proyecto web](https://www.socialancer.com/como-documentar-un-proyecto-web/) diff --git a/content/blog/como-instalar-y-comenzar-utilizar-conda/header.png b/bkp/blogs/como-instalar-y-comenzar-utilizar-conda/header.png similarity index 100% rename from content/blog/como-instalar-y-comenzar-utilizar-conda/header.png rename to bkp/blogs/como-instalar-y-comenzar-utilizar-conda/header.png diff --git a/bkp/blogs/como-instalar-y-comenzar-utilizar-conda/index.md b/bkp/blogs/como-instalar-y-comenzar-utilizar-conda/index.md new file mode 100644 index 000000000..577a17673 --- /dev/null +++ b/bkp/blogs/como-instalar-y-comenzar-utilizar-conda/index.md @@ -0,0 +1,178 @@ +--- +title: "Cómo instalar y comenzar a utilizar Conda" +slug: como-instalar-y-comenzar-utilizar-conda +date: 2020-12-03 +authors: ["Yurely Camacho"] +tags: [conda, empaquetado, paquetes, gestor, entorno virtual] +categories: [ciencia abierta, código abierto, desarrollo de software, DevOps] +description: | + Conda es un sistema de gestión de entornos y de paquetes que funciona en + Windows, Linux y MacOs. Inicialmente se creó para programas Python y está + escrito en python, pero puede implementarse para cualquier lenguaje. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Conda es un sistema de gestión de entornos y de paquetes que funciona en +Windows, Linux y MacOs. Inicialmente se creó para programas Python y está +escrito en python, pero puede implementarse para cualquier lenguaje. + + + +Es de código abierto y está publicado bajo la licencia BSD por +[Continuum Analytics](http://www.continuumanalytics.com/). Trabaja con +"canales"(channels); las ubicaciones de los repositorios en los que busca +paquetes. Te permite instalar, ejecutar y actualizar paquetes y sus dependencias +de manera rápida. Se utiliza mediante línea de comandos en el Anaconda Prompt o +en una ventana de terminal. En lo referente a la gestión de entornos, con conda +puedes crear, guardar, cargar y cambiarte de entorno fácilmente en tu ordenador +local. + +Un **entorno de conda** es un directorio con una colección específica de +paquetes de conda que has instalado. Puedes activar o desactivar fácilmente los +entornos y los demás que tengas no se verán afectados. Con conda también puedes +crear **_entornos virtuales_**; una herramienta que crea espacios aislados con +las dependencias que requieren los diferentes proyectos que tengas. + +Conda también es un paquete y está incluido en todas las versiones de +[Anaconda](https://anaconda.org/); una distribución libre y abierta​ de Python y +R, [Miniconda](https://docs.conda.io/en/latest/miniconda.html), una pequeña +versión de Anaconda que incluye pocos paquetes en comparación con esta, +[Anaconda Repository](https://docs.continuum.io/anaconda-repository/) y +[Anaconda Enterprise](https://www.anaconda.com/products/enterprise). Está +disponible también en [conda-forge](https://anaconda.org/conda-forge/conda); un +canal comunitario. + +## Instalando Conda + +Como mencionamos en líneas anteriores, conda está incluido en todas las +versiones de Anaconda y Miniconda. Por tal motivo, para obtenerla debes instalar +alguna de ellas o comprar +[Anaconda Enterprise](https://www.anaconda.com/products/enterprise). Necesitas +una computadora con sistema de 32 o 64 bits. Para Miniconda 400MB de espacio en +disco y 3GB para descargar e instalar Anaconda. + +- _Elige Anaconda_ si estás comenzando en conda o python, quieres tener + instalados automáticamente más de 7500 paquetes científicos y si cuentas con + el espacio suficiente en disco. + +- _Elige Miniconda_ si estás dispuesto a instalar individualmente el paquete que + necesites, cuentas con poco espacio en disco y por eso no puedes instalar + Anaconda y/o si deseas un acceso rápido a conda y python. + +A continuación detallamos los pasos a seguir para una instalación regular de +acuerdo al sistema operativo. + +1. **Descarga Anaconda o Miniconda según el sistema operativo** + +- Puedes descargar Anaconda + [en este enlace](https://www.anaconda.com/products/individual) + +- Para descargar Miniconda + [ingresa en este enlace](http://www.bicentenariobu.com/) + +Puedes escoger, según el sistema operativo, una versión con un instalador +gráfico o instalador por línea de comandos. Si no deseas ingresar comandos en +una ventana de terminal, elige el instalador gráfico (Interfaz gráfica de +usuario _GUI_). + +Independiente de que uses Anaconda o Miniconda y si no estás seguro de la opción +a descargar, te recomendamos elegir su versión más reciente. Asimismo, si +cuentas con otras instalaciones o paquetes de python, no es necesario +desinstalarlas o borrarlas. Solo instala Anaconda o Miniconda normalmente. + +2. **Una vez descargado el instalador debes hacer lo siguiente**: + +### En Windows + +- Dirígete a la carpeta donde se encuentra el archivo descargado y haz doble + click. Es un archivo .exe. + +- Sigue las instrucciones. + +### En MacOS + +- Miniconda: + + - En una ventana del terminal ejecute + `bash Miniconda3-latest-MacOSX-x86_64.sh` + +- Anaconda: + + - Dirígete a la carpeta donde se encuentra el archivo descargado y haz doble + click. Es un archivo .pkg. + +* Sigue las instrucciones de las pantallas de instalación + +* Debes cerrar y volver a abrir la ventana del terminal para que los cambios se + realicen. + +### En Linux + +En una ventana del terminal ejecuta: + +- Miniconda: + +`bash Miniconda3-latest-Linux-x86_64.sh` + +- Anaconda: + +`bash Anaconda3-latest-Linux-x86_64.sh` + +- Sigue las instrucciones de las pantallas de instalación. + +- Debes cerrar y volver a abrir la ventana del terminal para que los cambios se + realicen. + +Para todos los casos _Acepta los valores por defecto si durante la instalación +no estás seguro de alguna configuración. Luego puedes cambiarlos_ + +**Para probar la instalación independientemente del sistema operativo haz lo +siguiente:** + +- Abre una ventana del terminal o Anaconda Prompt (en Windows desde el menú de + inicio), luego ejecuta el comando `conda list`. Si la instalación ha sido + exitosa debe aparecer una lista con los paquetes instalados. + +## Actualización de conda + +Para actualizar conda debes abrir una ventana del terminal o Anaconda Prompt (en +Windows desde el menú de inicio), luego navega hasta la carpeta de Anaconda o +Miniconda (según el caso) y allí ejecutar el comando `conda update conda`. + +## Primeros pasos con conda + +Para que te familiarices, el comando `conda` es el principal y con él puedes, +entre otras cosas, consultar y buscar el índice del paquete que desees, crear +nuevos entornos de conda e instalar y actualizar paquetes en los entornos +existentes. + +A continuación te presentamos algunos de los comandos de conda que puedes probar +inicialmente: + +`conda --version` Verifica que conda está instalado y funcionando en tu sistema. + +`conda list` Muestra una lista de los paquetes instalados. + +`conda search nombre_paquete` Busca un paquete. + +`conda install nombre_paquete` Instala un paquete. + +`conda update nombre_paquete` Actualiza un paquete. + +Puedes consultar sobre los argumentos y usos de algunos comandos conda en +[este enlace](https://docs.conda.io/projects/conda/en/latest/commands.html). La +documentación oficial de conda te ofrece una +[guía de 20 minutos para iniciarte en conda](https://docs.conda.io/projects/conda/en/latest/user-guide/getting-started.html) +y probar sus principales características. + +Si necesitas de la gestión de paquetes y entornos, no dudes en usar conda. En un +próximo artículo te dejaremos algunos tips para que saques el mayor provecho a +trabajar con conda, no te lo pierdas. + +#### Referencias + +- [Documentación oficial Conda](https://docs.conda.io/projects/conda/en/latest/index.html) diff --git a/content/blog/como-instalar-y-comenzar-utilizar-tensorflow/header.png b/bkp/blogs/como-instalar-y-comenzar-utilizar-tensorflow/header.png similarity index 100% rename from content/blog/como-instalar-y-comenzar-utilizar-tensorflow/header.png rename to bkp/blogs/como-instalar-y-comenzar-utilizar-tensorflow/header.png diff --git a/content/blog/como-instalar-y-comenzar-utilizar-tensorflow/index.md b/bkp/blogs/como-instalar-y-comenzar-utilizar-tensorflow/index.md similarity index 76% rename from content/blog/como-instalar-y-comenzar-utilizar-tensorflow/index.md rename to bkp/blogs/como-instalar-y-comenzar-utilizar-tensorflow/index.md index 4d0962f81..a67c4ca3f 100644 --- a/content/blog/como-instalar-y-comenzar-utilizar-tensorflow/index.md +++ b/bkp/blogs/como-instalar-y-comenzar-utilizar-tensorflow/index.md @@ -2,45 +2,55 @@ title: "Cómo instalar y comenzar a utilizar Tensorflow" slug: como-instalar-y-comenzar-utilizar-tensorflow date: 2020-09-10 -author: Anavelyz Pérez -tags: [tensorflow,código, tensorflow, pip, docker] -categories: [ciencia abierta, código abierto, Python, ciencia de datos, inteligencia artificial] - -draft: false -usePageBundles: true +authors: ["Anavelyz Pérez"] +tags: [tensorflow, código, tensorflow, pip, docker] +categories: + [ + ciencia abierta, + código abierto, + Python, + ciencia de datos, + inteligencia artificial, + ] +description: | + Hablar de Tensorflow, es hablar de Machine Learning porque es una plataforma que + permite y facilita la creación de modelos asociados a algoritmos en los que se + configura al equipo involucrado. Esto de manera tal que se obtengan sistemas + capaces de construir y entrenar redes neuronales para detectar y descifrar + patrones y correlaciones análogos al aprendizaje y razonamiento usados por los + humanos. thumbnail: "/header.png" -featureImage: "/header.png" +template: "blog-post.html" --- - - - Hablar de Tensorflow, es hablar de Machine Learning porque es una plataforma que permite y facilita la creación de modelos asociados a algoritmos en los que se -configura al equipo involucrado. Esto de manera tal que se obtengan sistemas capaces -de construir y entrenar redes neuronales para detectar y descifrar patrones y -correlaciones análogos al aprendizaje y razonamiento usados por los humanos. +configura al equipo involucrado. Esto de manera tal que se obtengan sistemas +capaces de construir y entrenar redes neuronales para detectar y descifrar +patrones y correlaciones análogos al aprendizaje y razonamiento usados por los +humanos. Tensorflow fue ideado y desarrollado por un equipo de programadores de Google. -El 9 de noviembre de 2015 se publicó bajo una licencia de código abierto Apache 2.0. +El 9 de noviembre de 2015 se publicó bajo una licencia de código abierto Apache +2.0. ## Cómo comenzar a utilizar Tensorflow Es importante tener en cuenta que antes de instalar y comenzar a utilizar -Tensorflow es necesario contar con conocimientos previos de Machine -Learning, Codificación, Matemáticas y Estadística; esto permitirá que las tareas -de implementación de la plataforma en cualquiera de nuestros proyectos sea más +Tensorflow es necesario contar con conocimientos previos de Machine Learning, +Codificación, Matemáticas y Estadística; esto permitirá que las tareas de +implementación de la plataforma en cualquiera de nuestros proyectos sea más eficiente. En el caso de que no se cuente con conocimiento alguno o si simplemente se quiera ampliar lo que se sabe de estos ámbitos, en el sitio web oficial de -Tensorflow se encuentra una [página -educativa](https://www.tensorflow.org/resources/learn-ml?hl=es) donde está -disponible una serie de herramientas ideadas para instruirse. +Tensorflow se encuentra una +[página educativa](https://www.tensorflow.org/resources/learn-ml?hl=es) donde +está disponible una serie de herramientas ideadas para instruirse. Ahora bien, para instalar y utilizar Tensorflow tenemos tres opciones: pip, docker y Gooogle Colab. Veamos el procedimiento en cada caso. @@ -57,16 +67,15 @@ https://realpython.com/python-ides-code-editors-guide/ 2. Luego de que tengas Python en tu sistema verifica que este configurado; se requiere la versión de Python entre 3.5 a 3.7 y pip 19.0 o posterior. Para - esto puedes ejecutar las siguientes líneas de código y observar las versiones. + esto puedes ejecutar las siguientes líneas de código y observar las + versiones. -`python3 --version` -`pip3 --version` -`virtualenv --version` +`python3 --version` `pip3 --version` `virtualenv --version` 3. Crear un entorno virtual, este paso es opcional pero se recomienda para - trabajar de forma separada de los archivos del sistema y así evitar algún error o - actualización que puede alterar el rendimiento y funcionamiento de este. En - la página de Tensorflow hay un espacio dedicado a este punto + trabajar de forma separada de los archivos del sistema y así evitar algún + error o actualización que puede alterar el rendimiento y funcionamiento de + este. En la página de Tensorflow hay un espacio dedicado a este punto https://www.tensorflow.org/install/pip?lang=python3#2.-create-a-virtual-environment-recommended 1. Instalar el paquete de tensorflow con pip, utilizando: @@ -83,8 +92,8 @@ Luego, puedes importar tensorflow como una biblioteca, colocando: Docker es una plataforma abierta para desarrollar, enviar y ejecutar aplicaciones. Con Docker podemos mantener aislados los programas que estemos -ejecutando con los elementos del sistema, aprovechando mejor los recursos lo cual -agregaría velocidad y eficiencia al momento de compilar o ejecutar código. +ejecutando con los elementos del sistema, aprovechando mejor los recursos lo +cual agregaría velocidad y eficiencia al momento de compilar o ejecutar código. Para obtener información sobre la instalación de esta plataforma puedes visitar su [página web](https://docs.docker.com/get-docker/) o seguir la guía que nos @@ -94,9 +103,11 @@ https://www.tensorflow.org/install/docker. En el caso de tener o haber instalado Docker en tu equipo, con las siguientes líneas de código puedes obtener Tensorflow: -`docker pull tensorflow/tensorflow:latest-py3` # Descarga la imagen estable más reciente de Tensorflow +`docker pull tensorflow/tensorflow:latest-py3` # Descarga la imagen estable más +reciente de Tensorflow -`docker run -it -p 8888:8888 tensorflow/tensorflow:latest-py3-jupyter` #Inicia un servidor de Jupyter +`docker run -it -p 8888:8888 tensorflow/tensorflow:latest-py3-jupyter` #Inicia +un servidor de Jupyter - Ejecutar Tensorflow desde Google Colab. diff --git a/content/blog/como-presentar-tu-codigo-como-un-articulo-cientifico/header.png b/bkp/blogs/como-presentar-tu-codigo-como-un-articulo-cientifico/header.png similarity index 100% rename from content/blog/como-presentar-tu-codigo-como-un-articulo-cientifico/header.png rename to bkp/blogs/como-presentar-tu-codigo-como-un-articulo-cientifico/header.png diff --git a/bkp/blogs/como-presentar-tu-codigo-como-un-articulo-cientifico/index.md b/bkp/blogs/como-presentar-tu-codigo-como-un-articulo-cientifico/index.md new file mode 100644 index 000000000..cbba44df3 --- /dev/null +++ b/bkp/blogs/como-presentar-tu-codigo-como-un-articulo-cientifico/index.md @@ -0,0 +1,114 @@ +--- +title: "¿Cómo presentar tu código como un artículo científico?" +slug: como-presentar-tu-codigo-como-un-articulo-cientifico +date: 2020-03-04 +authors: ["Rainer Palm"] +tags: [artículos, publicación, código, herramientas] +categories: [ciencia abierta, código abierto] +description: | + Muchos científicos emplean la creación de software cuando desarollan sus + investigaciones, usando herramientas tales como scripts y simulaciones, + personalizadas y adaptadas a sus necesidades. En los casos en que no es así, + igual la mayoría termina empleando analísis computacional de alguna manera, con + software prediseñado para graficar, realizar calculos elementales, visualizar + estadísticas o datos que luego se mostrarán dentro de la presentación de su + investigación. Sea como sea, lo cierto es que cada vez el rol del desarrolador y + el del científico estan más relacionados, exigiendo que estas dos disciplinas se + vinculen de forma más estrecha. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Muchos científicos emplean la creación de software cuando desarollan sus +investigaciones, usando herramientas tales como scripts y simulaciones, +personalizadas y adaptadas a sus necesidades. En los casos en que no es así, +igual la mayoría termina empleando analísis computacional de alguna manera, con +software prediseñado para graficar, realizar calculos elementales, visualizar +estadísticas o datos que luego se mostrarán dentro de la presentación de su +investigación. Sea como sea, lo cierto es que cada vez el rol del desarrolador y +el del científico estan más relacionados, exigiendo que estas dos disciplinas se +vinculen de forma más estrecha. + + + +Lo que hace esto mucho más interesante es el hecho de que el desarrollo de +software está íntimamente involucrado en múltiples áreas de investigación, no +sólo porque se utiliza como herramienta, si no de que este desarrollo en sí y +los resultados que ofrece pueden traducirse en un problema a abarcar por un +estudio. Este es un acercamiento utilizado frecuentemente en papers que tratan +temas tales como simulaciones computacionales de procesos químicos variados, +aplicaciones posibles de algoritmos de inteligencia artificial y comportamiento +de esta en ámbitos particulares, problemas de lógica, y muchos otros más, +involucrando una inmensa cantidad de ramas de la ciencia e incluso fuera de +esta! + +Si tienes un proyecto de desarrollo de software cualquiera relacionado con la +ciencia, así sea nada más una herramienta creada durante tu investigación, +quizás sea oportuno buscar la forma de publicarlo, posiblemente adjunto a un +paper mas extenso. Hay muchas razones por las cuales lo deberias hacer, +independientemente del propósito principal de tu trabajo (divulgación del +conocimiento, estandares de reprodubilidad, dejar que los demas aprendan de tu +trabajo, etc.), y la labor requerida es prácticamente nula si ya te has tomado +el tiempo de escribir y documentar mínimamente tu codígo. Inclusive si +consideras que tu código no es lo suficientemente bonito como para publicarse, +le podría servir a alguien, así sea nada más para verificar tu investigación. + +## Documentación del proceso de desarrollo + +Para mostrar posibles usos de tu software, dar a conocer el razonamiento de tus +meétodos, y ayudar a entender por qué tu código funciona, es muy importante que, +preferiblemente durante el proceso de desarrollo, te tomes el tiempo de escribir +de forma rigurosa una documentación que describa con profundidad tanto los pasos +que has tomado a lo largo del proyecto, como por qué has pensado que esa ha sido +la mejor forma de llevar a cabo tus metas. Esto implica decir con exactitud +cuáles herramientas, lenguajes de programación, librerias, scripts, etc., has +utilizado, así como dar un recuento de los problemas, tanto conceptuales como +prácticos, encontrados durante el desarrollo, trazando un marco de referencia +para el funcionamiento de tu código, y por supuesto, mencionar fundamentos de tu +investigación, estudios y artículos anteriores escritos sobre problemas +relacionados con el tema. + +El uso de diagramas o esquemas para representar el modelado analítico de los +problemas en cuestión o para ilustrar de una forma mas abstracta o intuitiva el +funcionamiento del programa, es bastante útil a la hora de ayudar a otros +entender como funciona, y es importante si piensas luego presentar tu trabajo en +ámbitos menos formales. + +## Visualización de resultados + +Como extensión de lo que se dijo antes, puedes pensar en formas en las cuales se +puede visualizar tu código, ya sea mediante una simulación en tiempo real, +visualizaciones de estadísticas creadas con herramientas como R Studio, creación +de interfaces gráficas u otros métodos, siempre teniendo las particularidades de +tu investigación en mente. Con esto logras un mayor grado de accesibilidad y se +te hace más fácil divulgar el fruto de tus labores, presentando tus conclusiones +de una forma más atractiva sin perder credibilidad. Además, si presentas tu +código dentro de un notebook con Jupyter o una herramienta similar, puedes hacer +que tus lectores interactúen con tu código de una manera directa, sin mucha +complicación, ejecutándolo en tiempo real desde una interfaz web y generando +gráficas de manera inmediata. + +## Publicación de datos y codigo junto al paper + +Además de subir tu código junto a tu artículo en repositorios de Git o Docker, +puedes usar sitios como IEEE DataPort [1] para subir bases de datos para que +cualquiera pueda acceder a ellos de una forma sencilla, siendo los conjuntos de +datos asignados un DOI para identificarlos rápidamente. Por lo general, subirlos +a un archivo de datos de investigación te proveerá con referencias y +identificadores persistentes, sin importar que luego actualices los archivos +subidos. Si no es así, puedes usar Zenodo[2] o Figshare[3] para crear una copia +permanente y citable, con un identificador DOI, de la versión actual de tu +repositorio. Agregar las citas al propio software es también una opción. + +Recuerda además siempre revisar con cuidado los lineamientos del journal para el +cual estes pensando escribir, teniendo en cuenta como les será mas fácil acceder +y reproducir tu código. Si subes tu código y datos para que puedan ser vistos +por cualquiera, deberías también declarar abiertamente sus términos de uso, +licencias y demás. + +[1]: https://ieee-dataport.org/ "IEEE DataPort" +[2]: https://zenodo.org/ "Zenodo" +[3]: https://figshare.com/ "Figshare" diff --git a/content/blog/cuales-son-los-principios-de-la-investigacion-reproducible/header.png b/bkp/blogs/cuales-son-los-principios-de-la-investigacion-reproducible/header.png similarity index 100% rename from content/blog/cuales-son-los-principios-de-la-investigacion-reproducible/header.png rename to bkp/blogs/cuales-son-los-principios-de-la-investigacion-reproducible/header.png diff --git a/bkp/blogs/cuales-son-los-principios-de-la-investigacion-reproducible/index.md b/bkp/blogs/cuales-son-los-principios-de-la-investigacion-reproducible/index.md new file mode 100644 index 000000000..15c30c4f4 --- /dev/null +++ b/bkp/blogs/cuales-son-los-principios-de-la-investigacion-reproducible/index.md @@ -0,0 +1,145 @@ +--- +title: "¿Cuáles son los principios de la investigación reproducible?" +slug: cuales-son-los-principios-de-la-investigacion-reproducible +date: 2020-01-31 +authors: ["Rainer Palm"] +tags: [reproducibilidad, datos] +categories: [ciencia abierta, investigación abierta] +description: | + ¿Como puedes tener total confianza y seguridad en que tu metodología es sensata, + y de que tu investigación ha dado resultados certeros y facil de verificar? ¿Son + veraces los estudios y descubrimientos de otros científicos? +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +¿Como puedes tener total confianza y seguridad en que tu metodología es sensata, +y de que tu investigación ha dado resultados certeros y facil de verificar? ¿Son +veraces los estudios y descubrimientos de otros científicos? + + + +Ciertamente, la capacidad de validar y repetir el proceso llevado a cabo por los +investigadores es algo crucial a la hora de responder estas preguntas. Nos +encontramos en un momento historico en el que podemos, mediante tecnologías +digitales, acercarnos cada vez mas a satisfacer un criterio infalible de +reproducibilidad en algunas areas (como la ciencia de datos). Escribir cada uno +de los pasos realizados ya es una practica inherente al proceso de investigación +en sí, debido a la necesidad de coordinar proyectos en los que colaboran cientos +de personas, y al desarrollo de software que permite grabar y compartir este +proceso de una forma eficiente y completa. + +Aun así, paradojicamente, nos encontramos también en medio de una crisis en las +ciencias, donde los resultados de una gran cantidad de experimentos son +dificiles o imposibles de replicar \[1\], ya sea debido a ciertos limites en la +investigación en sí o por otras razones. Siendo la reproducibilidad uno de los +pilares del método científico como tal, estos dos hechos, tomados juntos, se +hacen algo desconcertantes. Quizás sea importante repasar exactamente que +consideramos como investigación reproducible y cuales son sus principios o +metas, y que iniciativas o herramientas hay para asegurar esa condición. + +## ¿Qué hace reproducible una investigación? + +Podemos llamar a una investigación reproducible si ésta puede ser repetida por +otros. En términos estrictos, esto simplemente significa que, contando con las +herramientas necesarias, cualquiera puede tomar la descripción o grabación del +experimento o estudio en cuestión para volverlo a realizar y verificar si el +resultado es el mismo o lo suficientemente parecido (en tal caso, se dice que +los resultados son replicables). + +Para que una investigación sea reproducible, por ende, se requiere que sus +métodos, datos, herramientas y configuración, sean descritos de una forma +detallada y precisa, dependiendo del área de conocimiento, y que esta +información sea legible tanto por un ser humano como por una computadora. Esto, +obviamente, se complica cada vez más dependiendo del tamaño de la investigación +y su complejidad. Ciertas herramientas, como [Jupyter](https://jupyter.org), +permiten realizar el analísis y, a la vez esquematizan y muestran comentarios +sobre los pasos del experimento, dentro de un mismo entorno de trabajo, lo cual +ayuda bastante. Sín embargo, al final del dia esto depende primordialmente de +las decisiones que tome el investigador, y no hay ninguna herramienta que +garantiza la reproducibilidad simplemente por ser usada. + +En ese caso, ¿en torno a qué aspectos deberían tomar las decisiones los +usuarios? ¿Cuáles preceptos éticos deben seguir para dirigirse hacia una +investigación reproducible? En la siguiente sección hablaremos de los principios +de la investigación reproducible. + +## Cuales són los principios de la investigación reproducible? + +- **Transparencia**. Es importante recordar que, tal como cualquier otra cosa + que te puedas imaginar (la realización de un plato de cocina, una canción, una + pintura, etc.), sólo se puede decir que una investigación es reproducible si + se pueden ver y entender los pasos que llevaron a su realización. Si realizas + análisis de datos o elaboras algún tipo de código, por ejemplo, es necesario + que tengas disponible toda la información referente al entorno (paquetes, + configuraciones, carpetas del proyecto, dependencias, etc.) gracias a los + cuales ejecutar el código, además de que es necesario que esté comentado + rigurosamente para que otros puedan entender exactamente por qué funciona. + +- **Métodologia abierta.** Siendo la ciencia una práctica colaborativa, es de + bastante importancia mantener un alto grado de transparencia, como + anteriormente mencionamos. Es importante también añadir que obligarte a + compartir el procedimiento que llevaste a cabo no sólo te da mas confianza a + la hora de compartir tus resultados, sino que también te anima a revisar cada + paso dado y pensar si fue el correcto (y permite a otros verificar lo mismo, + también). + +- **Enlazamiento de los resultados a los datos iniciales.** Una investigación + reproducible sistematiza su procedimiento de forma tal que se pueden ver + claramente los datos de entrada, como estos fueron generados y por que proceso + se analizan estos, ademas de hacerlos disponibles libremente (en cuanto sea + aplicable). De esta forma, se traza una ruta desde los datos de salida hacia + los de entrada, y viceversa. + +Estos tres principios se pueden aplicar independientemente del tipo de +investigación. Claramente, será mucho más fácil compartir un entorno virtual que +el Acelerador de partículas (en inglés Large Hadron Collider, LHC), pero lo +importante es hacer tanto los datos como detalles respecto a la forma en la que +fueron generados libremente disponibles, haciendo el experimento repetible, y +por tanto, verificable por la comunidad científica. + +##Que herramientas hay para realizar investigación reproducible? + +Sin duda, independientemente del tipo de trabajo que estés realizando, existe +una variedad de opciones de software para lidiar con el problema de documentar, +archivar, y esquematizar datos y archivos de una forma limpia y organizada, sin +necesidad de tardar muchas horas describiendo estos en texto plano. Según +Stodden et. al (2013)\[2\], hay cuatro tipos generales de herramientas en uso: + +- **Computación autoría y publicación alfabetizada.** Ésta describe herramientas + que permiten la creación de documentos que integran elementos rich media + (codigo y demás) junto a texto (por lo general en Markdown o LaTeX) y demas + archivos multimedia para presentar reportes que generan resultados tanto + visuales como textuales en tiempo real. En este ambito, sin duda una de las + mas populares es Jupyter, que soporta una cantidad abrumadora de lenguajes de + programación (principalmente Julia, Python y R) sin perder sencillez o + intuitividad. + +- **Control de versiones.** Se refiere a aquellas herramientas que te permiten + rastrear tu trabajo a lo largo del tiempo, tomando registro de los cambios y + evoluciones que toma. De esta forma, permiten tanto volver a un punto anterior + en el analísis sin empezar desde cero, como observar como cambia la + investigación y las ideas referentes a ella cronologicamente. El sistema de + control de versiones git es sin duda el mas popular, con una variedad de + servicios web disponibles dependiendo de tus necesidades (tales como GitHub o + Gitlab). + +- **Registro de procedencia de los datos.** Procedencia se refiere a mantener un + registro de la cronologia y historia de los objetos de investigación, tales + como datos, codigo fuentes, figuras, y resultados. Entre estas herramientas + estan VisTrails, Kepler y Taverna. + +- **Herramientas que capturan y preservan un entorno de software.** Algo + increiblemente importante pero a la vez dificil y complicado de hacer es + instalar y configurar una red de versiones especificas de dependencias, + paquetes y herramientas para uso compartido entre tus colaboradores. Existen + varios niveles de virtualización disponibles para llevar a cabo esta tarea, + tanto la emulación completa de un entorno virtual especifico (como lo hacen + Virtualbox of VMWare) o nada mas la creación de instancias separadas de + espacios de usuario (como Docker). + +\[1\] https://www.displayr.com/what-is-the-replication-crisis/ \[2\] +http://stodden.net/icerm_report.pdf diff --git a/content/blog/dataverse-y-su-potencial-para-proyectos-de-ciencia-abierta/header.png b/bkp/blogs/dataverse-y-su-potencial-para-proyectos-de-ciencia-abierta/header.png similarity index 100% rename from content/blog/dataverse-y-su-potencial-para-proyectos-de-ciencia-abierta/header.png rename to bkp/blogs/dataverse-y-su-potencial-para-proyectos-de-ciencia-abierta/header.png diff --git a/bkp/blogs/dataverse-y-su-potencial-para-proyectos-de-ciencia-abierta/index.md b/bkp/blogs/dataverse-y-su-potencial-para-proyectos-de-ciencia-abierta/index.md new file mode 100644 index 000000000..d8981bc35 --- /dev/null +++ b/bkp/blogs/dataverse-y-su-potencial-para-proyectos-de-ciencia-abierta/index.md @@ -0,0 +1,118 @@ +--- +title: "Dataverse y su potencial para proyectos de ciencia abierta" +slug: dataverse-y-su-potencial-para-proyectos-de-ciencia-abierta +date: 2020-08-08 +authors: ["Rainer Palm"] +tags: [datosverse, datos, repositorios] +categories: [ciencia abierta, datos abiertos, acceso abierto] +description: | + A lo largo de un proyecto de investigación suelen experimentarse dificultades en + cualquiera de sus fases: desarrollo, su divulgación, promoción, en la + publicación de los datos de forma abierta, en su catalogación o en su + disposición de forma abierta para ser consultado en cualquier investigación. En + cualquiera de estos casos, Dataverse[1] es una solución que promete no solamente + incorporar al flujo de trabajo métodos rápidos para asegurar que los datos + cumplan los principios FAIR[2], sino también ofrece un espacio donde alojarlos + organizados en conjuntos, agrupando metadatos y codigo clasificados con su + propio numero DOI, en repositorios llamados 'Dataversos'. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +A lo largo de un proyecto de investigación suelen experimentarse dificultades en +cualquiera de sus fases: desarrollo, su divulgación, promoción, en la +publicación de los datos de forma abierta, en su catalogación o en su +disposición de forma abierta para ser consultado en cualquier investigación. En +cualquiera de estos casos, Dataverse[1] es una solución que promete no solamente +incorporar al flujo de trabajo métodos rápidos para asegurar que los datos +cumplan los principios FAIR[2], sino también ofrece un espacio donde alojarlos +organizados en conjuntos, agrupando metadatos y codigo clasificados con su +propio numero DOI, en repositorios llamados 'Dataversos'. + + + +Dataverse es un proyecto que ya cuenta con apoyo de una cantidad de +universidades y instituciones prestigiosas alrededor del mundo. Por ejemplo, la +universidad Harvard destaca por su repositorio Dataverse público[3] en el cual +yace una enorme cantidad de conjuntos de datos (incluyendo metadatos, código y +documentación) en todo tipo de áreas y, además está libre para el uso en +investigaciones tanto dentro como fuera de la comunidad Harvard. Estos datos +pueden ser accedidos bajo políticas de acceso abierto y términos de uso +establecidos por cada equipo científico, permitiendo la réplica y reutilización +del trabajo alojado en el sitio. Por lo tanto, es una iniciativa bastante +atractiva cuando se desea difundir el trabajo realizado, ya que hace que tus +datos sean visibles mediante el uso de motores de busqueda y manejadores de +referencias. + +Para entender por qué ha ganado tanta tracción este proyecto, es importante +primero saber de qué se trata exactamente, y cómo se llevó a cabo. + +## Que es Dataverse? + +Dataverse es una aplicación web de código abierto para 'compartir, preservar, +citar, explorar, y analizar datos de investigación'. Cuenta con una multitud de +características para cumplir con este objetivo: al subir los archivos a la +plataforma, estos son almacenados y preservados de manera que permanezcan +iguales al día en que se subieron. También permite organización por 'carpetas' +mediante los llamados dataversos, haciéndote propietario de la plataforma en la +que subes los datos y enlazándolos, de esta forma, de forma permanente a tu +usuario, al tiempo que permite integrar de forma continua tus publicaciones y +los datos que estas utilizan. Todo esto con el propósito fundamental de asegurar +que tus datos te sean acreditados, estando, al mismo tiempo, alojados y +preservados por años por venir. + +Su nombre viene del hecho que Dataverse funciona mediante un repositorio (la +instalación de software) que a su vez aloja archivos virtuales llamados +dataversos. Los dataversos se componen de conjuntos de datos, y los conjuntos de +datos tienen metadatos descriptivos, archivos, documentación, código, y demás. +Si el usuario quisiera, puede incluir otr databerso dentro de ellos. Al publicar +los conjuntos de datos, se le asigna una citación formal académica y un +identificador DOI asociado a ellos, para que la utilices a la hora de escribir +artículos en tus redes o paginas web. + +Dataverse, por lo tanto, cuenta con varias APIs abiertas (de búsqueda, acceso y +depósito de archivos) para darle un grado mayor de interoperabilidad y permitir +una integración más limpia y ligera dentro de el esquema de trabajo de cualquier +investigador, archivista o editor. + +## Quien usa Dataverse? + +Además del repositorio de Harvard anteriormente mencionado, en la pagina +principal del sitio web de Dataverse se encuentra un mapamundi en el que se +señalan las instalaciones públicas de repositorios Dataverse, con mayor +concentración de éstos en Norte America y Europa, aunque se ven varias también +en America Latina, Africa y Asia. Algunas de estas estan pensadas no solamente +para uso local, sino también para países y regiones vecinas, como el ACSS +Dataverse[4] de Lebanon, el cual contiene conjuntos de datos producidos en +paises árabes. Además, a pesar de limitaciones respecto al envío de archivos, +muchos de estos sitios permiten acceder los dataversos de forma gratuita sin +importar que seas investigador o parte de la institución o comunidad en +cuestión. + +Al incentivar a los investigadores a usar una plataforma abierta para publicar y +compartir los datos que ellos mismos utilizan, se hace práctica la distribución +y publicación de estos bajo una licencia abierta que permita su acceso y +replicación entre terceros. Esta es una forma algo indirecta, pero aun así +posiblemente eficaz para lograr que se realice y presente una ciencia realmente +abierta mediante el uso de aplicaciones abiertas y eficientes en su realización, +sin modificar o añadir pasos innecesarios en su práctica. Mención aparte merece +el hecho de tener una gran utilidad para los propios investigadores, ya que +permite asegurar su acreditación adecuada en publicaciones que contengan su +trabajo. + +Es posible que en el futuro este tipo de práctica se hagan comunes, y que haya +una multitud de repositorios de aplicaciones como Dataverse alrededor del mundo, +que albergen el conjunto del trabajo científico realizado en las regiones donde +estén localizados. De esta manera, existiría la posiblidad de que las +conclusiones de los investigadores y instituciones sean realmente juzgadas, +criticadas y revisadas también por ciudadanos comunes, haciendo que cualquier +tipo de decisión política que dependa del trabajo científico, dependa también de +los aportes de estos. + +[1]: https://dataverse.org/ "Dataverse" +[2]: https://www.go-fair.org/fair-principles/ "FAIR" +[3]: https://dataverse.harvard.edu "Harvard Dataverse" +[4]: https://dataverse.theacss.org "ACSS Dataverse" diff --git a/content/blog/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/grafica1.png b/bkp/blogs/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/grafica1.png similarity index 100% rename from content/blog/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/grafica1.png rename to bkp/blogs/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/grafica1.png diff --git a/content/blog/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/grafica2.png b/bkp/blogs/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/grafica2.png similarity index 100% rename from content/blog/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/grafica2.png rename to bkp/blogs/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/grafica2.png diff --git a/content/blog/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/grafica3.png b/bkp/blogs/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/grafica3.png similarity index 100% rename from content/blog/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/grafica3.png rename to bkp/blogs/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/grafica3.png diff --git a/content/blog/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/header.png b/bkp/blogs/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/header.png similarity index 100% rename from content/blog/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/header.png rename to bkp/blogs/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/header.png diff --git a/content/blog/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/index.md b/bkp/blogs/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/index.md similarity index 55% rename from content/blog/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/index.md rename to bkp/blogs/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/index.md index 35b744ffc..5f8de145e 100644 --- a/content/blog/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/index.md +++ b/bkp/blogs/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/index.md @@ -2,68 +2,67 @@ title: "Dibuja tus mapas en R usando archivos de formato Shapefile" slug: dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile date: 2022-04-08 -author: Ever Vino -tags: [mapas, datos, visualización de datos, shapefile] -categories: [ciencia abierta, R] -aliases: ["/blog/0059-r-maps-viz/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/"] -draft: false -usePageBundles: true +authors: ["Ever Vino"] +tags: ["mapas", "datos", "visualización de datos", "shapefile"] +categories: ["ciencia abierta", "R"] +description: | + Este breve tutorial te mostrará como graficar mapas en R, extraer datos de + archivos de formato shapefile, resaltar puntos en tu mapa y modificar su + apariencia utilizando las bibliotecas `rgdal` y `ggplot2`. thumbnail: "/header.png" -featureImage: "/header.png" +template: "blog-post.html" --- - - - -Este breve tutorial te mostrará como graficar mapas en R, extraer datos -de archivos de formato shapefile, resaltar puntos en tu mapa y modificar -su apariencia utilizando las bibliotecas `rgdal` y `ggplot2`. +Este breve tutorial te mostrará como graficar mapas en R, extraer datos de +archivos de formato shapefile, resaltar puntos en tu mapa y modificar su +apariencia utilizando las bibliotecas `rgdal` y `ggplot2`. ## Comenzando -Para que todas las bibliotecas funcionen correctamente, se recomienda -instalar o actualizar a las últimas versiones de -[R](https://cran.r-project.org/) y de su IDE -[RStudio](https://www.rstudio.com/) con su correspondiente complemento +Para que todas las bibliotecas funcionen correctamente, se recomienda instalar o +actualizar a las últimas versiones de [R](https://cran.r-project.org/) y de su +IDE [RStudio](https://www.rstudio.com/) con su correspondiente complemento [RTools](https://cran.r-project.org/bin/windows/Rtools/rtools40.html). -En este artículo, vamos a utilizar archivos de formato Shapefile. Si todavía no sabes de qué se trata, te explicamos a continuación. +En este artículo, vamos a utilizar archivos de formato Shapefile. Si todavía no +sabes de qué se trata, te explicamos a continuación. Un archivo Shapefile contiene al menos: - `.shp` - un archivo tipo shape, es la geometría misma. -- `.shx` - un archivo tipo index, tiene las posiciones indexadas del archivo .shp. -- `.dbf` - un archivo tipo attribute, tiene los atributos de cada forma en una columna, es de tipo dBase IV. - -Adicionalmente, la carpeta donde se encuentran dichos archivos pueden -contener otros archivos de formato `.prj` o `.sbn`, estos aportan más -datos de la geometría o pueden ser usados en otros programas de sistemas -de información geográfica. - -Los datos importados con `rgdal` a partir de un archivo shapefile, son -objetos que contienen polígonos vectoriales, con las coordenadas la -latitud y la longitud en formato decimal. A partir de estos objetos, -podemos extraer datos para graficarlos desde una tabla. La biblioteca -`broom` nos ayuda en la extracción y agrupación de los datos para su -correspondiente graficación. +- `.shx` - un archivo tipo index, tiene las posiciones indexadas del archivo + .shp. +- `.dbf` - un archivo tipo attribute, tiene los atributos de cada forma en una + columna, es de tipo dBase IV. + +Adicionalmente, la carpeta donde se encuentran dichos archivos pueden contener +otros archivos de formato `.prj` o `.sbn`, estos aportan más datos de la +geometría o pueden ser usados en otros programas de sistemas de información +geográfica. + +Los datos importados con `rgdal` a partir de un archivo shapefile, son objetos +que contienen polígonos vectoriales, con las coordenadas la latitud y la +longitud en formato decimal. A partir de estos objetos, podemos extraer datos +para graficarlos desde una tabla. La biblioteca `broom` nos ayuda en la +extracción y agrupación de los datos para su correspondiente graficación. **Obteniendo nuestros archivos shapefile** -Muchos de estos archivos Shapefile representan mapas de nuestros -Estados, por lo que están disponibles de manera gratuita en la mayoría -de los casos, en otros, son de paga o están más completos, actualizados -y/o poseen datos específicos. Debajo mostramos algunos recursos web -gratuitos que puedes usar. +Muchos de estos archivos Shapefile representan mapas de nuestros Estados, por lo +que están disponibles de manera gratuita en la mayoría de los casos, en otros, +son de paga o están más completos, actualizados y/o poseen datos específicos. +Debajo mostramos algunos recursos web gratuitos que puedes usar. -[data.humdata.org](https://data.humdata.org/) para shapefiles de varios -países del mundo (algunos están desactualizados). +[data.humdata.org](https://data.humdata.org/) para shapefiles de varios países +del mundo (algunos están desactualizados). -[geo.gob.bo](https://geo.gob.bo/geonetwork/srv/spa/catalog.search#/home) para shapefiles de Bolivia. +[geo.gob.bo](https://geo.gob.bo/geonetwork/srv/spa/catalog.search#/home) para +shapefiles de Bolivia. ### Instalación de pre-requisitos @@ -79,13 +78,14 @@ install.packages("dplyr") # biblioteca usada para agrupar por valores de col install.packages("extrafont") # biblioteca para importar los tipos de letra de windows. ``` -_(Recuerde que para ejecutar una línea de comando en el Editor de RStudio se usa Ctrl+Enter)_ +_(Recuerde que para ejecutar una línea de comando en el Editor de RStudio se usa +Ctrl+Enter)_ ## Preparación de los datos para graficar -Nuestra base de datos fue descargada de -[GeoBolivia](https://geo.gob.bo), [INE Bolivia](https://www.ine.gob.bo/) -y [geodatos.net](https://www.geodatos.net/coordenadas/bolivia). Una vez +Nuestra base de datos fue descargada de [GeoBolivia](https://geo.gob.bo), +[INE Bolivia](https://www.ine.gob.bo/) y +[geodatos.net](https://www.geodatos.net/coordenadas/bolivia). Una vez descargados los datos, fueron depurados para el ejemplo. Abrimos nuestras bibliotecas requeridas: @@ -111,17 +111,17 @@ shapefile = readOGR( layer = "departamentos_geo", encoding = 'utf-8', use_iconv = TRUE -) +) ``` -- **`dsn`**: carpeta dentro del directorio actual, donde se encuentran - ficheros shapefiles. Si se pone solo un punto **"."** hace referencia - a que los ficheros se encuentran en la carpeta actual. +- **`dsn`**: carpeta dentro del directorio actual, donde se encuentran ficheros + shapefiles. Si se pone solo un punto **"."** hace referencia a que los + ficheros se encuentran en la carpeta actual. -- **`encoding="utf-8", use_iconv=TRUE`**: indica a la función `readOGR` - que debe importarse con la codificación `utf-8`. Como nuestro archivo - contiene caracteres del español como **ñ** y vocales con tildes, es - conveniente usar este comando. +- **`encoding="utf-8", use_iconv=TRUE`**: indica a la función `readOGR` que debe + importarse con la codificación `utf-8`. Como nuestro archivo contiene + caracteres del español como **ñ** y vocales con tildes, es conveniente usar + este comando. Para observar el contenido de `shapefile`, use `View(shapefile)`. @@ -135,18 +135,18 @@ head(geotable) ```r > head(geotable) # A tibble: 6 x 7 - long lat order hole piece group id + long lat order hole piece group id -1 -65.8 -18.0 1 FALSE 1 0.1 0 -2 -65.8 -18.0 2 FALSE 1 0.1 0 -3 -65.8 -18.0 3 FALSE 1 0.1 0 -4 -65.8 -18.0 4 FALSE 1 0.1 0 -5 -65.8 -18.0 5 FALSE 1 0.1 0 -6 -65.8 -18.0 6 FALSE 1 0.1 0 +1 -65.8 -18.0 1 FALSE 1 0.1 0 +2 -65.8 -18.0 2 FALSE 1 0.1 0 +3 -65.8 -18.0 3 FALSE 1 0.1 0 +4 -65.8 -18.0 4 FALSE 1 0.1 0 +5 -65.8 -18.0 5 FALSE 1 0.1 0 +6 -65.8 -18.0 6 FALSE 1 0.1 0 ``` -Nótese que geotable, no posee las etiquetas de los nombres de las -regiones a graficar, esto lo arreglamos con: +Nótese que geotable, no posee las etiquetas de los nombres de las regiones a +graficar, esto lo arreglamos con: ```r # añadiendo una columna id para poder juntar las columnas de nuestro geotable @@ -156,27 +156,33 @@ shapefile$id <- row.names(shapefile) geotable <- left_join(geotable, shapefile@data, by = "id") ``` -Para verificar que se han añadido los correspondientes nombres de regiones, use `head(geotable)` +Para verificar que se han añadido los correspondientes nombres de regiones, use +`head(geotable)` Funciones auxiliares: -- **`shapefile$id <- `**: crea una nueva columna `id` en shapefile o la reemplaza. -- **`row.names(shapefile) `**: extrae los nombres de las filas del shapefile que por defecto es una numeración que va desde 0 y coincide con el `id` de nuestro `geotable`. -- **`shapefile@data `** accede a la tabla o dataframe `data` de nuestro shapefile. -- **`left_join(tabla1, tabla2, by = clave) `**: junta dos tablas por izquierda, es decir, añade valores que faltan de `tabla2` a la `tabla1` de acuerdo al código `clave` o columna común. - -Ahora importamos nuestra tabla con los datos de población por -departamento: (haciendo `header = TRUE` nos aseguramos que la primera -fila se convierta en los nombres de las columnas) +- **`shapefile$id <- `**: crea una nueva columna `id` en shapefile o la + reemplaza. +- **`row.names(shapefile) `**: extrae los nombres de las filas del shapefile que + por defecto es una numeración que va desde 0 y coincide con el `id` de nuestro + `geotable`. +- **`shapefile@data `** accede a la tabla o dataframe `data` de nuestro + shapefile. +- **`left_join(tabla1, tabla2, by = clave) `**: junta dos tablas por izquierda, + es decir, añade valores que faltan de `tabla2` a la `tabla1` de acuerdo al + código `clave` o columna común. + +Ahora importamos nuestra tabla con los datos de población por departamento: +(haciendo `header = TRUE` nos aseguramos que la primera fila se convierta en los +nombres de las columnas) ```r # importando la tabla de datos de población poblacion <- import("departamentospoblacion.csv", header = TRUE) ``` -Nótese que cambiamos el nombre de nuestra columna en población -`DEPARTAMENTO` por `DEPARTAMEN`, para que coincidan y -luego juntarlas con `left_join()`. +Nótese que cambiamos el nombre de nuestra columna en población `DEPARTAMENTO` +por `DEPARTAMEN`, para que coincidan y luego juntarlas con `left_join()`. ```r # cambiando el nombre de la columna de DEPARTAMENTO POR DEPARTAMEN @@ -200,22 +206,25 @@ ggplot() + coord_equal() + labs(fill = "POBLACION") ``` -- **`geom_polygon(data, aes(x, y, group, fill))`**: dibuja polígonos con la tabla `data` y muestra la estética con `aes()`. - `x`, `y` son los valores en ejes de las abscisas y las ordenadas. Están agrupadas por el valor de la columna `group` y se colorea con base a los valores de la columna `fill`. -- **`coord_equal()`**: obliga a la gráfica a que la relación de aspecto entre coordenadas sea 1:1. +- **`geom_polygon(data, aes(x, y, group, fill))`**: dibuja polígonos con la + tabla `data` y muestra la estética con `aes()`. `x`, `y` son los valores en + ejes de las abscisas y las ordenadas. Están agrupadas por el valor de la + columna `group` y se colorea con base a los valores de la columna `fill`. +- **`coord_equal()`**: obliga a la gráfica a que la relación de aspecto entre + coordenadas sea 1:1. - **`lab(fill)`**: pone el título a la leyenda con `fill`. ![Mapa de Bolivia: Población por departamento](grafica1.png) ## Mejorando la presentación de nuestro mapa -Entre las cosas que podemos hacer para mejorar la apariencia de nuestra -gráfica están: poner un título, cambiar los colores, el fondo, el -formato de nuestra leyenda. A continuación mostramos como hacerlo. +Entre las cosas que podemos hacer para mejorar la apariencia de nuestra gráfica +están: poner un título, cambiar los colores, el fondo, el formato de nuestra +leyenda. A continuación mostramos como hacerlo. -Extraemos los valores de la población para ponerlas como etiquetas -dentro de nuestro mapa, para ello utilizamos las funciones `group_by()` -y `summarise()` de la biblioteca `dplyr`. +Extraemos los valores de la población para ponerlas como etiquetas dentro de +nuestro mapa, para ello utilizamos las funciones `group_by()` y `summarise()` de +la biblioteca `dplyr`. ```r etiquetas_poblacion <- datos %>% group_by(DEPARTAMEN) %>% @@ -226,13 +235,21 @@ etiquetas_poblacion <- datos %>% group_by(DEPARTAMEN) %>% ) ``` -- **`tabla0 %>% funcion0 %>% funcion1 ...`**: Esta notación indica que se debe tomar la `tabla0` como argumento de la `funcion0`, luego los resultados de la `funcion0` deben tomarse como argumentos de la `función1` y así sucesivamente. El símbolo **%>%** es conocido como `pipe operator`, este nos ayuda a concatenar valores de entrada y salida de diferentes funciones. -- **`group_by(col) %>% summarise(col1=accion1, col2=accion2 ...)`**: agrupa los datos en función del valor de columna `col` y con `summarise()` usa los datos agrupados para devolver nuevos valores: `col1`, `col2` ..., que pueden estar en función de los valores agrupados. +- **`tabla0 %>% funcion0 %>% funcion1 ...`**: Esta notación indica que se debe + tomar la `tabla0` como argumento de la `funcion0`, luego los resultados de la + `funcion0` deben tomarse como argumentos de la `función1` y así sucesivamente. + El símbolo **%>%** es conocido como `pipe operator`, este nos ayuda a + concatenar valores de entrada y salida de diferentes funciones. +- **`group_by(col) %>% summarise(col1=accion1, col2=accion2 ...)`**: agrupa los + datos en función del valor de columna `col` y con `summarise()` usa los datos + agrupados para devolver nuevos valores: `col1`, `col2` ..., que pueden estar + en función de los valores agrupados. - **`range(v)`**: extrae los valores máximo y mínimo de un rango de datos `v`. - **`mean(v)`**: devuelve el valor promedio del vector `v`. -Si queremos incluir nuevas fuentes para el tipo de letra para nuestro mapa, empleamos los siguientes comandos: -(Nota: nos pedirá confirmación para realizar la importación de fuentes y tardará unos minutos): +Si queremos incluir nuevas fuentes para el tipo de letra para nuestro mapa, +empleamos los siguientes comandos: (Nota: nos pedirá confirmación para realizar +la importación de fuentes y tardará unos minutos): ```r extrafont::font_import("C:/Windows/Fonts") @@ -287,22 +304,48 @@ ggplot() + ``` - **`theme_void()`**: elimina el fondo y los ejes de nuestra gráfica. -- **`geom_text(size, alpha, fontface, data, mapping = aes(x, y, label), color)`**: extrae los datos de `data`, para graficar el texto `label` en las coordenadas `x` e `y`, si se desea una diferenciación de colores se usa `color`. Con `size`, `alpha` y `fontface`, se establece el tamaño, la opacidad y la estética del texto respectivamente. -- **`format(v, big.mark)`**: da el formato al valor `v`, indicando la separación de miles con `big.mark` (En nuestro ejemplo el separador de miles es solo el espacio " "). -- **`labs(title, fill, caption)`**: con `title`, `fill`, `caption` pone el texto del título, la leyenda y el pie del gráfico respectivamente. -- **`scale_colour_gradientn(colours, guide)`**: aplica una escala de colores a todos los valores asignados al argumento `color`. En nuestro ejemplo tenemos color dentro de la función `geom_text(... aes(.. color = pob ...) ...)`, es decir, los valores de `pob` estarán coloreados según los valores de `colours` (la sintaxis `color` y `colors` pueden intercambiarse sin problema con `colour` y `colours`) y para que la guía de leyenda no se muestre usamos `guide = "none"`. -- **`scale_fill_continuous(low, high, guide, labels)`**: establece una escala de colores continua a los valores asignados a `fill`. En nuestro ejemplo `fill` está dentro de la función `geom_polygon(... aes(... fill = Poblacion2022 ...) ...)`, es decir, los valores de la columna `Poblacion2022` estarán afectados por esta función. Usamos `low` para el color correspondiente al valor más bajo y `high` para el color del valor más alto. Con `guide = colorbar` mostramos nuestra leyenda en forma de colorbar y con`labels` modificamos la apariencia en la escala de nuestro colorbar. -- **`scales::label_number(big.mark=" ")`**: usa la función `label_number()` de la biblioteca `scales`. - Con esto modificamos la apariencia de los números de nuestra leyenda poniéndole un espacio **" "** como separador de miles. - (Nótese que podemos usar `scales::funcion()` en lugar de `library(scales) funcion())`. -- **`theme(plot.title, legend.title, plot.caption)`**: modifica la apariencia del título del gráfico, el título de la leyenda y el pie del gráfico respectivamente. -- **`element_text(size, face, family, hjust)`**: extrae propiedades del texto para modificar el tamaño, la estética, el tipo y la posición en horizontal. +- **`geom_text(size, alpha, fontface, data, mapping = aes(x, y, label), color)`**: + extrae los datos de `data`, para graficar el texto `label` en las coordenadas + `x` e `y`, si se desea una diferenciación de colores se usa `color`. Con + `size`, `alpha` y `fontface`, se establece el tamaño, la opacidad y la + estética del texto respectivamente. +- **`format(v, big.mark)`**: da el formato al valor `v`, indicando la separación + de miles con `big.mark` (En nuestro ejemplo el separador de miles es solo el + espacio " "). +- **`labs(title, fill, caption)`**: con `title`, `fill`, `caption` pone el texto + del título, la leyenda y el pie del gráfico respectivamente. +- **`scale_colour_gradientn(colours, guide)`**: aplica una escala de colores a + todos los valores asignados al argumento `color`. En nuestro ejemplo tenemos + color dentro de la función `geom_text(... aes(.. color = pob ...) ...)`, es + decir, los valores de `pob` estarán coloreados según los valores de `colours` + (la sintaxis `color` y `colors` pueden intercambiarse sin problema con + `colour` y `colours`) y para que la guía de leyenda no se muestre usamos + `guide = "none"`. +- **`scale_fill_continuous(low, high, guide, labels)`**: establece una escala de + colores continua a los valores asignados a `fill`. En nuestro ejemplo `fill` + está dentro de la función + `geom_polygon(... aes(... fill = Poblacion2022 ...) ...)`, es decir, los + valores de la columna `Poblacion2022` estarán afectados por esta función. + Usamos `low` para el color correspondiente al valor más bajo y `high` para el + color del valor más alto. Con `guide = colorbar` mostramos nuestra leyenda en + forma de colorbar y con`labels` modificamos la apariencia en la escala de + nuestro colorbar. +- **`scales::label_number(big.mark=" ")`**: usa la función `label_number()` de + la biblioteca `scales`. Con esto modificamos la apariencia de los números de + nuestra leyenda poniéndole un espacio **" "** como separador de miles. (Nótese + que podemos usar `scales::funcion()` en lugar de `library(scales) funcion())`. +- **`theme(plot.title, legend.title, plot.caption)`**: modifica la apariencia + del título del gráfico, el título de la leyenda y el pie del gráfico + respectivamente. +- **`element_text(size, face, family, hjust)`**: extrae propiedades del texto + para modificar el tamaño, la estética, el tipo y la posición en horizontal. ![Mapa de Bolivia: Población por departamento](grafica2.png) ## Añadiendo ubicaciones a nuestro mapa -Incluyendo las ubicaciones de ciudades capitales de departamentos a nuestro mapa: +Incluyendo las ubicaciones de ciudades capitales de departamentos a nuestro +mapa: ```r ciudades = import("ciudades.csv") # importamos la localización de las ciudades capitales @@ -340,36 +383,41 @@ ggplot() + ), legend.title = element_text(size = 12, family = "Rubik"), plot.caption = element_text(family = "Helvetica") - ) + ) ``` -- **`geom_point(alpha, data, mapping = aes(x, y, colour), size)`**: dibuja puntos dentro del gráfico, comparte similares argumentos con `geom_poligon()` y `geom_text()`. -- **`scale_fill_brewer(palette, guide)`**: similar a la función `scale_fill_continuous(low, high, guide, labels)` aplica una escala de colores tipo brewer a todos los objetos asignados a `fill` y con `pallete` seleccionamos el tipo de paleta de colores a aplicar. -- **`scale_color_manual(values)`**: nos permite usar una escala de colores manual, `values` debe ser un vector que contenga los valores de los colores de la escala. +- **`geom_point(alpha, data, mapping = aes(x, y, colour), size)`**: dibuja + puntos dentro del gráfico, comparte similares argumentos con `geom_poligon()` + y `geom_text()`. +- **`scale_fill_brewer(palette, guide)`**: similar a la función + `scale_fill_continuous(low, high, guide, labels)` aplica una escala de colores + tipo brewer a todos los objetos asignados a `fill` y con `pallete` + seleccionamos el tipo de paleta de colores a aplicar. +- **`scale_color_manual(values)`**: nos permite usar una escala de colores + manual, `values` debe ser un vector que contenga los valores de los colores de + la escala. - **`raibow(9)`**: devuelve un vector con 9 colores del arcoiris. ![Mapa de Bolivia: Capitales de departamento](grafica3.png) #### Asignando colores -Puedes asignar los colores simplemente usando su nombre en inglés. Para -el blanco es **white**, para el rojo, **red**. También puedes utilizar -el código hexadecimal, como **#FF4500** para el rojo anaranjado; -agruparlos en una escala de colores utilizando el comando -`c("red","#FF4500"...)`. Una página recomendable para seleccionar -colores y obtener su código de color con un click es -[r-charts.com/colors/](https://r-charts.com/colors/). También puedes -emplear las funciones auxiliares que ofrece `R`, por ejemplo: -`scale_color`/`fill_brewer`/`viridis_`. Estas proporcionan escalas -predefinidas que podrían mejorar el impacto visual. +Puedes asignar los colores simplemente usando su nombre en inglés. Para el +blanco es **white**, para el rojo, **red**. También puedes utilizar el código +hexadecimal, como **#FF4500** para el rojo anaranjado; agruparlos en una escala +de colores utilizando el comando `c("red","#FF4500"...)`. Una página +recomendable para seleccionar colores y obtener su código de color con un click +es [r-charts.com/colors/](https://r-charts.com/colors/). También puedes emplear +las funciones auxiliares que ofrece `R`, por ejemplo: +`scale_color`/`fill_brewer`/`viridis_`. Estas proporcionan escalas predefinidas +que podrían mejorar el impacto visual. ## Guardando nuestro mapa -RStudio ofrece la posibilidad de exportar fácilmente desde su menú -ubicado encima de la vista previa del gráfico "Export". Podemos optar -por guardar nuestro mapa con mayor calidad o cierto formato y, para -ello, podemos usar `ggsave()`, que nos permite exportar o guardar -nuestro último gráfico ejecutado. +RStudio ofrece la posibilidad de exportar fácilmente desde su menú ubicado +encima de la vista previa del gráfico "Export". Podemos optar por guardar +nuestro mapa con mayor calidad o cierto formato y, para ello, podemos usar +`ggsave()`, que nos permite exportar o guardar nuestro último gráfico ejecutado. ```r ggsave( @@ -381,7 +429,9 @@ ggsave( ) ``` -Guarda el mapa con el nombre `filename` en la ruta `path`, con la escala y formato de `scale` y `device`. Con `dpi` indicamos la cantidad de píxeles por pulgada, que es la calidad de nuestro archivo a exportar. +Guarda el mapa con el nombre `filename` en la ruta `path`, con la escala y +formato de `scale` y `device`. Con `dpi` indicamos la cantidad de píxeles por +pulgada, que es la calidad de nuestro archivo a exportar. ## Referencias diff --git a/content/blog/epigraphhub/egh_map.png "b/bkp/blogs/epigraphhub-un-proyecto-de-c\303\263digo-abierto-para-el-analisis-de-datos-de-calidad/egh_map.png" similarity index 100% rename from content/blog/epigraphhub/egh_map.png rename to "bkp/blogs/epigraphhub-un-proyecto-de-c\303\263digo-abierto-para-el-analisis-de-datos-de-calidad/egh_map.png" diff --git a/content/blog/epigraphhub/header.png "b/bkp/blogs/epigraphhub-un-proyecto-de-c\303\263digo-abierto-para-el-analisis-de-datos-de-calidad/header.png" similarity index 100% rename from content/blog/epigraphhub/header.png rename to "bkp/blogs/epigraphhub-un-proyecto-de-c\303\263digo-abierto-para-el-analisis-de-datos-de-calidad/header.png" diff --git "a/bkp/blogs/epigraphhub-un-proyecto-de-c\303\263digo-abierto-para-el-analisis-de-datos-de-calidad/index.md" "b/bkp/blogs/epigraphhub-un-proyecto-de-c\303\263digo-abierto-para-el-analisis-de-datos-de-calidad/index.md" new file mode 100644 index 000000000..34f6987d2 --- /dev/null +++ "b/bkp/blogs/epigraphhub-un-proyecto-de-c\303\263digo-abierto-para-el-analisis-de-datos-de-calidad/index.md" @@ -0,0 +1,139 @@ +--- +title: + "EpiGraphHub: un proyecto de código abierto para el análisis de datos de + calidad" +slug: epigraphhub-un-proyecto-de-código-abierto-para-el-analisis-de-datos-de-calidad +date: 2022-09-28 +authors: ["Anavelyz Perez"] +tags: [epigraphhub, visualización de datos, análisis, datos, epidemiología] +categories: [ciencia abierta, código abierto] +description: | + ¿Quieres realizar un análisis y no encuentras datos?, ¿quieres realizar + visualizaciones como dashboards o gráficos?, o simplemente explorar, ¿cómo + puedes analizar datos? Entonces este artículo es para ti. Vamos a describir + EpiGraphHub, un proyecto de código abierto orientado al análisis de datos de + calidad. +thumbnail: "/header.png" +template: "blog-post.html" +--- + +¿Quieres realizar un análisis y no encuentras datos?, ¿quieres realizar +visualizaciones como dashboards o gráficos?, o simplemente explorar, ¿cómo +puedes analizar datos? Entonces este artículo es para ti. Vamos a describir +EpiGraphHub, un proyecto de código abierto orientado al análisis de datos de +calidad. + + + +## ¿Qué es EpiGraphHub? + +Es una plataforma de código abierto que integra y permite gestionar datos de +diversas fuentes. Fue diseñada principalmente para describir datos de salud +pública, pero incluye otros tópicos como socio-economía, demografía o censos. +Esto es posible porque posee conectores a muchas bases de datos y conjuntos de +datos abiertos. + +Con EpiGraphHub podemos hacer exploraciones rápidas y dashboarding (gráficos +interactivos). Además, puede servir como backend de datos para apps analíticas. + +Sus funciones de visualización están impulsadas por +[Apache Echarts](https://echarts.apache.org/), está compuesta por un servidor de +bases de datos Postgresql integrado con un frontend web Apache Superset +personalizado para el acceso y la exploración de datos. + +Cuenta con servidores, lo que nos permite acceder a grandes cantidades de datos +sin que tengamos que preocuparnos si nuestro computador soporta o no cientos de +datos. + +EpiGraphHub, al ser un proyecto de código abierto permite que cualquiera pueda +tomarlo y trabajar con él, lo hace disponible para programadores, empresarios, +analistas de datos y el público en general. Otro aspecto importante es que puede +conectarse a bases de datos locales, remotas o en la nube, incluso hojas de +cálculo de Google y su equipo está constantemente recopilando conjuntos de datos +abiertos relevantes. Esto nos permite más opciones en la exploración de datos. + +## Bibliotecas de EpiGraphHub + +Además de permitir hacer análisis visual, EpiGraphHub se complementa con +bibliotecas, las cuales están diseñadas para proporcionar a los usuarios +externos toda la funcionalidad analítica utilizada para potenciar la plataforma +y sus aplicaciones. + +Las bibliotecas permiten realizar o aplicar: + +- Estadística Bayesiana +- Análisis epidemiológico +- Modelado matemático +- Análisis de Costo-efectividad +- Pronósticos +- Aprendizaje automático +- Minería de textos +- Análisis Geoespacial + +Esto se encuentra disponible para los lenguajes de programación +[R](https://github.com/thegraphnetwork/r-epigraphhub/blob/main/epigraphhub.Rproj) +y [Python](https://github.com/thegraphnetwork/epigraphhub_py). + +## ¿Cómo utilizar la plataforma EpiGraphHub? + +Este procedimiento es muy sencillo, debes acceder a su dirección web: +https://dash.epigraphhub.org/. Luego puedes crear un usuario o emplear la cuenta +de invitado (usuario:guest y contraseña:guest). + +Para la cuenta de invitado no tienes todas las opciones disponibles, pero con +ella puedes explorar los datasets y las bases de datos en los servidores. +También tienes acceso a los dashboards y gráficos que los miembros del proyecto +han generado. + +![egh](egh_map.png) + +Si creas una cuenta tendrás una opción adicional en la que puedes realizar +consultas a través de SQL y personalizar los datos de acuerdo a lo que +necesites. + +En caso de que deseas ver un tutorial de cómo funciona EpiGraphHub puedes dar +clic [aquí](https://youtu.be/JOxbiovCtdE). + +## ¿Cómo unirse a la comunidad de EpiGraphHub? + +Si quieres formar parte de la comunidad de EpiGraphHub, puedes unirte a su +servidor en [Discord](https://discord.gg/56thARPrnJ). Allí tienes un espacio +para expresar tus preguntas, sugerencias o estar atento a los próximos eventos +organizados en la comunidad. + +## ¿Cómo contribuir en EpiGraphHub? + +EpiGraphHub al ser un proyecto de código abierto crea espacios en los que es +posible contribuir, su repositorio principal se encuentra en +[GitHub](https://github.com/thegraphnetwork/EpiGraphHub#contributing) por lo que +los issues y la forma en que podemos brindar nuestro granito de arena se +encuentra expresado allí. Igualmente, si tienes dudas puedes acudir a Discord. + +En resumen, EpiGraphHub es una herramienta que nos permite acceder y analizar +datos a través de sus servidores, lo cual logra que trabajemos sin preocuparnos +por la cantidad y el espacio que pudiesen ocupar en nuestro computador. También +podemos utilizar sus funcionalidades para analizar datos almacenados en local y +obtener resultados interesantes que no percibimos a simple vista en los datos. +Además de esto, los gráficos y dashboards que podemos obtener a través de la +plataforma son muy llamativos y podemos interactuar fácilmente con la +información, recordemos que provienen de Apache Echarts. + +Si ya le echaste un vistazo a este proyecto puedes dejarnos tus comentarios a +cerca de lo que percibiste y si te gustó. + +## Referencias + +- GRAPH Network. (2022, 1 junio). EpiGraphHub: a data integration platform for + health | Flavio Coelho [Vídeo]. YouTube. Recuperado 28 de septiembre de 2022, + de https://www.youtube.com/watch?v=8Mz52O_VzVc&feature=youtu.be + +- Welcome to EpigraphHub libraries documentation! — EpigraphHub Library + 2022-01-01 documentation. (s. f.). Recuperado 28 de septiembre de 2022, de + https://epigraphhub-libraries.readthedocs.io/en/latest/ + +- EpiGraphHub. (s. f.). Recuperado 28 de septiembre de 2022, de + https://epigraphhub.org/superset/welcome/ + +- Epidemias, D. M. A. (2022, 4 abril). Introduction to EpigraphHub. YouTube. + Recuperado 28 de septiembre de 2022, de + https://www.youtube.com/watch?v=JOxbiovCtdEf&feature=youtu.be diff --git a/content/blog/ethereum-merge-is-coming-pero-que-significa/energy.png b/bkp/blogs/ethereum-merge-is-coming-pero-que-significa/energy.png similarity index 100% rename from content/blog/ethereum-merge-is-coming-pero-que-significa/energy.png rename to bkp/blogs/ethereum-merge-is-coming-pero-que-significa/energy.png diff --git a/content/blog/ethereum-merge-is-coming-pero-que-significa/eth-pow-pos.png b/bkp/blogs/ethereum-merge-is-coming-pero-que-significa/eth-pow-pos.png similarity index 100% rename from content/blog/ethereum-merge-is-coming-pero-que-significa/eth-pow-pos.png rename to bkp/blogs/ethereum-merge-is-coming-pero-que-significa/eth-pow-pos.png diff --git a/content/blog/ethereum-merge-is-coming-pero-que-significa/ethereum_panda.png b/bkp/blogs/ethereum-merge-is-coming-pero-que-significa/ethereum_panda.png similarity index 100% rename from content/blog/ethereum-merge-is-coming-pero-que-significa/ethereum_panda.png rename to bkp/blogs/ethereum-merge-is-coming-pero-que-significa/ethereum_panda.png diff --git a/content/blog/ethereum-merge-is-coming-pero-que-significa/header.jpeg b/bkp/blogs/ethereum-merge-is-coming-pero-que-significa/header.jpeg similarity index 100% rename from content/blog/ethereum-merge-is-coming-pero-que-significa/header.jpeg rename to bkp/blogs/ethereum-merge-is-coming-pero-que-significa/header.jpeg diff --git a/content/blog/ethereum-merge-is-coming-pero-que-significa/header.png b/bkp/blogs/ethereum-merge-is-coming-pero-que-significa/header.png similarity index 100% rename from content/blog/ethereum-merge-is-coming-pero-que-significa/header.png rename to bkp/blogs/ethereum-merge-is-coming-pero-que-significa/header.png diff --git a/bkp/blogs/ethereum-merge-is-coming-pero-que-significa/index.md b/bkp/blogs/ethereum-merge-is-coming-pero-que-significa/index.md new file mode 100644 index 000000000..4c18768fe --- /dev/null +++ b/bkp/blogs/ethereum-merge-is-coming-pero-que-significa/index.md @@ -0,0 +1,137 @@ +--- +title: "Ethereum merge is coming. ¿Pero qué significa?" +slug: ethereum-merge-is-coming-pero-que-significa +date: 2022-03-22 +authors: ["Alan Hurtarte"] +tags: [ethereum, transacciones, bitcoin, criptomoneda] +categories: [tecnología, web3] +description: | + Oh sweet summer child, Ethereum ya no será el mismo, está evolucionando, al + mismo tiempo que todo el ecosistema. No es secreto que todo el ecosistema crece, + y a una velocidad agigantada. La masiva adopción de Ethereum trajo consigo + problemas a la red como: + + - Transacciones con gas demasiado alto (provocando transacciones de alto costo) + - Transacciones demasiado lentas. No te puedes imaginar pagar un café o una + hamburguesa con Ethereum si el proceso tarde 5 o 10 minutos en validarse. + - Debido a las dos anteriores, demasiado consumo de energía eléctrica. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + +Oh sweet summer child, Ethereum ya no será el mismo, está evolucionando, al +mismo tiempo que todo el ecosistema. No es secreto que todo el ecosistema crece, +y a una velocidad agigantada. La masiva adopción de Ethereum trajo consigo +problemas a la red como: + +- Transacciones con gas demasiado alto (provocando transacciones de alto costo) +- Transacciones demasiado lentas. No te puedes imaginar pagar un café o una + hamburguesa con Ethereum si el proceso tarde 5 o 10 minutos en validarse. +- Debido a las dos anteriores, demasiado consumo de energía eléctrica. + + + +Estos problemas lo sufren las dos blockchains más grandes del momento, bitcoin y +Ethereum. En el caso de bitcoin, la solución es ligthing network. Para Ethereum, +es este merge. + +![Meme GOT](meme-summer.jpeg) + +Este puede ser uno de los cambios más esperado por la comunidad, trae consigo un +gran cambio en el modo en que valida las transacciones, actualmente utiliza un +mecanismo llamado POW (proof of work) y cambia a un mecanismo llamado POS (proof +of stake). Este cambio mejorará la descentralización y el reducir bastante el +consumo de energía que con eso traerá menores costos. + +### Proof of work Vs. Proof of stake + +![Eth POW vr POS](eth-pow-pos.png) + +El concepto de **Proof of Work** existe desde antes de los crypto assets. La +primera idea fue publicada por Cynthia Dwork y Moni Naor en un artículo +publicado en 1993, sin embargo, no fue hasta 1999 que el término "Proof of work" +fue creada por Markus Jakobsson. + +Pero, ¿Por qué se usa esto?. En el white paper de bitcoin, Satoshi Nakamoto +teoriza que la única manera de vulnerar la fuerza de la red de bitcoin es a +través de un ataque del 51% de la red. Por eso, propone el uso de proof of work +para prevenir una entidad de ganar un control mayoritario sobre la red. Al +aplicar proof of work en este sentido, se argumenta es la idea central necesaria +para bitcoin, ya que permite un sistema de consenso realmente honesto y +distribuido. + +Así es como funciona actualmente bitcoin y Ethereum con el proof of work: + +1. Un grupo de transacciones son agrupadas en un memory pool (mempool). +2. Los mineros verifican cada transacción en el mempool que se legitima al + resolver un problema matemático. +3. El primer minero en resolver el problema obtiene una recompensa con un nuevo + bitcoin recién minado y el costo de la transacción. +4. El mempool verificado, ahora llamado bloque, es añadido a la blockchain. + +Ahora el **Proof of Stake**, tiene el mismo propósito de validar transacciones y +conseguir un consenso; sin embargo, se diferencia de proof of work, ya que no +involucra un problema matemático a resolver. Ahora el validador de cada bloque +se escoge determinísticamente basado en su **stake**. El stake es cuantas +monedas/tokens posee. Ya podrás suponer que al no tener que resolver un problema +matemático, la eficiencia energética de este sistema es mucho mayor, y esto +lleva a menores costos de transacción. Además, que este sistema puede proveer un +mejor incentivo para la salud de la red, al promover acumular moneda/tokens. + +### Porque del merge + +Ethereum tiene muchos problemas, y este merge busca solucionar el blockchain +trilemma + +- Seguridad +- Descentralización +- Escabilidad + +### Que beneficio trae el merge + +- Descentralización y seguridad: El merge requiere un mínimo de nodos y hacer + más fácil de correr un nodo. Para correr un nodo necesitas tener 32 ETH. +- Sostenibilidad: Proof of stake usa al menos 99% menos energía que proof of + work. + +![Energy scale per Transaction](energy.png) + +## ETH 2.0 + +![Ethereum panda](ethereum_panda.png) + +Este cambio en Ethereum ya venía siendo discutido desde el 2018, y había sido +añadido al roadmap, pero se dieron cuenta de varias cosas: + +- Tomaría años en entregar por completo el roadmap. +- Hacer el cambio completo de PoW a PoS, requeriría una migración por parte de + las aplicaciones existentes + +Entonces surgió la propuesta Eth1+Eth2 = Ethereum. Donde: + +- Eth1 = Execution Layer (actual red) +- Eth2 = Consensus Layer (el merge) + +El Consensus Layer es donde estará implementado el PoS, de esa manera se podrá +aplicar el merge, sin requerir cambios en los usuarios actuales de la red. Este +cambió lo explican más a fondo aquí +[The Great TH2 renaming](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/). + +![Ethereum roadmap](upgrade_path.png) + +## Conclusión + +Para el usuario final no significará un cambio en billetera o en como interactúa +con la red. Pero si verá los beneficios al tener transacciones más rápidas y de +menor costo. Esto nos acercará a una blockchain más útil para el día a día, +intercambiando valor. Es emocionante ver los cambios suceder y como se va +mejorando el ecosistema. + +## Fuentes + +- [The great renaming](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/) +- [The Ethereum merge is comming thread](https://twitter.com/JackNiewold/status/1506779959242764288) +- [The Ethereum merge](https://ethereum.org/en/upgrades/merge/#main-content) +- [Pow and Pos explained](https://hackernoon.com/consensus-mechanisms-explained-pow-vs-pos-89951c66ae10) diff --git a/content/blog/ethereum-merge-is-coming-pero-que-significa/meme-summer.jpeg b/bkp/blogs/ethereum-merge-is-coming-pero-que-significa/meme-summer.jpeg similarity index 100% rename from content/blog/ethereum-merge-is-coming-pero-que-significa/meme-summer.jpeg rename to bkp/blogs/ethereum-merge-is-coming-pero-que-significa/meme-summer.jpeg diff --git a/content/blog/ethereum-merge-is-coming-pero-que-significa/upgrade_path.png b/bkp/blogs/ethereum-merge-is-coming-pero-que-significa/upgrade_path.png similarity index 100% rename from content/blog/ethereum-merge-is-coming-pero-que-significa/upgrade_path.png rename to bkp/blogs/ethereum-merge-is-coming-pero-que-significa/upgrade_path.png diff --git a/content/blog/filtrar-datos-r/covid_continentes.png b/bkp/blogs/filtrar-datos-r/covid_continentes.png similarity index 100% rename from content/blog/filtrar-datos-r/covid_continentes.png rename to bkp/blogs/filtrar-datos-r/covid_continentes.png diff --git a/content/blog/filtrar-datos-r/covid_continentes_indicador.png b/bkp/blogs/filtrar-datos-r/covid_continentes_indicador.png similarity index 100% rename from content/blog/filtrar-datos-r/covid_continentes_indicador.png rename to bkp/blogs/filtrar-datos-r/covid_continentes_indicador.png diff --git a/content/blog/filtrar-datos-r/covid_region.png b/bkp/blogs/filtrar-datos-r/covid_region.png similarity index 100% rename from content/blog/filtrar-datos-r/covid_region.png rename to bkp/blogs/filtrar-datos-r/covid_region.png diff --git a/content/blog/filtrar-datos-r/header.png b/bkp/blogs/filtrar-datos-r/header.png similarity index 100% rename from content/blog/filtrar-datos-r/header.png rename to bkp/blogs/filtrar-datos-r/header.png diff --git a/content/blog/filtrar-datos-r/index.md b/bkp/blogs/filtrar-datos-r/index.md similarity index 54% rename from content/blog/filtrar-datos-r/index.md rename to bkp/blogs/filtrar-datos-r/index.md index 3b3a27796..bd2924aeb 100644 --- a/content/blog/filtrar-datos-r/index.md +++ b/bkp/blogs/filtrar-datos-r/index.md @@ -2,22 +2,24 @@ title: "Cómo filtrar datos de tu tabla con dplyr en R" slug: filtrar-datos-r date: 2022-06-14 -author: Ever Vino +authors: ["Ever Vino"] tags: [datos, paquetes, tablas, dplyr, filtrar datos] -categories: [ciencia de datos, R] -aliases: ["/blog/filtrar-datos-r/filtrar-datos-r/"] -draft: false -usePageBundles: true +categories: [ciencia de datos, R] +description: | + En este artículo mostraremos como usar algunas funciones importantes de la + biblioteca de `dplyr`, específicamente veremos como usar las funciones + `filter()`, `select()`, `group_by()`, `sumarize()` y `mutate()` dentro de un + ejemplo práctico. thumbnail: "/header.png" -featureImage: "/header.png" +template: "blog-post.html" --- - - - -En este artículo mostraremos como usar algunas funciones importantes de la biblioteca de `dplyr`, específicamente veremos como usar las funciones `filter()`, `select()`, `group_by()`, `sumarize()` y `mutate()` dentro de un ejemplo práctico. +En este artículo mostraremos como usar algunas funciones importantes de la +biblioteca de `dplyr`, específicamente veremos como usar las funciones +`filter()`, `select()`, `group_by()`, `sumarize()` y `mutate()` dentro de un +ejemplo práctico. @@ -34,11 +36,18 @@ p_load("ggplot2") # Biblioteca para graficar datos ``` -Recuerde, que tambien puede instalar y abrir las bibliotecas de manera tradicional, por ejemplo con: `install.packages("readr")`, luego abrir la misma biblioteca con `library(readr)`. +Recuerde, que tambien puede instalar y abrir las bibliotecas de manera +tradicional, por ejemplo con: `install.packages("readr")`, luego abrir la misma +biblioteca con `library(readr)`. ## Importando nuestros datos -La base de datos usada ha sido descargada de [Our World In Data](https://github.com/owid/covid-19-data), la cual muestra los datos recolectados de la reciente pandemia. Una vez descargada nuestra base de datos en formato `.csv`, la importamos a nuestro entorno de R. Puede descargar los archivos usados en este artículo [Repositorio de este artículo aquí](https://github.com/EverVino/Example_data_covid_r). +La base de datos usada ha sido descargada de +[Our World In Data](https://github.com/owid/covid-19-data), la cual muestra los +datos recolectados de la reciente pandemia. Una vez descargada nuestra base de +datos en formato `.csv`, la importamos a nuestro entorno de R. Puede descargar +los archivos usados en este artículo +[Repositorio de este artículo aquí](https://github.com/EverVino/Example_data_covid_r). Importamos los el archivo `.csv` a la variable `covid_data`. @@ -49,7 +58,7 @@ covid_data <- read_csv("owid-covid-data.csv") En la consola observamos lo siguiente: ```r -Rows: 193573 Columns: 67 +Rows: 193573 Columns: 67 ── Column specification ──────────────────────────────────────────────────────────────────────────── Delimiter: "," chr (4): iso_code, continent, location, tests_units @@ -60,12 +69,19 @@ date (1): date ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message. ``` -Como puede ver esta tabla es muy extensa, contiene 67 columnas (variables) y 193573 filas, manejar los datos directamente de esta tabla puede ser complicado, por lo que se recomienda reducir las variables o extraer información relevante para nosotros. -Si quiere explorar los datos manualmente puede ejecutar la función `(View(datos_covid))` en la consola. +Como puede ver esta tabla es muy extensa, contiene 67 columnas (variables) y +193573 filas, manejar los datos directamente de esta tabla puede ser complicado, +por lo que se recomienda reducir las variables o extraer información relevante +para nosotros. Si quiere explorar los datos manualmente puede ejecutar la +función `(View(datos_covid))` en la consola. ## Cómo usar la función filter() y select() -Queremos ver los datos de la región de Sudamérica (continent = "South America") y sólo las variables de país, fecha y nuevos casos que corresponderían a las columnas de location, date, new_cases respectivamente en el dataframe `datos_covid` (para graficar curvas suaves usamos la columna new_cases_smoothed en vez de new_cases). +Queremos ver los datos de la región de Sudamérica (continent = "South America") +y sólo las variables de país, fecha y nuevos casos que corresponderían a las +columnas de location, date, new_cases respectivamente en el dataframe +`datos_covid` (para graficar curvas suaves usamos la columna new_cases_smoothed +en vez de new_cases). Usando la función `filter()` y tenemos: @@ -81,70 +97,81 @@ covid_sudamerica <- select(covid_sudamerica, location, date, new_cases_smoothed) **`filter(tabla, condicion)`** -Función que es usada para filtrar en filas, selecciona un subconjunto de filas que cumplan con la condicion +Función que es usada para filtrar en filas, selecciona un subconjunto de filas +que cumplan con la condicion + - **`tabla`** : Dataframe o tabla de donde va se va a filtrar datos. -- **`condicion`** : Prueba lógica que devuelve valores booleanos TRUE o FALSE, de esta condicion depende si la fila se incluye en la nueva tabla. +- **`condicion`** : Prueba lógica que devuelve valores booleanos TRUE o FALSE, + de esta condicion depende si la fila se incluye en la nueva tabla. -Para armar la condicion, puede usar los nombres de la columna como variables y usar los siguientes operadores lógicos: +Para armar la condicion, puede usar los nombres de la columna como variables y +usar los siguientes operadores lógicos: -* **`>`** : Corresponde a **mayor que**. -* **`==`** : Corresponde a **igual que**. -* **`>=`** : Corresponde a **mayor o igual que**. -* **`<=`** : Corresponde a **menor o igual que**. -* **`!=`** : Corresponde a **diferente que**. +- **`>`** : Corresponde a **mayor que**. +- **`==`** : Corresponde a **igual que**. +- **`>=`** : Corresponde a **mayor o igual que**. +- **`<=`** : Corresponde a **menor o igual que**. +- **`!=`** : Corresponde a **diferente que**. Puede combinarlas las condiciones con: -* **`&`** : Operador AND. -* **`|`** : Operador OR. -* **`!`** : Operador NOT o negación. -* **`is.na(x)`** : Función que verifica si un dato es NA (Not Available/ Missing value), valor faltante o no disponible. Devuelve TRUE cuando x es NA. -* **`valor %in% vector`** : Operador que verifica si un valor existe en un vector. Devuelve TRUE cuando valor esta incluido en vector. +- **`&`** : Operador AND. +- **`|`** : Operador OR. +- **`!`** : Operador NOT o negación. +- **`is.na(x)`** : Función que verifica si un dato es NA (Not Available/ Missing + value), valor faltante o no disponible. Devuelve TRUE cuando x es NA. +- **`valor %in% vector`** : Operador que verifica si un valor existe en un + vector. Devuelve TRUE cuando valor esta incluido en vector. -**`select(tabla, nombre_col, ...)`** -Función que filtra columnas por nombre de columna para un nueva tabla. +**`select(tabla, nombre_col, ...)`** Función que filtra columnas por nombre de +columna para un nueva tabla. - **`tabla`** : Dataframe o tabla de donde va se va a filtrar datos. -- **`nombre_col`** : Nombre de la columna o variable que va a componer la nueva tabla. +- **`nombre_col`** : Nombre de la columna o variable que va a componer la nueva + tabla. ## Operador Pipe `%>%` -Este operador nos permite combinar muchas operaciones en una sóla línea, una simple cadena de comandos. -Considere lo siguiente para entender el flujo de datos del operador Pipe `%>%`. +Este operador nos permite combinar muchas operaciones en una sóla línea, una +simple cadena de comandos. Considere lo siguiente para entender el flujo de +datos del operador Pipe `%>%`. -1. Tome *x* -2. use *x* como entrada para la función *f(x)* -3. use la salida de *f(x)* como entrada de la función *g(x)* -4. use la salida de *g(x)* como entrada de la función *h(x)*. +1. Tome _x_ +2. use _x_ como entrada para la función _f(x)_ +3. use la salida de _f(x)_ como entrada de la función _g(x)_ +4. use la salida de _g(x)_ como entrada de la función _h(x)_. -Simplificando tenemos *h(g(f(x)))* , esta es una expresión complicada para escribirla, su equivalente usando el operador Pipe (%>%) es: -*x %>% f() %>% g() %>% h()* que es mucho más entendible y fácil de escribir. +Simplificando tenemos _h(g(f(x)))_ , esta es una expresión complicada para +escribirla, su equivalente usando el operador Pipe (%>%) es: _x %>% f() %>% g() +%>% h()_ que es mucho más entendible y fácil de escribir. -Usando el operador `%>%` podemos simplificar a una línea de comando encadenada, la obtención de nuestra variable `covid_sudamerica` de la sección anterior +Usando el operador `%>%` podemos simplificar a una línea de comando encadenada, +la obtención de nuestra variable `covid_sudamerica` de la sección anterior ```r covid_sudamerica <- - covid_data %>% - filter(continent == "South America" & !is.na(new_cases_smoothed)) %>% + covid_data %>% + filter(continent == "South America" & !is.na(new_cases_smoothed)) %>% select(location, date, new_cases_smoothed) ``` -Para poder graficar este ejemplo lo vamos a reducir un poco más, obteniendo una tabla que sólo contenga países de la región. +Para poder graficar este ejemplo lo vamos a reducir un poco más, obteniendo una +tabla que sólo contenga países de la región. ```r paises_andinos = c("Bolivia", "Peru", "Chile", "Ecuador") covid_paises_region <- - covid_data %>% - filter(location %in% paises_andinos) %>% + covid_data %>% + filter(location %in% paises_andinos) %>% select(location, date, new_cases_smoothed) ``` Para observar nuestros datos obtenidos graficamos ```r -ggplot(covid_paises_region) + +ggplot(covid_paises_region) + geom_line(aes(x = date, y = new_cases_smoothed, color = location), size = 0.5) + - scale_color_brewer(palette = "Set1") + theme_bw() + + scale_color_brewer(palette = "Set1") + theme_bw() + labs( x = "", y = "", @@ -158,10 +185,10 @@ geom_line(aes(x = date, y = new_cases_smoothed, color = location), size = 0.5) + ![Nuevos casos covid en Bolivia, Perú, Chile y Ecuador](covid_region.png) - ## Cómo usar summarise() y group_by() -Si, queremos saber el total de contagiados y el total de días desde que se registraron los contagios podemos usar `summarize()` +Si, queremos saber el total de contagiados y el total de días desde que se +registraron los contagios podemos usar `summarize()` ```r summarise( @@ -181,31 +208,42 @@ Ejecutanto obtenemos en la consola: ``` **`summarise(tabla, nueva_columa = funcion_vector(columna_tabla), ...)`** -Función que crea una nueva tabla a partir de la agrupación de columnas de una tabla anterior, los valores de la nueva columna dependen también del tipo de función vector que se use para agruparlas. +Función que crea una nueva tabla a partir de la agrupación de columnas de una +tabla anterior, los valores de la nueva columna dependen también del tipo de +función vector que se use para agruparlas. -- **`tabla`**: Dataframe o tabla de donde sus columnas servirán para contruir la nueva tabla. -- **`nueva_columna`**: nueva columna o variable creada a partir de las anteriores columnas. -- **`funcion_vector()`**: función que devuelve un solo valor a partir de un vector. +- **`tabla`**: Dataframe o tabla de donde sus columnas servirán para contruir la + nueva tabla. +- **`nueva_columna`**: nueva columna o variable creada a partir de las + anteriores columnas. +- **`funcion_vector()`**: función que devuelve un solo valor a partir de un + vector. Algunas funciones que se pueden usar como función vector son: -* **`sum(vector)`** : Devuelte la suma de los componentes de `vector`. -* **`mean(vector)`** : Devuelve el valor promedio de los valores de `vector`. -* **`min(vector)`** : Devuelve el valor mínimo de los valores de `vector`. -* **`max(vector)`** : Devuelve el valor mínimo de los valores de `vector`. -* **`n_distinc(vector)`** : Devuelve el conteo de los valores diferentes dentro de `vector`. -* **`n(vector)`** : Devuelve el conteo de los valores dentro de `vector`. -* **`sd(vector)`** : Devuelve la desviación estandar de los valores de `vector`. +- **`sum(vector)`** : Devuelte la suma de los componentes de `vector`. +- **`mean(vector)`** : Devuelve el valor promedio de los valores de `vector`. +- **`min(vector)`** : Devuelve el valor mínimo de los valores de `vector`. +- **`max(vector)`** : Devuelve el valor mínimo de los valores de `vector`. +- **`n_distinc(vector)`** : Devuelve el conteo de los valores diferentes dentro + de `vector`. +- **`n(vector)`** : Devuelve el conteo de los valores dentro de `vector`. +- **`sd(vector)`** : Devuelve la desviación estandar de los valores de `vector`. -Todas las funciones tienen la opción `ra.rm` para omitir o pasar por alto los valores que sean NA (No Applicable/Missing values) durante los cálculos, por ejemplo puede usar `mean(vector, na.rm = TRUE)` para calcular el promedio de `vector` descartando los datos que sean NA. +Todas las funciones tienen la opción `ra.rm` para omitir o pasar por alto los +valores que sean NA (No Applicable/Missing values) durante los cálculos, por +ejemplo puede usar `mean(vector, na.rm = TRUE)` para calcular el promedio de +`vector` descartando los datos que sean NA. -La función summarise() agrupa todos los datos de una columna, y devuelve un sólo valor por columna. +La función summarise() agrupa todos los datos de una columna, y devuelve un sólo +valor por columna. -Para el ejemplo, si quisieramos no obtener el total sino el total por países usamos la función `group_by()`. +Para el ejemplo, si quisieramos no obtener el total sino el total por países +usamos la función `group_by()`. ```r total_covid_paises_region <- - covid_paises_region %>% group_by(location) %>% + covid_paises_region %>% group_by(location) %>% summarise(total_contagios = sum(new_cases_smoothed, na.rm = TRUE)) total_covid_paises_region @@ -222,30 +260,36 @@ Ejecutando, observamos en la consola: 3 Ecuador 889635. 4 Peru 3588117. ``` + _Nota: estos son resultados de datos suavizados_ -**`group_by(tabla, columna_1, columna_2 ...)`** -Agrupa varias filas en una sola, las agrupa si y sólo si tienen el mismo valor en columna_1, luego las agrupa por valores en la columna_2 y así sucesivamente. Esta función siempre va acompañada de la función `summarise()` +**`group_by(tabla, columna_1, columna_2 ...)`** Agrupa varias filas en una sola, +las agrupa si y sólo si tienen el mismo valor en columna_1, luego las agrupa por +valores en la columna_2 y así sucesivamente. Esta función siempre va acompañada +de la función `summarise()` -- **`tabla`**: Dataframe o tabla de donde sus columnas servirán para contruir la nueva tabla. -- **`columna_n`**: nombre la columna de la cual se van a agrupar los valores con la función `summarise()`. +- **`tabla`**: Dataframe o tabla de donde sus columnas servirán para contruir la + nueva tabla. +- **`columna_n`**: nombre la columna de la cual se van a agrupar los valores con + la función `summarise()`. -Hagamos algo más interesante, queremos ver la evolución del contagios de COVID-19 por continentes. +Hagamos algo más interesante, queremos ver la evolución del contagios de +COVID-19 por continentes. ```r covid_continentes <- - covid_data %>% - group_by(continent, date) %>% - summarise(total_contagios = sum(new_cases_smoothed, na.rm = TRUE)) %>% + covid_data %>% + group_by(continent, date) %>% + summarise(total_contagios = sum(new_cases_smoothed, na.rm = TRUE)) %>% filter(!is.na(continent)) ``` Graficando los resultados ```r -ggplot(covid_continentes) + +ggplot(covid_continentes) + geom_line(aes(x = date, y = total_contagios, color = continent), size = 0.8) + - scale_color_brewer(palette = "Set1") + theme_bw() + + scale_color_brewer(palette = "Set1") + theme_bw() + labs( x = "", y = "", @@ -260,42 +304,52 @@ ggplot(covid_continentes) + ## Para que sirve la función mutate() -Una buen indicador, para saber si hemos mejorado el tratamiento y prevención contra la COVID-19 es hallar la relación entre el muertes por cada 1000 contagiados (mientras menor valor tenga la variable, mejor estamos preparados para afrontar la COVID). Llamemos a esta nueva variable `indicador`, esta dependera de otras para su cálculo, la función `mutate()` no ayudará a calcularla. +Una buen indicador, para saber si hemos mejorado el tratamiento y prevención +contra la COVID-19 es hallar la relación entre el muertes por cada 1000 +contagiados (mientras menor valor tenga la variable, mejor estamos preparados +para afrontar la COVID). Llamemos a esta nueva variable `indicador`, esta +dependera de otras para su cálculo, la función `mutate()` no ayudará a +calcularla. -_Puede que no sea excelente indicador y que no refleje muy bien lo que se quiere, pero para propositos de este ejemplo nos servirá_ +_Puede que no sea excelente indicador y que no refleje muy bien lo que se +quiere, pero para propositos de este ejemplo nos servirá_ ```r # Obtenemos nuestros datos que nos van a ayudar a calcular el indicador # Filtramos los valores que sean iguales a 0 y los datos NA con filter() covid_continentes_indicador <- - covid_data %>% - group_by(continent, date) %>% - summarise(nuevos_casos = sum(new_cases_smoothed, na.rm = TRUE), nuevas_muertes = sum(new_deaths_smoothed, na.rm = TRUE)) %>% + covid_data %>% + group_by(continent, date) %>% + summarise(nuevos_casos = sum(new_cases_smoothed, na.rm = TRUE), nuevas_muertes = sum(new_deaths_smoothed, na.rm = TRUE)) %>% filter(!is.na(continent) & nuevos_casos != 0 & nuevas_muertes != 0) ``` Usamos la función mutate para obtener nuestro indicador ```r -covid_continentes_indicador <- - covid_continentes_indicador %>% +covid_continentes_indicador <- + covid_continentes_indicador %>% mutate(indicador = nuevas_muertes/nuevos_casos*1000) ``` **`mutate(tabla, nueva_columna_1 = f(columna_1, columna_2...), nueva_columna_2 = f(columna_n, ...)... )`** Crea una nuevas columnas las modifica a partir de los datos de otras columnas. -- **`tabla`** : Dataframe o tabla de donde sus columnas servirán para obtener la nueva tabla. -- **`nueva_columna_n`** : Nombre la nueva columna que se crea a partir de otras columnas. +- **`tabla`** : Dataframe o tabla de donde sus columnas servirán para obtener la + nueva tabla. +- **`nueva_columna_n`** : Nombre la nueva columna que se crea a partir de otras + columnas. - **`columna_n`** : Nombre la columna o variable de la `tabla`. -- **`f(columna_1, columna_2, ...)`** : Representa la combinación algebraica de las variables que van a devolver el nuevos valores de la nueva_columna_n. (Observe que usamos nombre de la columna y variable como sinónimos) +- **`f(columna_1, columna_2, ...)`** : Representa la combinación algebraica de + las variables que van a devolver el nuevos valores de la nueva_columna_n. + (Observe que usamos nombre de la columna y variable como sinónimos) Mostrando los resultados en una gráfica ```r -ggplot(covid_continentes_indicador) + +ggplot(covid_continentes_indicador) + geom_line(aes(x = date, y = indicador, color = continent), size = 0.8) + - scale_color_brewer(palette = "Dark2") + theme_bw() + + scale_color_brewer(palette = "Dark2") + theme_bw() + labs( x = "", y = "", @@ -305,13 +359,18 @@ ggplot(covid_continentes_indicador) + color = "Continente" ) ``` + ![Relación muertes diarias por 1000 contagiados por Continente](covid_continentes_indicador.png) ## Conclusiones -Las funciones mostradas en el árticulo son las más usadas y permiten una mejor manipulación de datos en R. Como siempre es bueno revisar la [documentación oficial](https://www.rdocumentation.org) de los correspondientes paquetes si se quiere aprender más. +Las funciones mostradas en el árticulo son las más usadas y permiten una mejor +manipulación de datos en R. Como siempre es bueno revisar la +[documentación oficial](https://www.rdocumentation.org) de los correspondientes +paquetes si se quiere aprender más. -Puede descargar el [repositorio de este artículo aquí](https://github.com/EverVino/Example_data_covid_r). +Puede descargar el +[repositorio de este artículo aquí](https://github.com/EverVino/Example_data_covid_r). ## Referencias diff --git a/content/blog/git-de-en-diez-sencillos-pasos/header.png b/bkp/blogs/git-de-en-diez-sencillos-pasos/header.png similarity index 100% rename from content/blog/git-de-en-diez-sencillos-pasos/header.png rename to bkp/blogs/git-de-en-diez-sencillos-pasos/header.png diff --git a/bkp/blogs/git-de-en-diez-sencillos-pasos/index.md b/bkp/blogs/git-de-en-diez-sencillos-pasos/index.md new file mode 100644 index 000000000..b7eec2749 --- /dev/null +++ b/bkp/blogs/git-de-en-diez-sencillos-pasos/index.md @@ -0,0 +1,236 @@ +--- +title: "Git de 0 a 100 en diez sencillos pasos" +slug: git-de-en-diez-sencillos-pasos +date: 2020-01-08 +authors: ["Rainer Palm"] +tags: [git, repositorios, github] +categories: [desarrollo de software, control de versiones] +description: | + ¿Necesitas aprender [Git](https://git-scm.com/) para manejar con mayor + eficiencia y control tus proyectos y trabajos? Ya sea para desarrollo de + software, creación de páginas web, investigaciones científicas, o para manejar + tus escritos, te podría ser muy útil aprovechar la seguridad que te da Git para + el control de versiones, o la facilidad con la que permite la investigación + colaborativa. Además, podría serte de mucha ayuda a la hora de buscar empleo en + tu área de trabajo, ya que los proyectos y contribuciones que tengas almacenados + en Git te servirán como parte de tu currículo. Sin embargo, puede parecerte algo + intimidante debido a la gran diversidad de opciones que te proporciona, además + del uso requerido de la línea de comandos en la aplicación Git. Pero si sigues + los 10 pasos que presentamos a continuación, te darás cuenta de lo sencillo que + puede resultar subir y manejar archivos en tu primer repositorio, crear varias + ramas en el mismo y compartir archivos con colaboradores. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +¿Necesitas aprender [Git](https://git-scm.com/) para manejar con mayor +eficiencia y control tus proyectos y trabajos? Ya sea para desarrollo de +software, creación de páginas web, investigaciones científicas, o para manejar +tus escritos, te podría ser muy útil aprovechar la seguridad que te da Git para +el control de versiones, o la facilidad con la que permite la investigación +colaborativa. Además, podría serte de mucha ayuda a la hora de buscar empleo en +tu área de trabajo, ya que los proyectos y contribuciones que tengas almacenados +en Git te servirán como parte de tu currículo. Sin embargo, puede parecerte algo +intimidante debido a la gran diversidad de opciones que te proporciona, además +del uso requerido de la línea de comandos en la aplicación Git. Pero si sigues +los 10 pasos que presentamos a continuación, te darás cuenta de lo sencillo que +puede resultar subir y manejar archivos en tu primer repositorio, crear varias +ramas en el mismo y compartir archivos con colaboradores. + + + +## 1. Crea tu cuenta en Github + +Aunque es posible emplear git a nivel local, es preferible que utilices una +plataforma que te permita alojar repositorios en la nube, tal como +[Github](https://github.com/) o [Gitlab](https://about.gitlab.com/) para +difundir fácilmente tu trabajo. Puedes +[registrar una cuenta Github](https://github.com/join), donde simplemente +tendrás que proporcionar tus datos y seguir los pasos de creación de cuenta. +Luego de registrarla, podrás seleccionar un plan de pago cuando quieras, o +simplemente usarlo de forma gratuita. + +## 2. Crea tu primer repositorio + +Inmediatamente después de crear tu primera cuenta, Github te guiará hacia la +creación de tu primer repositorio, a través de https://github.com/new, donde +tendrás que ponerle un nombre y una descripción. Github automáticamente genera +el repositorio con un archivo `README.md`, el cual es un simple archivo de texto +que será visto al entrar en la página del repositorio. Este archivo tiene +información importante acerca del repositorio, el propósito de los archivos que +están allí y de cómo está organizado. También puedes incluir en él algún enlace +a la página web del proyecto (si la tienes), o un correo para contactos e +información. + +## 3. Instala Git en tu computadora + +Para poder subir archivos a tu repositorio desde tu disco duro, tendrás que +instalar Git en tu computadora. Simplemente descárgalo desde +https://git-scm.com/, o, si estás usando Linux, instálalo mediante el gestor de +paquetes de tu distribución buscando el paquete git. Después podrás usarlo en la +línea de comandos. Verifica si se instaló correctamente ejecutando + +``` +git –-help +``` + +## 4. Clona un repositorio + +Cuando creas un repositorio Git, automáticamente se crea una carpeta oculta +`.git` con información de los archivos y ramas de tu repositorio, los cambios a +estos y el último commit. Tu repositorio en Github también contiene esta +carpeta, así que, para ahorrarte un dolor de cabeza, deberías clonarlo (copiarlo +en tu ordenador), ya sea descargándolo desde su página o en la línea de comandos +escribiendo: + +``` +git clone https://github.com/(tu usuario)/(nombre del repositorio).git + +``` + +También puedes copiar la URL del repositorio desde la página. + +## 5. Agrega archivos a tu repositorio y haz tu primer commit + +Cada vez que realizas cambios en tu repositorio (ya sea modificando, agregando o +borrando archivos), deberás sincronizarlos haciendo lo que se conoce como un +commit. Puedes utilizar los comandos: + +``` +git add {nombre de tu archivo} +``` + +``` +git rm {nombre de tu archivo} +``` + +para hacer cambios en la copia local de tu repositorio, ya sea añadir y +modificar o eliminar archivos, respectivamente. Antes de sincronizar los +cambios, debes ‘empaquetarlos’ en un commit, mediante el comando + +``` +git commit -m “{descripción de los cambios}” +``` + +Después podrás sincronizar ese commit con el servidor de Github utilizando el +comando + +``` +git push origin master +``` + +Con aplicaciones gráficas como Github Desktop u otra similar, podrás realizar +estos cambios de una forma mucho más intuitiva. + +## 6. Maneja distintas ramas de tu repositorio + +Cuando creas tu repositorio con git, este solo tiene una rama principal o +“default”, la cual se denomina `master`. En git, una rama es una especie de +‘apuntador’ que señala a una serie específica de commits. Cuando quieras hacer +cambios en tus archivos, para realizar pruebas sin afectar el funcionamiento del +código alojado en la nube que ya sabes que funciona, puedes crear otra rama. Si +los resultados son de tu agrado, podrás sincronizar ambas ramas más tarde. + +Para crear otra rama, simplemente ejecuta: + +``` +git checkout -b {nombre de tu rama} +``` + +Esto hará que, a partir de ahora, todos los cambios que realices a tus archivos +sean parte de la rama que has creado. + +Si deseas sincronizar tu nueva rama con el servidor de Github, ejecutas: + +``` +git push origin {nombre de tu rama} +``` + +Igual que para hacer cambios en master, deberás hacer un commit para sincronizar +los cambios locales con el repositorio de Github. + +## 7. Realiza un merge + +El comando `git checkout` nos permite cambiar de rama dentro del repositorio. +Puedes usarlo para volver a hacer cambios en la rama master con el siguiente +comando: + +``` +git checkout master +``` + +Si estás satisfecho con los cambios que has hecho en la rama, puedes hacer un +merge, lo que quiere decir que se fusionan los cambios hechos en la rama +secundaria con los de la rama en la que estás ubicado actualmente (en este caso, +master) de la siguiente manera: + +``` +git merge {rama con cambios} +``` + +Git intentará hacer este proceso automáticamente, pero puede ser que hayan +conflictos entre ramas con los cambios hechos. En este caso, tendrás que editar +los archivos que te muestra Git, y agregarlos manualmente ejecutando + +``` +git add {nombre de archivo} +``` + +## 8. Verifica cambios con tu copia local + +En caso de que tu copia local del repositorio no tenga los cambios hechos hasta +el último commit en la rama que estás trabajando, puedes actualizarla ejecutando + +``` +git pull +``` + +Para ver los cambios que se han realizado entre las distintas ramas del +repositorio, ejecuta el comando + +``` +git diff {rama fuente} {rama a comparar} +``` + +También puedes ver la historia del repositorio (los commits hechos a lo largo +del tiempo) usando el comando `git log`. Recomendamos que primero ejecutes +`git log –help` para ver como puedes aprovechar mejor esta herramienta. + +## 9. Propone cambios a repositorios de terceros + +En caso de que quieras hacer un commit a un repositorio que sea de otra persona, +simplemente tendrás que ir a la página del repositorio en Github, hacer un +**fork** (una copia personal de ese repositorio, como un puente hacia el +original), y clonarlo en tu computadora. + +Luego de crear los commit deseados y subirlos a tu fork, podrás dirigirte a la +página donde este se encuentra y dar clic a **New pull request** (o solicitud de +extracción). Esto te llevará a una página donde puedes evaluar los cambios que +has hecho y crear una solicitud para que los propietarios del repositorio los +fusionen con su rama master. + +## 10. Acepta o niega cambios propuestos + +Cuando un colaborador siga los pasos descritos anteriormente y haga una +solicitud de extracción en tu repositorio, podrás verificar los cambios que se +han realizado en el commit de su fork, además puedes ver su descripción y las +sugerencias que han dado. Podrás entonces conversar con ellos en los comentarios +de la solicitud de extracción, y dependiendo de lo que consideres apropiado, +aceptar o negar los commit propuestos y fusionar su fork con la rama master de +tu repositorio. + +En caso de que quieras que un colaborador pueda contribuir al proyecto sin +necesidad de aprobar sus commit, podrás invitarlos mediante la página de +_Parámetros_ (accesible desde la página del repositorio), simplemente dando clic +a _Colaboradores_ en la barra lateral izquierda y añadiendo su nombre de usuario +de GitHub. + +Si has seguido todos los pasos hasta ahora, felicidades, ya puedes considerarte +oficialmente un usuario de git. Mantener y actualizar tus propios repositorios y +colaborar con los demás usuarios de Github es más sencillo de lo que parece. Si +así lo deseas, puedes seguir buscando información acerca de cómo aprovechar git +al máximo, ya sea a través del libro [Pro Git](https://git-scm.com/book/es/v2/) +o en la documentación de [Github](https://help.github.com/en/github). diff --git a/content/blog/herramientas-de-visualizacion-en-python/header.png b/bkp/blogs/herramientas-de-visualizacion-en-python/header.png similarity index 100% rename from content/blog/herramientas-de-visualizacion-en-python/header.png rename to bkp/blogs/herramientas-de-visualizacion-en-python/header.png diff --git a/bkp/blogs/herramientas-de-visualizacion-en-python/index.md b/bkp/blogs/herramientas-de-visualizacion-en-python/index.md new file mode 100644 index 000000000..487e842fb --- /dev/null +++ b/bkp/blogs/herramientas-de-visualizacion-en-python/index.md @@ -0,0 +1,117 @@ +--- +title: "Herramientas de visualización en Python" +slug: herramientas-de-visualizacion-en-python +date: 2020-05-29 +authors: ["Anavelyz Perez"] +tags: [visualización de datos, bibliotecas, código, herramientas] +categories: [Python] +description: | + En uno de nuestros artículos, + específicamente [10 razones para usar Python en tu próximo proyecto de investigación](http://opensciencelabs.org/blog/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/), + se da un recorrido por las ventajas que brinda el lenguaje de programación + Python, de allí podemos extraer algunas de sus características. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +En uno de nuestros artículos, +específicamente [10 razones para usar Python en tu próximo proyecto de investigación](http://opensciencelabs.org/blog/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/), +se da un recorrido por las ventajas que brinda el lenguaje de programación +Python, de allí podemos extraer algunas de sus características tales como: + + + +- [Python](http://python.org/) es un lenguaje de alto nivel, es decir, es un + lenguaje de programación muy intuitivo, diseñado de forma tal que el código + escrito sea fácil de leer y entender. +- Con pocas líneas de código se pueden hacer diversas actividades. +- Es multiplataforma, indicando que se puede ejecutar en distintos sistemas + operativos, como: Windows, Linux o Mac OS. +- Existe una gran cantidad de recursos y apoyo disponibles sobre este lenguaje, + a través de grupos de consulta y foros de discusión. +- Posee un número importante de bibliotecas que reciben mantenimiento y apoyo + regular por parte de desarrolladores y usuarios. Estas bibliotecas son + utilizadas en diversos campos como la estadística y la ciencia de datos. + +Tenemos entonces que Python es un lenguaje con características ideales para +llevar a cabo proyectos en muchas áreas, cuenta con elementos que lo hacen +potente para manipular grandes cantidades de datos y se han desarrollado +herramientas que posibilitan, facilitan y hacen su uso más dinámico. En este +artículo nos enfocaremos principalmente en describir algunas de las herramientas +de visualización sobre este lenguaje; cuando nos referimos a visualización se +hace alusión al hecho de ver, observar o captar a través de un gráfico lo que +está sucediendo y no vemos a simple vista en los datos. + +Una de las principales herramientas de visualización son las bibliotecas +destinadas a ello. Las bibliotecas de visualización son estructuras de código +formalmente distribuidas de manera tal que la podemos descargar y utilizar en +nuestros proyectos en el que empleamos Python. Las principales ventajas de estas +bibliotecas reside en el ahorro de tiempo y el uso de pocas líneas de código al +momento de programar. Al ser bibliotecas de visualización nos permiten crear, +mostrar y editar uno o varios gráficos a la vez. Recuerda que, en algunos textos +encontraremos la palabra **librería** en vez de **biblioteca**, se pudiesen usar +como sinónimos. + +Algunas de las bibliotecas más populares en Python para este caso son: + +- [matplotlib](https://matplotlib.org/): Es una biblioteca de visualización que + permite realizar visualizaciones estáticas, animadas e interactivas en Python. + Con ella se pueden generar gráficos de barras, histogramas, espectros de + potencia, stemplots, scatterplots, gráficos de error, gráficos circulares y + muchos otros. En su sitio oficial de Internet hay una serie de tutoriales y + ejemplos de lo que podemos hacer con ella. + +- [seaborn](https://seaborn.pydata.org/): Al igual que matplotlib, es una + biblioteca que brinda grandes opciones para realizar gráficos. De hecho, esta + biblioteca está basada en matplotlib. La diferencia principal se encuentra en + sus estilos y paletas de colores que son más estéticos y visualmente + atractivos. + +- [Bokeh](https://docs.bokeh.org): Es una biblioteca de visualización muy + completa porque permite hacer cualquier tipo de diagrama gráfico. Es ideal + para presentaciones basadas en la web, proporciona la construcción de gráficos + elegantes y versátiles de forma concisa. Una de las ventajas importantes de + esta biblioteca con respecto a las demás es su capacidad para tener un alto + rendimiento ante grandes cantidades de datos. Sus elementos se pueden + clasificar en tres grupos importantes: + +``` +- Gráficos rápidos, son aquellos que se pueden realizar con pocas líneas de código. + +- Especialidades de matplotlib, gráficos que modifican y mejoran los gráficos de matplotlib. + +- Dirigido a desarrolladores e ingenieros de software. +``` + +- [Plotly](https://plotly.com/): Es una herramienta de visualización en línea + que ha desarrollado bibliotecas tanto para Python como para R. Es la opción + más útil y fácil para crear visualizaciones altamente interactivas en la web + (dashboard). + +- [Pygal](http://www.pygal.org/): Al igual que las bibliotecas que hemos + descrito anteriormente Pygal permite realizar cualquier gráfico con pocas + líneas de código, esta tiene la particularidad de estar principalmente + orientada a la creación de gráficos en formato SVG, lo cual indica que + cualquiera de nuestros resultados puede ser editado en un editor de imágenes e + imprimirlos en una resolución de muy alta calidad. + +- [Ggplot](http://ggplot.yhathq.com/): Es un conjunto de métodos para graficar + basado en GGplot2 de R y la gramática de los gráficos. Los resultados se + generan rápidamente y con pocas líneas de código. + +- [Altair](https://altair-viz.github.io/): es una biblioteca de visualización + estadística para Python, basada en Vega y Vega-Lite (gramáticas de + visualización). Permite construir una amplia gama de visualizaciones + rápidamente. + +De esta forma te dejamos la referencia de algunas de las herramientas de +visualización de Python, pero hay otras muchas y puedes conseguir más +información en la web. Debes tener en cuenta que a diario podemos encontrar +nuevas alternativas y actualizaciones importantes de cada una de ellas. Para +hacer uso de las bibliotecas podemos recurrir a interfaces de visualización como +[Jupyter Notebook](http://jupyter.org/), +[Zeppelin Notebook](http://zeppelin.apache.org/), +[Google Colab](http://colab.research.google.com/), entre otras. diff --git a/content/blog/herramientas-de-visualizacion-en-r/header.png b/bkp/blogs/herramientas-de-visualizacion-en-r/header.png similarity index 100% rename from content/blog/herramientas-de-visualizacion-en-r/header.png rename to bkp/blogs/herramientas-de-visualizacion-en-r/header.png diff --git a/bkp/blogs/herramientas-de-visualizacion-en-r/index.md b/bkp/blogs/herramientas-de-visualizacion-en-r/index.md new file mode 100644 index 000000000..7f251cd73 --- /dev/null +++ b/bkp/blogs/herramientas-de-visualizacion-en-r/index.md @@ -0,0 +1,206 @@ +--- +title: "Herramientas de visualización en R" +slug: herramientas-de-visualizacion-en-r +date: 2020-04-09 +authors: ["Yurely Camacho"] +tags: + [ + datos, + visualización de datos, + lattice, + ggplot2, + tidyverse, + ggmap, + plotly, + shiny, + ] +categories: [ciencia abierta, código abierto, R] +description: | + Sin duda, los datos deben considerarse como la materia prima para cualquier + proyecto de ciencia abierta, pues todos se basan en el manejo de datos de + distintos tipos. Para _entender esos datos_ debe realizarse una inspección + visual de su comportamiento. Esto se conoce como _Visualización de Datos_, que + consiste en generar representaciones gráficas de las variables que componen un + conjunto de datos para obtener información fácilmente interpretable de lo que + ellos nos quieren decir y así, poder comunicarla de una manera asertiva. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Sin duda, los datos deben considerarse como la materia prima para cualquier +proyecto de ciencia abierta, pues todos se basan en el manejo de datos de +distintos tipos. Para _entender esos datos_ debe realizarse una inspección +visual de su comportamiento. Esto se conoce como _Visualización de Datos_, que +consiste en generar representaciones gráficas de las variables que componen un +conjunto de datos para obtener información fácilmente interpretable de lo que +ellos nos quieren decir y así, poder comunicarla de una manera asertiva. + + + +La visualización es un método de exploración de datos que muestra, de una +mirada, algunas cosas que de otra forma hubiese sido muy difícil observar. Por +tanto, se suele realizar al comienzo de cualquier análisis estadístico formal o +para la presentación de resultados en informes descriptivos de datos. La +visualización de datos se ve grandemente influenciada por su calidad y +capacidades de las herramientas computacionales y software estadísticos +utilizados para ello. Es aquí donde la decisión del analista de datos por +escoger entre uno u otro lenguaje de programación y/o paquete estadístico es +sumamente importante. + +En esta oportunidad, te hablamos de las capacidades para la visualización de +datos que posee el [Lenguaje estadístico R](https://www.r-project.org/). + +R es fundamentalmente un lenguaje de análisis estadístico y, por tanto, tiene en +su librería "base" soporte incorporado para gráficos. Otras funcionalidades +avanzadas se incorporan mediante la instalación de paquetes encontrados en +https://cran.r-project.org y son generados por una gran comunidad activa de +desarrolladores de R. Puedes acceder a más información que te proporcionamos +acerca de R en nuestro artículo +[¿Qué es el Lenguaje R y cómo puede ayudarte en tus proyectos?](/blog/que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos/). + +R posee una [**Galería de gráficos**](https://www.r-graph-gallery.com/), esto es +una colección de gráficos hechos en R, cuyos ejemplos están basados mayormente +en el uso de tidyverse y ggplot2. En ella se muestran cientos de gráficos con su +código reproducible disponible. Cualquier persona puede sugerir un gráfico o +informar de errores. + +En cuanto a la parte de generación de gráficos, en R existen dos _motores +gráficos_, esto se trata de una serie de funciones que permiten realizar +manipulaciones gráficas básicas: como: trazar líneas, dibujar puntos, curvas, +entre otros elementos. Estas funciones no son manejadas directamente por los +usuarios, si no utiliza funciones de alto nivel (como la función `plot`). Estos +motores son: "El motor tradicional o base de R" y "El motor _grid_". + +Las funciones básicas de R para gráficos como, `plot`, `hist`, `boxplot` y +otras, están desarrolladas bajo el motor tradicional de R. No obstante, para +construir otro tipo de gráficos no es suficientemente adecuada. Por tal motivo, +[Paul Murrell](https://www.stat.auckland.ac.nz/~paul/) desarrolló el motor grid. + +## Algunas consideraciones sobre el motor tradicional de R + +En su paquete base R cuenta con varias funciones para la producción de gráficas, +la mayoría de las cuales se encuentran en el paquete `graphics`. Algunas de las +funciones son: + +- `plot()` por defecto realiza un diagrama de dispersión. Si se cambia el + argumento `type`, permite realizar, por ejemplo, gráficos de líneas o series + de tiempo, entre otras. + +- `hist()` para un histograma. + +- `barplot()` permite hacer un gráfico de barras. + +- `boxplot()` para un diagrama de caja y bigotes. + +- `pie()` o `piechart()` gráfico circular o de sectores. + +Para todos los gráficos que se pueden hacer bajo el motor tradicional de R, se +pueden fijar múltiples elementos, algunos son: márgenes, espacios, títulos, +colores, tipos de marcadores, grosor de líneas. Además de los gráficos +mencionados anteriormente, también se pueden realizar gráficos de coordenadas +polares, eventos, pirámides de edades, matrices de dispersión, gráficos de +independencia y de estrellas, realizar combinaciones de gráficos, colocar curvas +a histogramas, efectos de sombreado. También se pueden obtener gráficos para +representar la salida de un modelo estadístico como: regresión lineal simple, +análisis de componentes principales, series de tiempo, cartas o diagramas de +control. + +Esos gráficos pueden ser almacenados para su posterior reutilización en +cualquier tipo de documento. Para lo cual se usa el paquete base `grDevices` que +permite aplicar funciones de dispositivos gráficos como `pdf()` y `png()`. + +A continuación daremos una descripción breve sobre algunos paquetes útiles para +la visualización de datos en R. + +### lattice + +El paquete fue escrito por [Deepayan Sarkar](https://www.isid.ac.in/~deepayan/) +con el objetivo de mejorar los gráficos básicos de R, proporcionando mejores +valores por defecto y tiene la capacidad de mostrar, de una manera fácil, las +relaciones multivariantes. Está desarrollado bajo el motor gráfico grid. Con +este paquete puedes realizar los gráficos _trellis_, que describen situaciones +complejas (mayormente multivariantes) como la relación entre variables +condicionada a una o más variables, representándolo en un sólo gráfico +organizado en paneles. Además, tiene la funcionalidad para generar gráficos en +3D, puedes consultar la +[documentación de este paquete](http://cran.fhcrc.org/web/packages/lattice/) +para más información. + +### ggplot2 + +Es un paquete apoyado en el motor grid. Fue desarrollado por +[Hardley Wickham](https://hadley.nz/) como una implementación de como una +implementación de la metodología de visualización de datos llamada _The Grammar +of Graphics_ cuya idea consiste en especificar de manera independiente las +componentes del gráfico y luego combinarlas. Es un paquete ampliamente difundido +y utilizado en la actualidad por los analistas de datos. Mantiene una estética +elegante y profesional. Este paquete viene incluido dentro de +[tidyverse](https://www.tidyverse.org/) que engloba un conjunto de paquetes para +ciencia de datos. Se pueden realizar gráficos interactivos y animados. + +Básicamente, los componentes del paquete son: **Estéticas** (color, forma de un +punto, relleno, entre otras), **Capas** (o geoms en el paquete) por ejemplo, +`geom_point`, `geom_line`, `geom_histogram`, `geom_bar`, `geom_boxplot`, +**Facetas** y **Temas**, referentes a aspectos estéticos, por ejemplo, ejes, +etiquetas, colores de fondo, tamaño de los márgenes y otros. Puedes consultar +más sobre este poderoso paquete en su +[página web](https://ggplot2.tidyverse.org/). + +### ggmap + +Permite la representación de información georreferenciada, tiene la misma +arquitectura que ggplot2. Ggmap permite añadir a los gráficos de ggplot2, una +capa cartográfica adicional para lo cual usa recursos disponibles en la web a +través de APIs de Google y otros. Puedes encontrar más información en la +[documentación de ggmap](https://www.rdocumentation.org/packages/ggmap/versions/3.0.0). + +### plotly + +Con plotly puedes realizar gráficos interactivos y dinámicos de calidad de +publicación, sumamente útiles para los resultados que se difunden a través de +Internet. Permite hacer gráficos de líneas, dispersión, área, barras, error, +cajas, histogramas, mapas térmicos, subgráficos, de múltiples ejes y gráficos +3D. Es gratuito y de código abierto con licencia del MIT, puedes ver la fuente, +informar de los problemas o contribuir en GitHub. Funciona sin conexión y no +requiere ningún registro de cuenta. Más información en https://plot.ly/r/. + +### shiny + +Es una herramienta que permite crear aplicaciones web interactivas de una manera +fácil, con esto los usuarios interactúan con sus datos sin tener que manipular +el código, para lo cual solo hace falta conocimiento de R y no HTML, por +ejemplo. Por medio de este paquete se pueden construir y personalizar fácilmente +interfaces gráficas sobre páginas web mediante pocas líneas de código. +El paquete proporciona varias aplicaciones de ejemplo que puedes usar +para aprender sus principios básicos. Consulta más información en (enlace a +documentación o sitio web de shiny). + +### Otros paquetes + +- El paquete **rgl** con el que se realizan gráficos interactivos en 3D. Se + pueden representar incluso formas geométricas en 3D. + +- Existen librerías en R para poder conectar y explorar los datos desde Google + Analytics: **googleAuthR** y **googleAnalyticsR**. Para utilizarlas se + necesitan en una el token Google Analytics, y en la otra, habilitar Google + Cloud y su API, respectivamente. + +- Paquete **ellipse** y **scatterplot3d** poseen varias funciones para realizar + gráficos básicos y en 3D respectivamente. + +R es muy potente para el análisis estadístico, puedes probar con distintos +paquetes y adoptar el que cumpla tus necesidades y expectativas. Esperamos que +este repaso por algunos de ellos te haya motivado a indagar un poco más sobre la +importancia de la visualización de los datos y la potencia de R para hacerlo. + +#### Referencias + +- _R para profesionales de los datos: una introducción_. Gil Carlos. Abril 2018. + +- _Gráficos Estadísticos con R_. Correa Juan y González Nelfi. Universidad + Nacional de Colombia, Sede Medellín. 2002. + +- [R Users Group Ecuador](https://rpubs.com/RUsersGroup-Ecuador/graf). diff --git a/content/blog/ibis-framework/header.jpg b/bkp/blogs/ibis-framework/header.jpg similarity index 100% rename from content/blog/ibis-framework/header.jpg rename to bkp/blogs/ibis-framework/header.jpg diff --git a/content/blog/ibis-framework/ibis-escalonando-a-analise-de-dados.ipynb b/bkp/blogs/ibis-framework/index.ipynb similarity index 99% rename from content/blog/ibis-framework/ibis-escalonando-a-analise-de-dados.ipynb rename to bkp/blogs/ibis-framework/index.ipynb index 886c9eff1..be324e348 100644 --- a/content/blog/ibis-framework/ibis-escalonando-a-analise-de-dados.ipynb +++ b/bkp/blogs/ibis-framework/index.ipynb @@ -1,5 +1,28 @@ { "cells": [ + { + "cell_type": "raw", + "id": "c2ac8114-f92c-4650-a159-a08d5b7bce11", + "metadata": {}, + "source": [ + "---\n", + "title: \"Ibis - Escalonando a Análise de Dados com Expressões Ibis\"\n", + "slug: \"ibis-framework\"\n", + "date: 2022-08-03\n", + "authors: [\"Luã Bida Vacaro\"]\n", + "tags: [\"ibis\", \"dataframe\", \"datos\", \"pandas\"]\n", + "categories: [\"ciencia abierta\", \"datos abiertos\", \"acceso abierto\", \"Python\", \"SQL\"]\n", + "description: |\n", + " Ibis Framework é uma biblioteca Python\n", + " que gera expressões de busca em banco de dados. O framework foi idealizado por\n", + " Wes McKinney, o mesmo criador do Pandas, voltado para\n", + " integração de diferentes Engines de Bancos de Dados através de Expressões Ibis\n", + " com Python.\n", + "thumbnail: \"/header.jpg\"\n", + "template: \"blog-post.html\"\n", + "---" + ] + }, { "cell_type": "markdown", "id": "2bc08615-e950-478a-af97-ba99bd90bead", @@ -7,10 +30,6 @@ "tags": [] }, "source": [ - "# Escalonando a Análise de Dados com Expressões Ibis\n", - "\n", - "![Ibis](ibis-bird.jpg)\n", - "\n", "[Ibis Framework](https://github.com/ibis-project/ibis/) é uma biblioteca Python que gera expressões de busca em banco de dados. O framework foi idealizado por [Wes McKinney](https://github.com/wesm), o mesmo criador do Pandas, voltado para integração de diferentes Engines de Bancos de Dados através de Expressões Ibis com Python. \n", "\n", "Enquanto os motores de busca e análise de dados crescem e ficam mais robustos com o avanço da era dos Dados, algumas complicações podem ser encontradas em diferentes ambientes de desenvolvimento. Um dos exemplos mais comuns é o crescimento de aplicações que realizam buscas SQL em um banco de dados, com o tempo as buscas se tornam complexas e de difícil leitura.\n", @@ -65,10 +84,10 @@ "metadata": {}, "outputs": [], "source": [ - "import matplotlib.pyplot as plt\n", - "import pandas as pd\n", "import sqlite3\n", - "import ibis" + "\n", + "import ibis\n", + "import matplotlib.pyplot as plt" ] }, { @@ -1078,7 +1097,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.11.6" }, "nikola": { "author": "Luã Bida Vacaro", diff --git a/bkp/blogs/ibis-framework/index.md b/bkp/blogs/ibis-framework/index.md new file mode 100644 index 000000000..f2867b028 --- /dev/null +++ b/bkp/blogs/ibis-framework/index.md @@ -0,0 +1,736 @@ +--- +title: "Ibis - Escalonando a Análise de Dados com Expressões Ibis" +slug: "ibis-framework" +date: 2022-08-03 +authors: ["Luã Bida Vacaro"] +tags: ["ibis", "dataframe", "datos", "pandas"] +categories: + ["ciencia abierta", "datos abiertos", "acceso abierto", "Python", "SQL"] +description: | + Ibis Framework é uma biblioteca Python + que gera expressões de busca em banco de dados. O framework foi idealizado por + Wes McKinney, o mesmo criador do Pandas, voltado para + integração de diferentes Engines de Bancos de Dados através de Expressões Ibis + com Python. +thumbnail: "/header.jpg" +template: "blog-post.html" +--- + +[Ibis Framework](https://github.com/ibis-project/ibis/) é uma biblioteca Python +que gera expressões de busca em banco de dados. O framework foi idealizado por +[Wes McKinney](https://github.com/wesm), o mesmo criador do Pandas, voltado para +integração de diferentes Engines de Bancos de Dados através de Expressões Ibis +com Python. + +Enquanto os motores de busca e análise de dados crescem e ficam mais robustos +com o avanço da era dos Dados, algumas complicações podem ser encontradas em +diferentes ambientes de desenvolvimento. Um dos exemplos mais comuns é o +crescimento de aplicações que realizam buscas SQL em um banco de dados, com o +tempo as buscas se tornam complexas e de difícil leitura. + +Atualmente o Ibis possui 12 backends em seu escopo, alguns deles são +responsáveis pela manipulação dos dados, outros, como por exemplo o SQLAlchemy, +são responsáveis pela tradução das expressões Ibis em buscas SQL, etc. Você pode +conferir todos os backends +[aqui](https://ibis-project.org/docs/3.1.0/backends/). + + + +## Setup e Base de Dados + +O Ibis pode ser instalado via `pip` ou `conda`. Nos exemplos a seguir +utilizaremos apenas a instalação padrão do Ibis, mas você pode conferir como +instalar outros Backends como o +[Google BigQuery](https://github.com/ibis-project/ibis-bigquery/), +[Apache Impala](https://github.com/ibis-project/ibis-bigquery/), +[PostgreSQL](https://ibis-project.org/docs/3.1.0/backends/PostgreSQL/) +dependendo da sua necessidade. + +```python +!mamba install ibis-framework matplotlib sqlalchemy -c conda-forge -y +``` + +Estaremos trabalhando com um dataset disponibilizado pelo Ministério da Saúde em +formato CSV. + +```python +!wget -c https://data.brasil.io/dataset/covid19/caso_full.csv.gz && gunzip -c caso_full.csv.gz > data/caso_full.csv +``` + +```python +import matplotlib.pyplot as plt +import pandas as pd +import sqlite3 +import ibis +``` + +## Como funciona o Ibis? + +O Ibis, a partir da criação de Expressões, se consitui em uma camada de +abstração entre as Engines de banco de dados e o usuário final. Em seu backend, +o Ibis utiliza Pandas como sua Engine de execução, então podemos ler o arquivo +CSV com a função `read_csv()` do Pandas: + +```python +df = ibis.backends.pandas.pd.read_csv('data/caso_full.csv') +``` + +```python +df.head() +``` + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
citycity_ibge_codedateepidemiological_weekestimated_populationestimated_population_2019is_lastis_repeatedlast_available_confirmedlast_available_confirmed_per_100k_inhabitantslast_available_datelast_available_death_ratelast_available_deathsorder_for_placeplace_typestatenew_confirmednew_deaths
0Rio Branco1200401.02020-03-17202012413418.0407319.0FalseFalse30.725662020-03-170.001cityAC30
1NaN12.02020-03-17202012894470.0881935.0FalseFalse30.335392020-03-170.001stateAC30
2Rio Branco1200401.02020-03-18202012413418.0407319.0FalseFalse30.725662020-03-180.002cityAC00
3NaN12.02020-03-18202012894470.0881935.0FalseFalse30.335392020-03-180.002stateAC00
4Rio Branco1200401.02020-03-19202012413418.0407319.0FalseFalse40.967542020-03-190.003cityAC10
+
+ +```python +df.info() +``` + +
+

+ OUTPUT + +

+
+  
+
+RangeIndex: 3853648 entries, 0 to 3853647
+Data columns (total 18 columns):
+#   Column                                         Dtype
+---  ------                                         -----
+0   city                                           object
+1   city_ibge_code                                 float64
+2   date                                           object
+3   epidemiological_week                           int64
+4   estimated_population                           float64
+5   estimated_population_2019                      float64
+6   is_last                                        bool
+7   is_repeated                                    bool
+8   last_available_confirmed                       int64
+9   last_available_confirmed_per_100k_inhabitants  float64
+10  last_available_date                            object
+11  last_available_death_rate                      float64
+12  last_available_deaths                          int64
+13  order_for_place                                int64
+14  place_type                                     object
+15  state                                          object
+16  new_confirmed                                  int64
+17  new_deaths                                     int64
+dtypes: bool(2), float64(5), int64(6), object(5)
+memory usage: 477.8+ MB
+
+
+
+
+
+ +E para demonstrar o verdadeiro poder do Ibis, iremos transformar nosso arquivo +CSV em uma Base de Dados SQL. Na instalação padrão do Ibis, o backend SQL é o +`sqlite3`, então nos exemplos a seguir utilizaremos SQLite para realizar buscas +na base de dados. Caso queira utilizar outra Engine SQL, como +[BigQuery](https://github.com/ibis-project/ibis-bigquery/) ou +[Postgres](https://ibis-project.org/docs/3.1.0/backends/PostgreSQL/), acesse a +[documentação oficial](https://ibis-project.org/docs/3.1.0/backends/PostgreSQL/) +e siga instruções de instalação. + +```python +df.to_sql('casos_covid19_BR', sqlite3.connect('data/casof.db')) +``` + +
+

+ OUTPUT + +

+
+  
+3853648
+
+
+
+ +```python +con = ibis.sqlite.connect('data/casof.db') +casos = con.table('casos_covid19_BR') +``` + +O Ibis, junto com o SQLAlchemy, utiliza grafos para representar suas Expressões. +Portanto é possível visualizar todas as etapas ocorridas no Backend com a +configuração de representação de grafos ativa. Da mesma forma, podemos +representar o Schema da nossa tabela através da função `display()`: + +```python +ibis.options.graphviz_repr = True +display(casos) +``` + +![png](index_files/index_15_0.png) + +Assim como no Pandas, as colunas podem ser chamadas diretamente. Entretanto, +como o Ibis funciona por padrão em +[`Lazy mode`](https://ibis-project.org/docs/3.1.0/tutorial/03-Expressions-Lazy-Mode-Logging/?h=lazy), +o resultado da query não fica armazenado em memória e ela só será executada +utilizando o comando `execute()`. O lazy mode busca diminuir a utilização da +memória, ao invés de executar a busca quando o objeto é instanciado, o Ibis +retorna uma expressão contendo os parâmetros de busca, executando a busca +somente quando necessário: + +```python +# Semelhante ao pandas, podemos realizar uma busca SQL que retorna os valores max. e min. da coluna +data_min = casos.date.min().name('first_entry') +data_max = casos.date.max().name('last_entry') +``` + +```python +print(data_min.execute()) # Dia da primeira entrada registrada na base de dados +print(data_max.execute()) # Dia da última entrada registrada na base de dados +``` + +
+

+ OUTPUT + +

+
+  
+2020-02-25
+2022-03-27
+
+
+
+
+
+ +## E por que usar Ibis ao invés das ferramentas SQL diretamente? + +- Ibis, por ser uma ferramenta escrita em Python, é atraente para quem não tem + tanta familiaridade com SQL. Ao automatizar as buscas, novos desenvolvedores + poderão entender como as buscas são feitas na Engine SQL. +- Com o crescimento da aplicação, os parâmetros de busca em SQL podem se tornar + confusos e de difícil replicação. Com o Ibis é possível portabilizar as + Expressões para serem reutilizadas em outras buscas sem a necessidade de + reescrever código. +- Caso você esteja trabalhando com diferentes Engines SQL, seja por causa do + tamanho da base de dados, por exemplo. Com o Ibis é possível rapidamente + conectar à uma Engine que consiga lidar diferentes volumes de dados + (ClickHouse, HeavyAI, etc) e continuar com o mesmo fluxo de trabalho. + +Por exemplo: já vimos que é possível criar buscas SQL através de expressões +Ibis, entretanto, o oposto também pode ser visualizado. Com a função `compile()` +podemos retornar os parâmetros da busca realizada pela Expressão Ibis na base de +dados. Ou seja, é possível realizar análises das buscas na base de dados com +facilidade, pois o Ibis te mostra como fez para retornar o resultado desejado: + +```python +print(data_min.compile()) +``` + +
+

+ OUTPUT + +

+
+  
+SELECT min(t0.date) AS first_entry
+FROM main."casos_covid19_BR" AS t0
+
+
+
+
+
+ +Um dos pontos chave do Ibis, é a possibilidade de criar Expressões com o +resultado de interesse, renomeá-las, e utilizá-las para outras buscas sem +precisar repetir código: + +```python +total_new_cases = casos['new_confirmed'].sum().name('total_new_cases') +total_new_deaths = casos['new_deaths'].sum().name('total_new_deaths') +``` + +```python +total_new_cases +``` + +![png](index_files/index_24_0.png) + +```python +epiweek_covid = casos.group_by('epidemiological_week').aggregate(( + total_new_cases, + total_new_deaths, + )) + +print(epiweek_covid.compile()) +``` + +
+

+ OUTPUT + +

+
+  
+SELECT t0.epidemiological_week, sum(t0.new_confirmed) AS total_new_cases, sum(t0.new_deaths) AS total_new_deaths
+FROM main."casos_covid19_BR" AS t0 GROUP BY t0.epidemiological_week
+
+
+
+
+
+ +Lembra que o Ibis utiliza o Pandas como Backend de execução? Podemos agora +salvar o Pandas DataFrame gerado na execução em uma variável para termos acesso +às funções do Pandas: + +```python +df = epiweek_covid.execute() +df.head() +``` + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
epidemiological_weektotal_new_casestotal_new_deaths
020200940
1202010330
22020112310
3202012193530
42020135476183
+
+ +```python +df['week'] = df['epidemiological_week'].astype(str).str[4:6] +df['year'] = df['epidemiological_week'].astype(str).str[0:4] + +df.pop('epidemiological_week') +df.insert(0, 'year', df.pop('year')) +df.insert(1, 'week', df.pop('week')) +df.head() +``` + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
yearweektotal_new_casestotal_new_deaths
020200940
1202010330
22020112310
3202012193530
42020135476183
+
+ +```python +df = df.head(15) +plt.bar(df.week, df.total_new_cases) +plt.bar(df.week, df.total_new_deaths) +plt.xlabel('Epidemiological week') +plt.ylabel('Population') +plt.legend(['New cases', 'New deaths']) +plt.show() +``` + +![png](index_files/index_29_0.png) + +## Manipulando os dados e inserindo novas colunas: + +Os DataFrames gerados pelo Pandas Engine são estáticos. Isso quer dizer que ao +manipular os dados, as expressões não alteram o DataFrame em si, mas preparam os +parâmetros de busca para gerar um novo DataFrame a partir do comando +`execute()`, que pode ser visualizado, armazenado e exportado. + +No exemplo abaixo, estaremos parametrizando a busca a ser realizada na base de +dados. Com uma sintaxe "Pandas-like", pode-se imaginar que estaremos manipulando +o DataFrame em si. Entretanto, o Ibis armazena o resultado desejado para que a +busca seja realizada somente quando o resultado deve ser exibido, executando-o. +Ao extrair as colunas como em `percentage_cases`, por exemplo, uma query SQL é +armazenada + +Operações matemáticas entre as colunas podem ser escritas de maneira Pythonica +com o Ibis e facilmente adicionadas em outros critérios de busca: + +```python +percentage_cases = (casos['new_confirmed'] / casos['estimated_population'] * 100).name('porc_cases') +``` + +Assim como em SQL, `when clauses` podem ser usadas para extrair apenas certas +partes dos dados. Neste exemplo estaremos extraindo as informações dos estados +do Sul do país, para que no final seja retornado um DataFrame com os parâmetros +definidos. Com o modo de gráficos ativo, podemos visualizar os passos +armazenados nos parâmetros de busca: + +```python +south_br = (casos.state.case() + .when('SC', 'Santa Catarina') + .when('RS', 'Rio Grande do Sul') + .when('PR', 'Parana') + .end() + .name('Regiao Sul')) + +south_br +``` + +![png](index_files/index_33_0.png) + +Compilando as buscas com os parâmetros, podemos visualizar a query que acabamos +de criar e que será executada com a função `execute()`: + +```python +# Query SQL referente a `percentage_cases`: +print(percentage_cases.compile().compile( + compile_kwargs={"literal_binds": True})) +``` + +
+

+ OUTPUT + +

+
+  
+SELECT (t0.new_confirmed / t0.estimated_population) * 100 AS porc_cases
+FROM main."casos_covid19_BR" AS t0
+
+
+
+
+
+ +```python +# Query SQL referente a `south_br` +print(south_br.compile().compile( + compile_kwargs={"literal_binds": True})) +``` + +
+

+ OUTPUT + +

+
+  
+SELECT CASE WHEN (t0.state = 'SC') THEN 'Santa Catarina' WHEN (t0.state = 'RS') THEN 'Rio Grande do Sul' WHEN (t0.state = 'PR') THEN 'Parana' ELSE CAST(NULL AS TEXT) END AS "Regiao Sul"
+FROM main."casos_covid19_BR" AS t0
+
+
+
+
+
+ +Agora que temos a porcentagem de casos e a região separadas em duas variáveis, +podemos agregar as buscas e encontrar as porcentagem de casos nos estados em +questão e retorná-lo em Dataframe: + +```python +# Agregando as duas queries SQL como se fosse um Pandas DataFrame: +sul = casos.group_by(south_br).aggregate(percentage_cases.mean().name('Media Casos')).dropna() +print(sul.compile().compile(compile_kwargs={"literal_binds": True})) +``` + +
+

+ OUTPUT + +

+
+  
+SELECT t0."Regiao Sul", t0."Media Casos"
+FROM (SELECT CASE WHEN (t1.state = 'SC') THEN 'Santa Catarina' WHEN (t1.state = 'RS') THEN 'Rio Grande do Sul' WHEN (t1.state = 'PR') THEN 'Parana' ELSE CAST(NULL AS TEXT) END AS "Regiao Sul", avg((t1.new_confirmed / t1.estimated_population) * 100) AS "Media Casos"
+FROM main."casos_covid19_BR" AS t1 GROUP BY CASE WHEN (t1.state = 'SC') THEN 'Santa Catarina' WHEN (t1.state = 'RS') THEN 'Rio Grande do Sul' WHEN (t1.state = 'PR') THEN 'Parana' ELSE CAST(NULL AS TEXT) END) AS t0
+WHERE t0."Regiao Sul" IS NOT NULL AND t0."Media Casos" IS NOT NULL
+
+
+
+
+
+ +```python +# O resultado da query com o DataFrame desejado: +sul.execute() +``` + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Regiao SulMedia Casos
0Parana0.018670
1Rio Grande do Sul0.028637
2Santa Catarina0.029332
+
+ +## Conclusão + +Como pudemos ver, o Ibis é uma ferramenta poderosa para acelerar sua análise de +dados, capaz de integrar diferentes engines SQL com o Pandas, o Framework traz +melhorias de performance e legibilidade ao código Python. Crie e realize buscas +SQL como se estivesse trabalhando com um Pandas DataFrame, mas com uma economia +de memória e alta portabilidade! Com o Ibis é possível utilizar o mesmo padrão +de trabalho para desenvolvimento e produção, acelerar seus testes unitários, +escalonar a aplicação para diferentes bases de dados, e muito mais! + +### Referências + +- https://ibis-project.org/ +- https://github.com/ibis-project/ibis diff --git a/content/blog/ibis-framework/output_14_0.png b/bkp/blogs/ibis-framework/index_files/index_15_0.png similarity index 100% rename from content/blog/ibis-framework/output_14_0.png rename to bkp/blogs/ibis-framework/index_files/index_15_0.png diff --git a/content/blog/ibis-framework/output_23_0.png b/bkp/blogs/ibis-framework/index_files/index_24_0.png similarity index 100% rename from content/blog/ibis-framework/output_23_0.png rename to bkp/blogs/ibis-framework/index_files/index_24_0.png diff --git a/content/blog/ibis-framework/output_28_0.png b/bkp/blogs/ibis-framework/index_files/index_29_0.png similarity index 100% rename from content/blog/ibis-framework/output_28_0.png rename to bkp/blogs/ibis-framework/index_files/index_29_0.png diff --git a/content/blog/ibis-framework/output_32_0.png b/bkp/blogs/ibis-framework/index_files/index_33_0.png similarity index 100% rename from content/blog/ibis-framework/output_32_0.png rename to bkp/blogs/ibis-framework/index_files/index_33_0.png diff --git a/content/blog/investigacion-colaborativa-con-git/header.png b/bkp/blogs/investigacion-colaborativa-con-git/header.png similarity index 100% rename from content/blog/investigacion-colaborativa-con-git/header.png rename to bkp/blogs/investigacion-colaborativa-con-git/header.png diff --git a/bkp/blogs/investigacion-colaborativa-con-git/index.md b/bkp/blogs/investigacion-colaborativa-con-git/index.md new file mode 100644 index 000000000..817de24c5 --- /dev/null +++ b/bkp/blogs/investigacion-colaborativa-con-git/index.md @@ -0,0 +1,123 @@ +--- +title: "Investigación Colaborativa con Git" +slug: investigacion-colaborativa-con-git +date: 2020-01-20 +authors: ["Anavelyz Perez"] +tags: [git, ramas] +categories: + [ + ciencia abierta, + investigación abierta, + desarrollo de software, + control de versiones, + ] +description: | + La Investigación colaborativa surge en el momento en el que varias entidades, + que pueden estar especializadas en diferentes áreas, se establecen un mismo + objetivo o proyecto. La finalidad de una investigación bajo este modelo es + encontrar soluciones, descubrir o explicar comportamientos de un fenómeno en + particular el cual puede ser económico, social, político, científico, entre + otros. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +La Investigación colaborativa surge en el momento en el que varias entidades, +que pueden estar especializadas en diferentes áreas, se establecen un mismo +objetivo o proyecto. La finalidad de una investigación bajo este modelo es +encontrar soluciones, descubrir o explicar comportamientos de un fenómeno en +particular el cual puede ser económico, social, político, científico, entre +otros. + + + +La investigación colaborativa se presenta en distintas ocasiones donde se +requiera un ciclo colaborativo de acuerdo a las necesidades que se presenten en +un proyecto, se busca brindar aportes significativos en la sociedad o entorno. + +A continuación te mostramos algunos ejemplos en los cuales puede resultar útil +implementar este tipo de investigación: + +- Un departamento de una organización está ayudando a otro que tiene una + deficiencia con respecto a la optimización de sus actividades. + +- Los cultivos de una localidad se están viendo afectados por una plaga; esa + plaga es similar a una ocurrida años atrás. Para estudiar las causas, + consecuencias y prevenir futuros episodios como este, se han reunido varios + biólogos expertos junto con historiadores, ingenieros agrónomos y + especialistas en otras áreas. + +- Un grupo de expertos en diversas disciplinas tienen en mente crear un + documento que sea pieza fundamental en la conformación del presupuesto + nacional del siguiente año fiscal. + +- Un diseñador industrial está proponiendo un rediseño de uno de los productos + de la empresa en la que trabaja. Para ello realiza un estudio con la ayuda de + sus compañeros expertos en marketing y estadística. Con esto busca obtener una + mejor perspectiva de los usuarios, sus necesidades y aceptación del mercado en + general. + +- Una institución privada desea financiar las actividades de una fundación. Para + lo cual recurre a un grupo de expertos con la finalidad de evaluar y presentar + un esquema del presupuesto y la descripción de lo que debe invertir para + obtener los mejores resultados. + +Cada una de las situaciones ejemplificadas requieren de la participación de +distintos grupos multidisciplinarios que pueden estar formados por personas, +entidades, institutos o grupos de trabajo que interactúen a la vez con la +información. Esto puede ser de manera individual, en paralelo o en conjunto para +conformar lo que sería el proyecto final. La idea es que, todos los miembros del +equipo que llevarán a cabo el proyecto, cumplan con tareas especificas según sus +conocimientos o aptitudes. + +Las tareas asignadas a cada miembro pueden o no depender condicionalmente unas +de otras y deben promover el cambio y fomentar la participación. Esto implica +que el proyecto estará sujeto a cambios constantes por la integración de nuevas +ideas. Es aquí cuando nos podemos plantear ¿Cómo almacenamos todos los cambios +que ocurren hasta que es alcanzado el objetivo final? ¿Qué debemos hacer si un +miembro del proyecto elimina por accidente información importante?. + +Para esto proponemos el uso de los _sistemas de control de versiones_ (VCS, por +sus siglas en inglés) pues nos permiten almacenar todos los cambios realizados y +la información asociada a ellos. En este caso te recomendamos el uso de **Git**. + +## Git + +Es un sistema de control de versiones que se diferencia de sus similares por la +forma en la que manejan sus datos; Git lo hace como una secuencia de copias +instantáneas. Además, "todo es verificado mediante una suma de comprobación +(_checksum_ en inglés) antes de ser almacenado, y a partir de ese momento es +identificado mediante esta, esto quiere decir que es imposible cambiar el +contenido de cualquier archivo o directorio sin que Git lo sepa". + +Para ejecutar la mayoría de las operaciones en Git solo se necesitan archivos y +recursos locales. Estas funcionalidades te permiten hacer investigación +colaborativa y que la información siempre esté salvaguardada. + +Por otro lado Git, al igual que otros VCS, posee un sistema de ramificación; el +cual consiste en tomar la versión principal del proyecto para poder trabajar en +ella individualmente, pero sin alterar la versión original, manejando así una +especie de copia de esta. Hechas las modificaciones, la rama puede volver a +fusionarse con el archivo de origen. + +Tal vez pienses que el proceso de creación de ramas es lento y tedioso, debido a +la cantidad de contenido o información en el proyecto, pero en Git esto resulta +rápido y sencillo. Una de las ventajas de utilizar ramas es que, como +colaborador, puedes trabajar de manera separada y eficiente, sin alterar la +versión principal. Así mismo, puedes crear subproyectos constituidos por ramas +de las cuales se deriven otras ramas. + +Git te permite obtener tu propio repositorio remoto o utilizar otros +alternativos, con lo cual obtendrás el máximo provecho a la información y a su +vez compartirás conocimiento rompiendo barreras de distancia. + +La investigación colaborativa con Git es ideal para crear grandes movimientos y +proyectos. Los avances y cambios llegarán en poco tiempo, los equipos de trabajo +pueden crear ambientes amigables de trabajo y cada aporte puede ser cuestionado +de manera positiva consultando a los involucrados oportunamente, respetando su +autoría y tiempo de dedicación al proyecto. + +Referencia: **The entire Pro Git book**. Autores: Scott Chacon y Ben Straub diff --git a/content/blog/la-importancia-de-la-integridad-en-los-datos-manejados-en-los-dashboards/header.png b/bkp/blogs/la-importancia-de-la-integridad-en-los-datos-manejados-en-los-dashboards/header.png similarity index 100% rename from content/blog/la-importancia-de-la-integridad-en-los-datos-manejados-en-los-dashboards/header.png rename to bkp/blogs/la-importancia-de-la-integridad-en-los-datos-manejados-en-los-dashboards/header.png diff --git a/bkp/blogs/la-importancia-de-la-integridad-en-los-datos-manejados-en-los-dashboards/index.md b/bkp/blogs/la-importancia-de-la-integridad-en-los-datos-manejados-en-los-dashboards/index.md new file mode 100644 index 000000000..88ff939dd --- /dev/null +++ b/bkp/blogs/la-importancia-de-la-integridad-en-los-datos-manejados-en-los-dashboards/index.md @@ -0,0 +1,107 @@ +--- +title: + "La importancia de la integridad en los datos manejados en los dashboards" +slug: la-importancia-de-la-integridad-en-los-datos-manejados-en-los-dashboards +date: 2020-05-14 +authors: ["Anavelyz Perez"] +tags: [datos, dashboard, herramientas, código] +categories: [ciencia de datos] +description: | + Si trabajamos en una empresa o institución pública o simplemente queremos ver el + comportamiento de nuestros datos, podemos pensar en realizar uno o varios + gráficos. Los gráficos son representaciones visuales de los datos que nos + permiten comprenderlos, compararlos, analizarlos y describirlos de forma tal que + se tenga una noción más clara de lo que ocurre con ellos. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + +Si trabajamos en una empresa o institución pública o simplemente queremos ver el +comportamiento de nuestros datos, podemos pensar en realizar uno o varios +gráficos. Los gráficos son representaciones visuales de los datos que nos +permiten comprenderlos, compararlos, analizarlos y describirlos de forma tal que +se tenga una noción más clara de lo que ocurre con ellos. + + + +En este artículo nos centraremos en los dashboards que son representaciones +gráficas de los datos. Como representaciones de gráficos, pueden estar +conformadas por una o varias visualizaciones con la particularidad de ser o no +interactivos. Los dashboards son utilizados principalmente para ver y evaluar la +calidad de un negocio o el cambio de algunos valores específicos a través del +tiempo. También permite observar el comportamiento de alguna variable y sugerir +estudios más profundos en relación a lo que sucede. + +Ya te habíamos mostrado, en el artículo Te hablamos del uso de dashboards para +visualización de datos de tu próximo proyecto. En ese artículo, definimos los +dashboards como: + +Los dashboards son herramientas de manejo de información que se vinculan entre +sí a través de APIs, servicios, librerías y código de una manera dinámica por +'debajo' de la interfaces de usuarios, es decir, mostrando los resultados de +esta interacción en una interfaz web o aplicación móvil, a través de gráficos y +visualizaciones que al instante presentan los llamados indicadores de +rendimiento (Key Performance Indicators KPI por sus siglas en inglés), o +cualquier otro tipo de indicadores, acerca de un negocio, proceso, departamento, +sitio web, o servidor. Prácticamente cualquier cosa que necesite ser +monitorizada de forma constante puede utilizar los dashboards. Debido a su +naturaleza como frontend, son completamente personalizables para cualquier +propósito al que los quieras aplicar, sólo hace falta crear los scripts +necesarios para hacerlo. + +Ahora, ¿Qué es lo primordial para elaborar un dashboard? + +Para elaborar dashboards son necesarios los datos, estos serán la materia prima +que permitirá crearlos. Debemos tener en cuenta que los datos puedan almacenar +la información que deseamos extraer o contabilizar. Una vez que se tengan +disponibles los datos se debe tener claro cuáles son las variables o valores que +se desean estudiar y así trazar un plan en el que se definan los tipos de +gráficos que serán presentados en los dashboards. + +Por otro lado, se deben definir las herramientas que utilizaremos para su +elaboración. De estas herramientas existen varias: desde una hoja de cálculo +hasta aplicaciones de software especializado. En el caso de software libre y +código abierto, existen bibliotecas que permiten crear dashboards de manera +rápida y sin muchas líneas de código. Por mencionar algunas están Bokeh y Plotly +que son librerías de código abierto para Python. En la sección frameworks y +librerías diseñadas para dashboards del artículo Te hablamos del uso de +dashboards para visualización de datos de tu próximo proyecto encontrarás una +descripción un poco más amplia de las herramientas que se pueden emplear para +esta elaboración. + +¿Qué es la integridad en los datos? y ¿cuál es su importancia en los dashboards? + +La integridad en los datos se refiere a su fiabilidad, es decir, a que la +información que muestran sea exacta, completa, homogénea, sólida y coherente. Al +tener integridad en los datos es muy probable que la información que se obtenga +a través de estos sea verídica y muestre la realidad. + +Por ello, es de gran importancia que los datos involucrados en la creación de +los dashboards tengan integridad. Permitiendo de esta manera presentar gráficos +claros, sin sesgos o alteraciones, se evitarían posibles problemas de +interpretación y la toma decisiones basadas en esta información es más +confiable. + +Otro aspecto que brinda la integridad de los datos en los dashboards es la +facilidad para agrupar la información y la segmentación de lo que puede o no ser +relevante. + +Tengamos en cuenta que la integridad de los datos se ve alterada en el momento +en que un valor en el conjunto de los datos ha sido modificado por equivocación, +se ingresa uno o varios datos erróneos o si simplemente fue alterado por alguna +circunstancia asociada al proceso de su obtención. Para prevenir esto es +importante la supervisión del proceso de obtención de los datos así como su +correcta depuración o pre-procesamiento. + +En resumen tenemos que los dashboards son una excelente herramienta para +describir los procesos que ocurren con los datos, pero para ello es vital que +estos últimos sean tales que contengan la mayor información, sean fiables de +manera que cuenten con integridad para así lograr el objetivo de describir y +tener mayor visión de lo que en verdad ocurre. + +Los dashboards son clave en la visualización de datos. Debemos ser consientes de +que un dato puede ser simplemente un valor, pero descubrir lo que este significa +puede causar impacto, mover o cambiar procesos cuando se requiera, en una en un +proyecto, en organización, en una comunidad o hasta en un país. diff --git a/content/blog/la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones/header.png b/bkp/blogs/la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones/header.png similarity index 100% rename from content/blog/la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones/header.png rename to bkp/blogs/la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones/header.png diff --git a/bkp/blogs/la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones/index.md b/bkp/blogs/la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones/index.md new file mode 100644 index 000000000..6a2a03614 --- /dev/null +++ b/bkp/blogs/la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones/index.md @@ -0,0 +1,116 @@ +--- +title: + "La investigación abierta, el manejo de repositorios y control de versiones" +slug: la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones +date: 2020-02-28 +authors: ["Anavelyz Perez"] +tags: [versionado, repositorios] +categories: + [ + ciencia abierta, + investigación abierta, + desarrollo de software, + control de versiones, + ] +description: | + Las investigaciones son esenciales en el avance tecnológico y social porque nos + permiten encontrar respuestas a muchas dudas e hipótesis que surgen diariamente, + así como encontrar soluciones a acontecimientos que lo requieran. Por ello, + cuando se menciona el término investigación abierta, se hace alusión a aquella + investigación que toma en cuenta los elementos de la ciencia abierta. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Las investigaciones son esenciales en el avance tecnológico y social porque nos +permiten encontrar respuestas a muchas dudas e hipótesis que surgen diariamente, +así como encontrar soluciones a acontecimientos que lo requieran. Por ello, +cuando se menciona el término investigación abierta, se hace alusión a aquella +investigación que toma en cuenta los elementos de la ciencia abierta. + + + +En el blog [_NeoScientia_](https://neoscientia.com/ciencia-abierta/) se menciona +que la investigación abierta impulsa la apertura al público de las +investigaciones de forma libre y gratuita. Lo cual consiste en que se publiquen +las metodologías, procesos y datos obtenidos por resultados directos o +derivados, fomentando con ello la colaboración entre profesionales. En este +sentido, la investigación abierta abre horizontes en los cuales se expone una +mayor cantidad de información, la difusión de los proyectos es mayor y se cuenta +con más apoyo al tener una serie de personas trabajando en un mismo proyecto. + +Es aquí cuando nos podemos preguntar acerca de las herramientas e instrumentos +que lo harán posible y que debemos manejar para trabajar en un proyecto de +investigación abierta, teniendo en cuenta que se necesitan espacios en donde se +comparta y difunda la información, preferiblemente a través de la web, para que +su acceso sea a nivel universal. Por ello, el acceso a los datos de las +investigaciones abiertas debe ser fácil y seguro, así como la edición de los +archivos involucrados debe estar monitoreada de manera que no se pierdan +aspectos vitales. + +De acuerdo con lo anterior, una herramienta necesaria son los repositorios, que +son una especie de depósito de archivos digitales. Su objetivo es organizar, +almacenar, preservar y difundir, en modo de acceso abierto (Open Access), la +producción intelectual resultante de la actividad académica, científica, social +o según sea el tema de la investigación. Cuando se cuenta con un repositorio se +tendrá un espacio en el cual más personas pueden acceder a lo que se ha logrado +con las investigaciones y, a su vez, estas personas formarán un ambiente +colaborativo en donde se validarán y discutirán los resultados, se construirán +también nuevos aportes y se dispondrá de más información. + +Una de las herramientas más difundidas en el manejo de repositorios es **Git**. +Cuando trabajamos en conjunto para lograr un objetivo, debemos contar con un +mecanismo mediante el cual la mayoría trabajen a la vez. Si estamos cerca y el +número de personas en la investigación es pequeño, este proceso puede resultar +fácil y los resultados se pueden trabajar en un mismo archivo sin que pase +desapercibido algún cambio. Mientras que, si estamos trabajando a distancia y +con un numeroso grupo de personas resultará difícil verificar los cambios y +editar en un solo documento. + +Para solucionar este problema, podemos recurrir al control de versiones. En +nuestro artículo +[Investigación Colaborativa con Git](/blog/investigacion-colaborativa-con-git/) +se menciona que el control de versiones nos permite almacenar todos los cambios +que ocurren durante el proceso de avance hasta que es alcanzado el objetivo +final y si algún miembro del equipo hace cambios durante el proceso y +conformación final del proyecto, estos quedarán registrados junto con la +información asociada a ellos. Logrando así que elementos vitales de las +investigaciones no se pierdan fácilmente, debido a cualquier confusión o error. +Lo que ocurre en tus documentos estará respaldado. Por todo ello es que +afirmamos que una herramienta potente para el control de versiones es Git. + +En un contexto más amplio tenemos que, al realizar investigaciones abiertas, se +deben manejar adecuadamente los repositorios para obtener una mayor cantidad de +información disponible y, a su vez, contribuir para que sea más abundante. +Además, si se combina esto con el control de versiones se tiene una +retroalimentación continua donde personas con distintos puntos de vista pueden +colaborar. La combinación de estas herramientas tendrá como resultado la +existencia de más elementos disponibles a nivel informativo, divulgativo y +experimental en distintas áreas y lo más importante, de manera segmentada. Es +destacable mencionar que los manejadores de repositorios tienen un motor de +búsqueda, lo cual nos permite acceder a lo que necesitamos de manera eficiente. +Por otro lado, con el control de versiones podemos tener versiones certificadas +y actualizadas de la información. + +Existen repositorios remotos, que combinan las funcionalidades de un repositorio +con el control de versiones. De manera general, un repositorio remoto es una +versión de un proyecto en específico que se encuentra alojado en internet. Estos +repositorios pueden tener permisos especiales de manera que todos o algunos de +los miembros del equipo de trabajo pueden editar. Esta edición será compartida +para cada uno. Esto se logra a partir de la gestión de repositorios remotos lo +cual podemos hacer con Git, implicando conocer cómo añadir repositorios nuevos, +eliminar aquellos que ya no son válidos, gestionar ramas remotas e indicar si +están bajo seguimiento o no, y otras cosas más. Te invitamos a revisar nuestro +artículo +[Git de 0 a 100 en diez sencillos pasos](/blog/git-de-en-diez-sencillos-pasos/). + +## Referencias + +[Biblioteca de la Universidad de Extremadura](https://biblioguias.unex.es/c.php?g=572093&p=3944864) + +[Oficina de conocimiento abierto](http://oca.unc.edu.ar/2018/08/21/repositorios-de-datos-de-investigacion-y-de-ciencia-abierta/) + +[Blog Neoscientia](https://neoscientia.com/ciencia-abierta/) diff --git a/content/blog/la-investigacion-abierta-podria-cambiar-el-futuro-de-la-investigacion-en-ciencias-puras-te-contamos-por-que/header.png b/bkp/blogs/la-investigacion-abierta-podria-cambiar-el-futuro-de-la-investigacion-en-ciencias-puras-te-contamos-por-que/header.png similarity index 100% rename from content/blog/la-investigacion-abierta-podria-cambiar-el-futuro-de-la-investigacion-en-ciencias-puras-te-contamos-por-que/header.png rename to bkp/blogs/la-investigacion-abierta-podria-cambiar-el-futuro-de-la-investigacion-en-ciencias-puras-te-contamos-por-que/header.png diff --git a/content/blog/la-investigacion-abierta-podria-cambiar-el-futuro-de-la-investigacion-en-ciencias-puras-te-contamos-por-que/index.md b/bkp/blogs/la-investigacion-abierta-podria-cambiar-el-futuro-de-la-investigacion-en-ciencias-puras-te-contamos-por-que/index.md similarity index 71% rename from content/blog/la-investigacion-abierta-podria-cambiar-el-futuro-de-la-investigacion-en-ciencias-puras-te-contamos-por-que/index.md rename to bkp/blogs/la-investigacion-abierta-podria-cambiar-el-futuro-de-la-investigacion-en-ciencias-puras-te-contamos-por-que/index.md index 0bc2e7528..587523905 100644 --- a/content/blog/la-investigacion-abierta-podria-cambiar-el-futuro-de-la-investigacion-en-ciencias-puras-te-contamos-por-que/index.md +++ b/bkp/blogs/la-investigacion-abierta-podria-cambiar-el-futuro-de-la-investigacion-en-ciencias-puras-te-contamos-por-que/index.md @@ -1,22 +1,32 @@ --- -title: "La investigación abierta podría cambiar el futuro de la investigación en ciencias puras. Te contamos por qué." +title: + "La investigación abierta podría cambiar el futuro de la investigación en + ciencias puras. Te contamos por qué." slug: la-investigacion-abierta-podria-cambiar-el-futuro-de-la-investigacion-en-ciencias-puras-te-contamos-por-que date: 2020-01-15 -author: Anavelyz Perez +authors: ["Anavelyz Perez"] tags: [datos] categories: [ciencia abierta, investigación abierta] - -draft: false -usePageBundles: true +description: | + La investigación abierta despliega nuevos horizontes en distintos niveles, + económicos, sociales, industriales, políticos e incluso en las ciencias puras. + Esta investigación permite que los resultados de los estudios y de los procesos + sean abiertos, respetando la licencia de conocimiento libre. Además, se publican + los datos, procedimientos y otras herramientas de la investigación (cuadernos de + notas, cuadernos de campo, videos de experimentos, datos de encuestas, etc.). thumbnail: "/header.png" -featureImage: "/header.png" +template: "blog-post.html" --- - -La investigación abierta despliega nuevos horizontes en distintos niveles, económicos, sociales, industriales, políticos e incluso en las ciencias puras. Esta investigación permite que los resultados de los estudios y de los procesos sean abiertos, respetando la licencia de conocimiento libre. Además, se publican los datos, procedimientos y otras herramientas de la investigación (cuadernos de notas, cuadernos de campo, videos de experimentos, datos de encuestas, etc.). +La investigación abierta despliega nuevos horizontes en distintos niveles, +económicos, sociales, industriales, políticos e incluso en las ciencias puras. +Esta investigación permite que los resultados de los estudios y de los procesos +sean abiertos, respetando la licencia de conocimiento libre. Además, se publican +los datos, procedimientos y otras herramientas de la investigación (cuadernos de +notas, cuadernos de campo, videos de experimentos, datos de encuestas, etc.). @@ -44,10 +54,10 @@ entes públicos. Es importante saber que los derechos de autor son respetados. Por otro lado, las ciencias puras se caracterizan por ver los cambios en entidades, entender, mostrar soluciones y considerar la aplicación de nuevas técnicas. Principalmente, se encargan de ensanchar el conocimiento básico de la -naturaleza, excluye intereses prácticos. Además, este tipo de ciencia ha -sufrido una serie de altibajos a lo largo del tiempo por la cantidad de -información que revela, la cual puede no beneficiar a muchos intereses, es una -práctica que requiere grandes inversiones y no siempre se cuenta con ella. +naturaleza, excluye intereses prácticos. Además, este tipo de ciencia ha sufrido +una serie de altibajos a lo largo del tiempo por la cantidad de información que +revela, la cual puede no beneficiar a muchos intereses, es una práctica que +requiere grandes inversiones y no siempre se cuenta con ella. Algunos ejemplos de ciencia pura son: @@ -77,14 +87,14 @@ importante saber que sin estos dos tipos de ciencia las tecnologías y la nueva era no serian posibles por la capacidad de aporte de cada una. > **Ejemplo** -> +> > Un grupo de científicos independientes estudiaron la genética de unos osos -> polares de la Antártida y encontraron que tienen características -> especiales con respecto al clima y su comida. Es importante entonces que los -> resultados se publiquen en revistas o plataformas que pueden difundir el tema. -> Es posible pensar en que se debiere hacer en una revista especializada, no -> obstante se requiere una cantidad de tiempo para que esto se logre -> satisfactoriamente. A corto plazo no es viable. +> polares de la Antártida y encontraron que tienen características especiales +> con respecto al clima y su comida. Es importante entonces que los resultados +> se publiquen en revistas o plataformas que pueden difundir el tema. Es posible +> pensar en que se debiere hacer en una revista especializada, no obstante se +> requiere una cantidad de tiempo para que esto se logre satisfactoriamente. A +> corto plazo no es viable. > > Mientras que si se decide publicar los resultados bajo investigación abierta > se tiene que los resultados, los datos y otros aspectos generales y @@ -98,6 +108,6 @@ el acceso a la información. Implicando de esta manera un esfuerzo continuo de las partes que conforman la sociedad. Cuando se implementa la investigación abierta para hacer ciencias puras se está permitiendo el incentivo de personas a realizar trabajos similares, se cubre en un abanico de necesidades de -conocimiento y se permite la educación continua porque logra que los -educadores, docentes y profesores tengan acceso a nuevos avances de manera -gratuita y sin limitación alguna. +conocimiento y se permite la educación continua porque logra que los educadores, +docentes y profesores tengan acceso a nuevos avances de manera gratuita y sin +limitación alguna. diff --git a/content/blog/los-laboratorios-sociales-y-el-manejo-del-covid-19/header.png b/bkp/blogs/los-laboratorios-sociales-y-el-manejo-del-covid-19/header.png similarity index 100% rename from content/blog/los-laboratorios-sociales-y-el-manejo-del-covid-19/header.png rename to bkp/blogs/los-laboratorios-sociales-y-el-manejo-del-covid-19/header.png diff --git a/bkp/blogs/los-laboratorios-sociales-y-el-manejo-del-covid-19/index.md b/bkp/blogs/los-laboratorios-sociales-y-el-manejo-del-covid-19/index.md new file mode 100644 index 000000000..f5a5127b9 --- /dev/null +++ b/bkp/blogs/los-laboratorios-sociales-y-el-manejo-del-covid-19/index.md @@ -0,0 +1,202 @@ +--- +title: "Los laboratorios sociales y el manejo del COVID-19" +slug: los-laboratorios-sociales-y-el-manejo-del-covid-19 +date: 2020-07-06 +authors: ["Yurely Camacho"] +tags: [laboratorios sociales, covid19, ciencia ciudadana] +categories: [ciencia abierta] +description: | + Frente a la pandemia ocasionada por la enfermedad COVID-19 se han desarrollado + en todo el mundo, distintas prácticas de ciencia abierta para hacerle frente. + Una de ellas son los **Laboratorios Sociales** donde los integrantes desarrollan + y difunden actividades virtuales respecto a este tema. Recordemos que los + laboratorios sociales son espacios donde cualquier ciudadano puede participar, + colaborando con otros, compartiendo sus conocimientos, ideas y experiencias con + el propósito de generar proyectos que ofrezcan propuestas o soluciones para + mejorar situaciones diversas. +thumbnail: "/header.png" +template: "blog-post.html" +--- + +Frente a la pandemia ocasionada por la enfermedad COVID-19 se han desarrollado +en todo el mundo, distintas prácticas de ciencia abierta para hacerle frente. +Una de ellas son los **Laboratorios Sociales** donde los integrantes desarrollan +y difunden actividades virtuales respecto a este tema. Recordemos que los +laboratorios sociales son espacios donde cualquier ciudadano puede participar, +colaborando con otros, compartiendo sus conocimientos, ideas y experiencias con +el propósito de generar proyectos que ofrezcan propuestas o soluciones para +mejorar situaciones diversas. + + + +En este post mencionamos algunos laboratorios sociales y los proyectos que han +desarrollado continuamente con respecto al manejo del COVID-19 y observaremos el +trabajo desempeñado en conjunto de algunos de ellos. + +### [FrenaLaCurva](https://frenalacurva.net/) + +FrenaLaCurva es un referente en cuanto a plataformas que desarrollan y ofrecen +iniciativas para el manejo del COVID-19, mediante +[**Laboratorios Ciudadanos Distribuidos**](https://frenalacurva.net/laboratorios-ciudadanos/) +con el fin de detectar buenas ideas y personas interesadas en ayudar a llevarlas +a cabo, mediante la experimentación, colaboración e innovación ciudadana para +afrontar la situación de la pandemia. La plataforma cuenta con la participación +de más de 10 países, entre ellos Brasil, Argentina, Colombia, Uruguay, Alemania. + +Algunas iniciativas de los Laboratorios Ciudadanos Distribuidos de FrenaLaCurva +son: + +- Red Comunitaria para la Atención alimentaria A Coruña + +- #yaVoyXti, app colaborativa de solidaridad en tiempos de coronavirus + +- Diario literario de un confinamiento + +Todas estas iniciativas y otras desarrolladas por esta plataforma ayudan a la +comunidad en su cotidianidad frente a a pandemia, brindándoles espacios para que +interactúen y se sientan acompañados. Puedes consultar +[aquí](https://drive.google.com/drive/folders/1zDYuT0bf0MAGD15bmYsxIBpDEhwbf16P) +toda la información sobre los proyectos. + +### [MIT MediaLab](https://www.media.mit.edu/) + +Los MediaLab son tipos de laboratorios sociales, y el Instituto de Tecnología de +Masachussets (MIT) cuenta con uno. Bajo este ámbito el MIT MediaLab está +dedicado a los proyectos de investigación en la convergencia del diseño, la +multimedia y la tecnología. Ofrece varios recursos y proyectos para el manejo +del COVID-19 como instituto de investigación. Entre ellos se encuentran: + +- [Centro de Información COVID-19](https://covid19.mit.edu/) + +Ofrece las últimas actualizaciones, orientación y recursos para ayudar a +apoyarle durante la pandemia. + +- [Proyecto sobre comunidades resilientes y COVID-19](https://www.media.mit.edu/projects/resilient-communities-and-covid19/overview/) + +Es un proyecto de la mano con el grupo City Science para abordar la resiliencia. + +- [Observatorio COVID-19](https://c19observatory.media.mit.edu/) + +Este proyecto es una colaboración del MIT con el Banco Mundial y se refiere al +seguimiento mundial de la evolución en tiempo real del COVID-19 mediante la +cuantificación del distanciamiento social y el impacto económico. + +- Pandemic Response CoLab (service unavailable) + +El propósito del proyecto es: + +- Identificar los problemas clave relacionados con COVID-19 + +- Desarrollar soluciones a estos problemas + +- Reclutar personas y recursos para implementar estas soluciones + +El proyecto ofrece un dashboard, el Pandemic Response Data Dashboard (service +unavailable) que recopila datos fiables y oportunos para ayudar a la comunidad +científica a encontrar las soluciones más impactantes a la pandemia. + +### [MediaLab UGR](https://medialab.ugr.es) y [LabIN Granada](https://labingranada.org/) + +MediaLab UGR es un laboratorio social de la Universidad de Granada que, entre +otras cosas, promueve convocatorias abiertas para la presentación de propuestas +y la participación en el desarrollo colaborativo de proyectos para la +Universidad y la sociedad en general. + +Por su parte, LabIN Granada es un laboratorio social nacido en 2007 para +Granada, y en este momento de aislamiento social, funciona como una herramienta +para conectarnos desde la solidaridad y la creatividad. + +Estos laboratorios, en ocasiones, trabajan en conjunto en la planificación y +desarrollo de proyectos para el bienestar social. Uno de ellos es la iniciativa +LabIN #UGRenCasa (link no disponible), un espacio de encuentro para la comunidad +universitaria y la ciudadanía durante el confinamiento con el fin de proponer +ideas para vivir mejor y compartir experiencias sobre esta situación y qué +podemos aprender de ello para el futuro. + +### MediaLab Prado (link no disponible) + +La actividad de MediaLab Prado se estructura en grupos de trabajo, convocatorias +abiertas para la producción de proyectos, investigación colaborativa y +comunidades de aprendizaje en torno a temas muy diversos. MediaLab Prado está +constituido por varios laboratorios, uno de ellos el InCiLab (link no +disponible) un laboratorio de innovación ciudadana. + +Una de las iniciativas de InCiLab frente al COVID-19 son los +[Laboratorios Bibliotecarios en confinamiento](https://www.culturaydeporte.gob.es/cultura/areas/bibliotecas/mc/laboratorios-bibliotecarios/jornadas/confinamiento.html) +bajo la tutela del Ministerio de Cultura y Deporte de España. Se trata de un +espacio de encuentro para reflexionar sobre el impacto que tendrá la pandemia en +las bibliotecas y proponer soluciones a nuevos retos. + +Continuemos con otro laboratorio y algunos de sus proyectos: + +### [BID Lab](https://bidlab.org/es/) + +Es el laboratorio de innovación del Grupo Banco Interamericano del Desarrollo +(BID). Se encarga de movilizar financiamiento, conocimiento y conexiones para +impulsar la innovación y promover la inclusión en América Latina y el Caribe +\[https://bidlab.org/es/\]. + +BID Lab ofrece un sitio web +[RESPONDIENDO AL COVID-19](https://bidlab.org/es/coronavirus) donde se presentan +proyectos que abordan los efectos sanitarios y económicos del COVID-19. Algunas +de esas iniciativas se muestran a continuación: + +- [COVID-19 Mapa de Innovadores de América Latina y el Caribe](https://bidlab.org/es/map-LAC-innovators-Covid-19) + +El mapa muestra los innovadores, emprendedores y +[startups](https://es.wikipedia.org/wiki/Empresa_emergente) de América Latina y +el Caribe, que proponen soluciones para moderar los desafíos ocasionados por el +COVID-19. + +- [CONECTOR Digital COVID-19](https://bidlab.org/es/conector-digital/inicio) + +Es un punto de encuentro y colaboración para apoyar a las empresas, +emprendedores y ciudadanos de América Latina y el Caribe con recursos de +innovaciones digitales, colaboración para potenciar el impacto de +sus soluciones, el intercambio de ideas, experiencias e información de valor +durante el tiempo de confinamiento. + +- [CivicLytics- Escucha ciudadana para no dejar a nadie atrás](https://covid19-civiclytics.citibeats.com/#/) + +CivicLytics es un observatorio que busca entender las percepciones y +preocupaciones de los ciudadanos de América Latina y el Caribe respecto a la +pandemia, mediante el uso de inteligencia artificial. Este proyecto es apoyado +por el BID Lab. + +### !Aislados pero unidos! + +El trabajo conjunto entre laboratorios sociales para manejar la COVID-19 se +evidencia en varias situaciones. Por ejemplo, el MediaLab UGR se unió a +FrenaLaCurva como laboratorio participante, puedes ver la noticia +[aquí](https://medialab.ugr.es/noticias/medialab-ugr-se-une-a-frenalacurva-net-una-iniciativa-para-hacer-frente-a-la-crisis-del-covid-19/). + +También Medialab Prado se suma a la iniciativa de FrenaLaCurva: +[Desafíos Comunes. Festival de innovación abierta Frena la Curva](https://frenalacurva.net/desafios-comunes/) +(link no disponible). Desafíos comunes es una convocatoria para iniciativas +vecinales, proyectos de emprendimiento e innovación social, y experiencias +colaborativas desde el sector público. + +Estos son algunos laboratorios sociales que han estado trabajando en el manejo +del COVID-19 con información breve sobre sus proyectos, anímate a acceder a sus +sitios web y obtén más detalles. + +**!Anímate!** + +Como ciudadano, investigador, emprendedor o simplemente amante de las buenas +prácticas de ciencia abierta, no te quedes atrás y participa o crea un proyecto +durante este tiempo de aislamiento y distanciamiento social. En OpenScienceLabs +te animamos a que no lo dejes para después, puedes comenzar ahora. + +#### Referencias + +- [FrenaLaCurva](https://frenalacurva.net/) + +- [MIT MediaLab](https://www.media.mit.edu/) + +- [MediaLab UGR](https://medialab.ugr.es) + +- [LabIN Granada](https://labingranada.org/) + +- [BID Lab](https://bidlab.org/es/) + +- [socialab](https://socialab.com) diff --git a/content/blog/nft-mas-que-un-jpg/dotcom-bubble.webp b/bkp/blogs/nft-mas-que-un-jpg/dotcom-bubble.webp similarity index 100% rename from content/blog/nft-mas-que-un-jpg/dotcom-bubble.webp rename to bkp/blogs/nft-mas-que-un-jpg/dotcom-bubble.webp diff --git a/content/blog/nft-mas-que-un-jpg/header.png b/bkp/blogs/nft-mas-que-un-jpg/header.png similarity index 100% rename from content/blog/nft-mas-que-un-jpg/header.png rename to bkp/blogs/nft-mas-que-un-jpg/header.png diff --git a/bkp/blogs/nft-mas-que-un-jpg/index.md b/bkp/blogs/nft-mas-que-un-jpg/index.md new file mode 100644 index 000000000..eba5a9d18 --- /dev/null +++ b/bkp/blogs/nft-mas-que-un-jpg/index.md @@ -0,0 +1,118 @@ +--- +title: "NFT. Más que un JPG" +slug: nft-mas-que-un-jpg +date: 2022-04-08 +authors: ["Alan Hurtarte"] +tags: [nft, criptomoneda, Blockchain] +categories: [tecnología] +description: | + Quizá hayas escuchado el término NFT últimamente. Títulos de noticias + descabelladas como + [«Porque este CryptoPunk NFT fue vendido por \$532 millones de USD»](https://www.cnet.com/news/why-this-cryptopunk-nft-sold-for-532-million-sort-of/) + o + [«Memes clásicos que fueron vendidos como NFT»](https://mashable.com/article/classic-memes-sold-nft-prices). + En este último artículo, se hace mención al meme de la «novia posesiva» que fue + vendido por \$411,000.00 USD. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Quizá hayas escuchado el término NFT últimamente. Títulos de noticias +descabelladas como +[«Porque este CryptoPunk NFT fue vendido por \$532 millones de USD»](https://www.cnet.com/news/why-this-cryptopunk-nft-sold-for-532-million-sort-of/) +o +[«Memes clásicos que fueron vendidos como NFT»](https://mashable.com/article/classic-memes-sold-nft-prices). + +En este último artículo, se hace mención al meme de la «novia posesiva» que fue +vendido por \$411,000.00 USD. + + + +![Overly attached Girlfriend MEME](nft-girlfriend-overly-attached.jpeg "Overly attached Girlfriend MEME") + +## Pero, ¿Qué es un NFT? + +Equivocadamente, se entiende como un JPG, o sea, un archivo de imagen. Si le doy +click derecho y "guardar imagen", ¿también tendría el NFT?, y ¿gratis?. + +Recientemente, se hizo viral el hecho de que en un torrent estaban todos los +NFTS actuales, una colección billonaria, descargable para cualquiera. + +![Torrents de NFTs](nft-torrents.jpeg "Torrents de NFTs") + +NFT es mucho más que una imagen, o un video, o una canción. Es la representación +digital de una propiedad. Imagina un sistema totalmente independiente, +inmutable, donde se reconoce tu propiedad. Por el momento lo que está pegando, +es arte, más específico, artes visuales digitales (imágenes y videos). Sin +embargo, no te extrañes ver campañas de NFT que sean mucho más que imágenes, que +podrían ser canciones, películas, cortos y lo que puedas imaginar digital. + +Dejando claro que es mucho más que una imagen, entonces podemos decir que un NFT +es un registro de propiedad, validado por una cadena de bloques, descentralizada +e inmutable, que nunca caducará. Creo que en este punto la pregunta es: ¿Qué no +podría ser un NFT?, bueno, hay muchas cosas que no pueden ser digitales, pero +imagina todo lo que sí pueden, y todo lo que ya lo es. + +Leí el caso de un músico que creó su proyecto, su propio token, en vez de ser +bitcoin o eth, y lo usó para juntar fondos para su disco. Los fans pudieron dar +apoyo a su artista favorito, colaborando a su crowdfunding, y obtienen cierta +cantidad del token del artista (un NFT). Al tener ingresos por su nuevo álbum, +el artista le dio parte de las regalías a los que tenían los NFTs. + +Podrás leer más aquí: +[NFTs are revolutionizing the music industry too](https://fortune.com/2021/10/29/nfts-music-industry/). +Esto nos lleva a lo que realmente mueve la web 3.0, propiedad de nuestros bienes +digitales (ownership). + +Lo cierto es que, el NFT le viene a dar más poder e independencia al artista. +Jack Conte, el CEO de Patreon, es un músico independiente que notó un fenómeno: +se esforzaba minuciosamente por hacer sus videos musicales, le metía todo su +dinero para hacer sus videos creativos, con stop motion, y proyecciones, y nada +pasaba, unas cuantas vistas en sus videos de youtube. Luego notó que a pesar de +tener éxito en youtube, y que la gente llegaba a sus presentaciones, no lograba +ser económicamente sostenible. Tienes talento, tienes fans, y entregas +constantemente tu arte, ¿Qué es lo que falta?. + +El modelo de negocio actual se trata del intermediario. Amazon no hace dinero +fabricando productos, AirBnb no hace dinero alquilando sus propiedades, Uber no +hace dinero con sus propios autos. Todos son intermediarios, y sus modelos de +negocio les permiten ganar mucho dinero manejando el uso de la propiedad ajena. +Lo mismo pasaba con Jack y youtube, así que creó Patreon, una plataforma en la +que los fans apoyan al artista directamente. Para mí esta es la primera versión +de la revolución del arte, y el NFT solo va a venir a acelerarlo. Imagina que +ser artista o creador de contenido, ya no sea una carrera en las que tus +familiares te dirían «de eso no vas a poder vivir», «pero necesitas una carrera +de verdad». + +## ¿Estamos ante una burbuja? + +Hay muchas opiniones al respecto, y como en cualquier tema te recomiendo hacer +tu propia investigación y llegar a tus propias conclusiones, especialmente si +hay dinero en juego. + +Personalmente, pienso que si esto es una burbuja, los precios son ridículamente +altos y eventualmente se normalizarán. + +Es importante entender que, la burbuja aquí es el precio, no la tecnología, y +esta tecnología vino para quedarse. + +![Burbuja de las .com](dotcom-bubble.webp "Bubuja de las .com") + +La burbuja de las “.com” es algo que resuena cuando se habla de este punto. +Cuando vino la tecnología de la web 2.0, se creó una burbuja, que explotó y +apenas 2 de cada 10 compañías sobrevivieron. Sin embargo, la tecnología se +quedó, y nos dio los gigantes tech que tenemos hoy en día como: google, +facebook, twitter, etc. + +Claro, el NFT actual hace una intersección entre dos mundos que no todos tenemos +acceso, el invertir cantidades ridículamente altas de dinero en arte, y la +tecnología disruptiva que no está lista para ser mainstream. Si le quitamos la +tecnología, solo nos queda gente gastando un montón de dinero en +representaciones visuales que son interpretadas. Y eso ya pasa, hay pinturas y +arte moderno que hoy en día se venden por precios ridículamente altos. Así que +el consejo es, no le busques el sentido al precio del arte, entiende la +tecnología por detrás, y no te dejes engañar o cegar por JPGs de millones de +dólares. diff --git a/content/blog/nft-mas-que-un-jpg/nft-girlfriend-overly-attached.jpeg b/bkp/blogs/nft-mas-que-un-jpg/nft-girlfriend-overly-attached.jpeg similarity index 100% rename from content/blog/nft-mas-que-un-jpg/nft-girlfriend-overly-attached.jpeg rename to bkp/blogs/nft-mas-que-un-jpg/nft-girlfriend-overly-attached.jpeg diff --git a/content/blog/nft-mas-que-un-jpg/nft-torrents.jpeg b/bkp/blogs/nft-mas-que-un-jpg/nft-torrents.jpeg similarity index 100% rename from content/blog/nft-mas-que-un-jpg/nft-torrents.jpeg rename to bkp/blogs/nft-mas-que-un-jpg/nft-torrents.jpeg diff --git a/content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Asana1.png b/bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Asana1.png similarity index 100% rename from content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Asana1.png rename to bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Asana1.png diff --git a/content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Basecamp1.png b/bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Basecamp1.png similarity index 100% rename from content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Basecamp1.png rename to bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Basecamp1.png diff --git a/content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Carrot1.png b/bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Carrot1.png similarity index 100% rename from content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Carrot1.png rename to bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Carrot1.png diff --git a/content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Discourse1.png b/bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Discourse1.png similarity index 100% rename from content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Discourse1.png rename to bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Discourse1.png diff --git a/content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Flarum1.png b/bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Flarum1.png similarity index 100% rename from content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Flarum1.png rename to bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Flarum1.png diff --git a/content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Keybase1.png b/bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Keybase1.png similarity index 100% rename from content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Keybase1.png rename to bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Keybase1.png diff --git a/content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Notion1.png b/bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Notion1.png similarity index 100% rename from content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Notion1.png rename to bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Notion1.png diff --git a/content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Slack1.png b/bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Slack1.png similarity index 100% rename from content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Slack1.png rename to bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/Slack1.png diff --git a/content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/header.png b/bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/header.png similarity index 100% rename from content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/header.png rename to bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/header.png diff --git a/bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/index.md b/bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/index.md new file mode 100644 index 000000000..eff49d30b --- /dev/null +++ b/bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/index.md @@ -0,0 +1,317 @@ +--- +title: "10 Plataformas que te ayudarán en la gestión de tu grupo de trabajo." +slug: plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo +date: 2021-01-23 +authors: ["Mariangela Petrizzo"] +tags: [comunicación, gestión] +categories: [organización, gestión de equipos] +description: | + El manejo de los equipos de trabajo es interés constante para Open Science Labs, + porque tenemos la convicción de que un equipo de trabajo bien manejado puede + crecer en conjunto y construir mejores resultados para la ciencia abierta. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + +El manejo de los equipos de trabajo es interés constante para Open Science Labs, +porque tenemos la convicción de que un equipo de trabajo bien manejado puede +crecer en conjunto y construir mejores resultados para la ciencia abierta. + + + +Ya en artículos anteriores hemos hablado de +[las herramientas que pueden utilizarse en el manejo de investigación reproducible](/blog/como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto/) +en equipos de trabajo, o +[cuáles son los aspectos clave a tener en cuenta en el manejo de equipos de ciencia abierta](/blog/aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta/), +y en este artículo queremos profundizar un poco más y mostrarte nuestra +perspectiva del propósito de examinar no solo las herramientas utilizadas, sino +también las prácticas de trabajo en equipo. + +## Los equipos de trabajo y su organización + +Recientemente ha sido muy difundido +[este artículo](https://critter.blog/2021/01/12/if-it-matters-after-today-stop-talking-about-it-in-a-chat-room/)) +en el cual Mike Crittenden muestra su perspectiva sobre las herramientas que se +utilizan en las comunicaciones internas y de cómo unas prácticas comunicativas +inadecuadas pueden conducir a retrabajo y estrés en los equipos. + +La premisa del autor en su artículo es que, en muchas ocasiones, la comunicación +en los equipos de trabajo genera un problema adicional cuando algunos temas, que +deberían trabajarse en mayor profundidad y con mayor dedicación, se acumulan al +verterse en herramientas pensadas para conversaciones breves y puntuales. + +Este _problema adicional_ que mencionamos tiene varias aristas. En primer lugar, +muchas de las herramientas de colaboración pensadas para equipos de desarrollo +tienen, además de las conexiones con repositorios, espacios de chats (canales) +para que los equipos puedan tener un espacio de conversación. Sin embargo, estos +chats que están generalmente pensados para conversaciones de alcance temporal +corto, no cuentan con dispositivos que faciliten su seguimiento y, pese a ello, +terminan utilizándose para conversaciones que pueden nutrirse de ser llevadas, +por ejemplo, a través de una discusión en el manejador de _issues_ de los +proyectos en una plataforma como [Github](http://github.com). + +Vaciar conversaciones con detalles técnicos, diálogos en grupos de chat, en +ocasiones conversaciones paralelas, interrumpidas por cualquier integrante del +grupo con algún sticker o pregunta no relacionada, sin lugar a dudas hacen mucho +más complicado llevar el seguimiento a detalles que, por ser determinantes para +el desempeño del equipo o de alguna tarea, seguro se benefician de un trabajo +más individualizado en un espacio que posibilite su seguimiento y +sistematización posteriores. + +No vamos a construir una crítica a ultranza del uso de chats en las +comunicaciones grupales, de hecho, tienen un papel muy importante en el +tratamiento de decisiones muy puntuales, recordatorios o incluso, con propósitos +de distensión y relajación, especialmente si se trabaja de forma remota. Sin +embargo, sostenemos la idea de que los grupos de trabajo necesitan que la +gestión de sus procesos internos se adecúe a las actividades que realizan, a fin +de facilitarlas sin hacerlas excesivamente complejas, y sabemos que hay +plataformas que pueden hacerlo posible. + +## Prácticas sanas en los equipos de trabajo + +Todo equipo de trabajo gira en torno, al menos, de un proyecto. Los proyectos se +organizan en torno a hitos y estos en función de tareas y actividades cuya +concresión debe organizarse y gestionarse. En medio de todo esto, ocurre el +flujo de presupuestos y asignación de recursos financieros y también de tiempo. + +Los equipos de trabajo en desarrollo de software no son la excepción en este +sentido. Aunque, en muchas ocasiones, se trate de equipos pequeños con varios +proyectos, resulta vital identificar los componentes y las personas que lideran +cada uno de sus procesos. Por ello, organizar las tareas, definir los flujos de +información para la gestión de actividades y hacer seguimiento de los alcances, +logros y problemas del equipo, a menudo requiere, no solo del uso de una +herramienta que lo facilite, sino también que el equipo asimile y haga propias +las prácticas necesarias para ello, convirtiéndolas en hábitos colectivos. + +Si nos centramos de forma estricta en la organización del trabajo, sabemos cómo +los equipos de ciencia abierta deben cultivar algunas prácticas, y ahora sabemos +que esto puede lograrse con el fomento en el uso de dispositivos que las +faciliten: + +1. Control de versiones integrado a los dispositivos de comunicación, + +2. Manejo de issues y sub-grupos en los repositorios, + +3. Metodología ágil para identificar hitos, metas, tareas y seguimiento, + +4. Entrenamiento en políticas de ciencia abierta para todo el equipo de trabajo, + e + +5. Incentivo a la ciencia abierta apoyando el desarrollo de habilidades no solo + para el desarrollo, sino también para la sistematización y la socialización + de los avances. + +Afortunadamente existen varias herramientas que pueden ayudar a integrar, en un +esquema _todo en uno_ estas distintas prácticas. Sin embargo, sabemos que +también es bastante probable que tu equipo de trabajo termine trasladando +prácticas cotidianas que pueden no ayudar mucho en el aprovechamiento de estas +herramientas. + +Para apoyarte en la decisión de cuál herramienta utilizar, hemos preparado para +ti y para tu equipo, esta revisión de opciones para trabajo en equipos de +desarrollo y otras formas de colaboración que, de seguro, podrán ayudarte a +compaginar de una forma más adecuada el trabajo a distancia con el logro de los +objetivos en tus proyectos. + +## Las herramientas elegidas + +Hemos seleccionado 10 de las herramientas más utilizadas en el trabajo en +equipo, algunas de uso general y otras de uso específico. La mejor recomendación +en este punto es que conozcas las prácticas que tu equipo realiza y el propósito +que tendría la incorporación de una herramienta, para tomar la decisión sobre +cuál herramienta utilizar. + +### 1. [Asana](http://asana.com) + +Asana es una plataforma en línea que permite la gestión de proyectos y grupos de +trabajo. Es gratuita para personas o equipos que están comenzando, aunque tiene +limitaciones en cuanto al manejo de tareas (solo hasta 1.000 tareas por equipo), +número de integrantes de cada equipo (hasta 15) y ofrece más de 100 +integraciones que están disponibles de forma gratuita. Asana, cuenta con un +espacio de gestión de proyectos, actualización de estatus de proyectos, +priorización de tareas, mensajes, conversaciones integradas sobre cada tarea +programada, tablero tipo Kanban y calendario. + +![Asana](Asana1.png) + +Cuenta también con plantillas que pueden adaptarse a los requerimientos que +tenga cada tipo de proyecto. Estas plantillas son bastante prácticas si lo que +deseas es comenzar a organizar y planificar las tareas del equipo pero no tienes +muy claro cuáles herramientas utilizar. Puede que algunos de los componentes del +proyecto sean de pago pero, en líneas generales, los que están disponibles en la +versión gratuita cumplen con los propósitos mínimos requeridos de planificación. +Ofrece integraciones con varias aplicaciones como Dropbox, Jira, MSTeams, Box y +Zoom entre otros. + +### 2. [Discourse for teams](http://teams.discourse.com) + +Discourse for teams es una versión de Discourse orientada a equipos de trabajo, +pensada para mejorar su productividad. Ofrece organización de las +conversaciones, un calendario que actualiza a hora local las citas y actividades +en agenda, un buscador que permite localizar información a través de distintos +tipos de documentos: desde conversaciones hasta documentación en wikis. +Asimismo, brinda personalización de los temas del escritorio y la interfaz, +además de algunos aspectos de seguridad como encriptación de conversaciones y +dos factores de autenticación en las cuentas. + +![Discourse](Discourse1.png) + +El enfoque de Discourse es la conversación que puede seguirse a través de +notificaciones por correo e incluye integraciones interesantes para equipos de +desarrollo como Slack, Github y Zendesk. + +### 3. [Slack](http://slack.com) + +Sin lugar a dudas esta es la aplicación que domina el mercado de aplicaciones de +comunicación para equipos, esto pese al grupo nada despreciable de personas y +equipos que se resisten a utilizar Slack. Es un software que posibilita que los +equipos de trabajo organicen sus intercambios de información en canales públicos +o privados, facilita la búsqueda de información, intercambio de archivos y +conexión con aplicaciones como Google Drive, Trello, Confluence, Jira, Asana y +Zendesk. + +![Slack](Slack1.png) + +Otra funcionalidad que tiene Slack, es que permite conectar el trabajo entre +equipos/empresas diferentes, así como integrar videollamadas y mensajería, y +ofrece la función de generación de flujos de trabajo. + +### 4. [Twist](http://twist.com) + +Twist es una plataforma que, al igual que otras reseñadas en este artículo, +incluye espacio para gestionar el trabajo colaborativo remoto y también generar +conversaciones entre los integrantes de los equipos. Twist promete estar +centrada en la conversación que ocurre entre los equipos de trabajo, permitiendo +que esté disponible y transparente para todos los integrantes del equipo, +organizada por temas de trabajo, estructurándola para que sea sencillo retomar o +entender una conversación luego de un tiempo sin participar en ella. De esta +forma, la conversación de los equipos de trabajo ocurre de forma asíncrona pero +no deja de ser un apoyo a los procesos internos. Quienes conocen Slack verán en +Twist, a primera vista, una interfaz muy similar que muestra las conversaciones +agrupadas en canales y por mensajes individuales. Twist incorpora, sin embargo, +la opción de visualizar y localizar las conversaciones también por temas. + +![Twist](twist1.png) + +Al igual que Slack, Twist facilita la configuración personalizada de las +notificaciones, menciones e información suministrada a los integrantes del +equipo y facilita la conexión con aplicaciones muy utilizadas por equipos de +desarrollo como Github. Una comparativa que presenta Twist con su competencia +directa, Slack, enfatiza en la posibilidad de organizar el proceso de +comunicación entre los integrantes del equipo evitando que se sientan abrumados +por el constante flujo de mensajes, notificaciones e información de Slack. + +### 5. [Carrot](http://carrot.io) + +Carrot es otra de las varias aplicaciones ideadas para favorecer el proceso de +comunicación en equipos de trabajo, remotos o no. El aspecto diferenciador de +Carrot es manejar las comunicaciones como feeds personalizados y tratando cada +mensaje como una noticia. Es un proyecto Open source que es gratuito para +organizaciones sin fines de lucro. + +![08f960fd.png](Carrot1.png) + +Un aspecto interesante de Carrot es que muestra estadísticas de los mensajes +dentro de una conversación, además de permitir compartir mensajes con canales +específicos de Slack a través de su integración. Permite incorporar bloques de +código y encabezados con formato H2, además de encuestas y recordatorios +generales para los equipos de trabajo y configuración de tema en modo oscuro. Es +una aplicación relativamente joven que cuenta con mejoras continuas. + +### 6. [Threads](http://threads.com) + +A diferencia de las aplicaciones que hemos reseñado hasta aquí, Threads solo +está disponible como aplicación descargable en computadoras de escritorio +(ambiente Windows o Mac) y en móbiles (Apple y Android). Se centran en un caso +de uso exitoso por parte de la empresa Buffer, que optó por utilizar esta +herramienta para mejorar la comunicación entre su equipo de trabajo. Los números +que exponen en ese caso de uso son realmente interesantes, registrando hasta un +80% de mejora en la productividad de los empleados de un equipo que, como el de +Buffer, está totalmente distribuido a lo largo y ancho del mundo. + +![Windows_app](thread.png) + +Esta aplicación está centrada, al igual que las otras reseñadas, en dar +estructura, orden y sistematización a la conversación de los equipos. La forma +en que Buffer expone que la ha utilizado, echa mano de tarjetas de conversación, +hilos y espacios en los cuales se puede dar lugar a chats para distensión del +equipo de trabajo, pero también acceso a los distintos temas manejados a través +de chats organizados a modo de tarjetas y un buscador que promete hacer mucho +más sencilla la localización de conversaciones específicas. + +### 7. [Basecamp](http://basecamp.com) + +Basecamp es otra de las aplicaciones disponibles para el manejo de las +actividades grupales, que incluye mensajes, manejo de tableros de tareas +pendientes, calendarios, vinculación de documentos y archivos, chats grupales y +un banco de preguntas comunes. Ofrece la posibilidad de programar las +notificaciones para garantizar tiempos de descanso en lugar de la exigente +conectividad que imponen aplicaciones como Slack. + +![838028b1.png](Basecamp1.png) + +Este producto incluye una opción gratuita para uso personal, con la posibilidad +de manejar hasta 3 proyectos, 20 usuarios y 1GB de almacenamiento en la nube. + +### 8. [Flarum](http://flarum.org) + +A diferencia de las aplicaciones presentadas antes, Flarum está centrada en +servir de plataforma para conducir los foros en páginas y portales web, y por +ello ofrece una especie de interfaz renovada de la interfaz de foros web. Es un +software de licencia abierta que garantiza su expansividad y flexibilidad a las +necesidades de los equipos de trabajo. + +![Flarum](Flarum1.png) + +Después de 6 años de desarrollo, Flarum 1.0.0 fue finalmente lanzado en 2021. +Permite el manejo de etiquetas lo cual le permite organizar de una forma más +pulcra la lista de discusiones visibles, tanto a través de la barra lateral como +de las banderas indicadas junto a cada discusión dentro de la lista de las más +recientes. + +### 9. [Keybase](http://keybase.io) + +Keybase es una aplicación gratuita, de código abierto, disponible para pc y +móbiles. Enfatiza en sus capacidades para manejo de mensajería y y envío de +archivos de forma encriptada. Aunque no está pensada de forma exclusiva para el +manejo del trabajo en equipos, resulta un apoyo importante por la vinculación +con aplicaciones como Github y Google Drive, por ejemplo. + +![Keybase](Keybase1.png) + +Permite el uso de etiquetas, el diseño de canales, el manejo de conversaciones +particulares, la localización de mensajes y archivos de forma relativamente +flexible. Se conecta también con identidades públicas, lo cual permite el manejo +de comunidades amplias. Aunque se centra en el cifrado como valor agregado, y +aunque resulta un poco pesada en su funcionamiento para algunos dispositivos, +resulta muy potente para el manejo de conversaciones importantes para los +equipos de trabajo. + +### 10. [Notion](http://notion.so) + +Notion es una aplicación que incluye herramientas para buena parte de las tareas +más necesarias en los equipos de trabajo: comunicación (chats), tareas (tasks) y +bases de conocimiento (wikis) entre otras. La posibilidad de reordenar esta +información en función de, por ejemplo, los proyectos y sus etiquetas, le aporta +a Notion una flexibilidad mayor al momento de ser implementada en los equipos de +trabajo. + +![Notion](Notion1.png) + +A quienes conocen Paper Dropbox, el manejo de los documentos de Notion puede +resultarles muy similar en cuanto a las menciones, la inclusión de tareas y +otros elementos que facilitan, dentro de los documentos, abrir y concretar +discusiones dentro de los equipos de trabajo. Es gratuita para uso personal con +acceso ilimitado a bloques y páginas, sincronización entre servicios y hasta 5 +integrantes de un equipo de trabajo. + +## ¿Cuál recomendamos? + +Creemos que hemos abordado de forma precisa las opciones más destacables de cada +una de las aplicaciones seleccionadas. Aunque, el manejo de conversaciones +separadas, buscadores, calendarios y de tableros kanban puede agilizar la +gestión de las actividades a realizar por los equipos de trabajo, sin embargo, +el mensaje es hacia no perder de vista que la primera atención que debemos +prestar es a los procesos de los grupos de trabajo. diff --git a/content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/thread.png b/bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/thread.png similarity index 100% rename from content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/thread.png rename to bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/thread.png diff --git a/content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/twist1.png b/bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/twist1.png similarity index 100% rename from content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/twist1.png rename to bkp/blogs/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/twist1.png diff --git a/content/blog/por-que-deberias-considerar-carpentries-como-una-referencia-para-aprender-ciencia-de-datos/header.png b/bkp/blogs/por-que-deberias-considerar-carpentries-como-una-referencia-para-aprender-ciencia-de-datos/header.png similarity index 100% rename from content/blog/por-que-deberias-considerar-carpentries-como-una-referencia-para-aprender-ciencia-de-datos/header.png rename to bkp/blogs/por-que-deberias-considerar-carpentries-como-una-referencia-para-aprender-ciencia-de-datos/header.png diff --git a/bkp/blogs/por-que-deberias-considerar-carpentries-como-una-referencia-para-aprender-ciencia-de-datos/index.md b/bkp/blogs/por-que-deberias-considerar-carpentries-como-una-referencia-para-aprender-ciencia-de-datos/index.md new file mode 100644 index 000000000..6f1362abd --- /dev/null +++ b/bkp/blogs/por-que-deberias-considerar-carpentries-como-una-referencia-para-aprender-ciencia-de-datos/index.md @@ -0,0 +1,121 @@ +--- +title: + "Por qué deberías considerar a The Carpentries como una referencia para + aprender ciencia de datos" +slug: por-que-deberias-considerar-carpentries-como-una-referencia-para-aprender-ciencia-de-datos +date: 2021-03-08 +authors: ["Anavelyz Perez"] +tags: [carpentries, datos, proyectos] +categories: [ciencia de datos, aprendizaje] +description: | + Cuando estamos por aprender y comprender al máximo sobre algo en específico, es + vital que tengamos fuentes de información que nos hagan este proceso más + sencillo, y que ante cualquier duda que tengamos la ayuda sea oportuna. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + +Cuando estamos por aprender y comprender al máximo sobre algo en específico, es +vital que tengamos fuentes de información que nos hagan este proceso más +sencillo, y que ante cualquier duda que tengamos la ayuda sea oportuna. + + + +"The Carpentries es un proyecto que engloba las comunidades de instructores, +capacitadores, mantenedores, ayudantes y simpatizantes de Software Carpentry, +Data Carpentry, y Library Carpentry que comparten la misión de enseñar +habilidades básicas de computación y ciencia de datos a los investigadores." +(https://carpentries.org/about/) + +Este proyecto es ideal para aprender ciencia de datos porque brinda una serie de +materiales diseñados para ello. Hay dos modalidades de enseñanza, una que +comprende talleres y otra en formato semestral. Los planes de estudio que ofrece +The carpentries varía de acuerdo a las tres comunidades que engloba. Esto es +porque cada una se centra en un aspecto práctico orientado a la necesidad del +investigador. Para conocer un poco mejor acerca de ello veamos las siguientes +descripciones, + +- Data Carpentry, facilita y desarrolla lecciones para talleres orientados a un + área de estudio específico, de modo que se enseña a los investigadores las + habilidades más relevantes para su dominio; utilizando ejemplos de su tipo de + trabajo. Por lo tanto, por esta comunidad podemos encontrar varios tipos de + talleres y planes de estudios organizados por dominio. Actualmente, los + dominios son: ecología, biología, genómica, Ciencias Sociales y datos + geoespaciales. Descripción extraída de: https://datacarpentry.org/lessons/ + +- Software Carpentry tiene como objetivo ayudar a los investigadores a ser más + capaces de escribir software para aplicaciones de investigación. Esto + significa centrarse en los lenguajes de programación, entornos de scripting y + aplicar el control de versiones para gestionar el código. Los talleres de + Software Carpentry emplean una pedagogía de tipo práctico para ayudar a los + investigadores a crear confianza y capacidad en el UNIX Shell (BASH), Python o + R y el software de control de versiones Git. Opcionalmente, posee módulos para + pruebas de unidades y SQL. Software Carpentry es una manera de empezar a + construir algunas habilidades y destrezas computacionales en una comunidad de + investigación. Las habilidades prácticas y los métodos con los que se enseñan + resultan ser útiles para otras enseñanzas avanzadas de seguimiento. Para ver + esta descripción y otros aspectos fundamentales visita + https://software-carpentry.org/lessons/ o + https://cookbook.carpentries.org/the-carpentries.html#software-carpentry + +- Library Carpentry, posee un plan de estudios básico que actualmente consiste + en nueve lecciones. Estas han sido enseñadas muchas veces, y han sido + refinadas después de la retroalimentación del instructor y del estudiante. Las + lecciones introducen términos, frases y conceptos en el desarrollo de software + y la ciencia de datos, cómo trabajar mejor con las estructuras de datos y cómo + utilizar expresiones regulares para encontrar y comparar datos. Presenta la + interfaz de línea de comandos de estilo Unix, y enseña la navegación básica en + el shell, así como el uso de bucles y tuberías para vincular los comandos del + shell. También introduce el grep para buscar y unir grupos de datos entre + archivos. Los ejercicios cubren el conteo y la extracción de datos. Además, + cubre el trabajo con OpenRefine para transformar y limpiar datos, y los + beneficios de trabajar en colaboración a través de Git/GitHub y la utilización + del control de versiones para realizar un seguimiento de su trabajo. Para + encontrar esta descripción y más información, visita: + https://librarycarpentry.org/lessons/ + +Con estas descripciones se hace notar el empeño de estas comunidades por lograr +que los investigadores tengan las herramientas necesarias a la hora de +implementar análisis de datos y otros elementos importantes en sus +investigaciones. Lo mejor de esto es que van desde lo más básico hasta lo que se +considera pertinente para que el conocimiento quedé plasmado en cada estudiante. +También, es valioso mencionar que todas las lecciones se distribuyen bajo la +licencia CC-BY y son libres para su reutilización o adaptación, con atribución. +Esto ha generado que las personas las utilicen en lecciones, en cursos, para +construir nuevas lecciones o para el aprendizaje autoguiado. + +Ahora, en torno a todo lo anterior, se tiene que + +- Existe una o varias comunidades que respaldan este proyecto y las lecciones + que han desarrollado. + +- El contenido de sus lecciones están disponibles en la web bajo un formato que + da la facilidad para reutilizar su contenido. + +- El acceso a los materiales desarrollados por el proyecto puede hacerse + mediante sus websites. En **Library Carpentry** los encontramos en la sección + [_OUR LESSONS_](https://librarycarpentry.org/lessons), en el caso de **Data + Carpentry**, en [_LESSONS_](https://datacarpentry.org/lessons/); para + **Software Carpentry** también existe una sección + [_LESSONS_](https://software-carpentry.org/lessons/). De manera general y + resumida podemos conseguir los planes de estudio de Carpentries en la sección + [_LEARN/OUR CURRICULA_](https://carpentries.org/workshops-curricula/). + +- Las lecciones están bien estructuradas. En el caso de Data Carpentry se + encuentran clasificadas según un dominio y, a pesar de esto, los conocimientos + impartidos también se pueden aplicar a otras áreas. Mientras que Software + Carpentry y Library Carpentry son ideales para aprender elementos de la + programación haciendo uso de bibliotecas y otras herramientas vitales en el + análisis de datos. + +- Puedes tener acceso a contenidos nuevos con el trascurso del tiempo. + +- Tus dudas, sugerencias y aportes serán atendidas por la comunidad. + +- Puedes encontrar lecciones tanto en Inglés como en Español. + +Estas son algunas de las tantas razones por la cual deberías considerar The +Carpentries como una referencia para aprender ciencia de datos. Te invitamos a +que le des un vistazo a este proyecto y nos dejes tus impresiones. diff --git a/content/blog/primeros-pasos-con-rstudio/2consola.gif b/bkp/blogs/primeros-pasos-con-rstudio/2consola.gif similarity index 100% rename from content/blog/primeros-pasos-con-rstudio/2consola.gif rename to bkp/blogs/primeros-pasos-con-rstudio/2consola.gif diff --git a/content/blog/primeros-pasos-con-rstudio/4.gif b/bkp/blogs/primeros-pasos-con-rstudio/4.gif similarity index 100% rename from content/blog/primeros-pasos-con-rstudio/4.gif rename to bkp/blogs/primeros-pasos-con-rstudio/4.gif diff --git a/content/blog/primeros-pasos-con-rstudio/C1.gif b/bkp/blogs/primeros-pasos-con-rstudio/C1.gif similarity index 100% rename from content/blog/primeros-pasos-con-rstudio/C1.gif rename to bkp/blogs/primeros-pasos-con-rstudio/C1.gif diff --git a/content/blog/primeros-pasos-con-rstudio/Environment.gif b/bkp/blogs/primeros-pasos-con-rstudio/Environment.gif similarity index 100% rename from content/blog/primeros-pasos-con-rstudio/Environment.gif rename to bkp/blogs/primeros-pasos-con-rstudio/Environment.gif diff --git a/content/blog/primeros-pasos-con-rstudio/Rstudio.png b/bkp/blogs/primeros-pasos-con-rstudio/Rstudio.png similarity index 100% rename from content/blog/primeros-pasos-con-rstudio/Rstudio.png rename to bkp/blogs/primeros-pasos-con-rstudio/Rstudio.png diff --git a/content/blog/primeros-pasos-con-rstudio/cambiotam.gif b/bkp/blogs/primeros-pasos-con-rstudio/cambiotam.gif similarity index 100% rename from content/blog/primeros-pasos-con-rstudio/cambiotam.gif rename to bkp/blogs/primeros-pasos-con-rstudio/cambiotam.gif diff --git a/content/blog/primeros-pasos-con-rstudio/header.png b/bkp/blogs/primeros-pasos-con-rstudio/header.png similarity index 100% rename from content/blog/primeros-pasos-con-rstudio/header.png rename to bkp/blogs/primeros-pasos-con-rstudio/header.png diff --git a/content/blog/primeros-pasos-con-rstudio/index.md b/bkp/blogs/primeros-pasos-con-rstudio/index.md similarity index 80% rename from content/blog/primeros-pasos-con-rstudio/index.md rename to bkp/blogs/primeros-pasos-con-rstudio/index.md index 060af6d43..c96141492 100644 --- a/content/blog/primeros-pasos-con-rstudio/index.md +++ b/bkp/blogs/primeros-pasos-con-rstudio/index.md @@ -2,17 +2,18 @@ title: "Primeros pasos con RStudio" slug: primeros-pasos-con-rstudio date: 2021-04-05 -author: Anavelyz Pérez +authors: ["Anavelyz Perez"] tags: [rstudio] -categories: [ciencia abierta, código abierto, R, IDE] - -draft: false -usePageBundles: true +categories: [ciencia abierta, código abierto, R, IDE] +description: | + RStudio es un entorno de desarrollo integrado (IDE) para el lenguaje de + programación R, el cual puedes utilizar para realizar scripts de análisis de + datos, aplicaciones web interactivas, documentos, reportes, gráficos y mucho + más. thumbnail: "/header.png" -featureImage: "/header.png" +template: "blog-post.html" --- - RStudio es un entorno de desarrollo integrado (IDE) para el lenguaje de @@ -34,15 +35,15 @@ ellas tiene una en versión Open Source (código abierto) y otra Pro. **RStudio Desktop** brinda acceso local a RStudio y tiene entre sus funcionalidades herramientas como resaltado de sintaxis, completado de código e indentación inteligente, te permite ejecutar el código R directamente desde el -editor de fuentes, gestionar fácilmente múltiples directorios de trabajo -usando proyectos, posee ayuda y documentación integradas de R. +editor de fuentes, gestionar fácilmente múltiples directorios de trabajo usando +proyectos, posee ayuda y documentación integradas de R. Además, cuenta con depurador interactivo para diagnosticar y corregir errores rápidamente. **RStudio Server** brinda acceso a RStudio a través de un navegador web, acerca -el cálculo a los datos, permite hacer y tener de forma centralizada cálculos -a escala y en la RAM. Cuenta con poderosas herramientas de codificación para +el cálculo a los datos, permite hacer y tener de forma centralizada cálculos a +escala y en la RAM. Cuenta con poderosas herramientas de codificación para mejorar la productividad. También existe la posibilidad de trabajar con esta herramienta completamente @@ -57,10 +58,9 @@ Sin embargo, en este artículo nos centraremos en RStudio Desktop. 1. Ir a la sección Download https://rstudio.com/products/rstudio/download/ específicamente hasta "All Installers" cerca de la parte inferior de la página. -1. Haz clic en el enlace de descarga correspondiente al sistema operativo de - tu ordenador. -1. Selecciona el archivo descargado e instala de acuerdo a tu sistema - operativo. +1. Haz clic en el enlace de descarga correspondiente al sistema operativo de tu + ordenador. +1. Selecciona el archivo descargado e instala de acuerdo a tu sistema operativo. Ahora, **Conozcamos la Interfaz de RStudio:** @@ -83,7 +83,7 @@ dividido en cuatro cuadrantes o regiones: ejemplo, ingresamos 9 + 3 entonces la consola interpreta que debe hacer una suma y finalmente devolverá el número 7. - En este cuadrante también encontramos el *Terminal* y la funcionalidad *Job* + En este cuadrante también encontramos el _Terminal_ y la funcionalidad _Job_ que permite mantenerse productivo mientras tu código funciona: trabajos locales y trabajos remotos. Puedes usarlas para ejecutar tus scripts en segundo plano mientras sigues usando el IDE. @@ -91,42 +91,48 @@ dividido en cuatro cuadrantes o regiones: ![Consola](2consola.gif) - En el cuadrante superior derecho podemos encontrar el Panel de Environment - (ambiente), Historial y las Conexiones. *Environment* muestra las + (ambiente), Historial y las Conexiones. _Environment_ muestra las características de variables, dataframes u objetos que se estén trabajando en algún proyecto o sesión determinada. También hay un botón que permite cargar datos a la memoria de RStudio. - Por otro lado, en el *Historial* puedes ver las líneas de comandos que han + Por otro lado, en el _Historial_ puedes ver las líneas de comandos que han sido ejecutadas recientemente, buscar mediante la caja de búsqueda o copiar - los comandos directamente a la consola, o al script. Además, es posible guardar - el historial de comandos para utilizarlos en otra sesión. + los comandos directamente a la consola, o al script. Además, es posible + guardar el historial de comandos para utilizarlos en otra sesión. ![Environment](Environment.gif) - El cuadrante inferior derecho contiene varias pestañas: - - Files(Archivos): es un gestor de archivos propio de RStudio, te permite crear, -editar y eliminar tus archivos, así como crear carpetas. + - Files(Archivos): es un gestor de archivos propio de RStudio, te permite + crear, editar y eliminar tus archivos, así como crear carpetas. - Plots: en esta pestaña se muestran los gráficos que se generen a través del -script o líneas de comandos. También te permite exportarlos en distintos -formatos. + script o líneas de comandos. También te permite exportarlos en distintos + formatos. - Packages: Si damos clic en esta pestaña aparecen dos botones, install y -update, seguido por una lista de paquetes que pueden estar o no instalados en tu -ordenador y que puedes usar o instalar según sea el caso. + update, seguido por una lista de paquetes que pueden estar o no instalados + en tu ordenador y que puedes usar o instalar según sea el caso. - Help: Nos da acceso a la ayuda que está compuesta por varias secciones, - - R Resources: Contiene una lista de enlaces que te dirigen a páginas web de las ayudas oficiales de R. + - R Resources: Contiene una lista de enlaces que te dirigen a páginas web de + las ayudas oficiales de R. - RStudio: Contiene enlaces asociados a los sitios web oficiales de RStudio. - - Manuals: Esta sección contiene los enlaces que te permiten acceder de forma local a una serie de manuales a cerca de R. + - Manuals: Esta sección contiene los enlaces que te permiten acceder de + forma local a una serie de manuales a cerca de R. + + - Reference: Hay dos enlaces, uno es el índice de los paquetes instalados y + otro muestra una serie de palabras clave y la clasificación por tópicos de + paquetes; al hacer clic en cualquiera de estos enlaces la información es + cargada de forma local. - - Reference: Hay dos enlaces, uno es el índice de los paquetes instalados y otro muestra una serie de palabras clave y la clasificación por tópicos de paquetes; al hacer clic en cualquiera de estos enlaces la información es cargada de forma local. - - - Miscellaneous Material: Muestra material diverso sobre R, tal como manuales de usuario preguntas frecuentes, Acerca de R, entre otros. + - Miscellaneous Material: Muestra material diverso sobre R, tal como + manuales de usuario preguntas frecuentes, Acerca de R, entre otros. - Viewer: esta pestaña es complemento de la extensión RMarkdown, la cual permite @@ -171,7 +177,10 @@ links o enlaces que te permiten acceder a estos sitios. RStudio tiene una [página web](https://education.rstudio.com/) diseñada especialmente para al aprendizaje y enseñanza de R y RStudio. Tiene cuatro -secciones principales: [Un blog](https://education.rstudio.com/blog/), [aprende](https://education.rstudio.com/learn/), [enseña](https://education.rstudio.com/teach/) y [certificate](https://education.rstudio.com/trainers/). Si eres completamente +secciones principales: [Un blog](https://education.rstudio.com/blog/), +[aprende](https://education.rstudio.com/learn/), +[enseña](https://education.rstudio.com/teach/) y +[certificate](https://education.rstudio.com/trainers/). Si eres completamente nuevo en R, la subsección Beginners https://education.rstudio.com/learn/beginner/ es ideal para ti. diff --git a/content/blog/primeros-pasos-con-rstudio/paq.gif b/bkp/blogs/primeros-pasos-con-rstudio/paq.gif similarity index 100% rename from content/blog/primeros-pasos-con-rstudio/paq.gif rename to bkp/blogs/primeros-pasos-con-rstudio/paq.gif diff --git a/content/blog/primeros-pasos-con-spyder/header.png b/bkp/blogs/primeros-pasos-con-spyder/header.png similarity index 100% rename from content/blog/primeros-pasos-con-spyder/header.png rename to bkp/blogs/primeros-pasos-con-spyder/header.png diff --git a/content/blog/primeros-pasos-con-spyder/index.md b/bkp/blogs/primeros-pasos-con-spyder/index.md similarity index 76% rename from content/blog/primeros-pasos-con-spyder/index.md rename to bkp/blogs/primeros-pasos-con-spyder/index.md index 45d4e5f04..b6ae3c3d2 100644 --- a/content/blog/primeros-pasos-con-spyder/index.md +++ b/bkp/blogs/primeros-pasos-con-spyder/index.md @@ -2,29 +2,25 @@ title: "Primeros pasos con Spyder" slug: primeros-pasos-con-spyder date: 2021-02-22 -author: Yurely Camacho +authors: ["Yurely Camacho"] tags: [spyder, código] categories: [ciencia abierta, código abierto, programación, IDE, Python] - -draft: false -usePageBundles: true +description: | + Si has elegido programar en Python, luego de haberlo instalado quizás te + preguntarás; ¿dónde voy a programar? Para esto necesitas un editor de código. + Existen muchas opciones de IDE (Entorno de Desarrollo Integrado) que puedes + usar, la elección dependerá de la herramienta que te haga sentir comodidad, se + adapte a tus necesidades de trabajo y, muy importante, sea sencilla de manejar. thumbnail: "/header.png" -featureImage: "/header.png" +template: "blog-post.html" --- - - - - - Si has elegido programar en Python, luego de haberlo instalado quizás te preguntarás; ¿dónde voy a programar? Para esto necesitas un editor de código. Existen muchas opciones de IDE (Entorno de Desarrollo Integrado) que puedes usar, la elección dependerá de la herramienta que te haga sentir comodidad, se adapte a tus necesidades de trabajo y, muy importante, sea sencilla de manejar. - - En este post presentamos lo que necesitas saber para utilizar [Spyder](https://www.spyder-ide.org/) como entorno de desarrollo para escribir, ejecutar, evaluar e inspeccionar el resultado de tu código escrito en Python. @@ -92,27 +88,27 @@ Para trabajar con Spyder tienes algunas opciones, entre las más comunes están: - **Spyder online**, permite que trabajes con una copia de Spyder que se ejecuta directamente en tu navegador web, es decir, no es necesaria su instalación. Esto es posible gracias a [Binder](https://mybinder.org/). Si deseas probarlo - debes acceder a la [página de Spyder en - Binder](https://mybinder.org/v2/gh/spyder-ide/spyder/4.x?urlpath=/desktop). + debes acceder a la + [página de Spyder en Binder](https://mybinder.org/v2/gh/spyder-ide/spyder/4.x?urlpath=/desktop). - Empleando [Anaconda](https://www.anaconda.com/) o [Miniconda](https://docs.conda.io/en/latest/miniconda.html). Spyder viene incluido, por defecto, en estas distribuciones. Esta es la forma más fácil de instalarlo y lo recomendamos para evitar cualquier inconveniente. -- Puedes instalarlo también usando [*pip*](https://pypi.org/project/spyder/) o - [*conda*](https://anaconda.org/anaconda/spyder) en tu entorno local con los +- Puedes instalarlo también usando [_pip_](https://pypi.org/project/spyder/) o + [_conda_](https://anaconda.org/anaconda/spyder) en tu entorno local con los siguientes comandos `conda install -c anaconda spyder` o `pip install spyder`. - La documentación oficial del proyecto te ofrece una [guía de - instalación](https://docs.spyder-ide.org/current/installation.html) que te - será de gran ayuda si surgen dudas. + La documentación oficial del proyecto te ofrece una + [guía de instalación](https://docs.spyder-ide.org/current/installation.html) + que te será de gran ayuda si surgen dudas. ### Ya tengo Spyder, ahora cómo lo uso -Para correr Spyder en Windows, dirígete al menú *Inicio* y luego busca la -aplicación de *Spyder*. En Linux, si instalaste Spyder usando Anaconda o +Para correr Spyder en Windows, dirígete al menú _Inicio_ y luego busca la +aplicación de _Spyder_. En Linux, si instalaste Spyder usando Anaconda o Miniconda, puedes acceder buscando su nombre en tu ícono de Menú. Si deseas -hacerlo utilizando la línea de comandos, en Windows abre *Anaconda Prompt* y haz +hacerlo utilizando la línea de comandos, en Windows abre _Anaconda Prompt_ y haz clic en Spyder. En las demás plataformas accede a una ventana del terminal y teclea `conda activate nombre_entorno` (en su defecto, nombre_entorno es `base` para activar tu entorno de trabajo local; o coloca el nombre del entorno donde @@ -126,13 +122,11 @@ de comandos, un **Explorador de Variables** para ver qué variables se han definido durante la evaluación, que cuenta con botones de **ayuda** para cualquier comando y **explorador de archivos**. -![Spyder](spyder.png) - -Como puedes observar, del lado izquierdo tenemos el *Editor de código*. En la -parte superior derecha se encuentran las pestañas: *Explorador de variables*, -*Explorador de archivos*, *Ayuda*. En la parte inferior derecha tenemos: *El -intérprete interactivo de Python (IPython Console)* y *El historial de -comandos*. +Como puedes observar, del lado izquierdo tenemos el _Editor de código_. En la +parte superior derecha se encuentran las pestañas: _Explorador de variables_, +_Explorador de archivos_, _Ayuda_. En la parte inferior derecha tenemos: _El +intérprete interactivo de Python (IPython Console)_ y _El historial de +comandos_. La barra de Menú se encuentra en la parte superior y debajo de ella la barra de herramientas. Esta última contiene botones que permiten realizar distintas @@ -146,7 +140,7 @@ adicional, accede al Explorador de archivos. Los archivos generados en Spyder se guardan, por defecto, con extensión `.py`. Al iniciar Spyder, puedes comenzar a trabajar en la ventana de la consola, si lo -deseas. Estás en la potestad de cambiar los paneles de lugar y su diseño según +deseas. Estás en la potestad de cambiar los paneles de lugar y su diseño según tus preferencias. A continuación te mostramos de una manera sencilla cómo hacer para crear, abrir @@ -154,29 +148,29 @@ y guardar un archivo en spyder y como ejecutar un script: - Para **Crear un nuevo archivo**, elige una de las siguientes opciones: - - Accede a la barra de Menú, haz clic en *Archivo* y luego en *Nuevo*. + - Accede a la barra de Menú, haz clic en _Archivo_ y luego en _Nuevo_. - Presiona las teclas Ctrl + N. - - Haz clic en el botón *Nuevo Archivo* de la barra de herramientas. + - Haz clic en el botón _Nuevo Archivo_ de la barra de herramientas. - Si deseas **Guardar un archivo**, elige entre: - - Hacer clic en *Archivo* y luego en *Guardar* en la barra de Menú. + - Hacer clic en _Archivo_ y luego en _Guardar_ en la barra de Menú. - Presionar las teclas Ctrl + S. - - Dar clic en el botón *Guardar Archivo* de la barra de herramientas. + - Dar clic en el botón _Guardar Archivo_ de la barra de herramientas. - Para **Abrir un archivo `.py` existente** tienes varias alternativas: - - Dirígete a la barra de Menú, haz clic en *Archivo*, luego en *Abrir*, + - Dirígete a la barra de Menú, haz clic en _Archivo_, luego en _Abrir_, después busca el archivo que desees. - Presiona Ctrl + O. - - En la barra de herramientas, haz clic en el botón *Abrir archivo*. Luego se + - En la barra de herramientas, haz clic en el botón _Abrir archivo_. Luego se abre una ventana donde buscarás la ubicación, luego selecciona el archivo - deseado y haz clic en *Abrir*. Posteriormente, se mostrará el archivo en el + deseado y haz clic en _Abrir_. Posteriormente, se mostrará el archivo en el Editor de Código. Te hemos presentado lo que debes saber para iniciarte en Spyder, esperamos que sea de provecho para tus proyectos. Anímate a usar este potente y popular -*Entorno de Desarrollo*. +_Entorno de Desarrollo_. ### Referencias diff --git a/content/blog/pyopensci-un-promotor-de-la-ciencia-abierta/header.png b/bkp/blogs/pyopensci-un-promotor-de-la-ciencia-abierta/header.png similarity index 100% rename from content/blog/pyopensci-un-promotor-de-la-ciencia-abierta/header.png rename to bkp/blogs/pyopensci-un-promotor-de-la-ciencia-abierta/header.png diff --git a/bkp/blogs/pyopensci-un-promotor-de-la-ciencia-abierta/index.md b/bkp/blogs/pyopensci-un-promotor-de-la-ciencia-abierta/index.md new file mode 100644 index 000000000..65a74073c --- /dev/null +++ b/bkp/blogs/pyopensci-un-promotor-de-la-ciencia-abierta/index.md @@ -0,0 +1,202 @@ +--- +title: "pyOpenSci: un promotor de la ciencia abierta" +slug: pyopensci-un-promotor-de-la-ciencia-abierta +date: 2020-08-06 +authors: ["Yurely Camacho"] +tags: [pyopensci] +categories: + [ciencia abierta, revisión abierta por pares, código abierto, Python] +description: | + Las distintas disciplinas que abarca la ciencia abierta trabajan de manera + conjunta; tal es el caso del código abierto, la investigación abierta y + reproducible y los datos abiertos. En el presente artículo tratamos sobre + **pyOpenSci**, un proyecto al servicio de la ciencia, desarrollado bajo el + enfoque de estas disciplinas. Si eres un programador, quieres desarrollar (o + estás desarrollando) algún paquete científico con + [Python](/blog/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/) + y que sea aceptado por una gran comunidad de _pythonistas_, entonces aquí está + lo que necesitas saber para lograrlo. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Las distintas disciplinas que abarca la ciencia abierta trabajan de manera +conjunta; tal es el caso del código abierto, la investigación abierta y +reproducible y los datos abiertos. En el presente artículo tratamos sobre +**pyOpenSci**, un proyecto al servicio de la ciencia, desarrollado bajo el +enfoque de estas disciplinas. Si eres un programador, quieres desarrollar (o +estás desarrollando) algún paquete científico con +[Python](/blog/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/) +y que sea aceptado por una gran comunidad de _pythonistas_, entonces aquí está +lo que necesitas saber para lograrlo. + + + +## ¿Qué es [pyOpenSci](https://www.pyopensci.org/)? + +pyOpenSci, también conocido como pyOpenScience, es un proyecto encargado de +promover la ciencia abierta mediante el apoyo al desarrollo, la +[_revisión por pares_](https://es.wikipedia.org/wiki/Revisi%C3%B3n_por_pares) y +la publicación abierta de **paquetes científicos escritos en Python** que +cuenten con una buena +[documentación](/blog/como-documentar-tu-proyecto-de-ciencia-abierta/) y estén +probados previamente. Estos paquetes son utilizados para recopilar, descargar y +transformar datos científicos con una metodología de trabajo abierta y +reproducible. + +El modelo de trabajo del proyecto está basado en la comunidad +[rOpenSci](https://ropensci.org/). pyOpenSci no trabaja solo, tiene una fuerte +vinculación con la +[Journal of Open Source Software (JOSS)](https://joss.theoj.org/), una revista +que fomenta la revisión por pares, la aceptación y la publicación de software de +código abierto. Por tanto, estas dos comunidades pueden verse como +complementarias entre sí. El enfoque en el proceso de revisión de pyOpenSci es +más práctico que el de la JOSS. Con pyOpenSci los autores pueden publicar sus +paquetes con un [DOI](https://www.doi.org/) (Digital Object Identifier) de +manera que puedan ser citados y encontrados por los buscadores de artículos +científicos. + +En este momento (noviembre 2022), pyOpenSci es un proyecto patrocinado +fiscalmente por Community Initiatives, razón por la cual se ha reanudado la +revisión del software desde septiembre de 2022. + +## Inicios de pyOpenSci, un relato de su fundador + +El proyecto pyOpenSci surgió por el pythonista +[**Steve Moss**](https://about.me/gawbul), el cual en el post +[Facilitating Open Science with Python](https://ropensci.org/blog/2013/05/16/pyopensci/), +publicado en el blog de rOpenSci en mayo del 2013, manifiesta las razones de +_¿Por qué Python?_, _¿Por qué pyOpenSci?_ donde textualmente dice: "quería, ante +todo, facilitar la mejora del campo científico, permitiendo y promoviendo la +apertura y el intercambio dentro y entre las comunidades científicas. Creo que +solo es posible que la ciencia progrese si se hace completamente transparente" +(traducción propia al español). De allí es donde se fundamentan los ideales de +pyOpenSci. + +El proyecto pretende mejorar y facilitar la apertura de la investigación +científica. Para ese momento Steve Moss tenía la esperanza de poder incentivar a +los investigadores a utilizar pyOpenSci para desarrollar, compartir y +comprometerse con sus estrategias y así hacer posible la ciencia abierta. Para +esto esperaba poder ofrecer talleres, sesiones de formación, consultoría y apoyo +y que pyOpenSci participara en actividades de divulgación dentro de las +comunidades. Algo que también expresa en su artículo. + +## ¿Cómo puedes contribuir a pyOpenSci? + +Puedes involucrarte en este proyecto de distintas maneras, a continuación te las +presentamos: + +- [**Súmate al foro comunitario**](https://pyopensci.discourse.group/). Un + espacio donde se discuten los temas de interés y se publican los anuncios de + nuevas reuniones. + +- **Envía un paquete**. Hazlo para apoyar a la comunidad científica de Python en + general y a la de pyOpenSci en específico. + +- **Puedes ser un revisor de paquetes**. + +- **Ayuda con la infraestructura técnica**. Tanto el sitio oficial del proyecto + como los otros sitios web, por ejemplo, necesitan mantenimiento y desarrollo. + +- **Participa activamente en la divulgación de pyOpenSci**. Comenta a tus amigos + y colegas, haz mención del proyecto en eventos abiertos y en tus redes + sociales. !Transmite la información para hacer crecer esta comunidad! + +## Colaboradores + +Según el fundador de pyOpenSci, para colaborar se necesita lo siguiente: "Además +de un amor por Python, uno debería tener un amor por ser abierto y transparente +sobre los temas que les apasionan". Esto lo expresó en su post para la comunidad +**rOpenSci** en 2013 (mencionado anteriormente). Donde resalta que, para ese +momento, solo era él en pyOpenSci y hasta la actualidad más de 30 personas han +colaborado con el proyecto, conformando una comunidad diversa de personas con un +fin común: ofrecer un lugar práctico en torno al software científico en Python y +donde se promuevan las buenas prácticas de ciencia abierta. + +Aquí te mencionamos algunas personas que han contribuido y son miembros activos +de pyOpenSci: [Leah Wasser](https://github.com/lwasser), +[Chris Holdraf](https://github.com/choldgraf), +[Max Joseph](https://github.com/mbjoseph), +[Ivan Ogasawara](https://github.com/xmnlab) miembro del Consejo Directivo de +nuestra plataforma Open Science Labs. + +## Paquetes pyOpenSci + +La comunidad pyOpenSci es la encargada de desarrollar, presentar, revisar y +promover los paquetes de software científico en Python. Al ser una comunidad +abierta, **cualquiera puede enviar un paquete para su revisión**. Puedes conocer +los paquetes que se encuentran actualmente en revisión accediendo a +[este repositorio GitHub](https://github.com/pyOpenSci/software-review/issues) y +los aceptados [aquí](https://www.pyopensci.org/python-packages/). + +Algunos de los paquetes aprobados hasta ahora por pyOpenSci son: + +- Lectura, desplazamiento temporal y la escritura de datos de sensores + [devicely](https://github.com/hpi-dhc/devicely) + +- Exploración y visualización de datos espaciales + [earthpy](https://github.com/earthlab/earthpy). + +- Diapositivas de + [Jupyter Notebooks](/blog/ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion/) + con [Nbless](https://github.com/py4ds/nbless). + +- Validación de las estructuras de datos manejadas por + [pandas](https://pandas.pydata.org/) con + [Pandera](https://github.com/pandera-dev/pandera). + +- Datos geoquímicos [pyrolite](https://github.com/morganjwilliams/pyrolite). + +- Integrar conjuntos de datos multimétricos + [OpenOmics](https://github.com/JonnyTran/OpenOmics) + +Pasemos ahora a conocer algunos de los sitios y recursos técnicos que mantiene +el proyecto (además de las reuniones y el foro). + +## pyOpenSci blog + +En este [blog](https://www.pyopensci.org/blog/) se abordan distintos tópicos, +entre ellos: + +- Eventos y actividades planificadas. + +- Paquetes que han pasado por el proceso de revisión. + +- Desafíos de pyOpenSci en la enorme comunidad de Python. + +## Otros recursos y sitios relacionados + +- [Organización pyOpenSci Github](https://github.com/pyOpenSci). Contiene el + [repositorio de revisión de software](https://github.com/pyOpenSci/software-review) + y otros. + +- [pyOpenSci cookiecutter](https://cookiecutter-pyopensci.readthedocs.io/en/latest/) + es una plantilla que facilita el empaquetado del código Python. + +- [Guía de desarrollo de paquetes](https://www.pyopensci.org/python-package-guide/) + y [Guía de revisión por pares](https://www.pyopensci.org/peer-review-guide/) + con información para los autores y revisores de los paquetes, que incluye todo + el proceso. Es lo primero que debes leer si estás interesado en enviar un + paquete a pyOpenSci. + +- [Repositorio de Gobernanza de pyOpenSci](https://github.com/pyOpenSci/governance). + Donde se discuten la dirección y el alcance de pyOpenSci. También ofrece notas + de las reuniones de la comunidad. + +La comunidad pyOpenSci está abierta para que envíes un paquete, te conviertas en +revisor, ayudes a difundir sus actividades y buenas prácticas o para que +participes en los foros donde tomarán en cuenta tus intervenciones. De esta +manera, estarás contribuyendo con la comunidad científica de Python. + +### Referencias + +- [Web site del Proyecto](https://www.pyopensci.org/) + +- [Web site de Steve Moss (fundador de pyOpenSci)](https://about.me/gawbul) + +- [Facilitating Open Science with Python](https://ropensci.org/blog/2013/05/16/pyopensci/) + +- [pyOpenSci Promoting Open Source Python Software To Support Open Reproducible Science](https://ui.adsabs.harvard.edu/abs/2019AGUFMNS21A..13W/abstract) diff --git a/content/blog/que-es-ciencia-ciudadana/header.png b/bkp/blogs/que-es-ciencia-ciudadana/header.png similarity index 100% rename from content/blog/que-es-ciencia-ciudadana/header.png rename to bkp/blogs/que-es-ciencia-ciudadana/header.png diff --git a/bkp/blogs/que-es-ciencia-ciudadana/index.md b/bkp/blogs/que-es-ciencia-ciudadana/index.md new file mode 100644 index 000000000..91933a721 --- /dev/null +++ b/bkp/blogs/que-es-ciencia-ciudadana/index.md @@ -0,0 +1,150 @@ +--- +title: "¿Qué es ciencia ciudadana?" +slug: que-es-ciencia-ciudadana +date: 2020-02-03 +authors: ["Rainer Palm"] +tags: [ciencia ciudadana, comunidad] +categories: [ciencia abierta, investigación abierta] +description: | + Comúnmente, existe una visión de la ciencia que la dibuja como una actividad que + se realiza de forma solitaria y apartada del grupo más numeroso de la sociedad, + que es desarrollada por científicos _asociales_ y que realizan sus + investigaciones de forma privada, casi oculta, y comparten su descubrimientos + solamente entre una comunidad selecta de individuos, casi todos hombres, + hablando con un vocabulario rebuscado y imposible de entender. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Comúnmente, existe una visión de la ciencia que la dibuja como una actividad que +se realiza de forma solitaria y apartada del grupo más numeroso de la sociedad, +que es desarrollada por científicos _asociales_ y que realizan sus +investigaciones de forma privada, casi oculta, y comparten su descubrimientos +solamente entre una comunidad selecta de individuos, casi todos hombres, +hablando con un vocabulario rebuscado y imposible de entender. + + + +Ya sea para buscar nuevas ideas, integrar más la comunidad científica en ámbitos +populares, para obtener colaboradores con los que trabajar, o para que una mayor +cantidad de personas adquieran conocimientos o habilidades relacionadas con una +investigación, la ciencia ciudadana involucra tanto científicos y profesionales +como a gente común, actuando como voluntarios en su proceso, es decir, en la +"recolección y analísis sístematico de los datos, desarollo de teconlogías, +pruebas de fenomenos naturales, y la difusión de esas actividades"[1], para de +esta forma romper generar un impacto mayor. + +Esta no es exactamente una práctica o idea nueva, pues ya antes tuvo otros +nombres, como investigación participativa. Sin embargo, las nuevas tecnologías +de comunicación (como las redes sociales) han ayudado a que la ciencia ciudadana +disfrute de una especie de renacimiento. Hay una multitud de historias con gran +notoriedad de personas totalmente desconocidas y ajenas a la comunidad +científica que, gracias a tener la oportunidad de aportar su granito de arena, +terminan descubriendo objetos celestes desconocidos, clasificando galaxias, +identíficando especies de aves, etc. Estas personas son lo que se conocen como +"cientificos ciudadanos", personas comunes y corrientes que contribuyen con +trabajo y datos a proyectos de investigadores académicos. + +Aunque es imposible saber con exactitud quienes fueron los primeros científicos +ciudadanos (ya que la _ciencia_ como institución es relativamente reciente), se +sabe que nuestros antepasados, sin ser exactamente investigadores o fílosofos +dedicados, solian practicar una especie de astronomía amateur, haciendo la parte +de observadores cuidadosos que simplemente, de forma intuitiva, descubrían +cuerpos estelares y monitoreaban aves y otros animales. En la era moderna, se +considera que los colonizadores americanos fueron los primeros científicos +ciudadanos como tal, registrando información exhaustiva acerca del clima y la +geografía, en un intento de entender cuando iban a caer las tormentas, usando +datos de una limitada cantidad de personas y buscando patrones que podrián +aparecer si se juntaban todos estos juntos. + +## Porque ciencia ciudadana? + +Existen muchos motios por los cuales la ciencia ciudadana debe recuperar su +papel en los aportes de la ciencia moderna. Te enumeramos algunos de los más +notables: + +- **Recolección de datos**: Dependiendo del objeto de estudio en cuestión, la + participación de una cantidad de personas de una variedad de trasfondos y + localidades puede ser necesaria para obtener una muestra lo suficientemente + amplia y exhaustiva. La colaboración de estas en forma de recolección de + ciertos datos (comportamiento de especies animales, estudio del movimiento de + ciertas plantas, alertas de plagas, etc.) puede ser fundamental para la + investigación, sin exigir necesariamente un sacrificio muy grande en cuanto a + tiempo y esfuerzo se refiere. + +- **Educación mediante la practica**: La ciencia ciudadana ofrece una + oportunidad perfecta para que quienes normalmente no se mueva en un entorno de + laboratorio científicos, pueda comenzar a participar en proyectos como + investigadores, y para que también de esta forma empiecen a desarollar + aptitudes y habilidades referentes al area en la que trabajen, sin mencionar + los conocimientos que obtengan como resultado del estudio conducido. + +- **Colaboración libre y abierta**: Los proyectos de ciencia ciudadana suelen + estar abiertos a todo tipo de personas, siempre y cuando estas quieran + involucrarse: sin importar que sean estudiantes, profesores, trabajadores, + jubilados, desempleados, etc. Los equipos científicos suelen establecer una + plataforma mediante la cual pueden participar los ciudadanos. Por ejemplo, + juegos que intenten explotar al máximo las capacidades intuitivas y racionales + de las personas, necesarias para algún problema difícil de resolver, como + Foldit [2], o aplicaciones que apunten a una audiencia regional, o en ciertos + casos, internacional; y luego recojer datos desde ahí. De esta forma se puede + recolectar datos desde una variedad de entes o grupos de personas de manera + paralela. Es cierto que un equipo científico no puede estar en todos los + lugares al mismo tiempo, pero de esta forma se pueden expandir el foco de la + investigación sin sacrificios significativos. + +- **Retroalimentación**: La ciencia ciudadana se establece una especie de + diálogo entre los ciudadanos que aportan sus datos y los científicos que + aportan sus conocimientos y enseñan métodos y analisis de estos. En esta + relación "entrada-salida", se logra plantear el problema estudiado dentro de + parametros mucho mas amplios, obteniendo una nueva perspectiva que es una + especie de síntesis entre la ciudadana y la científica. Los beneficios de + estos se pueden ver principalmente en la area de cambio clímatico y + biodiversidad, cuyas afirmaciónes suelen depender en estudios realizados + mediante ciencia ciudadana[3]. + +## Quienes hacen ciencia ciudadana? + +Como fue anteriormente mencionado, podemos ver el impacto que puede hacer esta +colaboración primordialmente en áreas donde se le deja la tarea de clasificar y +encontrar patrones a los ciudadanos. Un gejemplo interesante en este sentido, es +el proyecto Penguin Watch [4], que permite a cualquiera aportar su granito de +arena hacia 'entender cambios en la población de los pingüinos, y en sus índices +de supervivencia y reproducción', mediante observación de fotos tomadas por +drones y aviones, identíficando tanto pinguinos adultos y bebes como huevos de +estos, y otros animales. Sitios como Zooniverse[5] albergan una variedad de este +tipo de proyectos, donde se les permite a ciudadanos comunes colaborar en +proyectos tan extravagantes como Galaxy Zoo: Clump Scout, donde se estan +buscando galaxias 'grumosas', pocas y aisladas en la gran fabrica del universo, +aprovechando el incremento en el uso de instrumento de observación de astros. + +Para encontrar ejemplos de ciencia ciudadana que se hace en nuestro ámbito +regional, solo hace falta buscar. En sitios como Ciencia Ciudadana en España[6], +se muestran una variedad de instituciones y su localidad dentro de un mapa, +permitiendo a cualquiera facilmente participar y investigar mas en cuanto a +estos proyectos. En Cuba, por ejemplo, el desarollo de ciencia ciudadana ha +aportado mucho a programas de monitoreo de su biodiversidad, principalmente +destinados a apoyar estudios de conservación de aves[7]. En proyectos como +estos, se puede ver fácilmente en que áreas es mas eficaz la ciencia ciudadana: +problemas en los que se puede establecer de forma facil una plataforma por la +cual interactuan ciudadanos y cientificos, donde estos podrán realizar la tarea +de forma relajada y así ayudar a encontrar patrones. + +[1]: + http://www.openscientist.org/2011/09/finalizing-definition-of-citizen.html + "Finalizing a Definition of 'Citizen Science' and 'Citizen Scientists'" +[2]: https://fold.it/ "Foldit" +[3]: + https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0106508 + "The Invisible Prevalence of Citizen Science in Global Research: Migratory Birds and Climate Change" +[4]: + https://www.zooniverse.org/projects/penguintom79/penguin-watch + "Penguin Watch" +[5]: https://www.zooniverse.org/ "Zooniverse" +[6]: https://ciencia-ciudadana.es/ "Ciencia Ciudadana en España" +[7]: + http://repositorio.geotech.cu/xmlui/handle/1234/1226 + "Los Árboles, las Aves de la Ciudad y Yo: Proyecto de Ciencia Ciudadana del Museo Nacional de Historia Natural, de Cuba." diff --git a/content/blog/que-es-el-acceso-abierto-y-por-que-debes-tenerlo-en-cuenta-para-tus-investigaciones/header.png b/bkp/blogs/que-es-el-acceso-abierto-y-por-que-debes-tenerlo-en-cuenta-para-tus-investigaciones/header.png similarity index 100% rename from content/blog/que-es-el-acceso-abierto-y-por-que-debes-tenerlo-en-cuenta-para-tus-investigaciones/header.png rename to bkp/blogs/que-es-el-acceso-abierto-y-por-que-debes-tenerlo-en-cuenta-para-tus-investigaciones/header.png diff --git a/content/blog/que-es-el-acceso-abierto-y-por-que-debes-tenerlo-en-cuenta-para-tus-investigaciones/index.md b/bkp/blogs/que-es-el-acceso-abierto-y-por-que-debes-tenerlo-en-cuenta-para-tus-investigaciones/index.md similarity index 90% rename from content/blog/que-es-el-acceso-abierto-y-por-que-debes-tenerlo-en-cuenta-para-tus-investigaciones/index.md rename to bkp/blogs/que-es-el-acceso-abierto-y-por-que-debes-tenerlo-en-cuenta-para-tus-investigaciones/index.md index e6710a6bc..9a4f810d6 100644 --- a/content/blog/que-es-el-acceso-abierto-y-por-que-debes-tenerlo-en-cuenta-para-tus-investigaciones/index.md +++ b/bkp/blogs/que-es-el-acceso-abierto-y-por-que-debes-tenerlo-en-cuenta-para-tus-investigaciones/index.md @@ -1,23 +1,24 @@ --- -title: "¿Qué es el acceso abierto y por qué debes tenerlo en cuenta para tus investigaciones?" +title: + "¿Qué es el acceso abierto y por qué debes tenerlo en cuenta para tus + investigaciones?" slug: que-es-el-acceso-abierto-y-por-que-debes-tenerlo-en-cuenta-para-tus-investigaciones date: 2020-01-27 -author: Anavelyz Pérez +authors: ["Anavelyz Perez"] tags: [proyectos] categories: [ciencia abierta, acceso abierto] - -draft: false -usePageBundles: true +description: | + El acceso abierto es un término que se utiliza para definir aquellos proyectos + que están disponibles para todo público de forma libre y gratuita, en Internet o + cualquier otro medio. En este tipo de proyectos se permite copiar, utilizar o + distribuir el contenido con la condición de que se le den créditos al autor. thumbnail: "/header.png" -featureImage: "/header.png" +template: "blog-post.html" --- - - - El acceso abierto es un término que se utiliza para definir aquellos proyectos que están disponibles para todo público de forma libre y gratuita, en Internet o cualquier otro medio. En este tipo de proyectos se permite copiar, utilizar o @@ -88,8 +89,8 @@ ciertas barreras que facilita el proceso de publicación lo cual implica una retroalimentación continua entre investigadores. Es importante tener en cuenta que el acceso abierto en las investigaciones, ya -que permite promoverlas de manera efectiva a un amplio grupo de personas. Además, -se reconoce el trabajo y la autoría, se puede encontrar respaldo de +que permite promoverlas de manera efectiva a un amplio grupo de personas. +Además, se reconoce el trabajo y la autoría, se puede encontrar respaldo de instituciones o empresas para nuevas investigaciones y son un punto de partida para la investigación colaborativa. diff --git a/content/blog/que-es-el-codigo-abierto-y-como-puede-ayudarte/header.png b/bkp/blogs/que-es-el-codigo-abierto-y-como-puede-ayudarte/header.png similarity index 100% rename from content/blog/que-es-el-codigo-abierto-y-como-puede-ayudarte/header.png rename to bkp/blogs/que-es-el-codigo-abierto-y-como-puede-ayudarte/header.png diff --git a/content/blog/que-es-el-codigo-abierto-y-como-puede-ayudarte/index.md b/bkp/blogs/que-es-el-codigo-abierto-y-como-puede-ayudarte/index.md similarity index 52% rename from content/blog/que-es-el-codigo-abierto-y-como-puede-ayudarte/index.md rename to bkp/blogs/que-es-el-codigo-abierto-y-como-puede-ayudarte/index.md index 57249390d..0fe920970 100644 --- a/content/blog/que-es-el-codigo-abierto-y-como-puede-ayudarte/index.md +++ b/bkp/blogs/que-es-el-codigo-abierto-y-como-puede-ayudarte/index.md @@ -2,40 +2,43 @@ title: "¿Qué es el código abierto y cómo puede ayudarte?" slug: que-es-el-codigo-abierto-y-como-puede-ayudarte date: 2020-02-10 -author: Anavelyz Pérez +authors: ["Anavelyz Perez"] tags: [código, software] categories: [ciencia abierta, código abierto] - -draft: false -usePageBundles: true +description: | + Cuando escuchamos la palabra _código_ podríamos pensar que se trata de algo + oculto y secreto, en una contraseña o simplemente algún identificador. Sin + embargo, en el mundo computacional, por ejemplo, cuando se habla de _código_ se + hace referencia a una serie de palabras, números y símbolos que, combinadas, + corresponden a un conjunto de comandos que producen una solución, generan el + proceso de alguna tarea o forman un sistema en especifico. En desarrollo de + software, la palabra _código_ hace referencia a uno o varios lenguajes de + programación. thumbnail: "/header.png" -featureImage: "/header.png" +template: "blog-post.html" --- - - - -Cuando escuchamos la palabra *código* podríamos pensar que se trata de algo +Cuando escuchamos la palabra _código_ podríamos pensar que se trata de algo oculto y secreto, en una contraseña o simplemente algún identificador. Sin -embargo, en el mundo computacional, por ejemplo, cuando se habla de -*código* se hace referencia a una serie de palabras, números y símbolos que, -combinadas, corresponden a un conjunto de comandos que producen una solución, -generan el proceso de alguna tarea o forman un sistema en especifico. En -desarrollo de software, la palabra *código* hace referencia a uno o varios -lenguajes de programación. +embargo, en el mundo computacional, por ejemplo, cuando se habla de _código_ se +hace referencia a una serie de palabras, números y símbolos que, combinadas, +corresponden a un conjunto de comandos que producen una solución, generan el +proceso de alguna tarea o forman un sistema en especifico. En desarrollo de +software, la palabra _código_ hace referencia a uno o varios lenguajes de +programación. -El término *código abierto* se refiere al modo en que se tiene acceso al código que -involucra un software. Es decir, el software creado por algún grupo o individuo -que se etiquete como de código abierto, tendrá su código fuente disponible para -todo público de forma libre, en Internet o cualquier otro medio, podrá ser -copiado, utilizado y distribuido siempre y cuando se respeten los términos -establecidos por quien lo diseñó. Este tipo de proyectos ha permitido el -intercambio constante de conocimiento de manera tal que el software reciba +El término _código abierto_ se refiere al modo en que se tiene acceso al código +que involucra un software. Es decir, el software creado por algún grupo o +individuo que se etiquete como de código abierto, tendrá su código fuente +disponible para todo público de forma libre, en Internet o cualquier otro medio, +podrá ser copiado, utilizado y distribuido siempre y cuando se respeten los +términos establecidos por quien lo diseñó. Este tipo de proyectos ha permitido +el intercambio constante de conocimiento de manera tal que el software reciba mejoras continuamente, se aplique en distintos ámbitos y se amplíen las capacidades del software. @@ -47,23 +50,25 @@ necesitamos para conseguir resultados óptimos. Entre algunas de esas tareas puede estar el cálculo de una serie de indicadores, la creación de documentos con un formato similar, la edición, almacenamiento y procesamiento de los datos. -Ahora bien, si prestamos atención a estas tareas muchas veces las podemos considerar -repetitivas, porque bajo condiciones similares se realiza el mismo procedimiento. -Esto ha permitido que se desarrollen herramientas, aplicaciones y software por -parte de las empresas e individuos, de manera que permitan, faciliten y ahorren -tiempo en los procesos. - -Es aquí cuando el código abierto puede ser de mucha ayuda, dado que donde se requiera -un software o una serie de comandos que resuelvan una tarea en específica, se abre -un abanico de posibilidades para reutilizar código previamente desarrollado por otro equipo de trabajo, y encontrarás distintas fuentes de información para localizarlo, pues la -retroalimentación del conocimiento es constante. En otras palabras, el código -abierto es una forma de inteligencia colectiva en la cual muchas personas están -involucradas, comparten y colaboran. Además, están dispuestos a ayudar con sus -conocimientos poniendo a disposición sus trabajos. Logrando así una mayor -interacción entre expertos en el área y personas que se inician en el tema -central es decir, una comunidad. Para que estas comunidades surjan sólo es -necesaria una plataforma de comunicación que muchas veces puede ser un foro, en el cual -se realizan consultas y sugerencias. +Ahora bien, si prestamos atención a estas tareas muchas veces las podemos +considerar repetitivas, porque bajo condiciones similares se realiza el mismo +procedimiento. Esto ha permitido que se desarrollen herramientas, aplicaciones y +software por parte de las empresas e individuos, de manera que permitan, +faciliten y ahorren tiempo en los procesos. + +Es aquí cuando el código abierto puede ser de mucha ayuda, dado que donde se +requiera un software o una serie de comandos que resuelvan una tarea en +específica, se abre un abanico de posibilidades para reutilizar código +previamente desarrollado por otro equipo de trabajo, y encontrarás distintas +fuentes de información para localizarlo, pues la retroalimentación del +conocimiento es constante. En otras palabras, el código abierto es una forma de +inteligencia colectiva en la cual muchas personas están involucradas, comparten +y colaboran. Además, están dispuestos a ayudar con sus conocimientos poniendo a +disposición sus trabajos. Logrando así una mayor interacción entre expertos en +el área y personas que se inician en el tema central es decir, una comunidad. +Para que estas comunidades surjan sólo es necesaria una plataforma de +comunicación que muchas veces puede ser un foro, en el cual se realizan +consultas y sugerencias. ``` Una de las comunidades de código abierto más grande del mundo es @@ -71,16 +76,16 @@ GitHub, en la cual se alojan millones de proyectos a lo largo y ancho de todo e ``` Los proyectos bajo el código abierto pueden ser utilizados por cualquier persona -para casi cualquier propósito y, por tanto, se pueden emplear para construir otras cosas. Es -decir, son de estándar abierto, están a disposición del público aunque pueden tener varios -derechos de uso asociados. +para casi cualquier propósito y, por tanto, se pueden emplear para construir +otras cosas. Es decir, son de estándar abierto, están a disposición del público +aunque pueden tener varios derechos de uso asociados. Cualquiera puede inspeccionar un proyecto de código abierto en busca de errores e inconsistencias, permitiendo que sea transparente. Este aspecto es muy -importante dado que posibilita que, por ejemplo, los entes gubernamentales e instituciones que -tienen una serie de restricciones permitan su práctica sin problema alguno, y se -sentirán confiados sobre la manera en que la información sea utilizada, pues podría ser -monitoreada. +importante dado que posibilita que, por ejemplo, los entes gubernamentales e +instituciones que tienen una serie de restricciones permitan su práctica sin +problema alguno, y se sentirán confiados sobre la manera en que la información +sea utilizada, pues podría ser monitoreada. Finalmente, el código abierto recibe un aporte considerable por parte de empresas importantes a nivel informático apoyando el surgimiento de nuevos diff --git a/content/blog/que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo/header.png b/bkp/blogs/que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo/header.png similarity index 100% rename from content/blog/que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo/header.png rename to bkp/blogs/que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo/header.png diff --git a/bkp/blogs/que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo/index.md b/bkp/blogs/que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo/index.md new file mode 100644 index 000000000..19ffd0869 --- /dev/null +++ b/bkp/blogs/que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo/index.md @@ -0,0 +1,141 @@ +--- +title: + "Te contamos qué es el Data Version Control (DVC) y por qué es necesario que + tu equipo sepa cómo utilizarlo" +slug: que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo +date: 2021-03-22 +authors: ["Yurely Camacho"] +tags: [dvc, datos, versionado] +categories: + [ + ciencia abierta, + investigación abierta, + desarrollo de software, + control de versiones, + ] +description: | + Cuando colaboramos en proyectos que involucran un manejo y transformación + constante de conjuntos de datos y/o modelos derivados de estos, nos vemos en la + necesidad de indagar y poner en práctica técnicas que permitan tener un control + de todos los cambios realizados en ellos durante la investigación; para lo cual + se necesitan herramientas que lo hagan posible. Allí entra en juego el _Control + de versiones de datos_ o Data Version Control (DVC). +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Cuando colaboramos en proyectos que involucran un manejo y transformación +constante de conjuntos de datos y/o modelos derivados de estos, nos vemos en la +necesidad de indagar y poner en práctica técnicas que permitan tener un control +de todos los cambios realizados en ellos durante la investigación; para lo cual +se necesitan herramientas que lo hagan posible. Allí entra en juego el _Control +de versiones de datos_ o Data Version Control (DVC). + + + +En este apartado definimos brevemente el control de versiones de datos, +mencionamos algunas herramientas o _Sistemas de control de versiones_ que +permiten hacerlo y también listamos las ventajas que tiene su uso en equipos de +trabajo. + +En nuestro artículo +[Investigación colaborativa con Git](/blog/investigacion-colaborativa-con-git/) +mencionamos que los _Sistemas de control de versiones_ permiten almacenar los +cambios realizados en los archivos en todas sus fases de desarrollo y también la +información asociada a ellos (fecha y autoría de los cambios). En la mayoría de +ocasiones, se utilizan en entornos de desarrollo de software, pero son realmente +útiles cuando necesitamos un control sobre cualquier tarea que estemos +ejecutando. Para este caso hablamos de transformar conjuntos de datos y +experimentar, por ejemplo, modelos de Machine Learning donde el seguimiento de +todos los pasos y dependencias entre el código y los conjuntos de datos es +fundamental. + +En el control de versiones de datos (y en general, de cualquier tipo de +archivo), podemos ver las versiones como "fotografías" que registran el estado +en ese momento del tiempo. Luego se van tomando más fotografías (guardando +nuevas versiones) a medida que se hacen modificaciones, en este caso, a +conjuntos de datos o a _scripts_ de actualización o transformación de estos +(especificación y prueba de modelos). De tal forma que podamos experimentar +modelos, observar qué modelos funcionaban con cuál conjunto de datos, reproducir +experimentos anteriores o restaurar la investigación a una versión antigua en +cualquier momento. + +A continuación se mencionan algunas herramientas de software libre para el +versionado de conjuntos de datos y bases de datos. + +- [DVC](https://dvc.org/) +- [Pachyderm](https://www.pachyderm.com/) +- [Liquibase](https://www.liquibase.org/) +- [Dat](https://dat.foundation/) +- [Git lfs](https://git-lfs.github.com/) +- [Git-annex](https://git-annex.branchable.com/) + +En este punto hablaremos un poco sobre DVC, una de las herramientas más +utilizadas para el versionado de datos en la actualidad. + +### [DVC](https://dvc.org/) + +Es una herramienta gratuita y de código abierto empleada, mayormente, en +proyectos de ciencia de datos y Machine Learning facilitando la colaboración y +reproducibilidad. La parte central del DVC es el versionado de datos para +archivos grandes, modelos de Machine Learning, conjuntos de datos y flujo de +trabajo. Como DVC hace que los proyectos sean reproducibles y compartibles; +podemos saber cómo se construyeron y probaron los modelos y cómo han sido +transformados los datos originales. DVC está basado en +[Git](/blog/git-de-en-diez-sencillos-pasos/); aunque puede funcionar de manera +autónoma (pero sin capacidad de versionado). "Es como un Git solo para Datos". + +Esta herramienta se desarrolló en un 98% bajo el lenguaje de programación +**Python**. + +#### Características principales + +- DVC funciona sobre los repositorios de Git y tiene una interfaz y un flujo de + línea de comandos similares a este. + +- No requiere la instalación y el mantenimiento de bases de datos. + +- Puede ser ejecutado en los principales sistemas operativos (Linux, Windows y + MacOS). Funciona independientemente de los lenguajes de programación o de las + bibliotecas de Machine Learning utilizadas en el proyecto. + +- Es rápido de instalar, no depende de APIs o servicios externos. + +[Aquí puedes acceder al Repositorio de GitHub del proyecto DVC](https://github.com/iterative/dvc) + +## Ventajas de implementar el control de versiones de datos + +El tener un seguimiento de los cambios en conjuntos de datos y scripts de +especificación y prueba de modelos en una investigación, proporciona una serie +de beneficios o ventajas como las mencionadas a continuación: + +- Guardan toda la historia del proyecto. + +- El trabajo en equipo es más sencillo, debido a la especificación de fechas y + autorías de cambios; aumentando la capacidad de colaborar en un proyecto. + +- Permite el acceso compartido a los archivos y el desarrollo de ramas para + experimentar cambios. + +- No te preocupes si alguien comete un error o sobrescribe algo importante, + puedes volver a versiones anteriores en cualquier momento. + +- Facilita la reproducibilidad de modelos de aprendizaje automático en ciencia + de datos. + +- Permite que los desarrolladores de un proyecto, que trabajan en un mismo + archivo de datos, combinen de forma eficiente las ideas y cambios. + +En **OpenScienceLabs** te invitamos a utilizar el versionado de datos y de +modelos de Machine Learning con DVC, para que puedas llevar un seguimiento +adecuado de los cambios de los conjuntos de datos y modelos durante todas las +fases del proyecto, haciendo más eficiente dicho proceso. + +#### Referencias + +- [Herramientas de control de versiones](https://blog.dinahosting.com/herramientas-de-control-de-versiones/) + +- [Website oficial de la herramienta DVC](https://dvc.org/) diff --git a/content/blog/que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos/header.png b/bkp/blogs/que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos/header.png similarity index 100% rename from content/blog/que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos/header.png rename to bkp/blogs/que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos/header.png diff --git a/bkp/blogs/que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos/index.md b/bkp/blogs/que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos/index.md new file mode 100644 index 000000000..630eb36de --- /dev/null +++ b/bkp/blogs/que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos/index.md @@ -0,0 +1,215 @@ +--- +title: "¿Qué es el Lenguaje R y cómo puede ayudarte en tus proyectos?" +slug: que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos +date: 2020-01-17 +authors: ["Yurely Camacho"] +tags: [rstudio, rmarkdown, proyectos, markdown] +categories: [ciencia de datos, estadística, R, aprendizaje] +description: | + Si eres una persona con deseos de desarrollar proyectos de código abierto que + puedan ser compartidos, quieres replicar y /o mejorar proyectos existentes o + convertirte en un científico de datos, es muy probable que hayas leído o + escuchado sobre el [Lenguaje R](https://www.r-project.org/). En este post + daremos un paso breve sobre sus características, las posibilidades de emplearlo + en tus proyectos y las oportunidades laborales que tendrás cuando aprendas a + utilizarlo. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Si eres una persona con deseos de desarrollar proyectos de código abierto que +puedan ser compartidos, quieres replicar y /o mejorar proyectos existentes o +convertirte en un científico de datos, es muy probable que hayas leído o +escuchado sobre el [Lenguaje R](https://www.r-project.org/). En este post +daremos un paso breve sobre sus características, las posibilidades de emplearlo +en tus proyectos y las oportunidades laborales que tendrás cuando aprendas a +utilizarlo. + + + +Antes de conocer sobre R, vamos primero a resaltar la importancia que tiene y ha +tenido la **Estadística** en distintos ámbitos, ya te darás cuenta por qué lo +hacemos. Como profesional en cualquier área, habrás estudiado o al menos te +mencionaron la palabra estadística. El mundo y las situaciones cotidianas están +rodeadas de incertidumbre y la estadística es la disciplina que se encarga de +estudiarla. Sin embargo, para implementarla y conocer su gran potencialidad, +resulta necesario manejar una herramienta que sea fácil de aprender, que cuente +con la aprobación de un gran número de analistas de datos, que esté en constante +actualización y que sea demandada en grandes empresas. En efecto, el lenguaje R +cumple con estos y otros requerimientos. + +R fue desarrollado por los estadísticos +[**Robert Gentlemann**]() +y [**Ross Ihaka**](https://en.wikipedia.org/wiki/Ross_Ihaka) del Departamento de +Estadística de la +[**Universidad de Auckland**](http://www.nuevazelanda.cl/universidades/university-of-auckland.htm) +en 1993. El acrónimo R se deriva de los nombres de sus desarrolladores. +Actualmente es un proyecto de software libre para la computación estadística y +los gráficos. Es _colaborativo, gratuito, de código abierto_ y se encuentra a +cargo del **R Development Core Team**. Esto quiere decir, que detrás del +proyecto existe una comunidad de usuarios y programadores que buscan mejorar y +desarrollar nuevas funcionalidades para el lenguaje. R se perfila como un +lenguaje para estadísticos, sin embargo cualquier persona interesada puede +utilizarlo. Está pensado para que los usuarios implementen funciones +estadísticas, desde las más básicas como el cálculo de promedios, la generación +de publicaciones con aplicaciones web, la aplicación de técnicas de machine +learning, hasta la generación de gráficos interactivos y de alta calidad. Tienes +todo lo que necesitas en un mismo lenguaje. + +Puedes utilizar R a través de línea de comandos, sin embargo te recomendamos que +utilices un **Entorno de Desarrollo Integrado (IDE)**, por ejemplo +[**RStudio**](https://rstudio.com/) (el cual desde octubre del 2022 se +convertirá en [Posit](https://posit.co/)) que es uno de los más utilizados por +su fácil empleo y las amplias funcionalidades que ofrece. + +Ahora bien, ya que conoces un poco más sobre R, quizás en este momento te +preguntarás: + +**¿De qué me puede servir aprender este lenguaje?** + +La respuesta es simple pero extensa, aquí te presentamos algunas razones para +que te animes a utilizar R: + +- Si necesitas resumir, visualizar y analizar cualquier cantidad de datos, R es + una buena alternativa porque es fácil de aprender. Solo necesitas tener a + disposición un computador, tiempo y sed de conocimientos. + +- Cualquier funcionalidad estadística, como el cálculo de medidas descriptivas, + la generación de gráficos potentes y de alta calidad (estáticos y dinámicos) + pueden ser fácilmente implementados con R. Tienes todo lo que necesitas en un + mismo lenguaje. + +- Mediante la generación de [**Scripts**](https://es.wikipedia.org/wiki/Script) + puedes tener almacenado y a disposición inmediata el código y los datos + originales (por ejemplo un archivo .csv más el script de R) para resolver un + problema en particular. Esto te permite reutilizarlo y también compartirlo + haciéndolo _reproducible y colaborativo_. + +- Los entornos de desarrollo integrado, como _Rstudio_, facilitan el desarrollo + y te permiten manejar el lenguaje de una manera amigable. En una ventana + podrás ejecutar el código, en otra se mostrará la salida, también tienes una + ventana para ver las variables que has guardado y otra disponible para que + guardes tu script, todo en un mismo lugar. + +- R te permite obtener resultados detallados y generar reportes profesionales + con ayuda de herramientas como + [**Rmarkdown**](https://rmarkdown.rstudio.com/). Con esta funcionalidad puedes + exportarlos a formatos como HTML y PDF. Tu jefe, o la persona interesada en + tus reportes, quedará impresionado cuando le presentes un informe detallado + utilizando R. + +- Como mencionamos antes, es un software de gran demanda en el mundo laboral, y + conocerlo puede mejorar tus posibilidades de empleo. Actualmente las empresas + buscan analizar sus datos para tomar decisiones informadas y en base a ello, + obtener ventajas competitivas. Por tal motivo, si cuentas con algunas + habilidades para el procesamiento y análisis de datos, puedes darle valor a tu + perfil profesional utilizando R. + +- Si te animas, muy pronto podrás formar parte de los desarrolladores de R + incorporando librerías y paquetes para funciones estadísticas. + +- Aunque no tienes que ser un estadístico ni un programador para usar R, te + recomendamos que aprendas los aspectos básicos sobre la interpretación de + estadísticas y gráficos, y de dónde se derivan; esto te será de gran ayuda a + la hora de generar reportes y/o interpretar resultados. Lo más importante es + la disposición y el ánimo que tengas, recuerda que R es fácil de aprender. + +- En la web, en libros y tutoriales disponibles en la + [página oficial de R](https://www.r-project.org/) encontrarás la documentación + necesaria para que aprendas a utilizar este lenguaje y conozcas las funciones + y paquetes a tu disposición. El acceso a la documentación de R es totalmente + gratuita, una de las características más resaltantes del lenguaje. + +- Con R puedes procesar datos de distintos formatos ya que, entre otras cosas, + permite leer datos de diferentes software como SPSS, SAS o Excel. + +- El sistema operativo de tu computador tampoco es un inconveniente a la hora de + trabajar con R, ya que es compatible con Windows, Linux y MacOS. + +- Como R es de código y acceso abierto, permite hacer control de versiones + usando una herramienta como [**Git**](https://git-scm.com/), entre otras. + +- Actualmente se encuentran disponibles más de 2300 bibliotecas desarrolladas en + R y puedes descargarlas a través del + [Comprehensive R Archive Network (CRAN)](https://cran.r-project.org/mirrors.html). + ¡Imagina todo lo que puedes hacer para procesar tus datos con estas + bibliotecas!. + +En el post +[**Gigantes informáticos dan su apoyo al lenguaje de programación R**](https://diarioti.com/gigantes-informaticos-dan-su-apoyo-al-lenguaje-de-programacion-r/88705) +indican que [_Microsoft_](https://www.microsoft.com/es-ve), +[_Google_](https://about.google/), +[_HP_](http://welcome.hp.com/country/us/en/c/welcome.html) y +[_Oracle_](https://www.oracle.com/index.html) se han sumado al consorcio R +porque apoyan el desarrollo de este lenguaje. Si esto es así, debe ser porque +tiene altas potencialidades ¿qué opinas? + +De la misma manera, grandes e influyentes empresas reconocen sus capacidades, +entre ellas [_NASA_](https://www.nasa.gov/), +[_Banco Santander_](https://www.santander.com/es/home), +[_Samsung_](https://www.samsung.com/), +[_Western Union_](https://www.westernunion.com/ve/es/home.html), +[_eBay_](https://ve.ebay.com/), [_Honda_](https://www.honda.com/), +[_Hyundai_](https://www.hyundai.es/), [_Avon_](https://www.avon.com/), +[_Nestle_](https://www.nestle.com/), entre otros según lo mencionado en +[este post](https://www.maximaformacion.es/blog-dat/para-quien-esta-pensado-r-software/). + +**Quizás también te preguntarás ¿tiene inconvenientes?** + +Pues si, aunque R es potente en el ámbito estadístico y de ciencia de datos, _no +es un lenguaje de programación de propósito general_. Los lenguajes de propósito +general, como su nombre lo indica, pueden ser utilizados con distintos fines, +entre ellos la comunicación entre computadoras y dispositivos, el acceso y +manejo de bases de datos, el diseño de imágenes o páginas, la creación de +sistemas operativos, compiladores, entre otras cosas y, como ya mencionamos, R +es utilizado principalmente como un lenguaje estadístico. Asimismo, en algunos +casos, puede resultar lento si se compara con otros lenguajes de programación, +como Python. + +A continuación presentamos dos estudios formales donde se refleja el lugar que +ocupa R con respecto a su uso. + +1. La + [**20ª Encuesta Anual de KDnuggets Software Poll 2019**](https://www.kdnuggets.com/2019/05/poll-top-data-science-machine-learning-platforms.html) + la cual contó con más de 1.800 participantes, donde _Python_ obtuvo el primer + lugar. Sin embargo, R no se queda atrás en esta encuesta y junto con otro + lenguaje llamado _RapidMiner_ son usados aproximadamente por el 50% de los + participantes. + +1. En el **Estudio de popularidad de lenguajes de programación** + [PYPL PopularitY of Programming Language](https://pypl.github.io/PYPL.html) + basado en la cantidad de tutoriales que se buscan en google, para este año R + ocupa el séptimo lugar. + +Quizás estés pensando que no saber programar es una limitante para aprender R. +Eso no debería preocuparte, porque hay una cantidad importante de tutoriales que +pueden aportarte ideas para comenzar, y también puedes probar con códigos de +ejemplo y datos reales que son de acceso abierto. En las referencias te dejamos +algunos enlaces de tutoriales de R, libros y algunas Cheatsheets (hojas de +referencia). + +### Algunos libros para que te inicies con R + +[Libro R para principiantes](https://cran.r-project.org/doc/contrib/rdebuts_es.pdf) + +La traducción al español de “An Introduction to R”. +[Libro "Una Introducción a R"](https://cran.r-project.org/doc/contrib/R-intro-1.1.0-espanol.1.pdf) + +### Hojas de referencia "Cheatsheets" + +[Manejo de datos](https://rstudio.com/wp-content/uploads/2015/03/data-wrangling-spanish.pdf) + +[Rmarkdown](https://rstudio.com/wp-content/uploads/2015/03/rmarkdown-spanish.pdf) + +#### Referencias + +[Website de R](https://www.r-project.org/) + +[R, un lenguaje y entorno de programación para análisis estadístico](https://www.genbeta.com/desarrollo/r-un-lenguaje-y-entorno-de-programacion-para-analisis-estadistico) + +[QUÉ ES R SOFTWARE](http://www.maximaformacion.es/blog-dat/que-es-r-software/) + +[¿PARA QUIÉN ESTÁ PENSADO R SOFTWARE?](https://www.maximaformacion.es/blog-dat/para-quien-esta-pensado-r-software/) diff --git a/content/blog/que-es-el-open-science-framework/header.png b/bkp/blogs/que-es-el-open-science-framework/header.png similarity index 100% rename from content/blog/que-es-el-open-science-framework/header.png rename to bkp/blogs/que-es-el-open-science-framework/header.png diff --git a/bkp/blogs/que-es-el-open-science-framework/index.md b/bkp/blogs/que-es-el-open-science-framework/index.md new file mode 100644 index 000000000..79fb5c139 --- /dev/null +++ b/bkp/blogs/que-es-el-open-science-framework/index.md @@ -0,0 +1,111 @@ +--- +title: "Que es el Open Science Framework?" +slug: que-es-el-open-science-framework +date: 2021-04-19 +authors: ["Rainer Palm"] +tags: [osf, framework, proyectos] +categories: [ciencia abierta, investigación abierta] +description: | + El Open Science Framework (OSF)[1] es un conjunto de herramientas diseñadas + tanto para organizar, facilitar y mantener el proceso de vida de la + investigación, como para la captura de los distintos estados que esta toma a lo + largo de su realización. Mediante la creación de un "proyecto" (asociado a un + DOI) y su respectiva wiki en su sitio web[1], los usuarios son llevados a un + dashboard donde podrán administrar de manera sencilla archivos, componentes + ("subproyectos"), metadatos, usuarios, y demás, con su respectivo registro de + actividad, que junto a un sistema de control de versiones permiten la eficaz + revisión de cualquier error que se presenté. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + +El Open Science Framework (OSF)[1] es un conjunto de herramientas diseñadas +tanto para organizar, facilitar y mantener el proceso de vida de la +investigación, como para la captura de los distintos estados que esta toma a lo +largo de su realización. Mediante la creación de un "proyecto" (asociado a un +DOI) y su respectiva wiki en su sitio web[1], los usuarios son llevados a un +dashboard donde podrán administrar de manera sencilla archivos, componentes +("subproyectos"), metadatos, usuarios, y demás, con su respectivo registro de +actividad, que junto a un sistema de control de versiones permiten la eficaz +revisión de cualquier error que se presenté. + + + +Este sistema fue creado por el Center for Open Science (COS)[2], una +organización sin fines de lucro fundada en el 2013 en Charlottesville, Virginia +con el proposito de incentivar e incrementar la integridad, reproducibilidad y +transparencia de la investigación científica sin importar la disciplina en la +que se desenvuelva. Como parte de su misión de crear la infraestructura +necesaria para alcanzar estos objetivos, desarrollaron el OSF, el cual es +utilizado por una variedad de instituciones alrededor del mundo y posée soporte +para una multitud de servicios (tales como Google Scholar, Dropbox, Zotero, o +SSO) que permite que pueda ser integrado de manera continua y inobstructiva en +el flujo de investigación. + +## ¿Como funcióna el Open Science Framework? + +Como fue anteriormente mencionado, el OSF funciona mediante una pagina web que +mantenga un repositorio de "proyectos", tal como la pagina del OSF en si[1] o +cualquiera de la multitud de universidades que alojan y mantienen sus propios +repositorios. En estos repositorios, los usuarios crean proyectos en los cuales +pueden alojar información y archivos, hacerlos tanto públicos como privados e +invitar colaboradores para trabajar dentro de la plataforma. A su conveniencia, +se pueden asignar tanto privilegios individuales para los usuarios como +identificadores a los contenidos que son agregados al proyecto, y de esta forma +mantenerlo y publicitarlo de una forma mas eficaz. El OSF también posee métricas +a nivel de proyecto, que informan a los administradores de este de cuantas +personas han visto o descargado los contenidos. + +Además, ya que es una plataforma que intenta abrir la posibilidad de que hayan +practicas mas abiertas y colaborativas en las ciencias, permite la creación y el +uso de complementos de terceros, principalmente para integrar con mayor +facilidad servicios como Zotero o Dropbox en el manejo de citaciones y +almacenamiento, respectivamente. Aunque el OSF tiene restricciones de +almacenamiento para los archivos (individualmente no pueden pasar los 5GB), de +esta manera se hace practicamente ilimitada. + +Algo que distingue al OSF de otros programas similares es que, con el proposito +de fomentar la transparencia y la reproducibilidad, cada proyecto se puede +"registrar", y de esta forma mantenerse de manera indefinida una versión con +estampilla de tiempo del proyecto, que no puede ser editada ni borrada según la +voluntad del creador. Además, a esta versión registrada del proyecto se le puede +dar un identificador DOI o ARK, y cualquier contenido que sea alojado en sitios +de terceros es copiado como parte del proceso de registración. + +## ¿Quienes utilizan el Open Science Framework? + +La comunidad de OSF es bastante amplia. Basta con ver los numerosos repositorios +de instituciones universitarias que lo utilizan para hospedar archivos[4]. En sí +la plataforma gano notoriedad gracias al Psychology Reproducibility Study, un +meta-estudio en el cual colaboró la Universidad de Virginia con el COS para +replicar 100 estudios notables de psicología y ver si podían recibir los mismos +resultados. Todo el proceso de investigación fue compartido de manera abierta en +el OSF[5], permitiendo a cualquiera revisar los resultados con comodidad. + +A pesar de que su principal audiencia son los investigadores y las instituciones +en las que estos trabajan, tienen una serie de aplicaciones y herramientas +gratis diseñadas para la interacción de sus usuarios con personas fuera del +area. Estas son herramientas tales como OSF for Meetings[6], donde pueden subir +posters y presentaciones de conferencias y reuniones y OSF Preprints[7], donde +pueden compartir preprints con el proposito de recibir opiniones y exposición, y +se le otorga a cada uno un identificador unico. + +Inclusive mas alla de las necesidades de investigadores profesionales y +colaboraciones grandes, el OSF resulta ser una asombrosa herramienta de +organización para cualquiera que necesita una plataforma en la cual revisar, +alojar, analizar, y compartir archivos entre los colaboradores de un estudio +abierto, con capacidades unicas en cuanto al control de versiones, +identificadores, y transparencia de los datos de investigación se refiere. +Cualquiera interesado en utilizar el OSF es libre de crear una cuenta gratis y +utilizarlo, así que, si te interesa, porque no probarlo? + +[1]: https://osf.io "Open Science Framework" +[2]: https://cos.io "Center for Open Science" +[4]: https://osf.io/institutions?view_only= "OSF Institutions" +[5]: + http://osf.io/ezum7 + "Estimating the Reproducibility of Psychological Science" +[6]: https://osf.io/meetings "OSF for Meetings" +[7]: https://osf.io/preprints "OSF Preprints" diff --git a/content/blog/que-es-la-ciencia-abierta/componentes.png b/bkp/blogs/que-es-la-ciencia-abierta/componentes.png similarity index 100% rename from content/blog/que-es-la-ciencia-abierta/componentes.png rename to bkp/blogs/que-es-la-ciencia-abierta/componentes.png diff --git a/content/blog/que-es-la-ciencia-abierta/header.png b/bkp/blogs/que-es-la-ciencia-abierta/header.png similarity index 100% rename from content/blog/que-es-la-ciencia-abierta/header.png rename to bkp/blogs/que-es-la-ciencia-abierta/header.png diff --git a/bkp/blogs/que-es-la-ciencia-abierta/index.md b/bkp/blogs/que-es-la-ciencia-abierta/index.md new file mode 100644 index 000000000..a76d21e82 --- /dev/null +++ b/bkp/blogs/que-es-la-ciencia-abierta/index.md @@ -0,0 +1,177 @@ +--- +title: "¿Qué es la ciencia abierta?" +slug: que-es-la-ciencia-abierta +date: 2020-01-06 +authors: ["Yurely Camacho"] +tags: [datos] +categories: [ciencia abierta] +description: | + Si buscas la democratización del conocimiento, oportunidades de intercambio y + colaboración, mayor productividad científica, y mucho más, la **Ciencia + Abierta** es el camino. La producción del conocimiento científico se verá + revolucionado gracias a esta forma de hacer ciencia. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + +Si buscas la democratización del conocimiento, oportunidades de intercambio y +colaboración, mayor productividad científica, y mucho más, la **Ciencia +Abierta** es el camino. La producción del conocimiento científico se verá +revolucionado gracias a esta forma de hacer ciencia. + + + +Los avances constantes del internet y las redes han hecho posible y facilitan +mucho más la búsqueda e intercambio de información en distintos ámbitos. Esto se +considera un factor importante para el desarrollo de la Ciencia Abierta. Para +mostrarte un concepto claro sobre este término, comencemos por citar algunas +definiciones que se encuentran en la web y libros sobre el tema. + +- La ciencia abierta es la práctica de la ciencia de tal manera que otros puedan + colaborar y contribuir, donde los datos de la investigación, las notas de + laboratorio y otros procesos de investigación están disponibles gratuitamente, + bajo términos que permiten la reutilización, redistribución y reproducción de + la investigación, sus datos y métodos subyacentes + (FOSTER)[https://www.fosteropenscience.eu/foster-taxonomy/open-science-definition] + +- La OCDE (2016) indica que “ciencia abierta se refiere a los esfuerzos para + hacer que el proceso científico sea más abierto e inclusivo a todos los + actores relevantes, dentro y fuera de la comunidad científica, como lo permite + la digitalización”. + +- Según (The Royal Society, 2012) la ciencia abierta se define como “datos + abiertos (disponibles, inteligibles, accesibles y datos utilizables) combinado + con el acceso abierto a las publicaciones científicas y la comunicación + efectiva de sus contenidos” + +Podemos resaltar entonces, que la ciencia abierta es un movimiento, una manera +de ver y hacer ciencia, que busca crear una cultura donde la información de todo +el proceso de investigación científica, ya sean los datos, protocolos, cuadernos +de laboratorio, resultados obtenidos en las diferentes etapas de este proceso, +sean gratuitos y de libre acceso. De esta manera, todas las personas +involucradas en el proceso de investigación, ya sean los propios científicos, +instituciones de investigación y financiamiento, y público en general, pueden +contribuir y colaborar con el esfuerzo de investigación. Con esto se garantiza +que el trabajo científico sea abierto e inclusivo, donde el investigador se +percate que poner a libre disposición sus trabajos le garantizan, entre otras +cosas, el aumento del impacto y difusión de sus investigaciones. + +La ciencia abierta es una forma de producir conocimiento científico promoviendo +la comunicación y acceso efectivo del contenido de las investigaciones +científicas en todas las áreas (instrumentos de trabajo, resultados intermedios +y finales) mediante la digitalización y las bondades del internet. + +El acceso al contenido de algunas publicaciones científicas hasta hace pocos +años se realizaba, en la mayoría de ocasiones, por medio de revistas donde +mayormente había que pagar para obtener los papers y resultaban muy pocos los +documentos gratuitos. Estas publicaciones solo reflejan el procedimiento y los +resultados obtenidos, con el movimiento de la ciencia abierta. Esta forma de +hacer ciencia tradicional se combina con nuevas y novedosas herramientas +digitales con el fin de poner a libre disposición no sólo las publicaciones +finales, sino también los datos de la investigación, el software, notas de +laboratorio o los cuadernos de trabajo, evaluaciones por pares, entre otros. + +Este enfoque busca que las distintas etapas del proceso de investigación esté +abierta a la revisión, crítica, participación y colaboración, aportes para +mejoras, reproducción y reutilización para todos los involucrados, creando +nuevas formas de acceder al conocimiento científico. + +La ciencia abierta es un enfoque compuesto por distintas disciplinas +relacionadas. Según el proyecto [_FOSTER_](https://www.fosteropenscience.eu/) +sobre ciencia abierta incluye 8 elementos: + +- **Open notebooks (Cuadernos abiertos)** +- **Datos abiertos** +- **Revisión abierta** +- **Open access (Acceso abierto)** +- **Sotfware libre de código abierto** +- **Redes sociales académicas** +- **Ciencia ciudadana** +- **Recursos educativos abiertos** + +Todos estos aspectos afectan de una u otra forma el ciclo completo de la +investigación. En el blog +[_NeoScientia_](https://neoscientia.com/ciencia-abierta/) mencionan algunos de +estos componentes como grados de apertura de la ciencia, estos son: **Open +Research**, **Open Access**, **Open Notebook** y **CrowdScience**. Otros autores +las denominan como iniciativas que incluye la ciencia abierta. Distintas formas +de clasificarlos, pero todos con el mismo fin, la disponibilidad gratuita de +todos los recursos de investigaciones científicas. + +Puedes visualizar en la siguiente figura la taxonomía sobre la ciencia abierta. + +![Taxonomía sobre la ciencia abierta](componentes.png) + +A continuación mencionamos algunos beneficios de la práctica de la ciencia +abierta: + +- **Para el investigador**: + + - Ofrece mayor impacto y difusión de sus trabajos, a la vez que ganan + reconocimiento y fuentes para trabajos futuros. + - Brinda distintas maneras de publicar los artículos. + - No pierdes la autoría o méritos al publicar de manera abierta. + - Puedes ajustar el derecho al uso de la información que publicas, protegiendo + el contenido en torno a licencias **Creative Commons** o **Science Commons** + - Cuando interactúas con otros investigadores sobre trabajos en temas + similares, puedes aprender de forma más rápida y eficiente; evitando que + trabajos parecidos sean duplicados. + +- **Para las empresas de financiamiento (públicas o privadas)**: + + - Practicando la ciencia abierta, estas empresas y los estadistas se + convencerán que los procesos de investigación son más reconocidos y de mayor + calidad. + + * **Para los usuarios y público en general**: + + - En este enfoque la producción de conocimiento es eficiente, democrática y + permite atender mejor a las demandas sociales. + - Como usuario tienes posibilidades para contribuir e intervenir en cualquier + proceso de conocimiento abierto. + - Puedes encontrar las respuestas que buscas mediante la democratización del + conocimiento. + +El aumento actual en la práctica de la ciencia abierta a despertado iniciativas +en personas e instituciones de varios países, desde hace pocos años. Creando +emprendimientos, comunidades y proyectos sobre ciencia abierta. A continuación +mencionamos algunos: + +[**FOSTER**](https://www.fosteropenscience.eu/) + +[**Open Knowledge Foundation**](https://okfn.org/) + +[**ODSL (Open Data Science Latam)**](https://www.odsla.org/) + +[**Datalat**](https://www.datalat.org/) + +[**Open Science Comunity Leiden**](https://www.universiteitleiden.nl/open-science-community-leiden) + +[**Open Knowledge Foundation**](https://okfn.org/) + +[**Amelica**](http://amelica.org/) + +[**Association of European Research Libraries LIBER**](https://libereurope.eu/) + +[**MonuMAI**](https://*monumai.ugr.es/proyecto) + +En resumen, la ciencia abierta busca cumplir con los requerimientos actuales y +futuros en lo que se refiere al acceso, reproducción, publicación y colaboración +en investigaciones de cualquier disciplina. La ciencia abierta es un movimiento +que ha revolucionado la forma de ver y hacer ciencia, y en nuestra opinión es el +futuro. + +### Referencias + +- Anglada, Lluís; Abadal, Ernest (2018). “¿Qué es la ciencia abierta?”. Anuario + ThinkEPI, v. 12, pp. 292-298. + +- [Curso de Open Science para investigadores del CSIC](https://digital.csic.es/bitstream/10261/171854/1/Curso_Open_science_2018_DIGITALCSIC.pdf) + +- [Portal de FOSTER](https://www.fosteropenscience.eu/) + +- [Blog NeoScientia](https://neoscientia.com/ciencia-abierta/) + +- [Blog Cientópólis](https://www.cientopolis.org/ciencia-abierta/) diff --git a/content/blog/que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias/header.png b/bkp/blogs/que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias/header.png similarity index 100% rename from content/blog/que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias/header.png rename to bkp/blogs/que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias/header.png diff --git a/bkp/blogs/que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias/index.md b/bkp/blogs/que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias/index.md new file mode 100644 index 000000000..b8e7a116e --- /dev/null +++ b/bkp/blogs/que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias/index.md @@ -0,0 +1,279 @@ +--- +title: + "¿Qué hemos aprendido, gracias a la ciencia abierta, del manejo de pandemias?" +slug: que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias +date: 2020-05-27 +authors: ["Yurely Camacho"] +tags: [pandemias, covid19] +categories: [ciencia abierta, investigación abierta] +description: | + Al transcurrir los años se han presentado pandemias que han azotado y puesto en + alerta al mundo. Por tal motivo, la manera como las personas, instituciones y + gobiernos lo han manejado resulta de suma importancia ya sea para prevenir + errores cometidos, tomar medidas similares o reinventarse acciones en el tema. + Justo es aquí donde entra en juego la ciencia abierta. Tal vez te preguntarás + ¿Cuál es el papel de la ciencia abierta en todo esto? Pues las distintas + disciplinas que abarca, como el acceso y los datos abiertos, han permitido + producir conocimiento científico para combatir estas pandemias, por ejemplo, + para realizar un diagnóstico temprano, en la gestión de la producción de + vacunas, o para predecir niveles de propagación de las enfermedades y generar + soluciones tecnológicas. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Al transcurrir los años se han presentado pandemias que han azotado y puesto en +alerta al mundo. Por tal motivo, la manera como las personas, instituciones y +gobiernos lo han manejado resulta de suma importancia ya sea para prevenir +errores cometidos, tomar medidas similares o reinventarse acciones en el tema. +Justo es aquí donde entra en juego la ciencia abierta. Tal vez te preguntarás +¿Cuál es el papel de la ciencia abierta en todo esto? Pues las distintas +disciplinas que abarca, como el acceso y los datos abiertos, han permitido +producir conocimiento científico para combatir estas pandemias, por ejemplo, +para realizar un diagnóstico temprano, en la gestión de la producción de +vacunas, o para predecir niveles de propagación de las enfermedades y generar +soluciones tecnológicas. + + + +En este artículo te presentamos algunas iniciativas de ciencia abierta que han +permitido reducir y controlar el impacto de estas enfermedades, la COVID-19, el +Zika, la gripe, el dengue, el SARS (Síndrome respiratorio agudo grave) y el MERS +(Síndrome respiratorio de Oriente Medio), dejando aprendizajes y avances en este +ámbito. + +## ¿Por qué la Ciencia Abierta? + +En la actual pandemia de la COVID-19 el acceso a información, la difusión de +datos y el uso de código abierto, aceleraron las investigaciones haciendo +posible que en pocas semanas se obtuvieran avances significativos, en +comparación con aquellos probablemente obtenidos si la información no estuviera +abierta. El mejor ejemplo está en el proceso de secuenciación de su genoma, que +se logró en solo 11 días publicándose abiertamente, permitiendo conocer sobre +formas de transmisión y posibles métodos de detección. Se encuentran disponibles +decenas de portales de investigación, revistas y otras herramientas de acceso +abierto con información sobre la COVID-19 y su causante, el virus SARS-COV2. Te +presentamos algunos en el apartado de referencias. + +Algunas de esas investigaciones sobre el coronavirus se publicaron de manera +abierta antes de tener la revisión por pares, para acelerar los tiempos de +difusión del conocimiento. Este tipo de prácticas ya había sido implementada +durante las pandemias de SARS en 2003, de gripe AH1N1 en 2009 y el Zika en la +década de los 50, pero la evolución de las Tecnologías de Información y +Comunicación (TIC) en estos años ha permitido que se implementen con mayor +fuerza. De igual forma, la pandemia del Zika estuvo influenciada por el acceso +abierto, aunque en menor medida que la COVID-19. Se publicaron en abierto +resultados de investigaciones, por ejemplo, la reseñada en +[Proceedings of the National Academy of Sciences](https://www.eurekalert.org/pub_releases/2019-01/potn-anz010919.php), +[este +artículo](https://www.elsevier.es/es-revista-revista-colombiana-anestesiologia-341-articulo-zika-una-pandemia-progreso-un-S0120334716300235 +y otro +[publicado en Elsevier](https://www.elsevier.es/es-revista-revista-colombiana-anestesiologia-341-articulo-virus-zika-se-expande-su-S0120334716000216). + +Como todavía no hay cura para la fiebre del Zika, el desarrollo de vacunas y la +terapia contra el virus es relevante. Sin embargo, en un +[artículo del 2016](https://blogs.iadb.org/conocimiento-abierto/es/fortaleciendo-la-respuesta-ante-el-zika-mediante-la-colaboracion-abierta/) +sobre colaboración abierta en respuesta al Zika, se expone la falta de un +sistema eficaz para compartir datos e información y hace referencia a una +convocatoria para investigadores publicada por la Organización Mundial de la +Salud (OMS) en 2015. Actualmente, más de 30 +[organizaciones](https://blog.wellcome.ac.uk/2016/02/10/sharing-data-during-zika-and-other-global-health-emergencies/) +han ratificado la declaración de consenso de la OMS para compartir datos del +zika. + +Para minimizar la falta de información, El +[Banco Interamericano de Desarrollo (BID)](https://www.iadb.org/es), el +[Governance Lab](http://www.thegovlab.org) y asociados gubernamentales de +algunos países de América del Sur colaboraron para llevar a cabo conferencias +bajo el nombre de +[Smarter Crowdsourcing](https://zika.smartercrowdsourcing.org/) (Colaboración +abierta inteligente) buscando especialistas para impulsar una respuesta +colaborativa ante la crisis del Zika. + +Los datos juegan un rol importante en el tratamiento de las pandemias, y su +procesamiento es fundamental para mantenernos informados. El desarrollo de +tableros de monitoreo de casos de COVID-19, mapas con datos en tiempo real, +informes dinámicos y otras visualizaciones nos han permitido conocer sobre la +propagación del virus. Asimismo con datos de buena calidad, la ciencia de datos +puede ser una poderosa herramienta para realizar predicciones sobre la evolución +de la enfermedad COVID-19 o incluso para buscar un posible tratamiento. La +[Universidad de Zaragoza diseña un mapa que predice los nuevos contagios por coronavirus](https://www.heraldo.es/noticias/aragon/zaragoza/2020/02/28/la-universidad-de-zaragoza-disena-un-mapa-que-predice-los-nuevos-contagios-por-coronavirus-1361341.html). +Asimismo, la compañía de biotecnología _AbCellera_ está empleando un +[modelo de Machine learning](https://www.abcellera.com/news/2020-03-abcellera-and-lilly-codevelopment) +para desarrollar terapias basadas en anticuerpos de pacientes que se han +recuperado de la enfermedad. + +Modelos predictivos de este tipo también se emplearon en la pandemia del Zika. +Uno de ellos desarrollado por el Consejo Nacional de Investigaciones Científicas +y Técnicas [CONICET](https://www.conicet.gov.ar/) en Argentina junto con Ecuador +y Colombia en 2019. La investigación incluyó la captura de mosquitos adultos y +su análisis genético con la finalidad de aplicar dichos modelos para conocer +probabilidades de brotes en áreas particulares y así evaluar posibles acciones +preventivas. De igual forma, estos modelos estuvieron presentes en la pandemia +de gripe AH1N1, donde un estudio de investigadores de la Escuela Médica de +Harvard determinaron que el uso de la Wikipedia y así el empleo de big data, son +capaces de predecir con precisión la llegada de los brotes de gripe en EEUU +(http://www.ploscompbiol.org/article/info%3Adoi%2F10.1371%2Fjournal.pcbi.1003581). +Puedes consultar información abierta sobre la influenza y las pandemias de +gripe, como la gripe aviar y la AH1N1 +[aquí](https://espanol.cdc.gov/flu/pandemic-resources/index.htm) y también sobre +fuentes de información acerca de la gripe aviar en +[este enlace](https://www.researchgate.net/publication/331177707_Fuentes_de_Informacion_acerca_de_la_Gripe_Aviar). + +Los datos abiertos son tomados para desarrollar metodologías que hagan más +accesible la información a cualquier persona. De esta manera Google y +[UNICEF](https://www.unicef.org/es) trabajaron en el desarrollo de un panel de +control abierto al público sobre el zika, para analizar grandes cantidades de +datos, así como para visualizar y predecir brotes potenciales de enfermedades, +puedes encontrar información en +[este enlace](https://googleblog.blogspot.com/2016/03/providing-support-to-combat-zika-in.html). + +Los avances tecnológicos y la influencia de las TIC han cerrado la brecha de la +desinformación, aunque en ocasiones su uso hace que se divulgue información poco +certera. En +[este artículo](https://www.scielo.sa.cr/scielo.php?script=sci_arttext&pid=S1409-14292009000100001) +se presenta la influencia de las TIC durante la pandemia de la gripe. Donde +algunas iniciativas fueron llevar a cabo cursos virtuales y conferencias durante +la pandemia, fue una iniciativa desarrollada por la Organización Panamericana de +Salud usando el programa _Elluminate_ que en la actualidad se comercializa bajo +el nombre de +[Blackboard Collaborate](https://www.blackboard.com/teaching-learning/collaboration-web-conferencing/blackboard-collaborate). +En la actual pandemia de COVID-19 se ha hecho inevitable el amplio uso de estas +tecnologías que permiten el teletrabajo y la investigación colaborativa +empleando herramientas como Git, redes sociales como Whatsapp, han ayudado a +mantenernos comunicados y trabajando. + +Otro aspecto importante es la investigación colaborativa, por ejemplo, en +proyectos de código abierto o repositorios de datos. En la pandemia de gripe +AH1N1 en 2009 se creó un repositorio en la plataforma colaborativa GitHub acerca +de la [gripe AH1N1 en Londres](https://github.com/JDureau/H1N1-London-2009). +Otros repositorios en esta plataforma referentes a información y proyectos sobre +pandemias son: +[Repositorio de datos sobre los brotes del zika](https://github.com/BuzzFeedNews/zika-data#additional-resources) +y en https://github.com/cdcepi/zika, el proyecto en GitHub de la app Española +[Open Coronavirus](https://github.com/open-coronavirus/open-coronavirus/blob/master/README.es.md), +que busca tener cuarentenas selectivas en lugar de masivas en España. + +Frente al COVID-19 se han desarrollado proyectos de código abierto,por ejemplo, +el proyecto [_Ushahidi_](https://www.ushahidi.com/), que proporciona, entre +otras cosas, mapas de infectados y lugares donde pueden suministrarse alimentos. +Otro iniciativa es +[eCALLER EPIDEMIAS](https://ingenia.es/actualidad/conocimiento/lanzamos-ecaller-epidemias-software-libre-para-hacer-frente-a-covid-19/) +que cuenta con un despliegue de aplicaciones para el diagnóstico y +monitorización. Otra iniciativa han sido _hackatones_ que reúnen a las personas +para usar sus habilidades y ayudar a combatir los problemas con la pandemia +desarrollando proyectos de tecnología. Uno de ellos, el Hack Quarantine +desarrollado, el Debian biohackatone en 2020 y +[CodeTheCurve](https://en.unesco.org/news/codethecurve-youth-innovators-hacking-their-way-surmount-covid-19-challenges). +Algunas instituciones tecnológicas han creado fondos para financiar proyectos de +código abierto en combate al COVID-19 como el de +[Mozila](https://blog.mozilla.org/blog/2020/03/31/moss-launches-covid-19-solutions-fund/). + +Las pandemias del SARS en 2003 y el MERS en 2012, fueron causadas por tipos +distintos de coronavirus. Las investigaciones realizadas en la pandemia del SARS +influyen ahora en relación al nuevo tipo de coronavirus SARS COV-2 causante de +la enfermedad COVID-19, puedes consultar +[este artículo](https://www.intramed.net/contenidover.asp?contenidoid=95673) +para más información. Algunos trabajos en acceso abierto puedes consultarlos +[aquí](https://academica-e.unavarra.es/bitstream/handle/2454/9567/Hao%20Niu.pdf?sequence=1&isAllowed=y) +y en +[este enlace](https://www.scielosp.org/article/ssm/content/raw/?resource_ssm_path=/media/assets/rpsp/v14n1/16645.pdf). +Asimismo, se realizaron comparaciones de como +[el coronavirus SARS-COV2 supera los casos del SARS de 2003 para Enero 2020](https://gacetamedica.com/investigacion/todo-lo-que-se-sabe-del-nuevo-coronavirus-2019-ncov-fx2404160/) +y otras investigaciones relacionadas y comparando los 3 tipos de coronavirus +causantes de estas pandemias (SARS, MERS y COVID-19), puedes consultar +información +[aquí](https://gacetamedica.com/investigacion/que-paso-con-los-otros-brotes-de-coronavirus/). + +Las investigaciones iniciadas sobre los coronavirus del SARS y el MERS sirvieron +para conocer sobre estos virus y que los científicos e investigadores se dieran +una idea de lo que sería el nuevo coronavirus SARS Cov-2. El conocimiento y los +datos abiertos relacionados a las anteriores pandemias, permiten que se hagan +investigaciones como la de +[este artículo](https://www.lavanguardia.com/ciencia/20200227/473812035831/coronaviris-covid19-letal-gripe-sars-mers.html) +donde comparan la letalidad del COVID-19, el SARS, MERS y la gripe. + +El Dengue ha sido otra pandemia para la cual se han llevado a cabo proyectos +como un +[Documento de trabajo sobre datos abiertos del dengue](https://idatosabiertos.org/wp-content/uploads/2015/10/7.Dengue-Pane-Ojeda-Valdez.pdf) +por parte de la Iniciativa Latinoamericana por los Datos Abiertos y el Open Data +que presentan mapas de riesgo y de incidencia dinámicos para 18 países de la +región de las Américas de la OMS. También está +["DengueNet"](http://ghdx.healthdata.org/record/who-denguenet], el sistema +central de gestión de datos de la OMS para la vigilancia epidemiológica y +virológica mundial del dengue y la fiebre hemorrágica del dengue. Puedes visitar +[en este enlace](http://www.bvs.hn/php/level.php?lang=es&component=59&item=2) +otros sitios de acceso abierto a información sobre el dengue. + +Cabe resaltar que la era tecnológica, los avances y los nuevos usos de las TIC +afectan y mejoran la forma en la que las personas acceden a la información sobre +salud. Esto ha sido fundamental para la ciencia abierta y podemos observarlo si +comparamos las iniciativas actuales frente al COVID-19 con las surgidas frente a +otras pandemias. + +## Lo que sabemos hasta ahora + +De todas las iniciativas de ciencia abierta que se han desarrollado en torno a +las pandemias, hemos aprendido a divulgar datos e información, mantenernos +actualizados y reconocer información veraz, como la proporcionada por la OMS, a +trabajar de forma colaborativa con personas de distintos lugares en el mundo, +tomar conciencia de nuestro papel protagónico en el cumplimiento de medidas +sanitarias, a hacer uso de herramientas digitales para mantenernos informados y +publicar información importante, a tomar decisiones personales y colectivas en +base a datos abiertos y herramientas de acceso abierto, en fin, poner en +práctica y a disposición nuestras capacidades para generar proyectos que creen +soluciones y todos se beneficien de ellas. Asimismo formar parte como usuarios o +beneficiarios de esos proyectos y hacer que la práctica de la ciencia abierta +sea cada vez más adaptada en la cotidianidad de las personas. También nos han +permitido reconocer los avances tecnológicos para la investigación, eliminar las +barreras entre investigadores y los ciudadanos de todo el mundo para que, con +ayuda de los datos e información disponible, podamos comparar las acciones que +se han llevado a cabo y reconocer que la ciencia abierta tiene un rol importante +en el ámbito de la salud. Finalmente, debemos decir que las pandemias han hecho +que los gobiernos conozcan y actúen de manera rápida y eficiente ante cualquier +pandemia y esto ha sido posible, con el transcurrir de los años, gracias a las +buenas prácticas de ciencia abierta. + +### Referencias + +- [Coronavirus: Recursos y conocimiento abierto para colaborar en la respuesta a la pandemia](https://blogs.iadb.org/conocimiento-abierto/es/coronavirus-recursos-y-conocimiento-abierto-para-colaborar-en-la-respuesta-a-la-pandemia/). + +- [Fortaleciendo la respuesta ante el Zika mediante la colaboración abierta](https://blogs.iadb.org/conocimiento-abierto/es/fortaleciendo-la-respuesta-ante-el-zika-mediante-la-colaboracion-abierta/). + +**Algunas plataformas de acceso abierto sobre el COVID-19 y el SARS-COV2:** + +- [Literatura mundial sobre la enfermedad COVID-19 de la OMS](https://search.bvsalud.org/global-literature-on-novel-coronavirus-2019-ncov/) + +- [Canal de noticias de la OMS](https://www.who.int/es) + +- [Statista en Español](https://es.statista.com/temas/5901/el-coronavirus-de-wuhan/) + +- [Datos del Banco Mundial](https://datos.bancomundial.org/) + +- [Center for Control and Prevention of Disease](https://espanol.cdc.gov/flu/index.htm) + +- [EBSCO Medical](https://covid-19.ebscomedical.com/research) + +- [Repositorio de Investigación de Elsevier](https://coronavirus.1science.com/search). + En particular este repositorio contiene artículos sobre COVID-19, _SARS_ y + _MERS_, las dos últimas fueron pandemias desarrolladas en la primera década + del siglo XXI. + +- [Centro de Información de Coronavirus de Elsevier](https://www.elsevier.com/connect/coronavirus-information-center) + +- [Centro de Recursos sobre el Coronavirus de The Lancet](https://www.thelancet.com/coronavirus) + +- [Página de Investigación de Coronavirus y Enfermedades Infecciosas de la SSRN](https://www.ssrn.com/index.cfm/en/coronavirus/) + +- [Nature Research](https://www.nature.com/collections/hajgidghjb?utm_source=sn&utm_medium=referral&utm_content=null&utm_campaign=BSLB_1_CA01_GL_BSLB_AWA_CA01_GL_LSGR_PubH_Coronovirus_LandingPage) + +- [Taylor & Francis](https://taylorandfrancis.com/coronavirus/) + +- [New England Journal of Medicine](https://www.nejm.org/coronavirus) + +- La Universidad de Chile ofrece una web donde guarda enlaces a sitios de acceso + abierto sobre información e investigaciones acerca del COVID-19. Visítala en + [este enlace](https://bibliotecas.uv.cl/recursos-acceso-abierto). diff --git a/content/blog/que-necesitas-para-desarrollar-en-la-web3/ganache.png b/bkp/blogs/que-necesitas-para-desarrollar-en-la-web3/ganache.png similarity index 100% rename from content/blog/que-necesitas-para-desarrollar-en-la-web3/ganache.png rename to bkp/blogs/que-necesitas-para-desarrollar-en-la-web3/ganache.png diff --git a/content/blog/que-necesitas-para-desarrollar-en-la-web3/hardhat.png b/bkp/blogs/que-necesitas-para-desarrollar-en-la-web3/hardhat.png similarity index 100% rename from content/blog/que-necesitas-para-desarrollar-en-la-web3/hardhat.png rename to bkp/blogs/que-necesitas-para-desarrollar-en-la-web3/hardhat.png diff --git a/content/blog/que-necesitas-para-desarrollar-en-la-web3/header.jpeg b/bkp/blogs/que-necesitas-para-desarrollar-en-la-web3/header.jpeg similarity index 100% rename from content/blog/que-necesitas-para-desarrollar-en-la-web3/header.jpeg rename to bkp/blogs/que-necesitas-para-desarrollar-en-la-web3/header.jpeg diff --git a/content/blog/que-necesitas-para-desarrollar-en-la-web3/index.md b/bkp/blogs/que-necesitas-para-desarrollar-en-la-web3/index.md similarity index 50% rename from content/blog/que-necesitas-para-desarrollar-en-la-web3/index.md rename to bkp/blogs/que-necesitas-para-desarrollar-en-la-web3/index.md index 85e5decbc..6bf7cb9f9 100644 --- a/content/blog/que-necesitas-para-desarrollar-en-la-web3/index.md +++ b/bkp/blogs/que-necesitas-para-desarrollar-en-la-web3/index.md @@ -2,36 +2,41 @@ title: "Como desarrollador, ¿Qué necesito para entrar en la web3?" slug: que-necesitas-para-desarrollar-en-la-web3 date: 2022-03-22 -author: Alan Hurtarte +authors: ["Alan Hurtarte"] tags: [cripto, desarrollador] categories: [desarrollo de software, UI-UX, web3] -aliases: ["/blog/0060-crypto-dev-ecosystem/que-necesitas-para-desarrollar-en-la-web3/"] -draft: false -usePageBundles: true +description: | + Si ya eres desarrollador y tienes la meta, el deseo, o simplemente la curiosidad + de adentrarte en la web3, en este blog te mencionaré las tecnologías que se + utilizan en el tech stack para desarrollar. thumbnail: "./header.jpeg" -featureImage: "./header.jpeg" --- - - -Si ya eres desarrollador y tienes la meta, el deseo, o simplemente la curiosidad de adentrarte en la web3, en este blog te mencionaré las tecnologías que se utilizan en el tech stack para desarrollar. +Si ya eres desarrollador y tienes la meta, el deseo, o simplemente la curiosidad +de adentrarte en la web3, en este blog te mencionaré las tecnologías que se +utilizan en el tech stack para desarrollar. +Empecemos con un esquema básico, la web3, no funciona diferente de la web normal +en teoría, lo que cambia es que en vez de tener un solo lugar centralizado con +nuestros datos en el backend, está disperso por los nodos, ya sea directo en los +smart contracts (si fuera Ethereum) o en el uso de algún servicio +[IPFS](https://web3.storage/). Mientras el frontend es lo mismo que ya usas. +Html, Css, JS, React, vue o cualquier otro frontend framework. -Empecemos con un esquema básico, la web3, no funciona diferente de la web normal en teoría, lo que cambia es que en vez de tener un solo lugar centralizado con nuestros datos en el backend, está disperso por los nodos, ya sea directo en los smart contracts (si fuera Ethereum) o en el uso de algún servicio [IPFS](https://web3.storage/). Mientras el frontend es lo mismo que ya usas. Html, Css, JS, React, vue o cualquier otro frontend framework. - - - -Es importan destacar que la web3 no es excluyente de las tecnologías existentes. Puedes tener tu backend en nodejs, php, java, .net, python o el que prefieras y aun así interactuar con servicios web3. - - +Es importan destacar que la web3 no es excluyente de las tecnologías existentes. +Puedes tener tu backend en nodejs, php, java, .net, python o el que prefieras y +aun así interactuar con servicios web3. ## Desarrollo local -Así como en la web2, tienes tu desarrollo local, ya sea con docker o con instalaciones de tu servidor en el localhost. En el web3 tenemos herramientas como [hardhat](https://hardhat.org/) o [ganache](https://trufflesuite.com/ganache/index.html) +Así como en la web2, tienes tu desarrollo local, ya sea con docker o con +instalaciones de tu servidor en el localhost. En el web3 tenemos herramientas +como [hardhat](https://hardhat.org/) o +[ganache](https://trufflesuite.com/ganache/index.html)
@@ -45,13 +50,13 @@ Así como en la web2, tienes tu desarrollo local, ya sea con docker o con instal

-Es una herramienta para correr Solidity localmente. Encuentras una manera fácil para hacer deploy de tus contratos, correr tests y debuguear código en Solidity en diferentes versiones. +Es una herramienta para correr Solidity localmente. Encuentras una manera fácil +para hacer deploy de tus contratos, correr tests y debuguear código en Solidity +en diferentes versiones.
-Se corre como un paquete global de Node.js que se instala con NPM -
-
+Se corre como un paquete global de Node.js que se instala con NPM


@@ -69,7 +74,8 @@ npm install --save-dev hardhat
Tu blockchain local en un clic. Con `Ganache` pueden lanzar rápidamente un blockchain personal para correr tus tests, e inspeccionar el estado mientras controlas como la cadena opera. -Para instalarlo se debe correr un ejecutable y se instala como cualquier otra aplicación en tu sistema. +Para instalarlo se debe correr un ejecutable y se instala como cualquier otra +aplicación en tu sistema.
@@ -77,9 +83,13 @@ Para instalarlo se debe correr un ejecutable y se instala como cualquier otra ap ### Aprende Solidity -Uso de ejemplo Solidity, pero podrías aprender cualquier otro lenguaje como [Rust](https://docs.solana.com/developing/on-chain-programs/developing-rust) para programar en el blockchain de [solana](https://solana.com/). +Uso de ejemplo Solidity, pero podrías aprender cualquier otro lenguaje como +[Rust](https://docs.solana.com/developing/on-chain-programs/developing-rust) +para programar en el blockchain de [solana](https://solana.com/). -Regresando a Solidity, si ya estás familiarizado con JavaScript, notaras muy familiar la sintaxis de Solidity. Es un lenguaje de tipado estático, con llaves, diseñado para desarrollar smart contracts que corren en Ethereum. +Regresando a Solidity, si ya estás familiarizado con JavaScript, notaras muy +familiar la sintaxis de Solidity. Es un lenguaje de tipado estático, con llaves, +diseñado para desarrollar smart contracts que corren en Ethereum. Aquí un ejemplo de un contrato en Solidity, un sencillo Hello World @@ -102,19 +112,28 @@ return "Hello, World!"; Si ya has programado antes podrás encontrar las similitudes. -1. Se declara la licencia del contrato. Recuerda que la mayoría, por no decir todos, los contratos son open source, así que cualquiera puede leer o interactuar con ellos. +1. Se declara la licencia del contrato. Recuerda que la mayoría, por no decir + todos, los contratos son open source, así que cualquiera puede leer o + interactuar con ellos. 2. Se declara la versión del compilador (`pragma solidity ^0.8.0`) -3. Se declara el contrato como tal. Palabra reservada `contract` y el nombre designado. +3. Se declara el contrato como tal. Palabra reservada `contract` y el nombre + designado. -4. Se crea la función `helloWorld`. Nota que después del nombre, tienen otros términos. Estos términos se llaman `modificadores de acceso`. El `public` se comporta como ya imaginas, el interesante y nuevo es `pure` que indica que esta función no requiere gas para hacerla funcionar. Es solo lectura, entre otras cosas. +4. Se crea la función `helloWorld`. Nota que después del nombre, tienen otros + términos. Estos términos se llaman `modificadores de acceso`. El `public` se + comporta como ya imaginas, el interesante y nuevo es `pure` que indica que + esta función no requiere gas para hacerla funcionar. Es solo lectura, entre + otras cosas. -Como todo lenguaje tiene sus partes complejas y únicas que te invito pruebes y aprendas en su [documentación](https://ethereum.org/en/developers/) +Como todo lenguaje tiene sus partes complejas y únicas que te invito pruebes y +aprendas en su [documentación](https://ethereum.org/en/developers/) ### Perfecto, ya tengo mi blockchain y mi contrato ¿Ahora que? -Listo, cada herramienta tiene su modo de publicar o desplegar tus contratos a tu red local. +Listo, cada herramienta tiene su modo de publicar o desplegar tus contratos a tu +red local. Por ejemplo, con `Hardhat`: @@ -123,7 +142,8 @@ npx hardhat compile ``` -Con `Ganache`, se debe usar otra herramienta de la misma familia llamada `truffle`, y se ejecuta de la misma manera que `hardhat` +Con `Ganache`, se debe usar otra herramienta de la misma familia llamada +`truffle`, y se ejecuta de la misma manera que `hardhat` ``` @@ -141,7 +161,8 @@ truffle compile
-Al tener tu contrato desplegado ya podrás interactuar con él, usando web3.js o ether.js. En otras palabras, ya se trata del frontend. +Al tener tu contrato desplegado ya podrás interactuar con él, usando web3.js o +ether.js. En otras palabras, ya se trata del frontend.
@@ -155,7 +176,12 @@ Al tener tu contrato desplegado ya podrás interactuar con él, usando web3.js o
-Web3.js es la herramienta que maneja toda la lógica para conectarnos a nuestros smart contracts. Al compilar un contrato se genera un archivo llamado [abi.json](https://www.quicknode.com/guides/solidity/what-is-an-abi). Este archivo expone todos tus métodos públicos de tu smart contract, junto con los parámetros y tipos que espera. De esa manera tu frontend se podrá comunicar de manera exitosa con tus contratos. +Web3.js es la herramienta que maneja toda la lógica para conectarnos a nuestros +smart contracts. Al compilar un contrato se genera un archivo llamado +[abi.json](https://www.quicknode.com/guides/solidity/what-is-an-abi). Este +archivo expone todos tus métodos públicos de tu smart contract, junto con los +parámetros y tipos que espera. De esa manera tu frontend se podrá comunicar de +manera exitosa con tus contratos.
@@ -165,10 +191,11 @@ Web3.js es la herramienta que maneja toda la lógica para conectarnos a nuestros La manera en que interactuamos con ellos es por pasos: -1. Instancias una referencia a tu archivo `abi`. Recuerda que este es el que sabe, el cómo, cuando y donde, de la comunicación con tus contratos. - -2. Al tener la referencia de tu `abi`, puedes acceder por notación de objetos a tus métodos +1. Instancias una referencia a tu archivo `abi`. Recuerda que este es el que + sabe, el cómo, cuando y donde, de la comunicación con tus contratos. +2. Al tener la referencia de tu `abi`, puedes acceder por notación de objetos a + tus métodos ``` @@ -198,32 +225,52 @@ let count = await favoriteSongsPortalContract.getTotalSongs(); ``` -Así de fácil podemos conectar nuestros nuevos contratos con nuestro conocido y confiable frontend. +Así de fácil podemos conectar nuestros nuevos contratos con nuestro conocido y +confiable frontend. -El código completo de este ejemplo está en este [repositorio](https://github.com/kenny08gt/ether-favorite-songs) +El código completo de este ejemplo está en este +[repositorio](https://github.com/kenny08gt/ether-favorite-songs)
## Billetera (wallet) -Otra diferencia entre web2 y web3 es que el usuario se identifica con una "billetera", este es un término que no representa realmente lo que es y puede confundir a personas nuevas o que no tienen interés financiero en el blockchain. La más popular de estas herramientas es [metamask](https://metamask.io/) aunque no la [única](https://moralis.io/what-is-a-web3-wallet-web3-wallets-explained/), que te deja tener una dirección hexadecimal única, y puedes generar múltiples direcciones. Cada una de estas te sirve para identificarte con aplicaciones web3. En vez de tener que hacer login con tu correo una y otra vez, solo debes conectar tu dirección (en tu billetera) y ya puedes interactuar con la web3. +Otra diferencia entre web2 y web3 es que el usuario se identifica con una +"billetera", este es un término que no representa realmente lo que es y puede +confundir a personas nuevas o que no tienen interés financiero en el blockchain. +La más popular de estas herramientas es [metamask](https://metamask.io/) aunque +no la [única](https://moralis.io/what-is-a-web3-wallet-web3-wallets-explained/), +que te deja tener una dirección hexadecimal única, y puedes generar múltiples +direcciones. Cada una de estas te sirve para identificarte con aplicaciones +web3. En vez de tener que hacer login con tu correo una y otra vez, solo debes +conectar tu dirección (en tu billetera) y ya puedes interactuar con la web3. -Estas billeteras son gratuitas (si son software) y se instalan en segundos. Puede ser usada como extensión en tu navegador o en aplicaciones individuales. +Estas billeteras son gratuitas (si son software) y se instalan en segundos. +Puede ser usada como extensión en tu navegador o en aplicaciones individuales. -Esto es fundamental para el funcionamiento de la web3. Cada interacción con el blockchain queda firmado por quien hizo la petición. Así queda todo registrado en el blockchain. +Esto es fundamental para el funcionamiento de la web3. Cada interacción con el +blockchain queda firmado por quien hizo la petición. Así queda todo registrado +en el blockchain. ## Resumen - Necesitas una blockchain local para tu desarrollo. -- Necesitas Aprender un lenguaje para hacer tus contratos (Solidity, por ejemplo). +- Necesitas Aprender un lenguaje para hacer tus contratos (Solidity, por + ejemplo). - Necesitas compilar tus contratos. -- Necesitas un frontend, con lo que ya sepas o aprender sobre frontend. Html, css, js, react o vue js. +- Necesitas un frontend, con lo que ya sepas o aprender sobre frontend. Html, + css, js, react o vue js. - Necesitas interactuar con web3.js en tu frontend. - Necesitas una billetera para interactuar con tus contratos. -El ecosistema sigue creciendo aceleradamente, cada vez hay más herramientas y se van completando los vacíos. Todavía hace falta mucho product design, y desarrollo para volverlo mainstream. Hay gente que se refiere al estado actual del web3 como con los 90 en la web2. Largos tiempos de espera, a veces falla, falta de feedback al usuario. Así que si te interesa esto, puedes ser parte del futuro de la web, que hoy mismo se está construyendo. +El ecosistema sigue creciendo aceleradamente, cada vez hay más herramientas y se +van completando los vacíos. Todavía hace falta mucho product design, y +desarrollo para volverlo mainstream. Hay gente que se refiere al estado actual +del web3 como con los 90 en la web2. Largos tiempos de espera, a veces falla, +falta de feedback al usuario. Así que si te interesa esto, puedes ser parte del +futuro de la web, que hoy mismo se está construyendo. diff --git a/content/blog/que-necesitas-para-desarrollar-en-la-web3/web3js.jpeg b/bkp/blogs/que-necesitas-para-desarrollar-en-la-web3/web3js.jpeg similarity index 100% rename from content/blog/que-necesitas-para-desarrollar-en-la-web3/web3js.jpeg rename to bkp/blogs/que-necesitas-para-desarrollar-en-la-web3/web3js.jpeg diff --git a/content/blog/que-son-las-mentorias-y-como-potencian-los-proyectos-de-ciencia-abierta/header.png b/bkp/blogs/que-son-las-mentorias-y-como-potencian-los-proyectos-de-ciencia-abierta/header.png similarity index 100% rename from content/blog/que-son-las-mentorias-y-como-potencian-los-proyectos-de-ciencia-abierta/header.png rename to bkp/blogs/que-son-las-mentorias-y-como-potencian-los-proyectos-de-ciencia-abierta/header.png diff --git a/bkp/blogs/que-son-las-mentorias-y-como-potencian-los-proyectos-de-ciencia-abierta/index.md b/bkp/blogs/que-son-las-mentorias-y-como-potencian-los-proyectos-de-ciencia-abierta/index.md new file mode 100644 index 000000000..dd7a5e431 --- /dev/null +++ b/bkp/blogs/que-son-las-mentorias-y-como-potencian-los-proyectos-de-ciencia-abierta/index.md @@ -0,0 +1,166 @@ +--- +title: + "¿Qué son las mentorías y cómo potencian los proyectos de ciencia abierta?" +slug: que-son-las-mentorias-y-como-potencian-los-proyectos-de-ciencia-abierta +date: 2020-02-14 +authors: ["Yurely Camacho"] +tags: [proyectos] +categories: [organización, mentorías] +description: | + La competitividad y los deseos de superación a nivel personal, profesional y + laboral impulsan los deseos individuales por aprender continuamente para + afianzar nuestros conocimientos, aptitudes y habilidades. En muchos casos, el + aprendizaje demanda la adquisición o fortalecimiento de capacidades y destrezas, + para las cuales el proceso de mentoría nos brinda una buena oportunidad para + lograrlo. En el presente artículo proporcionamos una definición de mentoría, te + daremos un paseo por algunos programas actuales de mentoría y al final + reflexionamos sobre las bondades de este proceso en proyectos de ciencia + abierta. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +La competitividad y los deseos de superación a nivel personal, profesional y +laboral impulsan los deseos individuales por aprender continuamente para +afianzar nuestros conocimientos, aptitudes y habilidades. En muchos casos, el +aprendizaje demanda la adquisición o fortalecimiento de capacidades y destrezas, +para las cuales el proceso de mentoría nos brinda una buena oportunidad para +lograrlo. En el presente artículo proporcionamos una definición de mentoría, te +daremos un paseo por algunos programas actuales de mentoría y al final +reflexionamos sobre las bondades de este proceso en proyectos de ciencia +abierta. + + + +El término **mentor** proviene de la novela “La Odisea”, escrita por el poeta +griego Homero. Mentor era un amigo de confianza de Odiseo y lo ayudó a aconsejar +a su hijo Telémaco. De allí, se conoce como mentor la persona que enseña, +aconseja, guía, apoyar y ayuda en el desarrollo y crecimiento de otra persona +invirtiendo tiempo y conocimientos para ello. + +Aunque la palabra _Mentoría_ no se encuentra en el Diccionario de la Real +Academia Española, hoy por hoy se utiliza para definir el proceso de aprendizaje +mediante el cual una persona con mayor experiencia (_mentor_) transmite sus +conocimientos, experiencias, información y técnicas a otra (_aprendiz_) con la +finalidad de desarrollar o afianzar en él, destrezas para el logro de los +objetivos propuestos ya sea a nivel académico, profesional o personal. + +La mentoría también puede utilizarse como una estrategia de aprendizaje que +consiste en brindar consejo y un ejemplo constructivo a los participantes con el +fin de ayudarles a alcanzar su potencial [_MENTOR_](https://www.mentoring.org/). +Se espera en un largo plazo que las personas que participan en las mentorías +puedan poner en práctica las habilidades y conocimientos que adquirieron en su +proceso de aprendizaje en aspectos de su vida personal, profesional y laboral. + +Es importante mencionar que aunque haya programas establecidos que conduzcan el +proceso de la mentoría, en realidad, ninguna mentoría debería ser igual a otra: +los intereses particulares e intercambios interpersonales definen cada proceso +de guía y acompañamiento, donde la confianza y aceptación son aspectos +fundamentales. + +Un buen mentor debe ser una persona que sirva de guía al alumno prestándole la +ayuda adecuada, disponiendo de tiempo de dedicación, contando con conocimientos +suficientes sobre los desafíos que los aprendices enfrentan, debe tener alta +capacidad de comunicar esa experiencia y la predisposición para hacerlo, así +como un interés en contribuir al desarrollo del participante. + +Las mentorías pueden ser pagas o gratuitas, presenciales u online. A este último +tipo se le conoce como _e-mentoría, telementoría o mentoría online_, y se +plantea como respuesta a las limitaciones de espacio y tiempo que pueden +presentarse en las mentorías presenciales. La mentoría online, se basa en la +implementación de las Tecnologías de comunicación e información (TIC's) y la +comunicación mediada por ordenador (CMO) como el uso de e-mail, sistemas de +conferencia por ordenador, redes sociales como WhatsApp para llevar a cabo las +mentorías. Este tipo de mentoría se benefician de conservar un registro de la +interacción con su mentor. + +Existen figuras públicas que alcanzaron el éxito con el acompañamiento de un +mentor, por ejemplo, el CEO de Facebook, +[Mark Zuckerberg](https://es.wikipedia.org/wiki/Mark_Zuckerberg) tuvo como +mentor a [Steve Jobs](https://es.wikipedia.org/wiki/Steve_Jobs), ex CEO de Apple +y el cofundador de Microsoft, +[Bill Gates](https://es.wikipedia.org/wiki/Bill_Gates) tuvo como mentor a El CEO +de Berkshire Hathaway, +[Warren Buffett](https://es.wikipedia.org/wiki/Warren_Buffett), otras +personalidades en +[este enlace](https://sebastianpendino.com/ayuda-mentor-ejemplos/). + +## ¿Cómo ayudan las mentorías a los proyectos de ciencia abierta? + +Veamos algunos argumentos de cómo las mentorías pueden ayudarte si desarrollas +(o así lo deseas) proyectos de ciencia abierta. + +Como se dijo en nuestro artículo, la ciencia abierta (enlace al artículo +ciencia_abierta) está compuesta por varias disciplinas, entre ellas: el acceso +abierto, datos abiertos, código abierto, investigación abierta y reproducible, +ciencia ciudadana, ciencia de datos, entre otros. El "hacer" ciencia abierta se +está practicando cada vez más, de ahí la importancia de encontrar un mentor para +ayudarte a desarrollar y potenciar buenas prácticas, para aprender o +especializarte en el manejo de algunas herramientas que necesitarás para +desenvolverte en este apasionante mundo de la ciencia abierta. + +Con la ayuda de un mentor y un plan estratégico puedes garantizar, en buena +medida, un logro de tus objetivos, cerrando la brecha entre las aplicaciones +teóricas y prácticas de todos los componentes de esta forma de hacer ciencia. El +objetivo principal de las mentorías en ciencia abierta es educar a los +científicos sobre las bondades de hacer abierta la ciencia que practican. + +Sin embargo, debes tomar en cuenta que el éxito de tu proyecto depende +exclusivamente de tí como investigador aunque la ayuda de un mentor, sin duda, +aumenta la probabilidad de éxito. + +Debido a la rigurosidad en el planteamiento y desarrollo de procesos de +investigación, se hace cada vez más necesario la ayuda y acompañamiento de +investigadores con conocimientos afianzados y que se encuentren en la +disposición de ayudar a otros investigadores. En ocasiones puedes sentir que tu +trabajo en el proyecto no fluye, que cada vez son más los inconvenientes que se +te presentan y que solo con leer libros y consultando la web, no sientes el +avance. En estas situaciones te sería de gran ayuda contar con un mentor. + +Un mentor en proyectos de ciencia abierta debe ser un embajador de la práctica, +la formación y la educación de la Ciencia Abierta en proyectos y comunidades. De +acuerdo con el enfoque de ciencia abierta que estés trabajando o quieras +comenzar a manejar puedes encontrar una gran variedad de perfiles de los +posibles mentores. + +Si participas en una mentoría en investigación abierta, por ejemplo, el mentor +contribuye a tu desarrollo técnico en cuanto a métodos, instrucciones, +pensamiento creativo, requisitos académicos, habilidades de comunicación, +gestión y apertura de los datos y divulgación de los resultados. Un tema +interesante que puedes tratar con tu mentor es la preparación para el mercado +laboral, él puede darte sugerencias sobre ello, permitiéndote establecer +contactos con personas que se desarrollen en el mismo campo de investigación y +aportándote una nueva perspectiva del panorama de todo lo que puedes lograr en +la disciplina en la cual te desempeñes. Lo mismo ocurre si participas en +mentorías sobre cualquier otro componente de la ciencia abierta, por ejemplo, +mentorías sobre "cómo abrir los datos", plataformas de control de versiones e +investigación reproducible, gestión de datos, código abierto, ciencia de datos. + +Puedes encontrar distintos programas y personas que brindan mentorías, muchas de +esas son pagas y tienen un plan de trabajo establecido. A continuación te +presentamos algunas plataformas e iniciativas de programas de mentorías: + +- [MENTOR-Sociedad Nacional de Mentoría](https://www.mentoring.org/) +- [Centro Nacional de mentoría](https://www.nwrel.org/mentoring/) +- [Acamica](https://www.acamica.com/) +- [Red de Mentores UANL](http://innovacion.uanl.mx/mentoria/) +- [Red de Mentores de Madrid](https://www.madrimasd.org/emprendedores/red-mentores-madrid) +- [WINN Women in the news Network](https://www.womeninnetwork.org/que-hacemos) +- [Programa de mentorías de la Universidad Complutense de Madrid](https://www.ucm.es/mentorias) +- [Programa de mentorías de la Universidad de la Frontera](http://mentorias.ufro.cl/) +- [Open Life Science](https://openlifesci.org) +- [Neoscientia](https://neoscientia.com/) +- [Encontrar mentores en ciencia de datos](https://mentorcruise.com/) + +Y en openScienceLabs te brindamos un programa de mentorías sobre algunos temas +de ciencia abierta que puedes consutar en enlace. + +### Referencias + +- [MENTOR-Sociedad Nacional de Mentoría](https://www.mentoring.org/) +- [Neoscientia](https://neoscientia.com/) +- [El mentoring como herramienta de motivación y retención del talento](http://pdfs.wke.es/2/2/7/6/pd0000012276.pdf) +- [Mentoría en educación superior, la experiencia en un programa extracurricular](http://www.scielo.org.mx/pdf/redie/v20n4/1607-4041-redie-20-04-86.pdf) diff --git a/content/blog/que-son-los-datos-abiertos/header.png b/bkp/blogs/que-son-los-datos-abiertos/header.png similarity index 100% rename from content/blog/que-son-los-datos-abiertos/header.png rename to bkp/blogs/que-son-los-datos-abiertos/header.png diff --git a/bkp/blogs/que-son-los-datos-abiertos/index.md b/bkp/blogs/que-son-los-datos-abiertos/index.md new file mode 100644 index 000000000..a2d4697e0 --- /dev/null +++ b/bkp/blogs/que-son-los-datos-abiertos/index.md @@ -0,0 +1,145 @@ +--- +title: "¿Qué son los datos abiertos?" +slug: que-son-los-datos-abiertos +date: 2020-01-18 +authors: ["Rainer Palm"] +tags: [datos] +categories: [ciencia abierta, datos abiertos, investigación abierta] +description: | + El manejo de los datos es un aspecto muy importante a considerar en los + proyectos de ciencia abierta. Con respecto al almacenamiento y uso de los datos, + hay un número nada despreciable de movimientos e iniciativas en boga que buscan + un mayor grado de transparencia y distribución de la información en todo tipo de + ámbitos. Principalmente en la esfera pública (en temas referidos a políticas + gubernamentales, uso del presupuesto de los ministerios, etc.), son iniciativas + que buscan hacer libres las investigaciones, técnicas y datos utilizados para + justificar la información y politicas dadas por estas instituciones. Movimientos + tales como el Partido Pirata prometen que, cuando estos datos estén disponibles, + no solamente se ejecutarán las políticas de una forma más eficiente sino que se + podrá garantizar la veracidad de la investigación permitiendo generar una fuerte + confianza en ésta. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +El manejo de los datos es un aspecto muy importante a considerar en los +proyectos de ciencia abierta. Con respecto al almacenamiento y uso de los datos, +hay un número nada despreciable de movimientos e iniciativas en boga que buscan +un mayor grado de transparencia y distribución de la información en todo tipo de +ámbitos. Principalmente en la esfera pública (en temas referidos a políticas +gubernamentales, uso del presupuesto de los ministerios, etc.), son iniciativas +que buscan hacer libres las investigaciones, técnicas y datos utilizados para +justificar la información y politicas dadas por estas instituciones. Movimientos +tales como el Partido Pirata prometen que, cuando estos datos estén disponibles, +no solamente se ejecutarán las políticas de una forma más eficiente sino que se +podrá garantizar la veracidad de la investigación permitiendo generar una fuerte +confianza en ésta. + + + +Por esto mismo, el tema de los datos abiertos es tan popular en comunidades de +ciencia actualmente. Dado que la posibilidad de contar con datos abiertos es +ofrecida por tecnologías computacionales, el internet, e instrumentos de +grabación ubícuos, en realidad es una simple extensión del dogma científico +proponer que todos compartan sus métodos en un formato reproducible, legible +tanto por humanos como por computadoras, y por lo tanto ayudar en cuanto la +replicabilidad de sus investigaciones. Pero, ¿qué son datos abiertos? y ¿Qué +exactamente queremos que sea parte del bien común? + +## Que son los datos? + +Cuando nos referimos a datos, por lo general hablamos de un conjunto de +materiales crudos que usamos en investigaciones, estudios y demás para derivar +conocimientos de ellos. Ya sean resultados de encuestas, medidas de laboratorio, +o grabaciones e imágenes del campo de estudio, se trata de la 'entrada' que +recibe el proceso investigativo para su realización. En otras palabras, un +'dato' es una unidad de información. + +Durante el proceso investigativo los datos pueden ser analizados, estudiados, +visualizados, coleccionados, medidos, etc. Para alcanzar un nivel aceptable de +transparencia, estos pasos deben ser también anotados y convertidos en datos en +si mismos. De esta forma los métodos utilizados pueden ser verificados y +reproducidos por cualquiera con acceso a las herramientas adecuadas. Sin acceso, +por lo menos escrito o grabado, al proceso mediante los cuales se obtuvieron los +datos, no se puede confiar en estos y por lo tanto prácticamente carecen de +significado. + +## Que son datos abiertos? + +En la actualidad, una inmensa cantidad de datos son recolectados y procesados +diariamente de forma casi automática como consecuencia del funcionamiento de +empresas, organizaciones e individuos. Aunque estos datos en su mayoría +pertenecen a entes privados y, por lo tanto, son puestos a disponibilidad de +apenas una cantidad selecta de personas, su 'minado' y posterior uso ya ayudan +muchísimo a la eficiencia y control del trabajo. Entonces, ¿que pasaría si esta +enorme base de datos estuvieraa disposición del público para su libre uso? + +Eso es lo que significa que algo tenga datos 'abiertos'. Según el +[Open Data Handbook](https://opendatahandbook.org/guide/es/what-is-open-data/), +los datos abiertos son aquellos que pueden ser vistos, utilizados, reutilizados, +y redistribuidos libremente por cualquier persona, y que se encuentran sujetos, +cuando mucho, al requerimiento de atribución y de compartirse de la misma manera +en que aparecen. De esta forma, 'abierto' puede aplicarse a información acerca +de cualquier sujeto, ya sea en áreas como finanzas, ciencia, cultura, negocios, +producción o cultura; siempre y cuando ésta esté sujeta a una licencia abierta +para libre uso y beneficio al público. Por lo tanto, 'abierto' puede aplicarse +también a información en una variedad de formatos, ya sean pedazos de texto +enriquecido, imágenes, videos y hojas de cálculo entre otras. + +Lo más importante es que los datos, para que sean 'abiertos', no deben ser +simplemente liberados, sino deben también estar disponibles en formatos y +lenguajes que puedan ser recibidos y procesados de forma significativa por una +computadora. También deben estar sujetos a una licencia 'abierta', es decir, que +mínimo permita su uso, modificación, y reproducción universales (sin restricción +en cuanto a quiénes o cuántas personas lo pueden ver), y que según sea +apropiado, permita también uso comercial, uso sin referencia alguna a los +creadores originales, o modificación de la licencia en sí. + +## Porque datos abiertos? + +El principal beneficio que proporciona tener datos abiertos en proyectos locales +es la interoperabilidad, o la capacidad de diversos sistemas y organizaciones de +trabajar en conjunto, usando los mismos datos sin restricciones o dificultades, +inclusive sin siquiera organizarse entre sí. Quizá ya hayas disfrutado de esto, +a la hora de consultar o revisar repositorios en Github, por ejemplo. De esta +forma, todos pueden aprovechar al máximo los datos de todos, haciendo el trabajo +más rápido y eficiente. Por esta misma razón se estima que los datos abiertos +pueden aportar mucho a la economía, ya que en temas de finanzas harían mucho mas +fácil tomar decisiones y, por ejemplo, estudios de mercado se podrían realizar +de manera más sencilla. + +La transparencia es también una de las principales razones por las cuales se +exige datos abiertos, sobre todo en el ámbito gubernamental. Las instituciones +públicas recogen una gran cantidad de datos al año, que cuentan como 'públicos'. +Estos se podrián liberar mediante una política de Estado y así cualquiera +podría, en teoría, revisar en función de sus intereses particulares y saber, por +ejemplo, en que se gastan los impuestos o mediante cuál proceso se hacen leyes. +Ya existen varios ejemplos de esto siendo realizado en un grado mas reducido, en +proyectos como el [Where does my money go?](https://app.wheredoesmymoneygo.org/) +de Inglaterra, donde se muestra aproximadamente cuanto dínero es gastado en las +distintas funciones de gobierno. Con un mayor grado de transparencia se promete +que la corrupción se hará más difícil y habrá mayor participación de los +ciudadanos en los procesos políticos y administrativos del Estado. + +También en el ámbito de las ciencias es importante considerar cuestiones de +transparencia y reproductibilidad. Siendo los datos abiertos prácticamente la +única forma en la que pueden replicarse los análisis computacionales, y siendo +estos ahora muy comunes en todo tipo de investigaciones, el problema de la +disponibilidad de los datos se hace integral para el cumplimiento del criterio +de ciencia. + +Sín duda los datos abiertos representan uno de los movimientos y tendencias mas +interesantes e importantes dentro de la comunidad científica. Es imperativo para +el progreso de la ciencia cambiar el paradigma de los lineamientos generales en +cuanto a la publicación de la investigación y los hallazgos se refiere. Mas aún +en una era donde la casi instantanea y amplia distribución de todo tipo de +información posibilita la creación de redes colaborativas mas eficientes y +grandes, investigaciones y analísis que no sacrifican reproducibilidad o +documentación según se van volviendo mas complejos. Los datos abiertos son el +primer paso a el establecimiento de una ciencia abierta, transparente y +retroalimenticia, acelerando aún mas el proceso investigativo a la vez que se +establecen practicas etícas y mas libertades, tanto para trabajadores en el area +como aficionados o interesados. diff --git a/content/blog/que-son-los-laboratorios-sociales-y-como-pueden-ayudar-los-equipos-de-investigacion/header.png b/bkp/blogs/que-son-los-laboratorios-sociales-y-como-pueden-ayudar-los-equipos-de-investigacion/header.png similarity index 100% rename from content/blog/que-son-los-laboratorios-sociales-y-como-pueden-ayudar-los-equipos-de-investigacion/header.png rename to bkp/blogs/que-son-los-laboratorios-sociales-y-como-pueden-ayudar-los-equipos-de-investigacion/header.png diff --git a/bkp/blogs/que-son-los-laboratorios-sociales-y-como-pueden-ayudar-los-equipos-de-investigacion/index.md b/bkp/blogs/que-son-los-laboratorios-sociales-y-como-pueden-ayudar-los-equipos-de-investigacion/index.md new file mode 100644 index 000000000..854bf4e20 --- /dev/null +++ b/bkp/blogs/que-son-los-laboratorios-sociales-y-como-pueden-ayudar-los-equipos-de-investigacion/index.md @@ -0,0 +1,132 @@ +--- +title: + "¿Qué son los laboratorios sociales y cómo pueden ayudar a los equipos de + investigación?" +slug: que-son-los-laboratorios-sociales-y-como-pueden-ayudar-los-equipos-de-investigacion +date: 2020-02-07 +authors: ["Rainer Palm"] +tags: [laboratorios sociales, comunidad, ciencia ciudadana] +categories: [ciencia abierta] +description: | + Recientemente se ha vuelto popular la creación de espacios tales como MediaLabs + y otras formas de laboratorios sociales. Estas organizaciones de innovación + sugieren el uso del modelo abierto del laboratorio, donde se hacen disponibles + tanto utensilios como instrumentos (ya sean de trabajo o de medición), como un + entorno en el cual se puede experimentar con este material, y donde se ponen en + contacto personas que, quizás, nunca hayan estado relacionadas con el mundo + académico o emprendedor de ninguna forma, permitiéndoles _cocrear_ + investigaciones y productos de forma independiente. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Recientemente se ha vuelto popular la creación de espacios tales como MediaLabs +y otras formas de laboratorios sociales. Estas organizaciones de innovación +sugieren el uso del modelo abierto del laboratorio, donde se hacen disponibles +tanto utensilios como instrumentos (ya sean de trabajo o de medición), como un +entorno en el cual se puede experimentar con este material, y donde se ponen en +contacto personas que, quizás, nunca hayan estado relacionadas con el mundo +académico o emprendedor de ninguna forma, permitiéndoles _cocrear_ +investigaciones y productos de forma independiente. + + + +La experiencia que ofrecen estos lugares es tan , que muchos espacios variados +(principalmente museos de ciencia y de tecnología) han empezado a ofrecer este +mismo servicio, con un enfoque especializado en la realización de ciencia con +metodologías experimentales. Ya sea como parte de un plan educativo o +simplemente como un negocio prestado a individuos interesados, estos +laboratorios sociales trasladan las ideas de la cultura DIY a la esfera de la +ciencia ciudadana, otorgando los medios para que las personas aprendan a hacer +ciencia con su practica, enseñandoles a solucionar problemas concretos de su +comunidad con investigaciones empíricas. De esta forma, ayudan a distribuir el +conocimiento científico de una forma mas didáctica y inmediatamente útil, muy +distinta a como es comunmente recibido en escuelas y libros. + +Estos sitios no solamente ofrecen un lugar donde trabajar, sino también una +comunidad que reune una gran variedad de actores: organizaciones sin fines de +lucro, gobiernos, empresas sociales, y por supuesto, principalmente, ciudadanos +comunes. La confluencia de estos entes se debe a que el laboratorio social es un +lugar primariamente diseñado para la creación y experimentación de nuevas ideas, +un lugar donde cualquiera puede probar, proponer, inventar, y encontrar nuevas +ideas o hipótesis. Esto obliga a los laboratorios sociales ser espacios que +sobrevivan al constante cambio, a la reconfiguración de sus herramientas según +las necesidades de los usuarios, ser espacios flexibles y abiertos donde se +pueden encontrar soluciones rapidas y conclusiones certeras sín importar el reto +al cual se este afrontando. + +A pesar de su novedad, es un modelo que promete, mezclando aspectos de +resolución de conflictos, estudios innovativos, aprendizaje didáctico e +organización espontanea en un mix que podría tener un impacto bastante +significativo en los modos de trabajo en donde se desenvuelven tanto ciudadanos +como emprendedores y científicos. Por supuesto, hay un número de problemas con +la manera en la que existen actualmente, como el riesgo de que sus usuarios se +vuelvan parte del precariado, volviendo estos espacios un lugar de trabajo +extraoficial, fuera del alcance de normativas laborales y derechos que les +otorgaria un empleo regular. + +## ¿Que laboratorios sociales existen actualmente? + +La institución que inmediatamente viene a la mente cuando pensamos en modelos +experimentales de laboratorio es el MIT Media Lab, una comunidad de +investigación que activamente promueve "una cultura unica y antidisciplinaria +que fomenta la mezcla no convencional de areas de estudio supuestamente +dispares"\[1\]. Apoyado por una multitud de organizaciones en industrias y +negocios variados, su principal misión es, mediante este arreglo en el que +estudiantes de distintas esferas de la ciencia trabajan juntos, crear +"tecnologías disruptivas que ocurren en las franjas, liderando areas como +computación vestible, interfaces tangibles ... desde enfoques digitales al +tratamiento de enfermedades neurologicas, hasta tecnologías avanzadas de imagen +que pueden 'ver alrededor de una esquina'.". + +Dentro de esta comunidad, existe una multitud de programas conjuntos en los que +sus integrantes trabajan con colaboradores del MIT. Cualquiera que desee ver los +resultados de esta bomba de experimentación y distintas perspectivas solamente +necesita ir a su canal de YouTube\[2\], donde estan alojados tanto conferencias +y charlas como presentaciones cortas (menos de 5 minutos) de proyectos +particulares, hechos por los investigadores. Es facil apreciar como su uso de +tecnícas y herramientas desarrolladas en el sitio llevan a resultados un tanto +interesantes y prometedores, como impresoras 3D que integran procesos biologícos +en la fabricación de objetos\[3\]. Sín duda un modelo interesante a pesar de su +obvia restricción en cuanto al personal que trabaja ahí. + +A pesar de que esta organización en particular solamente abarca la comunidad +particular de los estudiantes del MIT, existén otros proyectos con un grado de +accesibilidad mucho mayor, tal como el Medialab Prado\[4\] de Madríd, España. +Este proyecto se trata de un laboratorio verdaderamente ciudadano, en el que +cualquiera puede realizar propuestas y trabajar junto a otras personas en los +proyectos que deseen. Su visión es de un laboratorio que sustente comunidades de +aprendizaje y de práctica conformadas por personas de todo tipo de trasfondos, +experimentando con metodologías y modos de trabajo en el proceso, +transformandolos conforme se desarollan proyectos 'culturalmente libres'. + +Para este proposito, se hace un espacio completamente abierto al público, donde +se acogen numerosos grupos de trabajo involucrados en el prototipado de una +múltitud de proyectos. Mediante una plataforma online y numerosas fases de +producción y debate, se genera "un contexto de intercambio de conocimientos y +habilidades en torno a un problema colectivo"\[5\], y para solucionar estos +problemas, se promueve la utilización de herramientas libres y código abierto. +Periodícamente Medialab Prado publica información acerca de proyectos para los +cuales se requieren propuestas, y despues en los talleres en que se desarollen +estas propuestas se puede tanto ser promotor del proyecto como trabajar +directamente como un colaborador. Aparte de ser un espacio donde pueden +colaborar las personas, también se suelen alojar conferencias y actividades +relacionadas dentro de el. + +Alrededor del mundo existen un multitud de similares espacios cuyo objetivo es +integrar al ciudadano común en el proceso científico, plantenadose como una +especie de transformacion tanto de la forma en la que se distribuye el +conocimiento y se capacitan las personas, como del proceso de innovación y +colaboración, con un enfoque social. Iniciativas tales como el SociaLab, que +comenzó en Colombia\[6\], la Honey Bee Network\[7\], o el Climate CoLab\[8\] +permiten a cualquier persona que disponga de tan solo un poco de curiosidad y +algo de tiempo trabajar en proyectos científicos a gran escala, en cuestiones de +traducción, diseño, mentoría, y por supuesto, analísis, investigación, y +experimentación. + +\[1\]: "The MIT Media Lab at a Glance" \[2\]: "MIT Media Lab" \[3\]: "3D +printing with living organisms" \[4\]: "Medialab Prado" \[5\]: "Medialab Prado - +Qué es" diff --git a/content/blog/r-nube-de-palabras/header.png b/bkp/blogs/r-nube-de-palabras/header.png similarity index 100% rename from content/blog/r-nube-de-palabras/header.png rename to bkp/blogs/r-nube-de-palabras/header.png diff --git a/content/blog/r-nube-de-palabras/index.ipynb b/bkp/blogs/r-nube-de-palabras/index.ipynb similarity index 99% rename from content/blog/r-nube-de-palabras/index.ipynb rename to bkp/blogs/r-nube-de-palabras/index.ipynb index b0aa94c02..121695ac3 100644 --- a/content/blog/r-nube-de-palabras/index.ipynb +++ b/bkp/blogs/r-nube-de-palabras/index.ipynb @@ -1,5 +1,28 @@ { "cells": [ + { + "cell_type": "raw", + "id": "d16a9ac1-d49f-45df-bef5-d38b220ab431", + "metadata": {}, + "source": [ + "---\n", + "title: \"Crea una nube de palabras en R a partir de un documento de texto\"\n", + "slug: r-nube-de-palabras\n", + "date: 2022-03-01\n", + "authors: [\"Ever Vino\"]\n", + "tags: [nube de palabras, tm]\n", + "categories:\n", + " [ciencia abierta, código abierto, R, ciencia de datos, minería de datos]\n", + "description: |\n", + " Una nube de palabras o wordcloud nos sirve para visualizar la frecuencia de palabras\n", + " dentro de un texto. En este tutorial, usaremos el artículo de [inteligencia artificial]\n", + " (https://es.wikipedia.org/wiki/Inteligencia_artificial) de Wikipedia para\n", + " construir nuestra nube de palabras usando las bibliotecas `tm` y `wordcloud`.\n", + "thumbnail: \"/header.png\"\n", + "template: \"blog-post.html\"\n", + "---" + ] + }, { "cell_type": "markdown", "id": "2bc08615-e950-478a-af97-ba99bd90bead", @@ -7,10 +30,6 @@ "tags": [] }, "source": [ - "# Crea tu nube de palabras en R a partir de un documento de texto\n", - "\n", - "![Convertir un texto a Nube de palabras ](../../../images/blog/crea-una-nube-de-palabras-en-r-partir-de-un-documento-de-texto/header.png)\n", - "\n", "Una nube de palabras o wordcloud nos sirve para visualizar la frecuencia de palabras dentro de un texto.\n", "En este tutorial, usaremos el artículo de [inteligencia artificial](https://es.wikipedia.org/wiki/Inteligencia_artificial) de Wikipedia para construir nuestra nube de palabras usando las bibliotecas `tm` y `wordcloud`.\n", "\n", @@ -374,17 +393,21 @@ ], "metadata": { "kernelspec": { - "display_name": "R", - "language": "R", - "name": "ir" + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" }, "language_info": { - "codemirror_mode": "r", - "file_extension": ".r", - "mimetype": "text/x-r-source", - "name": "R", - "pygments_lexer": "r", - "version": "4.0.4" + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" }, "nikola": { "author": "Ever Vino", diff --git a/bkp/blogs/r-nube-de-palabras/index.md b/bkp/blogs/r-nube-de-palabras/index.md new file mode 100644 index 000000000..fae55951e --- /dev/null +++ b/bkp/blogs/r-nube-de-palabras/index.md @@ -0,0 +1,250 @@ +--- +title: "Crea una nube de palabras en R a partir de un documento de texto" +slug: r-nube-de-palabras +date: 2022-03-01 +authors: ["Ever Vino"] +tags: [nube de palabras, tm] +categories: + [ciencia abierta, código abierto, R, ciencia de datos, minería de datos] +description: | + Una nube de palabras o wordcloud nos sirve para visualizar la frecuencia de palabras + dentro de un texto. En este tutorial, usaremos el artículo de [inteligencia artificial] + (https://es.wikipedia.org/wiki/Inteligencia_artificial) de Wikipedia para + construir nuestra nube de palabras usando las bibliotecas `tm` y `wordcloud`. +thumbnail: "/header.png" +template: "blog-post.html" +--- + +Una nube de palabras o wordcloud nos sirve para visualizar la frecuencia de +palabras dentro de un texto. En este tutorial, usaremos el artículo de +[inteligencia artificial](https://es.wikipedia.org/wiki/Inteligencia_artificial) +de Wikipedia para construir nuestra nube de palabras usando las bibliotecas `tm` +y `wordcloud`. + + + +## Instalación de pre-requisitos + +Para un mejor manejo de los paquetes, aquí vamos a utilizar la biblioteca +`pacman`, esta nos permitirá hacer una instalación y activación de las +bibliotecas de manera rápida. Recuerde instalar **Rtools** y la versión más +reciente de **R** si está usando **Windows**. + +```python +# install.packages("pacman") # Si no tiene instalada la Biblioteca Pacman ejecutar esta línea de código +library("pacman") +``` + +Bibliotecas adicionales requeridas, instaladas y abiertas con `pacman`. + +```python +p_load("tm") # Biblioteca para realizar el preprocesado del texto, +p_load("tidyverse") # Biblioteca con funciones para manipular datos. +p_load("wordcloud") # Biblioteca para graficar nuestra nube de palabras. +p_load("RColorBrewer") # Biblioteca para seleccionar una paleta de colores de nuestra nube de palabras. +``` + +## Importación del texto + +Para este ejemplo, descargamos nuestro artículo de formato texto de un +repositorio, guardamos la dirección web en `articulo_IA` y lo descargamos usando +la función `read_file()`. También puede usar los directorios locales para +importar un texto de su preferencia. Si desea descargar el archivo que usamos en +este ejemplo puede hacer hacerlo ejecutando +`download.file("https://gist.github.com/EverVino/7bdbbe7ebdff5987970036f52f0e384f/raw/3a1997b6f9e3471555a941f8812ada0cef84977d/gistfile1.txt", paste(getwd(),"/texto.txt", sep=""))` +en la línea de comando de R, esto descargará el archivo y lo guardara en la +carpeta de trabajo de R con el nombre de **texto.txt**. + +_Para saber la carpeta de trabajo puede ejecutar `getwd()`. puede cambiar la +carpeta de trabajo con la función `setwd("/nuevo_directorio_trabajo/")`._ + +Luego de importar el texto, vamos a convertirlo en un objeto tipo `Source`, esto +facilitará la minería del texto y su posterior modificación. + +```python +articulo_IA <- "https://gist.github.com/EverVino/7bdbbe7ebdff5987970036f52f0e384f/raw/3a1997b6f9e3471555a941f8812ada0cef84977d/gistfile1.txt" +texto <- read_file(articulo_IA) +``` + +- `read_file(dir)`: Función de la biblioteca `tidyverse` que nos permite + importar archivos de texto. El resultado de la función es un vector de un sólo + elemento. `dir` es la **direción local** o **url** con el nombre del archivo + de formato **txt** a importar. + +```python +texto <- VCorpus(VectorSource(texto), + readerControl = list(reader = readPlain, language = "es")) +``` + +- `VCorpus (x, readerControl(y))`: Donde `x` es un objeto del tipo `Source`, se + recomienda que sea un objeto del tipo `VectorSource`. Para `readerControl(y)` + `y` es una lista de parámetros para leer `x`. + +- `VectorSource(vector)`: Convierte una lista o vector a un objeto tipo + VectorSource. + +## Preprocesado de texto + +Una vez importado el texto, tenemos que eliminar la palabras que actúan como +conectores, separadores de palabras , de oraciones, y números que no aportarán +al análisis del texto, para ello usamos la función `tm_map()` que nos permite +aplicar funciones al texto del `Corpus`. + +```python +texto <- tm_map(texto, tolower) +texto <- texto %>% + tm_map(removePunctuation) %>% + tm_map(removeNumbers) %>% + tm_map(removeWords, stopwords("spanish")) +texto <- tm_map(texto, removeWords, c("puede", "ser", "pues", "si", "aún", "cómo")) +texto <- tm_map(texto, stripWhitespace) +``` + +- `tm_map(text, funcion_de_transformacion, parametros_de_funcion)`: Transforma + el contenido de texto de un objeto `Corpus` o `VCorpus`, aplicando las + funciones de transformación de texto. + +- `tolower`: Función de transformación de texto, usado para convertir todas la + mayúsculas a minúsculas. + +- `removeNumber`: Función para eliminar los números del texto. + +* `removeWord`: Función para remover palabras, + +- `stopword("lang")`: Lista de palabras conectoras en el lenguaje lang, es + argumento de la función `removeWord`. + +- `stripWhitespace`: Función para remover los espacios blancos de un texto. + +Nótese que usamos ambas notaciones para transformar el texto del `Corpus`, la +notación normal `tm_map(x, FUN)` y también la notación de la biblioteca de +`tydiverse` `pipeoperator` `>%>`, que toma como argumento inicial el resultado +de la anterior función. + +_Si quiere observar los cambios del texto puede ejecutar en la consola +`writeLines(as.character(texto[[1]]))`, esto imprimirá el resultado en la +consola._ + +## Construyendo la tabla de frecuencia + +```python +texto <- tm_map(texto, PlainTextDocument) +``` + +- `PlainTextDocument`: Convierte texto a un objeto tipo PlainTextDocument. Para + el ejemplo, convierte un `VCorpus` a `PlainTextDocument` el cuál contiene + metadatos y nombres de las filas, haciendo factible la conversión a un matriz. + +```python +tabla_frecuencia <- DocumentTermMatrix(texto) +``` + +- `DocumentTermMatrix(texto)`: Convierte texto a un objeto tipo term-document + matrix. Es un objeto que va a contener la frecuencia de palabras. + +```python +tabla_frecuencia <- cbind(palabras = tabla_frecuencia$dimnames$Terms, + frecuencia = tabla_frecuencia$v) +``` + +Extraemos los datos que nos interesan del objeto `tabla_frecuencia` y los +juntamos con `cbind()`. + +_Ejecutando en la consola `View(tabla_frecuencia)` notamos que es un objeto, +para acceder a sus valores usamos el símbolo `$` dicho de otra manera: para +acceder a las `palabras` usamos `tabla_frecuencia$dimnames$Terms` y para su +correspondientes frecuencia en el texto `tabla_frecuencia$v`._ + +```python +# Convertimos los valores enlazados con cbind a un objeto dataframe. +tabla_frecuencia<-as.data.frame(tabla_frecuencia) +# Forzamos a que la columna de frecuencia contenga valores numéricos. +tabla_frecuencia$frecuencia<-as.numeric(tabla_frecuencia$frecuencia) +# Ordenamos muestra tabla de frecuencias de acuerdo a sus valores numéricos. +tabla_frecuencia<-tabla_frecuencia[order(tabla_frecuencia$frecuencia, decreasing=TRUE),] +``` + +_Con estos últimos ajustes ya tenemos nuestra tabla de frecuencias para +graficarla._ _Puede verificar los resultados ejecutando en la consola +`head(tabla_frecuencia)`_ + +## Graficando nuestra nube de palabras + +Una vez obtenida nuestra tabla de frecuencia sólo es necesario aplicar la +función `wordcloud()`. + +```python +wordcloud(words = tabla_frecuencia$palabras, + freq = tabla_frecuencia$frecuencia, + min.freq = 5, + max.words = 100, + random.order = FALSE, + colors = brewer.pal(8,"Paired")) +``` + +![png](index_files/index_24_0.png) + +- `wordcloud(word, freq, min.freq, max.words, random.order, color)`: Función + para graficar la frecuencia de palabras, el tamaño de la palabra graficada + será proporcional a la frecuencia de la misma. Esta función grafica las + palabras en `word` con sus respectivas frecuencias `freq`, sólo usará las + palabras que como mínimo tenga una frecuencia mínima `min.freq`, la cantidad + de palabras en graficadas es igual a `maxwords`, las posiciones podrán ser + aleatorias o no, dependiendo del valor de `random.order`, los colores estan + dados en forma de lista en `colors`. +- `brewer.pal(n, "paleta")`: Devuelve `n` valores de la `paleta`. Para la + función `brewer.pal()` puede usar las paletas `"Dark2"`, `"Set1"`, `"Blues"` + entre otros. + +_Cada vez que ejecute la función le mostrará diferentes resultados, para +evitarlo si así se desea, puede fijar un estado inicial para generar números +aleatorios que utiliza la función wordcloud. Use: `set.seed(1234)` para este +propósito (puede alterar el valor del argumento numeral para diferentes +resultados)._ + +## Guardando nuestra nube de palabras + +Usamos la función `png()` para guardar la gráfica que se genera usando +wordcloud. También puede usar otras funciones como `jpeg`, `svg` y otros. Nótese +que usamos la función `png()` y `dev.off()` antes y despues de la función +generadora de la grafica `wordcloud()` + +```r +png("nube.png", width = 800,height = 800, res = 100) + wordcloud(...) +dev.off() +``` + +- `png("nombre.png", with, height, res) ... dev.off()`: Guarda el gráfico + generado en formato `png`, dentro del directorio actual de trabajo. Lo guarda + con el nombre `"nombre.png"` con el ancho y alto en pixeles de `with` y + `height` respectivamente; y con la resolución `res` en ppi. Con `dev.off()` + concluimos la obtención de datos de `png()`. + +_Otra biblioteca muy utilizada para generar una nube de palabras es +`wordcloud2`, esta posee muchos más parámetros para modificar la apariencia de +la nube, pero teniendo en cuenta que R está optimizado para realizar tratamiento +de datos y no tanto para dibujar palabras, es recomendable usar otras opciones +online o programas de diseño gráfico, si queremos mejores resultados. Y usar R +para la obtención de la tabla de frecuencia de las palabras._ _Nota: Existen +palabras que pueden derivar de una misma palabra y expresan el mismo +significado, como ser nube, nubes, nubarrón, que estan diferenciadas aquí en +este ejemplo, estos requieren la aplicación adicional de una función que +contemple estas variaciones linguisticas, lamentablemente a la fecha no hay una +función equivalente para el español para R. Sin embargo si realiza el análisis +de palabras en inglés puede usar +`tm_map(Corpus_en_ingles, stemDocument, language="english")`._ + +Finalmente antes de concluir cerramos las bibliotecas abiertas con `pacman`. La +ventaja de hacer esto se ve cuando manejamos diferentes bibliotecas que tienen +funciones con el mismo nombre, al cerrar las bibliotecas con conflictos, nos +evitamos de especificar en el código a que biblioteca de R nos referimos. + +```python +p_unload(all) +``` + +## Referencias + +- [Wikipedia-Inteligencia Artificial](https://es.wikipedia.org/wiki/Inteligencia_artificial) +- [Documentacion de R](https://www.rdocumentation.org) diff --git a/content/blog/r-nube-de-palabras/output_23_0.png b/bkp/blogs/r-nube-de-palabras/index_files/index_24_0.png similarity index 100% rename from content/blog/r-nube-de-palabras/output_23_0.png rename to bkp/blogs/r-nube-de-palabras/index_files/index_24_0.png diff --git a/content/blog/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/header.png b/bkp/blogs/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/header.png similarity index 100% rename from content/blog/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/header.png rename to bkp/blogs/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/header.png diff --git a/bkp/blogs/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/index.md b/bkp/blogs/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/index.md new file mode 100644 index 000000000..b4e03d987 --- /dev/null +++ b/bkp/blogs/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/index.md @@ -0,0 +1,150 @@ +--- +title: "10 razones para usar Python en tu proximo proyecto de investigación" +slug: razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion +date: 2020-01-22 +authors: ["Rainer Palm"] +tags: [bibliotecas, herramientas, código] +categories: [ciencia abierta, investigación abierta, ciencia de datos, Python] +description: | + ¿Estás interesado en integrar un poco de programación en tu rutina cotidiana?, + ¿Necesitas aprovechar de la versatilidad y eficiencia que te otorga manejar con + fluidez codigo?, ¿O simplemente quieres aprovechar de la utilidad de poder + realizar análisis computacional?. Sea cual sea la razón, te podrías estar + preguntando por donde empezar. Habiendo tantos lenguajes de programación + disponibles, con una cantidad prácticamente infinita de usos, puede serte + difícil decidir con cuál empezar a aprender o cuál aportará más a tu trabajo. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +¿Estás interesado en integrar un poco de programación en tu rutina cotidiana?, +¿Necesitas aprovechar de la versatilidad y eficiencia que te otorga manejar con +fluidez codigo?, ¿O simplemente quieres aprovechar de la utilidad de poder +realizar análisis computacional?. Sea cual sea la razón, te podrías estar +preguntando por donde empezar. Habiendo tantos lenguajes de programación +disponibles, con una cantidad prácticamente infinita de usos, puede serte +difícil decidir con cuál empezar a aprender o cuál aportará más a tu trabajo. + + + +Probablemente hayas escuchado de [Python](http://python.org) en algún momento, +debido a que es un lenguaje con mucha difusión, que goza de una gran comunidad y +patrocinio de grandes compañías (principalmente [Facebook](http://facebook.com), +[Google](http://google.com), [Amazon](http://amazon.com) y +[Capital One](https://www.capitalone.com/)). Se trata de un lenguaje +interpretativo (no requiere ser compilado) y de alto nivel, lo cual lo hace +perfecto para principiantes y cualquier tipo de persona que quiera entrar en el +mundo de la programación. Si aún no te hemos convencido, aqui te damos mas +excusas para aprender a usar Python en tu próóximo proyecto de investigación! + +## Lenguaje estándar para ciencia reproducible + +No importa cual sea la rama en la que te desenvuelvas, Python es una de las +principales herramientas en la creación de investigaciones reproducible. Siendo +un lenguaje que se presta muy bien a la creación de 'scripts' pequeños y +modulares, ademas de ser bastante ligero y poseer su propio manejador de +paquetes (pip), hace que la creación de un entorno virtual para investigación +colaborativa y reproducible sea sencilla e indolora. Dejar disponible cóódigo +libre usado en tu investigación hará mucho para garantizar su reproducibilidad, +sobre todo si utilizas un programa de control de versiones como git, y esto no +es algo que puedas hacer usando programas pre-compilados de código cerrado. + +##Gran cantidad de recursos y apoyo disponibles + +Siendo Python un lenguaje que cuenta con una gran comunidad internacional, hay +un sinfín de libros y guías dispuestas a ayudarte en tu ruta de aprendizaje, en +todo tipo de plataformas. Si tienes algún problema o duda, es cuestión de buscar +o preguntar por algun sitio de consulta (como +[StackOverflow](http://stackoverflow.com)), y si lo que quieres es aprender a +escribir código, hay un sinfín de posibilidades a tu alcance, desde cursos +directos en sitios como [Codeacademy](https://www.codecademy.com/), hasta libros +como [Python Crash Course](http://www.nostarch.com/pythoncrashcourse/) o +[Learn Python 3 the Hard Way](https://learnpythonthehardway.org/python3/). +Además, su uso común en ambientes académicos hace sencillo encontrar con quien +colaborar. + +## Librerías dedicadas a análisis científico + +Hay una multitud de librerías de Python que reciben mantenimiento y apoyo +regular por parte de desarrolladores y usuarios, y que son utilizadas muy +comúnmente en ámbitos no solo de estadística o ciencia de datos, sino también en +experimentos, dependiendo de la circunstancias. Librerías como +[matplotlib](https://matplotlib.org/), [Pandas](https://pandas.pydata.org/), +[SciKit learn](https://scikit-learn.org) son usadas regularmente en una variedad +de análisis, ya que proporcionan herramientas para manipulación y interpretación +de datos de alto nivel en una gran cantidad de formatos, cuyos resultados pueden +ser luego fácilmente mostrados de una forma visual e intuitiva sin sacrificar +reproducibilidad. + +## Interpretado y sencillo de aprender + +Ya que Python es un lenguaje de alto nivel (más parecido a nuestros 'lenguajes +naturales', abstrayendo mucha de la lógica interna de la computadora), está +diseñado específicamente para que el código escrito en este sea fácil de leer y +entender, con uso significativo de espacios en blanco y constructos del +lenguaje; se hace mucho mas intuitivo para aquellos que no esten acostumbrados a +leer y escribir código. Además, que sea interpretado significa que no te tienes +que preocupar por compiladores y demás tecnicismos. + +## Automatización de tareas manuales y tediosas + +Sin escribir mucho código, Python permite que muchas tareas de manejo e +interpretación de datos o archivos (tales como comparación de dos tablas de +datos, conversión de tipos de archivos, etcetera) se puedan automatizar de una +forma rápida y sencilla. Sin mencionar que hay una cantidad enorme de apoyo para +todo tipo de formatos de imágenes, películas, música, texto, etcetera. De hecho, +este es el foco del libro +[Automate the Boring Stuff with Python](https://automatetheboringstuff.com/) un +libro de acceso abierto para la lectura desde su sitio web. + +## Creación de tu propio entorno de trabajo + +Con la continua creación de scripts y uso de librerías adaptadas a tu flujo y +area de trabajo, eventualmente puedes automatizar y hacer mas eficiente gran +parte de tu investigación, teniendo un conjunto de herramientas de código +abierto y acceso libre a tu disposición, para que las puedas modificar y mejorar +como desees. Si aprendes a integrar elementos de interfaz gráfica (GUI) en tu +código, te sera aún mas fácil integrar de forma fluida scripts de Python en tus +proyectos de investigación colaborativa, haciéndolos accesibles y sencillos de +usar. + +## Visualización y demostración de análisis + +Existen una gran cantidad de opciones en relación a librerías de Python usadas +muy comúnmente en escritura de artículos de análisis computacional. Ya sea el +anteriormente mencionado Matplotlib, librerías que enlazan R a Python, o +'cuadernos' como los de Jupyter. Existe una variedad de herramientas que +permiten a cualquiera no solamente ver gráficos sino también fácilmente entender +como fueron generados y experimentar con las variables y modelos usados. + +## Multiplataforma y soporte en varias IDEs + +Python, al ser un lenguaje abierto, es inherentemente multiplataforma. Pero lo +mas importante es la gran cantidad de entornos de desarrollo integrado (IDEs, +por sus siglas en inglés) que soportan nativamente, sin necesidad de plugins, la +sintaxis de Python, haciendo posible el uso de completación de código y el +aprovechamiento de otras capacidades de la IDE que estés utilizando (como +integración con git, programación visual y otras añadidas mediante plugins). + +## Scripting con librerías de multiples lenguajes de programación + +Debido a la facilidad y rapidez de escribir muchos scripts pequeños en Python, +se han creado distintas utilidades que se apoyan a su vez en código +anteriormente escrito con otros lenguajes (tales como C++) para interactuar con +controladores de hardware, leer archivos con datos crudos, ejecutar operaciones +que son mas eficientes a bajo nivel, etc. En pocas palabras, puedes usar a +Python como si fuese una especie de "gestor" de una multitud de programas ya +hechos, dándote aún mas flexibilidad sin complicar demasiado las cosas. + +## Computación interactiva + +Python posee un terminal interactivo que te permite ejecutar y evaluar comandos +de una forma directa, y 'recordar' comandos previamente utilizados al instante, +además de importar librerías sin necesidad de correr archivos con código +previamente escrito (en formato .py), definir variables, correr y grabar +funciones, etcetera. Ciertas herramientas, como Jupyter, permiten integrar la +shell dentro de una interfaz web, lo cual facilita a cualquiera a cualquier +usuario interactuar con tus modelos y funciones libremente. diff --git a/content/blog/reorganiza-tus-tablas-con-tidyr/Viajeros_2016_2021.jpeg b/bkp/blogs/reorganiza-tus-tablas-con-tidyr/Viajeros_2016_2021.jpeg similarity index 100% rename from content/blog/reorganiza-tus-tablas-con-tidyr/Viajeros_2016_2021.jpeg rename to bkp/blogs/reorganiza-tus-tablas-con-tidyr/Viajeros_2016_2021.jpeg diff --git a/content/blog/reorganiza-tus-tablas-con-tidyr/Viajeros_trimestre_1_2019.jpeg b/bkp/blogs/reorganiza-tus-tablas-con-tidyr/Viajeros_trimestre_1_2019.jpeg similarity index 100% rename from content/blog/reorganiza-tus-tablas-con-tidyr/Viajeros_trimestre_1_2019.jpeg rename to bkp/blogs/reorganiza-tus-tablas-con-tidyr/Viajeros_trimestre_1_2019.jpeg diff --git a/content/blog/reorganiza-tus-tablas-con-tidyr/header.png b/bkp/blogs/reorganiza-tus-tablas-con-tidyr/header.png similarity index 100% rename from content/blog/reorganiza-tus-tablas-con-tidyr/header.png rename to bkp/blogs/reorganiza-tus-tablas-con-tidyr/header.png diff --git a/content/blog/reorganiza-tus-tablas-con-tidyr/index.md b/bkp/blogs/reorganiza-tus-tablas-con-tidyr/index.md similarity index 76% rename from content/blog/reorganiza-tus-tablas-con-tidyr/index.md rename to bkp/blogs/reorganiza-tus-tablas-con-tidyr/index.md index 0b62f0ba6..6b4bf29a4 100644 --- a/content/blog/reorganiza-tus-tablas-con-tidyr/index.md +++ b/bkp/blogs/reorganiza-tus-tablas-con-tidyr/index.md @@ -2,14 +2,16 @@ title: "Reorganiza tus tablas con tidyr en R" slug: reorganiza-tus-tablas-con-tidyr date: 2022-07-17 -author: Ever Vino +authors: ["Ever Vino"] tags: [tidyr, bibliotecas, tablas, reorganizar, filtrar datos] categories: [R, ciencia de datos] - -draft: false -usePageBundles: true +description: | + En este artículo, veremos cómo modificar la forma de una tabla, combinando + varias columnas en una sola o viceversa, veremos ejemplos en los que + utilizaremos la biblioteca `tidyr` con sus funciones `gather()`, `spread()`, + `separate()`, y `unite()`. thumbnail: "/header.png" -featureImage: "/header.png" +template: "blog-post.html" --- @@ -38,13 +40,19 @@ p_load("scales") # Biblioteca para dar formato de miles en el eje "y" ``` -Recuerda, también puedes instalar y abrir las bibliotecas de manera tradicional, por ejemplo con: `install.packages("tidyr")`, luego abrir la misma biblioteca con `library(tidyr)`. +Recuerda, también puedes instalar y abrir las bibliotecas de manera tradicional, +por ejemplo con: `install.packages("tidyr")`, luego abrir la misma biblioteca +con `library(tidyr)`. ## Importando nuestros datos -Los datos usados han sido descargados de [la base de datos del Instituto de Estadística de Bolivia (INE)](https://www.ine.gob.bo/). Una vez que se tiene los datos en nuestro equipo, se modifica para que se encuentren en formato `.csv` y los importamos a nuestro entorno de R. +Los datos usados han sido descargados de +[la base de datos del Instituto de Estadística de Bolivia (INE)](https://www.ine.gob.bo/). +Una vez que se tiene los datos en nuestro equipo, se modifica para que se +encuentren en formato `.csv` y los importamos a nuestro entorno de R. -Puedes descargar los archivos usados en este artículo [aquí](https://github.com/EverVino/Example_data_tidyr). +Puedes descargar los archivos usados en este artículo +[aquí](https://github.com/EverVino/Example_data_tidyr). Importamos el archivo `.csv` a la variable `datos_turistas`. @@ -58,7 +66,7 @@ En la consola observamos lo siguiente: ```r -Rows: 44 Columns: 169 +Rows: 44 Columns: 169 ── Column specification ─────────────────────────────────────────────────────────────── Delimiter: "," chr (1): Nacionalidad @@ -69,17 +77,23 @@ dbl (168): 31/01/08, 28/02/08, 31/03/08, 30/04/08, 31/05/08, 30/06/08, 31/07/08, ``` -Nuestra tabla tiene varias columnas correspondientes al acumulativo por mes, si queremos graficar estos datos, `ggplot()` no nos será de mucha utilidad. Por ello vamos a usar `gather()` para convertir las fechas de las columnas en datos de una sola columna. +Nuestra tabla tiene varias columnas correspondientes al acumulativo por mes, si +queremos graficar estos datos, `ggplot()` no nos será de mucha utilidad. Por +ello vamos a usar `gather()` para convertir las fechas de las columnas en datos +de una sola columna. -Si quieres explorar los datos manualmente puedes ejecutar la función `(View(datos_turistas))` en la consola. +Si quieres explorar los datos manualmente puedes ejecutar la función +`(View(datos_turistas))` en la consola. ## ¿Cómo usar la función `gather()`? -La función `gather()` puede agrupar los nombres de las columnas en una sola, así como se muestra en la siguiente animación. +La función `gather()` puede agrupar los nombres de las columnas en una sola, así +como se muestra en la siguiente animación. ![Fucionamiento de gather de tidyr()](https://user-images.githubusercontent.com/209714/48026738-e9a06a80-e114-11e8-9a24-ecc8b37b8a53.gif) -En nuestro caso queremos hacer algo similar, agrupar las fechas en una columna llamada `Fecha`. +En nuestro caso queremos hacer algo similar, agrupar las fechas en una columna +llamada `Fecha`. ```r @@ -131,13 +145,20 @@ Ejecutando `head(datos_turistas)`, notamos que hemos obtenido lo deseado. Función que es usada para agrupar columnas en dos nuevas columnas. - **`data`** : Dataframe o tabla que se va a modificar. -- **`key`** : Nombre de la nueva columna que va almacenar los *nombres de la columnas* que se van a agrupar. -- **`value`** : Nombre de la nueva columna que va contener los *valores de la columnas* que se van a agrupar. -- **`...`** : Nombres o selección de columnas a agruparse, puedes usar los nombres de las columnas con la función concatenar `c()`. Por ejemplo, `c(nombre_col1, nombre_col2...)` o hacer la selección del complemento con `!c()`, también puedes utilizar como referencia el número de columna. Para hacer referencia a una serie sucesiva emplea `:`, algo como: `n_col1:n_col2`. +- **`key`** : Nombre de la nueva columna que va almacenar los _nombres de la + columnas_ que se van a agrupar. +- **`value`** : Nombre de la nueva columna que va contener los _valores de la + columnas_ que se van a agrupar. +- **`...`** : Nombres o selección de columnas a agruparse, puedes usar los + nombres de las columnas con la función concatenar `c()`. Por ejemplo, + `c(nombre_col1, nombre_col2...)` o hacer la selección del complemento con + `!c()`, también puedes utilizar como referencia el número de columna. Para + hacer referencia a una serie sucesiva emplea `:`, algo como: `n_col1:n_col2`. ## Separa una columna con `separate()` -Para ejemplificar el operador `separate()` vamos a separar la columna `Fecha` en las columnas `día`, `mes` y `año`. +Para ejemplificar el operador `separate()` vamos a separar la columna `Fecha` en +las columnas `día`, `mes` y `año`. ```r @@ -174,13 +195,20 @@ Función que es usada para separar una columna en varias. - **`data`** : Dataframe o tabla que se va a modificar. - **`col`** : Nombre de la columna que va a separarse. -- **`into`** : Nombres de la nuevas columnas que van a crearse a partir de `col`. Puedes usar la función concatenar `c()` para nombrar a las columnas. -- **`sep`** : Separador, un carácter que va a servir para identificar en donde se separa para generar las nuevas columnas. Puedes usar *Regular Expressions*. -- **`remove`** : Acepta valores booleanos `TRUE` y `FALSE`, por defecto es `TRUE`, si es igual `TRUE` borra la columna que se separa, en `FALSE` la mantiene. +- **`into`** : Nombres de la nuevas columnas que van a crearse a partir de + `col`. Puedes usar la función concatenar `c()` para nombrar a las columnas. +- **`sep`** : Separador, un carácter que va a servir para identificar en donde + se separa para generar las nuevas columnas. Puedes usar _Regular Expressions_. +- **`remove`** : Acepta valores booleanos `TRUE` y `FALSE`, por defecto es + `TRUE`, si es igual `TRUE` borra la columna que se separa, en `FALSE` la + mantiene. -Vamos a aprovechar los nuevos datos generados, para graficar el top de turistas que han visitado Bolivia en los años 2016-2021. +Vamos a aprovechar los nuevos datos generados, para graficar el top de turistas +que han visitado Bolivia en los años 2016-2021. -En el código abajo usamos muchas funciones de la biblioteca `dplyr` si quieres aprender más sobre esa biblioteca lee [este artículo](https://opensciencelabs.org/blog/filtrar-datos-r/filtrar-datos-r/). +En el código abajo usamos muchas funciones de la biblioteca `dplyr` si quieres +aprender más sobre esa biblioteca lee +[este artículo](/blog/filtrar-datos-r/filtrar-datos-r/). ```r @@ -189,21 +217,21 @@ datos_turistas$año <- as.integer(paste("20", datos_turistas$año, sep = "")) # Filtramos por año -datos_turistas_2016_2021 <- - datos_turistas %>% +datos_turistas_2016_2021 <- + datos_turistas %>% filter(as.integer(año) >= 2016, na.rm =TRUE) # Agrupando por Nacionalidad y año -datos_turistas_2016_2021 <- +datos_turistas_2016_2021 <- datos_turistas_2016_2021 %>% group_by(Nacionalidad, año) %>% summarise(turistas_anuales = sum(Turistas)) # Extrayendo los top turistas visitantes de Bolivia -top_turistas_2016_2021 <- - datos_turistas_2016_2021 %>% +top_turistas_2016_2021 <- + datos_turistas_2016_2021 %>% arrange(desc(turistas_anuales)) %>% - group_by(año) %>% + group_by(año) %>% slice(1:7) # Graficando con ggplot2 @@ -231,12 +259,12 @@ ggplot(data = top_turistas_2016_2021) + ## Función `unite()` -Unite es una función complementaria a `separate()` y hace lo contrario, une las columnas en un sola. -Vamos a usarlo para juntar las columnas de `mes` y `año`. +Unite es una función complementaria a `separate()` y hace lo contrario, une las +columnas en un sola. Vamos a usarlo para juntar las columnas de `mes` y `año`. ```r -datos_turistas_trimestre <- +datos_turistas_trimestre <- unite(datos_turistas, mes_año, c("mes","año"), sep = "-") ``` @@ -264,14 +292,18 @@ Función que une varias columnas en una. - **`data`** : Dataframe o tabla que se va a modificar. - **`col`** : Nombre de la nueva columna que va a unir otras columnas. -- **`... `** : Nombres de las nuevas columnas que van a juntarse en `col`. Puedes emplear la función concatenar `c()` para nombrar las columnas. -- **`sep`** : Separador, un carácter que va a servir para unir los valores de las columnas que se unen. -- **`remove`** : Acepta valores booleanos `TRUE` y `FALSE`. Si es igual a `TRUE`, borra las columnas que se unen, pero si es `FALSE`, las mantiene. Por defecto, su valor es `TRUE`. +- **`... `** : Nombres de las nuevas columnas que van a juntarse en `col`. + Puedes emplear la función concatenar `c()` para nombrar las columnas. +- **`sep`** : Separador, un carácter que va a servir para unir los valores de + las columnas que se unen. +- **`remove`** : Acepta valores booleanos `TRUE` y `FALSE`. Si es igual a + `TRUE`, borra las columnas que se unen, pero si es `FALSE`, las mantiene. Por + defecto, su valor es `TRUE`. ## Función `spread()` -Esta función es la que complementa a la función `gather()`, y hace exactamente lo contrario. -Esparcir una columna en varias. +Esta función es la que complementa a la función `gather()`, y hace exactamente +lo contrario. Esparcir una columna en varias. Antes de utilizar `spread()` vamos a agrupar nuestro datos en trimestres. @@ -305,20 +337,22 @@ En la consola podemos ver ``` -Ahora podemos usar `spread()`, para expandir los datos de la columna trimestre en columnas independientes. +Ahora podemos usar `spread()`, para expandir los datos de la columna trimestre +en columnas independientes. ```r -# Mostar en columnas los valores de trimestre +# Mostar en columnas los valores de trimestre datos_turistas_trimestre <- spread( - data = datos_turistas_trimestre, - key = trimestre, + data = datos_turistas_trimestre, + key = trimestre, value = turistas_trimestre) ``` -Ahora observamos que nuestros datos se han esparcido, este formato es útil para visualización de datos en otros frameworks. +Ahora observamos que nuestros datos se han esparcido, este formato es útil para +visualización de datos en otros frameworks. ```r @@ -339,18 +373,22 @@ Ahora observamos que nuestros datos se han esparcido, este formato es útil para **`spread(data, key, value)`** -Función que es usada para esparcir los datos de una columna como nombres de columnas. +Función que es usada para esparcir los datos de una columna como nombres de +columnas. - **`data`** : Dataframe o tabla que se va a modificar. -- **`key`** : Nombre de la columna cuyos valores se van esparcir como los *nombres de las nuevas columnas*. -- **`value`** : Nombre de la columna cuyos valores van a convertirse en los *nuevos valores de las nuevas columnas*. +- **`key`** : Nombre de la columna cuyos valores se van esparcir como los + _nombres de las nuevas columnas_. +- **`value`** : Nombre de la columna cuyos valores van a convertirse en los + _nuevos valores de las nuevas columnas_. -Aprovechemos estos datos para graficar el top de países que han visitado Bolivia en el primer trimestre del 2019. +Aprovechemos estos datos para graficar el top de países que han visitado Bolivia +en el primer trimestre del 2019. ```r top_turistas_trimestre_1_2019 <- - datos_turistas_trimestre %>% + datos_turistas_trimestre %>% select(Nacionalidad, `2019 Q1`) %>% rename(trimestre1_2019= `2019 Q1`) %>% arrange(desc(trimestre1_2019)) %>% as.data.frame() %>% @@ -382,9 +420,12 @@ ggplot(data = top_turistas_trimestre_1_2019) + ## Otros detalles -Las funciones mostradas en el artículo son las más usadas, y permiten un mejor manejo de datos en R. Te recomiendo revisar la [documentación oficial](https://www.rdocumentation.org) si quieres aprender más. +Las funciones mostradas en el artículo son las más usadas, y permiten un mejor +manejo de datos en R. Te recomiendo revisar la +[documentación oficial](https://www.rdocumentation.org) si quieres aprender más. -En el caso de que quieras descargar el repositorio de este artículo puedes hacerlo [aquí](https://github.com/EverVino/Example_data_tidyr). +En el caso de que quieras descargar el repositorio de este artículo puedes +hacerlo [aquí](https://github.com/EverVino/Example_data_tidyr). ## Referencias diff --git a/content/blog/si-pensado-en-como-automatizar-la-construccion-de-citas-en-tu-proyecto-te-contamos-como-hacerlo-posible/header.png b/bkp/blogs/si-pensado-en-como-automatizar-la-construccion-de-citas-en-tu-proyecto-te-contamos-como-hacerlo-posible/header.png similarity index 100% rename from content/blog/si-pensado-en-como-automatizar-la-construccion-de-citas-en-tu-proyecto-te-contamos-como-hacerlo-posible/header.png rename to bkp/blogs/si-pensado-en-como-automatizar-la-construccion-de-citas-en-tu-proyecto-te-contamos-como-hacerlo-posible/header.png diff --git a/bkp/blogs/si-pensado-en-como-automatizar-la-construccion-de-citas-en-tu-proyecto-te-contamos-como-hacerlo-posible/index.md b/bkp/blogs/si-pensado-en-como-automatizar-la-construccion-de-citas-en-tu-proyecto-te-contamos-como-hacerlo-posible/index.md new file mode 100644 index 000000000..4e294899d --- /dev/null +++ b/bkp/blogs/si-pensado-en-como-automatizar-la-construccion-de-citas-en-tu-proyecto-te-contamos-como-hacerlo-posible/index.md @@ -0,0 +1,120 @@ +--- +title: + "Si has pensado en cómo automatizar la construcción de citas en tu proyecto, + te contamos cómo hacerlo posible." +slug: si-pensado-en-como-automatizar-la-construccion-de-citas-en-tu-proyecto-te-contamos-como-hacerlo-posible +date: 2020-05-16 +authors: ["Rainer Palm"] +tags: [proyectos, citas, referencias, zotero, metadatos] +categories: [ciencia abierta] +description: | + En el proceso de escritura de un artículo científico, o documentación de un + proyecto, siempre se busca optimizar el uso del tiempo dedicado a la + transcripción y elaboración de los documentos y presentaciones del trabajo, así + como en tareas como la elaboración de citas y referencias para artículos entre + otros. Aunque el uso de herramientas de procesamiento de texto facilita bastante + la tarea de compartir y escribir el trabajo, aun así se suele tener que + configurar manualmente cosas tales como indices, código insertado dentro del + texto, formulas matemáticas… y citas. Esto se complica un poco más pues, + dependiendo de la forma en la que estés publicando tu artículo, todas estas + tareas pueden tener formatos muy distintos. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +En el proceso de escritura de un artículo científico, o documentación de un +proyecto, siempre se busca optimizar el uso del tiempo dedicado a la +transcripción y elaboración de los documentos y presentaciones del trabajo, así +como en tareas como la elaboración de citas y referencias para artículos entre +otros. Aunque el uso de herramientas de procesamiento de texto facilita bastante +la tarea de compartir y escribir el trabajo, aun así se suele tener que +configurar manualmente cosas tales como indices, código insertado dentro del +texto, formulas matemáticas… y citas. Esto se complica un poco más pues, +dependiendo de la forma en la que estés publicando tu artículo, todas estas +tareas pueden tener formatos muy distintos. + + + +En el caso de las citas y referencias, existe una variedad nada despreciable de +estándares dependiendo, entre otras cosas de si se deben colocar al final de la +página, al final del documento o después del texto citado y, además, en que +formato escogido para presentarlas, en que orden se deben introducir cada uno de +sus elementos, entre otros. Esto se puede tornar bastante tedioso, en especial +si tienes un gran numero de citas y referencias que colocar, si provienen de una +variedad de formatos y lugares diferentes, si la información es incompleta, por +ejemplo en año o nombres completos de autores, si cuentan o no con metadatos +adecuados, entre otros. Simplemente esta tarea de buscar, ordenar y insertar +estos datos puede tomar bastante tiempo si no se utilizan las herramientas o +programas adecuados. + +¿Nunca te has preguntado si podrías simplemente añadir las citas en cuanto las +ves en un sitio o en un documento? O, simplemente, ¿si podrías automatizar la +búsqueda de metadatos por Internet de alguna forma, saltando de largo todo este +tedioso procedimiento? A pesar de que existen varias alternativas, una de las +aplicaciones más llamativas en cuanto a la organización de fuentes de +investigación se refiere, es Zotero. Esta aplicación es un completo manejador de +referencias que se conecta directamente con tu navegador, mediante una +extensión, para descargar archivos y organizarlos de forma automática y directa, +al tiempo que se integra también con tu editor de texto preferido. Zotero además +permite organizar citas, referencias, fuentes y archivos, pues tiene la +capacidad de guardar información extraída desde sitios web, capturando tanto el +origen de los datos como su año, autor, DOI, entre otros. + +## ¿Como funciona Zotero? + +Zotero es una aplicación disponible tanto para teléfono como para tu ordenador, +que se conecta a tu navegador mediante una extensión disponible para instalar +desde su página web. Sin importar cuál navegador utilices (ya sea, Firefox, +Chrome, o Safari), o mediante un marcador (Zotero Bookmarklet) que guarda +elementos en Zotero en cuanto lo cargas. Actúa como un organizador y manejador +de archivos y otros elementos como libros, artículos, reportes, manuscritos, +sonidos guardados, casos, entre otros, y está principalmente orientado a guardar +y citar referencias bibliográficas. Por ello, presta especial atención al +almacenamiento de metadatos referentes a éstos, permitiendo su clasificación en +conjuntos que llama «colecciones», para organizarlos según tema, proyecto o +cualquier otro criterio que establezcas, permitiéndote etiquetarlos, añadir +notas o sub-ítems, entre otros. + +La conexión de Zotero al navegador, te permite añadir cualquier archivo que +estés visualizando directamente a tu colección. Al hacer click en la extensión +de Zotero, te permitirá guardar el sitio web, archivo o documento que estés +viendo en el momento. Si se trata de una imagen, sonido o video, el botón +derecho del ratón te permitirá integrarlo inmediatamente en tu colección de +Zotero como un elemento. Además, existen traductores diseñados para extraer los +metadatos de sitios web particulares, en especial aquellos de uso popular y +aquellos relacionados con la investigación científica, incluyendo catálogos de +librerías, bases de datos, sitios de noticias y catálogos de tiendas, entre +otros. + +## ¿Como se utiliza Zotero? + +Zotero requiere ser instalado en tu ordenador antes de poder ser utilizado. Es +software multiplataforma y de código abierto, así que funcionará en tu sistema +operativo sin problema alguno. Después de esto, ya está listo para usar. Si +deseas integrarlo a tu navegador, necesitarás instalar la extensión adecuada, +para disfrutar de las funcionalidades adicionales. La interfaz funciona como un +organizador de archivos cualquiera, con un árbol de carpetas a tu izquierda (las +colecciones), los ítems dentro de estas colecciones a tu izquierda, y los +metadatos de estos ítems a tu derecha. + +Añadir nuevos ítems es muy sencillo: simplemente se crea una nueva colección, +con el botón derecho del ratón en la sección de la derecha, y en esta colección +puedes añadir ítems de distintos tipo mediante un botón ubicado en la zona +central de la barra superior. Al seleccionar ítems dentro de la colección, +puedes empezar a llenar metadatos en la sección derecha. Cuando agregas archivos +de tipo .pdf a Zotero, este intentará automáticamente buscar los metadatos +correspondientes mediante Internet, y si añades artículos a Zotero mediante la +varita mágica (con su identificador DOI, ISBN o similar), este automáticamente +lo clasificará y buscará título, autores, año de publicación y demás datos e +información relevantes sobre el documento. + +Utilizar Zotero es una cuestión muy sencilla, no requiere de practica y +cualquier duda que tengas respecto a las particularidades de su funcionamiento +se pueden resolver mediante una busqueda en el manual de éste. Sin duda se trata +de una herramienta muy útil que te ayudara a acelerar tu trabajo de muchas +maneras, ya sea simplemente para organizar tu material de estudio o para hacer +citaciones en tus artículos mediante complementos que conecten con Zotero para +tu procesador de texto favorito. diff --git a/content/blog/si-ya-usas-codigo-abierto-te-contamos-como-puedes-sacarle-mayor-provecho-tu-documentacion-para-tus-articulos-y-publicaciones/header.png b/bkp/blogs/si-ya-usas-codigo-abierto-te-contamos-como-puedes-sacarle-mayor-provecho-tu-documentacion-para-tus-articulos-y-publicaciones/header.png similarity index 100% rename from content/blog/si-ya-usas-codigo-abierto-te-contamos-como-puedes-sacarle-mayor-provecho-tu-documentacion-para-tus-articulos-y-publicaciones/header.png rename to bkp/blogs/si-ya-usas-codigo-abierto-te-contamos-como-puedes-sacarle-mayor-provecho-tu-documentacion-para-tus-articulos-y-publicaciones/header.png diff --git a/bkp/blogs/si-ya-usas-codigo-abierto-te-contamos-como-puedes-sacarle-mayor-provecho-tu-documentacion-para-tus-articulos-y-publicaciones/index.md b/bkp/blogs/si-ya-usas-codigo-abierto-te-contamos-como-puedes-sacarle-mayor-provecho-tu-documentacion-para-tus-articulos-y-publicaciones/index.md new file mode 100644 index 000000000..1b8511fcf --- /dev/null +++ b/bkp/blogs/si-ya-usas-codigo-abierto-te-contamos-como-puedes-sacarle-mayor-provecho-tu-documentacion-para-tus-articulos-y-publicaciones/index.md @@ -0,0 +1,127 @@ +--- +title: + "Si ya usas código abierto, te contamos cómo puedes sacarle mayor provecho a + tu documentación (para tus artículos y publicaciones)" +slug: si-ya-usas-codigo-abierto-te-contamos-como-puedes-sacarle-mayor-provecho-tu-documentacion-para-tus-articulos-y-publicaciones +date: 2020-02-17 +authors: ["Rainer Palm"] +tags: [documentación, código, proyectos, artículos] +categories: [ciencia abierta, código abierto, desarrollo de software] +description: | + Con mucha frecuencia, los proyectos de código abierto suelen prestar poca + atención al tema de documentación. De hecho, es tan común que la encuesta + [Open Source Survey](https://opensourcesurvey.org/2017/) (realizada por Github, + involucrando tanto académicos, como a trabajadores en la industria de + computación, como colaboradores independientes) reportó que al menos 93% de los + encuestados, creían que la documentación incompleta o sin actualizar era uno de + los problemas más agravantes dentro de la esfera del software libre. En la misma + encuesta, 60% de los participantes admitían también contribuir a la + documentación de sus proyectos con muy poca frecuencia. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Con mucha frecuencia, los proyectos de código abierto suelen prestar poca +atención al tema de documentación. De hecho, es tan común que la encuesta +[Open Source Survey](https://opensourcesurvey.org/2017/) (realizada por Github, +involucrando tanto académicos, como a trabajadores en la industria de +computación, como colaboradores independientes) reportó que al menos 93% de los +encuestados, creían que la documentación incompleta o sin actualizar era uno de +los problemas más agravantes dentro de la esfera del software libre. En la misma +encuesta, 60% de los participantes admitían también contribuir a la +documentación de sus proyectos con muy poca frecuencia. + + + +Independientemente del tipo de proyecto en el que participes o de su objetivo, +la documentación es un factor muy importante a la hora de crear proyectos +accesibles e inclusivos, en el sentido que facilita en gran medida tanto su +utilización como la colaboración entre personas que no estén activamente +involucradas en su desarrollo. Establecer de forma clara términos de uso del +código, manuales o guías permite a tus usuarios ser autosuficientes y dar +sugerencias mucho más útiles y profundas, además de que puede ser el factor +clave para que alguien se vuelva un colaborador o que termine ignorando tu +proyecto. Tal como dice +[Write The Docs | Why Write Docs?](http://www.writethedocs.org/guide/writing/beginners-guide-to-docs/#why-write-docs): + +- Si la gente no sabe que tu proyecto existe, no lo usarán. +- Si la gente no sabe como instalar tu código, no lo usarán. +- Si la gente no puede entender como usar tu código, no lo usarán. + +Fuera de cuestiones de colaboración o facilidad de lectura, es obvio también que +el código se hace progresivamente más difícil de entender y recordar conforme el +proyecto avanza y se hace más extenso, por lo que la documentación se vuelve una +herramienta de supervivencia, especialmente si no pretendes trabajar en el +código con frecuencia. Algo que puede ocurrirte con más frecuencia de la que +esperas, es estar en la situación donde quieres continuar un proyecto de hace +meses, pero no entiendes absolutamente nada de lo que hace el código. + +Por estas razones (¡y muchas otras!) la documentación de tu trabajo es +imperativa. Sin embargo, es común que durante el proceso de documentación, +utilicemos destrezas que no suelen aprenderse en trabajos relacionados con +software, por lo que los lineamientos que se deben seguir para llevar a cabo una +buena documentación pueden no estar muy claros. Entonces, ¿qué es lo que hace +una buena documentación de código abierto? + +## Accesibilidad + +A la hora de escribir tu documentación, tienes que tener en cuenta que la van a +leer tanto usuarios como desarrolladores, y que por lo general van a querer +acceder a la información de la forma más rápida y completa posible. El uso de +hipervínculos y tablas de contenidos ayuda bastante, permitiéndote reutilizar +otras documentaciones abiertas, a la vez que puedes mantener la información +ordenada y concisa, ayudando a los usuarios encontrar los términos o datos que +necesitan de la forma más rápida y sencilla posible. Por esta razón, también es +recomendado poner ciertos datos que van a buscar la mayoría de los interesados +en un primer momento, tales como: la licencia que utilices, la meta del +proyecto, ejemplos de uso, lista de tareas por realizar, etc. + +## Comunicación con tus usuarios + +Puede sonar obvio, pero la documentación, al final del día, está pensada para +que la lean tus usuarios. Si está dentro de la posibilidad, es bastante +beneficioso agregar canales por los cuales puedan consultar y hasta contribuir +otros desarrolladores: pull requests, tus cuentas en redes sociales, acceso al +rastreamiento de problemas, FAQs, entre otros. Para este fin puedes usar ciertas +convenciones como el archivo CONTRIBUTING.md, el cual especifica normas de +conducta, como se prefiere que se comuniquen los usuarios, y las +responsabilidades de los administradores del repositorio. + +También podemos añadir que contribuir a la documentación de cualquier +repositorio es una forma fácil y relativamente sencilla de apoyar un proyecto, +sin involucrarse demasiado. Este es uno de los ámbitos donde cualquiera puede +aportar perspectivas relevantes, sin importar demasiado su trasfondo o +habilidades particulares. + +## Guías concisas y ejemplos sencillos + +Sín importar el tipo de programa que estés desarrollando, facilitará bastante su +uso si das algunos ejemplos de cómo se utiliza en un contexto cotidiano, con una +guía paso a paso o una pequeña sección en su manual específicamente para +principiantes, con algunos comandos y funciones cruciales para el uso más básico +de tu código. Te puede resultar útil el empleo de capturas de pantallas, incluir +configuración de texto inteligente (con bloques de código, resaltamiento de +sintaxis, etcétera), acompañados de párrafos de texto concisos, escritos con +lenguaje simple y sin entrar mucho en terminología específica. + +Siempre recomendamos que si necesitas ayuda en cuanto a cómo escribir +documentación, ¡solo hace falta revisar lo que ya han escrito otros! Ya sea para +aprender ciertos modos de escritura que son comunes dentro de esta práctica, +para aprender de los errores que cometen los demás, o simplemente para situarte +en el lugar de alguien que esté chequeando tu código por primera vez. Leer lo +que han escrito los demás con el enfoque de aprender es una buena estrategia. +Prácticamente, todas las distribuciones de Linux incluyen el comando `man` que +te permite ver información sobre varios comandos de bash, y muchos repositorios +de Github tienen por lo menos un archivo `README.md`, visto en cuanto entras a +su página, cuyo objetivo es mostrar el principal propósito y uso del proyecto. +Es solo cuestión de revisar un poco para encontrar una enorme variedad de +ejemplos. + +## Referencias + +- [Open Source Survey](https://opensourcesurvey.org/2017/) + +- [Write The Docs | Why Write Docs](http://www.writethedocs.org/guide/writing/beginners-guide-to-docs/#why-write-docs) diff --git a/content/blog/te-contamos-sobre-la-comunidad-ropensci/header.png b/bkp/blogs/te-contamos-sobre-la-comunidad-ropensci/header.png similarity index 100% rename from content/blog/te-contamos-sobre-la-comunidad-ropensci/header.png rename to bkp/blogs/te-contamos-sobre-la-comunidad-ropensci/header.png diff --git a/bkp/blogs/te-contamos-sobre-la-comunidad-ropensci/index.md b/bkp/blogs/te-contamos-sobre-la-comunidad-ropensci/index.md new file mode 100644 index 000000000..8c77e5b20 --- /dev/null +++ b/bkp/blogs/te-contamos-sobre-la-comunidad-ropensci/index.md @@ -0,0 +1,186 @@ +--- +title: "Te contamos sobre la comunidad rOpenSci" +slug: te-contamos-sobre-la-comunidad-ropensci +date: 2020-08-18 +authors: ["Yurely Camacho"] +tags: [comunidad, ropensci, paquetes, revisión] +categories: [ciencia abierta, R] +description: | + Para compartir, almacenar y divulgar de una manera fácil los datos y resultados + de las investigaciones, los científicos deben contar con paquetes que lo + garanticen. De esta manera, las investigaciones serán compatibles con formatos + estandarizados y se logrará, progresivamente, el avance de la ciencia bajo el + enfoque de ciencia abierta. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Para compartir, almacenar y divulgar de una manera fácil los datos y resultados +de las investigaciones, los científicos deben contar con paquetes que lo +garanticen. De esta manera, las investigaciones serán compatibles con formatos +estandarizados y se logrará, progresivamente, el avance de la ciencia bajo el +enfoque de ciencia abierta. + + + +Una de las comunidades de promoción y desarrollo de software de código abierto +que proporciona estas ventajas para los investigadores es +[rOpenSci](https://ropensci.org/). A lo largo de este post conoceremos lo que +hace la comunidad, cómo puedes formar parte y estar en armonía con ella, el +proceso de revisión y más. + +## ¿Qué es rOpenSci? + +rOpenSci es una iniciativa sin fines de lucro fundada en 2011 por +[Karthik Ram](https://karthik.io/), +[Scott Chamberlain](https://ropensci.org/author/scott-chamberlain/) y +[Carl Boettiger](https://www.carlboettiger.info/) con la finalidad de promover, +enseñar y hacer crecer las mejores prácticas en el desarrollo, uso y revisión +por pares de software para el lenguaje R. Todo esto con el objeto de fomentar el +uso de la ciencia abierta en las investigaciones. + +rOpenSci es un proyecto patrocinado fiscalmente por +[NumFOCUS](https://numfocus.org) una organización que apoya y promueve la +computación científica, innovadora y de código abierto. Consulta el siguiente +post de su blog con la presentación del proyecto: +[Cómo rOpenSci utiliza Code Review para promover la ciencia reproducible](https://numfocus.org/blog/how-ropensci-uses-code-review-to-promote-reproducible-science). + +rOpenSci, gracias a su mecanismo de revisión por pares y el constante trabajo de +los desarrolladores de la comunidad, ha logrado más de 200 +[paquetes disponibles](https://ropensci.org/packages/), alrededor de 500 +contribuyentes de código y más de 500 citas en investigaciones, formando un +imponente sistema de software abierto para el desarrollo y la revisión por pares +(https://ropensci.org/pdfs/2018-08-15_rpharma_ropensci_butland.pdf). Desde estos +enlaces puedes conocer tanto el +[equipo principal](https://ropensci.org/about/#team), como el de becarios de +investigación, alumnos y +[colaboradores](https://ropensci.org/about/#collaborators) del proyecto. + +La comunidad de rOpenSci acepta [donaciones](https://ropensci.org/donate/) de +individuos, instituciones y corporaciones que apoyen sus actividades. Si deseas +hacer una donación al proyecto, +[accede a este formulario](https://numfocus.salsalabs.org/donate-to-ropensci/index.html). + +### Acerca de los [Paquetes de rOpenSci](https://ropensci.org/packages/) + +Un paquete rOpenSci es una herramienta de software de R que está siendo o ha +sido examinado cuidadosamente (mediante un proceso de revisión por pares), y que +ha sido aportado por el personal y miembros de la comunidad. + +Con los paquetes de rOpenSci puedes, entre otras cosas, recopilar y acceder a +datos desde varias fuentes y de varios tipos, analizarlos de manera interactiva +y realizar visualizaciones de estos. Además, puedes incluir una narrativa en el +proceso que permita generar un documento para presentaciones finales, en +formatos como Word, Markdown, PDF o LaTeX, que luego puedes compartir. + +#### Explora los tutoriales, videotutoriales y casos de uso de los paquetes + +rOpenSci ofrece una documentación diversa, incluyendo +[tutoriales](https://ropensci.org/tutorials/) y +[videotutoriales](https://vimeo.com/ropensci) que muestran un recorrido +detallado acerca de lo que puedes hacer con sus paquetes. Asimismo, presenta +[casos de Uso](https://ropensci.org/usecases/) con ejemplos de su manejo en +situaciones reales. + +### Infórmate brevemente sobre la revisión por pares de software en rOpenSci + +#### ¿Cómo enviar un paquete a rOpenSci?, y ¿cómo es el proceso de revisión? + +La comunidad en general puede enviar un paquete para que sea revisado y, los +revisores de la comunidad deben garantizar el cumplimiento de ciertos +requerimientos internos y un nivel de calidad consistente para que los paquetes +sean aceptados. Para lograrlo llevan a cabo un proceso de revisión por pares +caracterizado por ser transparente, constructivo y abierto. + +El proceso es un trabajo voluntario donde intervienen: los _editores_ que +gestionan el flujo de entrada de los paquetes y garantizan su progreso; los +_autores_ que desarrollan, presentan y realizan mejoras en su paquete; y los +_revisores_ (dos por presentación de un paquete) que examinan el código del +software y la experiencia del usuario. Dicho proceso se lleva a cabo en el +[repositorio de GitHub de Revisión de Software](https://github.com/ropensci/software-review/), +allí notarás que se trata de una conversación continua hasta la aceptación del +paquete, donde el autor recibe recomendaciones. + +Si tu colaboración es aceptada, seguirás recibiendo el apoyo de la comunidad en +lo referente a temas de mantenimiento y a las actualizaciones de R. Sin embargo, +conservarás la propiedad y el control de tu paquete. La comunidad te ofrece +promocionarlo en su [página web](https://ropensci.org/), blog y redes sociales. +Cabe destacar, que si tienes un documento de desarrollo este puede ser enviado, +luego de la revisión, a la Journal of Open-Source Software +[(JOSS)](https://joss.theoj.org/) para su publicación. + +La comunidad cuenta con un [libro guía](https://devguide.ropensci.org/) que +recopila todos los aspectos importantes para el desarrollo, mantenimiento y +revisión de los paquetes de rOpenSci, que incluye una guía para los editores, +autores y revisores, las políticas de la comunidad, las buenas prácticas para el +mantenimiento de los paquetes y otros tópicos de interés. No puedes dejar de +leerlo. + +**Si deseas enviar un paquete, lo primero que debes hacer** es darle un vistazo +a la [Guía para autores](https://devguide.ropensci.org/authors-guide.html) antes +de abrir un número de envío en el +[repositorio de revisión de software](https://github.com/ropensci/software-review/). + +#### Únete como revisor de paquetes + +Si deseas ser revisor, puedes proponerte a través de +[este formulario](https://ropensci.org/onboarding/) con información de contacto +y áreas de especialización, pero te recomendamos que antes leas la +[guía para revisores](https://devguide.ropensci.org/reviewerguide.html) donde se +detalla el proceso a seguir. + +### Lo que debes hacer para estar en sintonía con la comunidad + +Para unirte y estar al día con la [comunidad](https://ropensci.org/community/), +además de hacerlo enviando un paquete, siendo editor o revisor, puedes: + +- Seguir el proyecto en sus redes sociales, en Twitter como + [@rOpenSci](https://twitter.com/ropensci) y promoverlo en las tuyas. + +- Acceder y explorar el [**rOpenSci blog**](https://ropensci.org/blog/) para + conocer los paquetes, aprender a utilizarlos o contribuir a su mejora, conocer + las mejores prácticas en desarrollo y revisión de software, eventos y otros + post de la comunidad. + +- Suscribirte a [**rOpenSci News**](https://news.ropensci.org/) el _boletín + informativo de rOpenSci_, y recibir actualizaciones semestrales de las + actividades de la comunidad en tu correo. + +- Asistir a las llamadas de la comunidad + [**rOpenSci community calls**](https://ropensci.org/commcalls/). Son llamadas + trimestrales para aprender más sobre los desarrollos de rOpenSci y nuevos + proyectos. Son gratuitas y abiertas, las llamadas anteriores se encuentran + grabadas y disponibles en línea. Si tienes alguna idea para un tema de la + llamada comunitaria puedes plasmarlo en el + [depósito público de ideas](https://github.com/ropensci-org/community-calls). + +- Plantear y responder preguntas en el + [**foro de discusión**](https://discuss.ropensci.org/), en + [**Stackoverflow**](https://stackoverflow.com/questions/tagged/ropensci) con + la etiqueta #ropensci o en Twitter. + +- Conocer los eventos próximos en la página oficial + (https://ropensci.org/events/). + +- Visitar [otros recursos](https://ropensci.org/resources/) que te ofrece + rOpenSci como charlas y publicaciones sobre la comunidad, la ciencia abierta y + la revisión por pares de software de código abierto, de las cuales puedes + descargar las presentaciones o ver en línea. + +La comunidad rOpenSci está abierta a tu participación y a la de cualquier +persona. Si usas el lenguaje R, unirte a ella es una buena oportunidad. Puedes +darle un vistazo a nuestro post sobre +[pyOpenSci: un promotor de la ciencia abierta](/blog/pyopensci-un-promotor-de-la-ciencia-abierta/) +si tu lenguaje de programación es Python; y tus aspiraciones son las de +desarrollar un paquete, ser editor, revisor, o seguir a esta comunidad. + +#### Referencias + +- [rOpenSci](https://ropensci.org) + +- [Mejor ciencia con rOpenSci](https://maelle.github.io/latinr/slides.html#1) + +- [rOpenSci: permitiendo la investigación abierta y reproducible](https://ropensci.org/pdfs/2018-08-15_rpharma_ropensci_butland.pdf) diff --git a/content/blog/te-ensenamos-lugares-para-aprender-los-fundamentos-de-la-ciencia-abierta/header.png b/bkp/blogs/te-ensenamos-lugares-para-aprender-los-fundamentos-de-la-ciencia-abierta/header.png similarity index 100% rename from content/blog/te-ensenamos-lugares-para-aprender-los-fundamentos-de-la-ciencia-abierta/header.png rename to bkp/blogs/te-ensenamos-lugares-para-aprender-los-fundamentos-de-la-ciencia-abierta/header.png diff --git a/bkp/blogs/te-ensenamos-lugares-para-aprender-los-fundamentos-de-la-ciencia-abierta/index.md b/bkp/blogs/te-ensenamos-lugares-para-aprender-los-fundamentos-de-la-ciencia-abierta/index.md new file mode 100644 index 000000000..a50e6d1fc --- /dev/null +++ b/bkp/blogs/te-ensenamos-lugares-para-aprender-los-fundamentos-de-la-ciencia-abierta/index.md @@ -0,0 +1,128 @@ +--- +title: + "Te enseñamos 4 lugares para aprender los fundamentos de la ciencia abierta" +slug: te-ensenamos-lugares-para-aprender-los-fundamentos-de-la-ciencia-abierta +date: 2020-06-22 +authors: ["Rainer Palm"] +tags: [datos, manual] +categories: [ciencia abierta] +description: | + ¿Qué es realmente la ciencia abierta? A pesar de que parece una idea simple, su + implementación puede concurrir en todo tipo de preguntas y problemas posteriores + sin una definición clara de los permisos de uso sobre resultados o metodologías, + concedidos tanto a los investigadores como a los lectores y posteriores usuarios + de la investigación, y de qué es lo que se busca lograr con este tipo de + práctica de investigación. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +¿Qué es realmente la ciencia abierta? A pesar de que parece una idea simple, su +implementación puede concurrir en todo tipo de preguntas y problemas posteriores +sin una definición clara de los permisos de uso sobre resultados o metodologías, +concedidos tanto a los investigadores como a los lectores y posteriores usuarios +de la investigación, y de qué es lo que se busca lograr con este tipo de +práctica de investigación. + + + +La ciencia abierta plantea cuestiones en el ámbito legal e institucional, por lo +que deben declararse previamente de manera formal las normas de publicación o de +uso, tanto de los datos utilizados como del artículo o conclusiones resultantes. +Es por esto que tanto los miembros del equipo de investigación como las +instituciones que financian y publican estas deben tener una idea clara de +cuáles són los fundamentos en los cuales se basa la ciencia abierta y a qué +principios se han de ajustar. + +Para este propósito existe una variedad de recursos en linea a través de los +cuales se pueden aprender los fundamentos de las prácticas de la ciencia +abierta. Mucha de esta información ya está lo suficientemente abreviada y +resumida, de manera tal que cualquiera, aún sin experiencia previa en el tema +pueda fácilmente entenderlo sin mucho problema en poco tiempo, exigiendo sólo el +querer hacerlo. Entonces, ¿cuáles son exactamente estos sitios desde los que las +personas se pueden educar acerca de los principios de la ciencia abierta? + +## Manual de Capacitación de Ciencia Abierta[1] + +En el febrero de 2018, 14 autores en la Biblioteca Nacional Alemana de Ciencia y +Tecnología se reunieron y trabajaron juntos con el propósito de crear un manual +gratuito y abierto, mediante el cual se buscaría capacitar y educar a las +personas acerca de las prácticas y principios de la ciencia abierta, publicado +por GitBook en internet y libre para el uso de cualquiera. El resultado fue el +manual de capacitación anteriormente mencionado, el cual se produjo como +resultado de un proyecto financiado por la Unión Europea llamado FOSTER Plus, +cuyo propósito principal era convertir la ciencia abierta en un estándar dentro +de la comunidad científica. + +A pesar de que en este manual se habla también de las filosofias y teorias de +las cuales surgieron los movimientos de conocimiento abierto, el foco está +principalmente en la formas y métodos con las cuales se realiza la ciencia +abierta. Por lo tanto, el manual también actúa como una herramienta para educar +a aquellos que deseen difundir y enseñar pautas acerca de las herramientas +disponibles para la realización de papers de acceso abierto, investigación +reproducible, y políticas de ciencia abierta, entre otros. + +## Open Definition[2] + +La Open Definition, tal como su nombre se indica, trata simplemente de dar una +definición clara y a fondo de lo que significa que un conocimiento sea +"abierto". Es un documento que fue creado por la Open Knowledge Foundation, el +cual está escrito principalmente con la creación de licencias de acceso libre de +datos, métodos, publicaciones y demás. Esta definición de libre se deriva y es +sinónima con aquella usada en el mundo del software, particularmente de la Open +Source Definition. A pesar de que trata de ser un documento legal, es bastante +conciso, corto y fácil de entender. + +Por lo tanto, se trata de un documento bastante importante a la hora de crear y +analizar licencias de acceso abierto y los permisos y privilegios que éstas +conceden tanto a los investigadores como a los lectores o usuarios de la +investigación. Aclara temas de los cuales no se suele hablar mucho, tales como +la necesidad de que los archivos utilizados estén en formatos que no posean +restricción algunas, que se permita también la distribución del trabajo tanto +junto como separado de sus componentes constituyentes, entre otros. + +## Open Science Knowledge Base[3] + +Esta lista se trata de un recopilatorio de recursos y enlaces a literatura, +cursos, videos, y demás donde se explican en detalle una multitud de temas +relacionados con la ciencia abierta. Funciona como una lista desde la cual todos +los interesados en el tema pueden indagar más a fondo si lo consideran +necesario, con enlaces a artículos donde se explica la investigación +reproducible, la replicabilidad, el conocimiento abierto, de manera breve y +corta o extensa y detallada, tal como el usuario lo desee. A la vez, actúa como +un curso donde se da un programa educativo para que cualquiera pueda aprender de +ciencia abierta desde 0, desde responder preguntas tales como '¿cuales són los +problemas que abarca la ciencia abierta?' hasta enseñar lugares donde puedes +realizar preguntas como ésta y buscar recursos adicionales, como por ejemplo, +acerca de cómo enseñar ciencia abierta. + +## Open Data Handbook[4] + +También realizado por la Open Knowledge Foundation, éste es un proyecto que +actua como una introducción a la apertura de datos, principalmente en cuanto al +estatus legal y social de estos se refiere, y cuáles técnicas son adecuadas para +la distribución o uso de datos que han sido liberados para el público. Se +explica tanto el propósito de esforzarse en utilizar tecnologías contemporáneas +para publicar datos de forma abierta, cuáles requisitos se deben cumplir en +términos de disponibilidad, interoperabilidad y permisos de redistribución, para +que un conjunto de datos se considere abierto, como las herramientas, métodos y +servicios se pueden utilizar para liberar datos al público. + +En el sitio del Open Data Handbook también se pueden encontrar recursos[5] +creados por la comunidad, todos relacionados a temas de datos abiertos +(privacidad, políticas, estándares, derecho a la información, etc), donde se han +compartido artículos y portales relacionados al tema, algunos también preparados +con principantes en mente. + +[1]: + https://book.fosteropenscience.eu/es/ + "Manual de Capacitación de Ciencia Abierta" +[2]: https://opendefinition.org/od/2.1/en/ "Open Definition" +[3]: + https://how-to-open.science/change/educate/literature/ + "Open Science Knowledge Base" +[4]: http://opendatahandbook.org/guide/es/ "Open Data Handbook" +[5]: https://opendatahandbook.org/resources/ "Open Data Handbook | Resources" diff --git a/content/blog/te-hablamos-de-cinco-repositorios-con-datos-abiertos-sobre-paises/header.png b/bkp/blogs/te-hablamos-de-cinco-repositorios-con-datos-abiertos-sobre-paises/header.png similarity index 100% rename from content/blog/te-hablamos-de-cinco-repositorios-con-datos-abiertos-sobre-paises/header.png rename to bkp/blogs/te-hablamos-de-cinco-repositorios-con-datos-abiertos-sobre-paises/header.png diff --git a/bkp/blogs/te-hablamos-de-cinco-repositorios-con-datos-abiertos-sobre-paises/index.md b/bkp/blogs/te-hablamos-de-cinco-repositorios-con-datos-abiertos-sobre-paises/index.md new file mode 100644 index 000000000..7130ddbf2 --- /dev/null +++ b/bkp/blogs/te-hablamos-de-cinco-repositorios-con-datos-abiertos-sobre-paises/index.md @@ -0,0 +1,192 @@ +--- +title: "Te hablamos de cinco repositorios con datos abiertos sobre países" +slug: te-hablamos-de-cinco-repositorios-con-datos-abiertos-sobre-paises +date: 2020-01-29 +authors: ["Yurely Camacho"] +tags: [datos, repositorios, acceso] +categories: [ciencia abierta, datos abiertos, acceso abierto] +description: | + Si estás interesado en practicar la ciencia abierta o simplemente quieres o + necesitas conocer más acerca del tema, resulta de suma importancia que descubras + sobre los **datos abiertos**. Es decir, datos que sean accesibles a cualquier + persona con la finalidad que sean **reutilizados y redistribuidos** y no tengan + grandes exigencias de permisos específicos para su descarga y procesamiento, los + cuales te servirán para llevar a cabo cualquier proyecto que tengas en mente o + culminar alguno. Sin embargo, la finalidad de este post no es hablarte + específicamente sobre los datos abiertos, sino sobre algunos repositorios de + datos abiertos. A pesar de esto, una pequeña introducción no está de más para + entrar en confianza sobre el tema. Puedes visitar nuestro artículo sobre Datos + abiertos [aquí](/blog/que-son-los-datos-abiertos/). +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Si estás interesado en practicar la ciencia abierta o simplemente quieres o +necesitas conocer más acerca del tema, resulta de suma importancia que descubras +sobre los **datos abiertos**. Es decir, datos que sean accesibles a cualquier +persona con la finalidad que sean **reutilizados y redistribuidos** y no tengan +grandes exigencias de permisos específicos para su descarga y procesamiento, los +cuales te servirán para llevar a cabo cualquier proyecto que tengas en mente o +culminar alguno. Sin embargo, la finalidad de este post no es hablarte +específicamente sobre los datos abiertos, sino sobre algunos repositorios de +datos abiertos. A pesar de esto, una pequeña introducción no está de más para +entrar en confianza sobre el tema. Puedes visitar nuestro artículo sobre Datos +abiertos [aquí](/blog/que-son-los-datos-abiertos/). + + + +Los repositorios de datos abiertos son almacenes de datos que tienen la +finalidad de promover un entorno de libre acceso al compartirlos entre personas, +permitiendo la creación de diferentes enfoques respecto a los datos manejados, +obteniendo soluciones innovadoras e incentivando la redistribución y +reproducibilidad en las investigaciones. En cualquier caso, en todos los países +se necesitan datos de buena calidad que permitan identificar medidas públicas y +privadas eficaces, realizar comparaciones y evaluar cambios en el tiempo con +respecto a otros países, afianzar metas sociales, supervisar avances, entre +otras cosas. + +En la web puedes encontrar gran cantidad de repositorios y portales de datos +abiertos que te dan acceso a la descarga y visualización de conjuntos de datos +en diferentes formatos, los cuales también pueden utilizarse para dar solución a +tareas académicas, hacer pruebas, probar herramientas de manejo de datos, entre +otras situaciones afines. + +A continuación te contamos acerca de cinco repositorios de datos abiertos sobre +algunos países, sin orden en particular: + +### 1. [**Portal de Datos de Europa**](https://www.europeandataportal.eu/es/homepage) + +Ofrece una recopilación de datos y +[**metadatos**](https://es.wikipedia.org/wiki/Metadatos) referidos a contenidos +publicados por entidades de la administración pública que se encuentran +disponibles en portales de acceso público de los distintos países de Europa. De +la misma manera, ofrece información sobre el proceso de suministro de datos y +los beneficios de reutilizarlos. El portal está traducido en varios idiomas y +cuenta aproximadamente con 976547 conjuntos de datos. + +Uno de sus objetivos principales es promover la accesibilidad de los datos +abiertos y su valorización, desde su publicación hasta la reutilización. El +portal cuenta con varias secciones: _Búsqueda de conjuntos de datos_, +_Proporcionar datos_, _Utilizar datos_ y _Formación y biblioteca_ donde +básicamente encontrarás, entre otras cosas, buscadores de conjuntos de datos por +categorías, por relevancia, fecha de creación, modificación y por ubicación, +formación y módulos de aprendizaje sobre los datos abiertos, los beneficios que +trae su utilización y referencias a otras iniciativas importantes en el área, +también información para inclusión de datos desde otros portales. Es de gran +ayuda si requieres conjuntos de datos sobre los distintos países de Europa, +donde puedes realizar comparaciones a través del tiempo y entre distintos +países, por ejemplo. + +### 2. [**Datos de libre acceso del Banco Mundial**](https://datos.bancomundial.org/) + +El _Grupo de gestión de datos sobre el desarrollo_ del Banco Mundial promueve +una iniciativa de acceso abierto y gratuito a datos sobre el desarrollo en el +mundo, encargado de mantener conjuntos de datos sectoriales, macroeconómicos y +financieros a los cuales se puede acceder por país o por indicador. Este grupo +se encarga de coordinar el trabajo estadístico, preparar estudios sobre pobreza, +documentos de investigación y otros trabajos sectoriales y económicos, como +estrategias de atención a países. La información proporcionada por este +repositorio proviene, en su mayoría, de los sistemas estadísticos de los países +miembros y por tal motivo, la calidad de los datos depende de la eficiencia y +calidad de dichos sistemas. + +Como usuario de los datos del Banco Mundial, puedes copiar, distribuir, adaptar, +exhibir o incluir los datos con fines comerciales o no, sin costo adicional y +sujeto a ciertas restricciones como: reconocer la autoría de los datos, no +reproducir los logotipos o marcas registradas del Banco Mundial, no puedes +afirmar que el Banco Mundial aprueba el uso que hagas de los datos, entre otras +restricciones mínimas. + +Dale un vistazo al [_Catálogo de Datos_](https://datacatalog.worldbank.org/) y +al [_Banco de Datos_](https://databank.bancomundial.org/home.aspx) del Banco +Mundial que te servirá para complementar información. + +### 3. [Portal de Datos Abiertos: Números para el desarrollo](https://code.iadb.org/es) del Banco Interamericano de desarrollo + +Permite explorar, visualizar y descargar datos sobre indicadores socioeconómicos +de América Latina y el Caribe. Los datos disponibles provienen de +investigaciones y otras fuentes utilizadas por el Banco. En este portal puedes +encontrar datos sobre distintos temas: educación, mercados laborales, +integración global, pobreza, sexo y agricultura, entre otros. + +El portal está dirigido a investigadores, estudiantes, responsables +gubernamentales, analistas y otros que trabajen en temas de desarrollo y +políticas públicas. Permite analizar más de 1000 indicadores de desarrollo de +los países de América Latina (la dolarización, la deuda pública interna, salario +mínimo y Cobertura por pensiones y seguro social, entre otros), seleccionar +datos sobre los países en específico y por indicador. + +Puedes descargar los datos en formato '.xls' y '.csv' para compartir o +reutilizarlos en tus proyectos. Asimismo, el portal te brinda formas de explorar +los datos de los países a través de visualizaciones animadas e interactivas. + +### 4. [Observatorio de la Complejidad Económica (OEC)](https://observatoriodenoticias.redue-alcue.org/el-observatorio-de-la-complejidad-economica-oec/) + +El observatorio proporciona información confiable y clasificada según estándares +reconocidos sobre aspectos comerciales y productivos de los países de todo el +mundo. Posee una serie de menús: _Países_, _Productos_, _Visualizaciones_, +_Clasificación_ y _Publicaciones_, que garantizan el manejo eficiente y +facilidad en el análisis de dichos datos. + +En estos menús encontrarás descripciones con el contenido económico de los +países que necesites, puedes acceder a la información contenida sobre los 200 +productos más comercializados a nivel internacional, explorar los datos de forma +gráfica, construyendo y filtrando la información de interés. También observarás +un listado de los productos y los países clasificados de acuerdo a la +complejidad económica, encontrarás artículos, notas y documentos referentes al +avance del sitio en la explicación de la complejidad económica de los países. +Puedes realizar búsquedas por periodicidad y profundidad, por año, categorías, +países y realizar comparaciones entre ellos. Asimismo, los datos, +visualizaciones y publicaciones se encuentran disponibles para su descarga y +envío. + +### 5.[Iniciativa de datos abiertos del gobierno de España](https://datos.gob.es/es/catalogo) + +Esta iniciativa lleva el nombre de _Aporta_ y se desarrolló con el fin de +promocionar la apertura de la información pública y desarrollo de servicios +avanzados basados en datos en el Gobierno de España. Cuenta, entre otros +productos, con la plataforma **datos.gob.es** que sirve como punto de encuentro +entre todos los actores del entorno de datos abiertos en España: usuarios, +ciudadanos o profesionales que demandan datos y/o quieren conocer novedades, +aplicaciones o servicios relacionados con ellos. También organismos públicos que +proporcionan y utilizan datos y que quieren estar al tanto de novedades del +sector. Y demás personas que requieren fuentes de datos para crear productos y +servicios que quieren dar a conocer. + +La plataforma tiene una sección de **Catálogo de datos** donde muestra los +conjuntos de datos disponibles (alrededor de 25.822 a la fecha) y permite +realizar búsquedas por categoría, formato, publicador, nivel de administración, +frecuencia de actualización y etiqueta. Este repositorio sirve tanto de punto de +localización como de entrada a nuevos datos disponibles. Es una buena +alternativa si quieres conocer o necesitas información sobre el desarrollo del +Gobierno en España. + +En **Open Science Labs** pensamos que cada país debe contar con un repositorio +de datos abiertos, donde se encuentre información referente al desempeño del +país en todos los ámbitos (social, económico, educativo, tecnológico, entre +otros). Asimismo, apostamos a que se divulgue en cada país la cultura de los +datos abiertos y aún más allá, la práctica de la ciencia abierta. Las +estadísticas y datos de todos los países deben estar a disposición de cualquier +ciudadano y/o institución, siempre y cuando el acceso y manejo de ellos se haga +de manera responsable. + +[**El Barómetro de Datos Abiertos**](https://opendatabarometer.org/?_year=2017&indicator=ODB) +es una medida global del grado en que los gobiernos están publicando y +utilizando datos abiertos con el propósito de rendir cuentas, innovar y lograr +un impacto social con beneficios a los ciudadanos. + +Los repositorios de datos abiertos que te mostramos son algunos de los muchos +que están disponibles y te pueden ser de gran ayuda. En los siguientes enlaces +encontrarás referencias a otros repositorios. + +- [_Biblioteca Universitaria Huelva_](https://guiasbuh.uhu.es/c.php?g=498100&p=3907565) +- [_Biblioteca Universidad de Extremadura_](https://biblioguias.unex.es/c.php?g=572093&p=3944864) +- [_Portal de Datos Abiertos de la Unión Europea_](http://data.europa.eu/euodp/es/data/) +- [_Gapminder_](https://www.gapminder.org/data/) +- [_Portal de Datos Abiertos de Esri España_](http://opendata.esri.es/) +- [_FAIRsharing_](https://fairsharing.org/databases/) +- [_Odisea_](http://odisea.ciepi.org/) +- [_OpenDOAR_](https://v2.sherpa.ac.uk/opendoar/) diff --git a/content/blog/te-hablamos-de-las-licencias-mas-utilizadas-en-proyectos-de-ciencia-abierta/header.png b/bkp/blogs/te-hablamos-de-las-licencias-mas-utilizadas-en-proyectos-de-ciencia-abierta/header.png similarity index 100% rename from content/blog/te-hablamos-de-las-licencias-mas-utilizadas-en-proyectos-de-ciencia-abierta/header.png rename to bkp/blogs/te-hablamos-de-las-licencias-mas-utilizadas-en-proyectos-de-ciencia-abierta/header.png diff --git a/bkp/blogs/te-hablamos-de-las-licencias-mas-utilizadas-en-proyectos-de-ciencia-abierta/index.md b/bkp/blogs/te-hablamos-de-las-licencias-mas-utilizadas-en-proyectos-de-ciencia-abierta/index.md new file mode 100644 index 000000000..01d2cf614 --- /dev/null +++ b/bkp/blogs/te-hablamos-de-las-licencias-mas-utilizadas-en-proyectos-de-ciencia-abierta/index.md @@ -0,0 +1,124 @@ +--- +title: + "Te hablamos de las licencias mas utilizadas en proyectos de ciencia abierta" +slug: te-hablamos-de-las-licencias-mas-utilizadas-en-proyectos-de-ciencia-abierta +date: 2020-05-06 +authors: ["Rainer Palm"] +tags: [licencia, proyectos, free software] +categories: [ciencia abierta] +description: | + ¿Cómo proteger tus proyectos, tu código y tu labor si dejas que cualquiera con + acceso a Internet la acceda y utilice tal como desee? En GitHub están alojados + millones de proyectos cuyo código es reutilizado de cualquier manera y en + proyectos de cualquier tipo, sin que el programador pueda controlarlo. ¿Cómo + podría un desarrollador promedio resguardarse de un posible abuso, para tomar + medidas de seguridad, o para evitar que otro se beneficie de su labor sin + saberlo? Es aquí donde, en el desarrollo de software, entran las licencias de + software, y es aquí donde, por múltiples razones (transparencia, + reproductibilidad, libertad de acceso, mayor eficacia durante el desarrollo, + entre otras), nos interesan sobre todo aquellas licencias de código abierto, ya + que hacen posible el desarrollo de muchas prácticas de la ciencia abierta. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +¿Cómo proteger tus proyectos, tu código y tu labor si dejas que cualquiera con +acceso a Internet la acceda y utilice tal como desee? En GitHub están alojados +millones de proyectos cuyo código es reutilizado de cualquier manera y en +proyectos de cualquier tipo, sin que el programador pueda controlarlo. ¿Cómo +podría un desarrollador promedio resguardarse de un posible abuso, para tomar +medidas de seguridad, o para evitar que otro se beneficie de su labor sin +saberlo? Es aquí donde, en el desarrollo de software, entran las licencias de +software, y es aquí donde, por múltiples razones (transparencia, +reproductibilidad, libertad de acceso, mayor eficacia durante el desarrollo, +entre otras), nos interesan sobre todo aquellas licencias de código abierto, ya +que hacen posible el desarrollo de muchas prácticas de la ciencia abierta. + + + +Establecer una licencia para los productos de tu investigación, permite hacer +saber a otras personas qué es lo que pueden (o no) hacer con tu trabajo, y +divulgar las pautas bajo las cuales se puede interactuar con la investigación y +el equipo que la desarrolla. Por lo tanto, es imperativo para cualquier +institución o individuo que sea parte de una comunidad de ciencia abierta, +conocer a fondo las licencias más apropiadas y utilizadas por más personas, y +cuáles son sus restricciones y aplicación según qué tipo de proyectos beneficien +más, las comunidades que apoyan a estas licencias entre otros aspectos muy +importantes sobre el licenciamiento de proyectos de ciencia abierta, además de +tener en mente cómo se va a usar la investigación realizada en el futuro, ya sea +si ésta se va a usar para fines lucrativos o si se espera que los demás utilicen +licencias similares al reproducirla, modificarla y/o utilizarla en el futuro. + +¿Qué tipos de licencias existen? + +En el mundo del software libre, por lo general, se entiende que toda licencia +abierta permite tanto el libre acceso y uso del software, como su distribución y +modificación. En términos mas detallados, las licencias de software libre, en +términos generales, establecen la condición de que los desarrollos se adecúen a +los diez criterios establecidos por la Open Source Definition (o similares, como +aquellos que propone la Free Software Foundation). Estos criterios protegen +tanto el derecho de los usuarios de modificar, ya sea mediante parches o +modificación directa del código desarrollado, y redistribuir el software, como +el del autor de proteger la integridad de su labor. Por supuesto, una licencia +puede exigir restricciones adicionales de parte del usuario, como en el caso de +una licencia copyleft, que requiere que los proyectos derivados utilicen la +misma licencia que el trabajo original, contrastado con las licencias +"permisivas", que no tienen este requerimiento. + +Cuales son las licencias mas utilizadas? + +En proyectos de ciencia abierta y en muchos otros espacios, las artes, el +desarrollo de software, la divulgación de noticias y información, así como +prácticamente cualquier ámbito que utilice el derecho de autor, existe un +movimiento que agrupa un conjunto de licencias que van ganando progresivamente +adeptos. Con una comunidad activa, sin duda porque también involucra +directamente políticas y proyectos relacionados con el apoyo y promulgación de +la ciencia abierta, es la licencia Creative Commons. A pesar de que esta +inicialmente se aplicaba en la esfera de las artes, desde el 2005 esta +organización se empezó a involucrar en proyectos científicos, mediante el +programa Science Commons. + +Estas licencias permite a quien las utilice, escoger entre cuatro "condiciones +de licencia". Las modalidades de licencias Creative Commons dependen de: si se +debe siempre acreditar al creador original (CC BY), si siempre se debe usar la +misma licencia al redistribuir y modificar el trabajo (CC BY-SA), si es +únicamente para uso sin fines de lucro (CC BY-NC), o si no se permiten trabajos +derivativos (CC BY-ND). Utilizar una licencia CC BY es una opción para la +publicación de investigaciones científicas financiadas por el público, para las +cuales se espera que sea libremente reutilizable y accesible para cualquiera, o +forme parte del programa de libre acceso de algunos gobiernos, como el del Reino +Unido. + +Una de las licencias en las cuales probablemente estén publicados programas que, +directa o indirectamente, utilizas a diario es la licencia GNU GPL v3.0. Esta es +un tipo de licencia copyleft que "garantiza tu libertad para compartir y cambiar +todas las versiones de un programa-para asegurarse que sigue siendo software +libre para todos los usuarios". Esto lo hace ideal para mantener la integridad +de tu software sin necesidad de hacerlo propietario. Esta es usada en una +variedad de programas, tales como GIMP, WordPress, Audacity, el kernel de Linux, +entre otros. Diametralmente opuesta a ésta es la licencia BSD, la cual apunta a +imponer un mínimo de restricciones en el uso y redistribución del software, +siendo minimalista y concisa en su aplicación. Por supuesto, esta es usada en +las distribuciones BSD de Linux, ya que forman parte de la misma organización. + +La licencia que en el 2015 era la mas utilizada en Github, es la licencia MIT, +cuyo nombre está tomado de la institución donde se creó. Principalmente se +caracteriza por ser una licencia permisiva y compatible con bastantes otras +licencias. A pesar de ser una licencia de software libre, permite a los +desarrolladores re-licenciar sus programas para que sean propietarios si estos +son publicados bajo la licencia MIT, aunque por supuesto, también se podrían +reintegrar en una licencia como la GPL con igual facilidad. Si has usado alguna +distribución de Linux, ya has utilizado un programa publicado bajo la licencia +MIT: el sistema de ventanas X. Publicado también bajo la misma licencia esta +node.js, un framework de dashboards de los cuales se derivaron muchos mas. + +Finalmente, queremos recordarte que la decisión de escoger una licencia depende +de cuales restricciones sean absolutamente necesarias para tu proyecto, y +intentar permitir la mayor cantidad de libertades sin sacrificar la integridad y +metas de tu trabajo. De la licencia utilizada pueden surgir problemas legales o +de seguridad, por lo que es importante revisar con calma cual es la mejor opción +y tener claro junto a todos los miembros del equipo bajo que términos se esta +trabajando. diff --git a/content/blog/te-hablamos-del-uso-de-dashboards-para-visualizacion-de-datos-de-tu-proximo-proyecto/header.png b/bkp/blogs/te-hablamos-del-uso-de-dashboards-para-visualizacion-de-datos-de-tu-proximo-proyecto/header.png similarity index 100% rename from content/blog/te-hablamos-del-uso-de-dashboards-para-visualizacion-de-datos-de-tu-proximo-proyecto/header.png rename to bkp/blogs/te-hablamos-del-uso-de-dashboards-para-visualizacion-de-datos-de-tu-proximo-proyecto/header.png diff --git a/bkp/blogs/te-hablamos-del-uso-de-dashboards-para-visualizacion-de-datos-de-tu-proximo-proyecto/index.md b/bkp/blogs/te-hablamos-del-uso-de-dashboards-para-visualizacion-de-datos-de-tu-proximo-proyecto/index.md new file mode 100644 index 000000000..9cc4a9e3e --- /dev/null +++ b/bkp/blogs/te-hablamos-del-uso-de-dashboards-para-visualizacion-de-datos-de-tu-proximo-proyecto/index.md @@ -0,0 +1,118 @@ +--- +title: + "Te hablamos del uso de dashboards para visualización de datos de tu próximo + proyecto" +slug: te-hablamos-del-uso-de-dashboards-para-visualizacion-de-datos-de-tu-proximo-proyecto +date: 2020-03-11 +authors: ["Rainer Palm"] +tags: [visualización de datos, proyectos, datos, código, dashboard, framework] +categories: [ciencia abierta] +description: | + Muchas veces ocurre que, a pesar de que te has tomado el tiempo para analizar y + modelar un problema, escribir código, depurarlo y asegurarte de que todo + funcione bien, necesitas simplificar y compartimentar los datos y la salida de + tu programa para que puedas presentar tu trabajo y que este sea entendido, + usualmente mediante un informe y/o una visualización de lo realizado. Las + herramientas comúnmente usadas para este propósito tienen varias dificultades: + suelen ser estáticas (tal como las diapositivas o los informes escritos), ser + diseñadas en mente solo para gente con conocimiento técnico, o permitir solo el + uso de ciertos lenguajes de programación o librerías. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Muchas veces ocurre que, a pesar de que te has tomado el tiempo para analizar y +modelar un problema, escribir código, depurarlo y asegurarte de que todo +funcione bien, necesitas simplificar y compartimentar los datos y la salida de +tu programa para que puedas presentar tu trabajo y que este sea entendido, +usualmente mediante un informe y/o una visualización de lo realizado. Las +herramientas comúnmente usadas para este propósito tienen varias dificultades: +suelen ser estáticas (tal como las diapositivas o los informes escritos), ser +diseñadas en mente solo para gente con conocimiento técnico, o permitir solo el +uso de ciertos lenguajes de programación o librerías. + + + +Aquí es donde entran en juego los dashboards. Estas son herramientas de manejo +de información que se vinculan entre sí a través de APIs, servicios, librerías y +código de una manera dinámica por 'debajo' de la interfaces de usuarios, es +decir, mostrando los resultados de esta interacción en una interfaz web o +aplicación móvil, a través de gráficos y visualizaciones que al instante +presentan los llamados indicadores de rendimiento (Key Performance Indicators +KPI por sus siglas en inglés), o cualquier otro tipo de indicadores, acerca de +un negocio, proceso, departamento, sitio web, o servidor. Prácticamente +cualquier cosa que necesite ser monitorizada de forma constante puede utilizar +los dashboards. Debido a su naturaleza como frontend, son completamente +personalizables para cualquier propósito al que los quieras aplicar, sólo hace +falta crear los scripts necesarios para hacerlo. + +¿Por qué utilizar un dashboard? + +La principal razón de su popularidad radica en que ofrecen una plataforma +central de monitoreo, y a través de ella se puede observar minuto a minuto el +rendimiento de cualquier cosa. El backend (comúnmente alojado en un servidor de +forma separada de la interfaz del usuario), recibirá también los datos de +entrada y se encarga de realizar el análisis en tiempo real. El backend también +transmite los resultados a la aplicación web o móvil, lo que constituye de cara +al usuario el dashboard como tal, permitiendo a los usuarios conocer el estado +actual del servicio de forma instantánea. Un dashboard requiere, por lo tanto, +de una red por debajo que grabe, maneje y suba los datos para el análisis que se +mostrará en el dashboard. El dashboard permite no solamente la realización del +análisis sino también su modificación, ya sea para verlo de maneras distintas o +con más detalle, para ajustar los periodos de recolección de datos, o quizás +para explorar las predicciones realizadas por el backend. + +El dashboard, por lo tanto, intenta responder preguntas acerca de tu negocio o +servicio al instante, mediante análisis rápido y presentación de la información +en un sitio web. Se construye a partir de aquellas preguntas que se realizan con +bastante frecuencia en el manejo de un servicio, tales como: ¿Estará el servidor +funcionando? ¿Cuáles son las principales entradas de dinero? ¿Cuál contenido es +el que suelen revisar nuestros usuarios con más frecuencia? ¿Cuánto +contenido/trabajo se ha realizado en una semana?, entre otras. Para +responderlas, se centra en presentar de forma clara datos operacionales, con +tablas, gráficos de líneas o barras, medidores, en un diseño sencillo que +utiliza elementos y símbolos comunes e intuitivos. + +Frameworks y librerias diseñadas para dashboards + +Un framework es una plataforma reutilizable útil en el desarrollo de +aplicaciones de software de forma que sirve de soporte como base para el +desarrollo de nuevas aplicaciones. El framework que ha ganado mayor difusión +recientemente, quizás debido a que se construyó a partir de otros que han habido +antes (tales como React.js, Plotly.js, o Flask), es Dash, un framework de Python +principalmente diseñado para crear aplicaciones web orientadas a la +visualización de datos. La idea general esta en vincular una interfaz gráfica +alrededor de tu código Python de una forma rápida y sencilla, renderizando esta +en un navegador web apoyándose en Javascript y HTML, sin necesitar que el +usuario utilice estos lenguajes. Cuenta con paquetes en pip, y una galería de +ejemplos, además de ser completamente código abierto y usar la licencia MIT. La +popularidad de Dash también se debe a que el código escrito para este framework +es bastante compacto (aquí hay una aplicación que muestra una variedad de +gráficas en 43 líneas), y tiene bastante capacidad de personalización estética +para quién lo desee, mediante CSS. + +Por supuesto, hay también bastantes otras opciones. Está Shiny, que es un +paquete de R que permite la creación de aplicaciones web directamente desde R, +ya sea alojándolas directamente en un sitio web o integrándolas en documentos R +Markdown, que también soporta el uso de temas CSS y Javascript. Shiny también +tiene una comunidad bastante dedicada y activa. También esta Cube.js, un +framework de código abierto diseñado desde abajo para análisis inteligente +accesible instantáneamente desde un sitio web. O JDash, o Mozaïk.Todo es +cuestión de utilizar el que mas se acerque a tus necesidades. + +Los dashboards son una herramienta bastante poderosa. Con un proceso +automatizado de subida y recolecta de datos por debajo, y un diseño funcional, +sencillo y bien pensado, pueden volverse un instrumento muy importante para +presentar tu proyecto y/o desarrollarlo en grupo, y en áreas de marketing, o +negocios son prácticamente indispensables. Si tienes dificultades con cuestiones +de coordinación de equipos, monitoreo de proyectos o manejo de finanzas, ¿por +qué no probarlos? \[1\]: https://dash.plot.ly/ "Dash" \[2\]: +https://dash-gallery.plotly.host/Portal/ "Dash App Gallery" \[3\]: +https://gist.github.com/chriddyp/3d2454905d8f01886d651f207e2419f0 "Hello World +Dash app" \[4\]: https://shiny.rstudio.com/ "R Shiny" \[5\]: +https://shiny.rstudio.com/gallery/#user-showcase "R Shine | User Showcase" +\[6\]: https://cube.dev/ "Cube.js" \[7\]: http://jdash.io/ "JDash" \[8\]: +http://mozaik.rocks/ "Mozaïk" diff --git a/content/blog/te-mostramos-algunos-repositorios-con-datos-sobre-el-covid-19/header.png b/bkp/blogs/te-mostramos-algunos-repositorios-con-datos-sobre-el-covid-19/header.png similarity index 100% rename from content/blog/te-mostramos-algunos-repositorios-con-datos-sobre-el-covid-19/header.png rename to bkp/blogs/te-mostramos-algunos-repositorios-con-datos-sobre-el-covid-19/header.png diff --git a/content/blog/te-mostramos-algunos-repositorios-con-datos-sobre-el-covid-19/index.md b/bkp/blogs/te-mostramos-algunos-repositorios-con-datos-sobre-el-covid-19/index.md similarity index 66% rename from content/blog/te-mostramos-algunos-repositorios-con-datos-sobre-el-covid-19/index.md rename to bkp/blogs/te-mostramos-algunos-repositorios-con-datos-sobre-el-covid-19/index.md index cb3e3f6cc..336e5315a 100644 --- a/content/blog/te-mostramos-algunos-repositorios-con-datos-sobre-el-covid-19/index.md +++ b/bkp/blogs/te-mostramos-algunos-repositorios-con-datos-sobre-el-covid-19/index.md @@ -2,33 +2,32 @@ title: "Te mostramos algunos repositorios con datos sobre el COVID-19" slug: te-mostramos-algunos-repositorios-con-datos-sobre-el-covid-19 date: 2020-03-23 -author: Anavelyz Pérez +authors: ["Anavelyz Perez"] tags: [repositorios, datos, salud, covid19] categories: [ciencia abierta, datos abiertos, acceso abierto] - -draft: false -usePageBundles: true +description: | + El covid-19 es un virus que emergió en Wuhan, China a finales del año 2019, este + virus ha generado desde entonces una gran alarma internacional. Se trata de una + infección respiratoria que comienza con fiebre y tos seca y que, al cabo de + cerca de una semana, puede provocar falta de aire. La vía principal de + transmisión del virus es a través de pequeñas gotas que se producen cuando una + persona infectada tose o estornuda \[https://www.isglobal.org/coronavirus\]. + También se transmite al tocarse ojos, nariz o boca tras tocar superficies + contaminadas. Este virus se ha extendido y el número de países en los que sus + ciudadanos se han contagiado incrementó masivamente en los últimos días. thumbnail: "/header.png" -featureImage: "/header.png" +template: "blog-post.html" --- - - - -![header](../../../images/blog/te-mostramos-algunos-repositorios-con-datos-sobre-el-covid-19/header.png) - El covid-19 es un virus que emergió en Wuhan, China a finales del año 2019, este virus ha generado desde entonces una gran alarma internacional. Se trata de una infección respiratoria que comienza con fiebre y tos seca y que, al cabo de cerca de una semana, puede provocar falta de aire. La vía principal de -transmisión del virus es a través de pequeñas gotas que se -producen cuando una persona infectada tose o estornuda -\[https://www.isglobal.org/coronavirus\]. También se transmite al tocarse ojos, -nariz o boca tras tocar superficies contaminadas. Este virus se ha extendido y -el número de países en los que sus ciudadanos se han contagiado incrementó -masivamente en los últimos días. - - +transmisión del virus es a través de pequeñas gotas que se producen cuando una +persona infectada tose o estornuda \[https://www.isglobal.org/coronavirus\]. +También se transmite al tocarse ojos, nariz o boca tras tocar superficies +contaminadas. Este virus se ha extendido y el número de países en los que sus +ciudadanos se han contagiado incrementó masivamente en los últimos días. Para el 11 de marzo de 2020 la Organización Mundial de la Salud ha declarado el brote del virus como una pandemia global. En un artículo de la revista Nature @@ -39,31 +38,33 @@ menciona que el virus se encuentra en más de 100 países, ha infectado a unas Por esta razón, los científicos han venido realizando un esfuerzo continuo para estudiar el virus y conseguir la cura. De manera que cada uno de los avances de -sus investigaciones están siendo publicados en revistas o repositorios de acceso abierto. La -particularidad de esto es la omisión de las revisiones preprint de los artículos -y/o archivos involucrados para agilizar el proceso de publicación. Algunos -repositorios y editoriales conocidos han prestado sus espacios para publicar los -avances a pesar de esta condición. - -Aunque podemos pensar que los artículos publicados en abierto no son tan fiables por la falta de -la revisión, es importante tener en cuenta que, sin embargo, al tener una cantidad importante de personas -(científicos, médicos, profesionales de las salud, politicos, entre otros) al -pendiente de lo que ocurre, la validación de los archivos se hace entre los -lectores y estudiosos del área, y que cualquier sugerencia o comentario se realiza en -la plataforma o se envían directamente a los autores. +sus investigaciones están siendo publicados en revistas o repositorios de acceso +abierto. La particularidad de esto es la omisión de las revisiones preprint de +los artículos y/o archivos involucrados para agilizar el proceso de publicación. +Algunos repositorios y editoriales conocidos han prestado sus espacios para +publicar los avances a pesar de esta condición. + +Aunque podemos pensar que los artículos publicados en abierto no son tan fiables +por la falta de la revisión, es importante tener en cuenta que, sin embargo, al +tener una cantidad importante de personas (científicos, médicos, profesionales +de las salud, politicos, entre otros) al pendiente de lo que ocurre, la +validación de los archivos se hace entre los lectores y estudiosos del área, y +que cualquier sugerencia o comentario se realiza en la plataforma o se envían +directamente a los autores. Además de ello, tal y como es descrito en el articulo "El coronavirus empuja a la ciencia a compartir" se ha dispuesto a la comunidad internacional secuencias genéticas del coronavirus en tiempo real. Una acción similar que funcionó para -monitorear el brote de SARS o los inicios de la gripe A. La idea de esta práctica es -evaluar la situación y guiar las acciones políticas. De forma tal que el control -de la pandemia se realiza bajo un proceso colaborativo que, al complementarlo -con la iniciativa de tener repositorios de acceso abierto para los resultados, logra que la sociedad -en general y la comunidad científica en particular, consigan puntos de referencia e información -clave en cortos periodos de tiempo. +monitorear el brote de SARS o los inicios de la gripe A. La idea de esta +práctica es evaluar la situación y guiar las acciones políticas. De forma tal +que el control de la pandemia se realiza bajo un proceso colaborativo que, al +complementarlo con la iniciativa de tener repositorios de acceso abierto para +los resultados, logra que la sociedad en general y la comunidad científica en +particular, consigan puntos de referencia e información clave en cortos periodos +de tiempo. -Entre los repositorios más difundidos con datos y artículos sobre el -covid-19 están: +Entre los repositorios más difundidos con datos y artículos sobre el covid-19 +están: -medRxiv: es un servidor gratuito de archivo y distribución en línea para manuscritos completos pero no publicados (preprints) en las ciencias médicas, @@ -80,7 +81,8 @@ https://www.medrxiv.org/search/Coronavirus Hay alrededor de 400 artículos disponibles en este repositorio sobre el coronavirus. https://www.biorxiv.org/search/Coronavirus -También revistas como Nature \[https://www.nature.com/search?q=coronavirus\], Cell +También revistas como Nature \[https://www.nature.com/search?q=coronavirus\], +Cell \[https://www.cell.com/action/doSearch?searchType=quick&searchText=coronavirus&searchScope=fullSite&occurrences=all&code=cell-site\] o The Lancet \[https://www.thelancet.com/action/doSearch?searchType=quick&searchText=coronavirus&searchScope=fullSite&occurrences=all&code=lancet-site\] @@ -128,6 +130,7 @@ la distribución geográfica del virus https://arcg.is/918mf [Periódico global: El país](https://elpais.com/) -Material informativo de la Universidad Central de Venezuela, Facultad de Medicina +Material informativo de la Universidad Central de Venezuela, Facultad de +Medicina [Portal Regional de la BVS](https://bvsalud.org/vitrinas/es/post_vitrines/nuevo_coronavirus/) diff --git a/content/blog/te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta/header.png b/bkp/blogs/te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta/header.png similarity index 100% rename from content/blog/te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta/header.png rename to bkp/blogs/te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta/header.png diff --git a/bkp/blogs/te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta/index.md b/bkp/blogs/te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta/index.md new file mode 100644 index 000000000..5bab105d8 --- /dev/null +++ b/bkp/blogs/te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta/index.md @@ -0,0 +1,129 @@ +--- +title: + "Te mostramos cinco librerías en Python para tu próximo proyecto de ciencia + abierta" +slug: te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta +date: 2020-06-09 +authors: ["Anavelyz Perez"] +tags: [datos, visualización de datos, pandas, scipy, matplotlib, seaborn, bokeh] +categories: [ciencia abierta, código abierto, Python] +description: | + Un proyecto de ciencia abierta, así como cualquier otro, requiere de una + evaluación previa para determinar lo que se necesita hacer y cómo debe llevarse + a cabo. En el caso de ciencia abierta, debemos tener en cuenta que, por su + alcance e impacto en la comunidad científica y sociedad en general, es vital + estudiar las herramientas que se utilizarán porque de ellas depende la obtención + de resultados óptimos, visualmente atractivos y lo suficientemente informativos. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Un proyecto de ciencia abierta, así como cualquier otro, requiere de una +evaluación previa para determinar lo que se necesita hacer y cómo debe llevarse +a cabo. En el caso de ciencia abierta, debemos tener en cuenta que, por su +alcance e impacto en la comunidad científica y sociedad en general, es vital +estudiar las herramientas que se utilizarán porque de ellas depende la obtención +de resultados óptimos, visualmente atractivos y lo suficientemente informativos. + + + +Antes de continuar, recordemos del artículo +[¿Qué es la ciencia abierta?](/blog/que-es-la-ciencia-abierta/), que la ciencia +abierta es un movimiento, una manera de ver y hacer ciencia, que busca crear una +cultura donde la información de todo el proceso de investigación científica, ya +sean los datos, protocolos, cuadernos de laboratorio, resultados obtenidos en +las diferentes etapas de este proceso, sean gratuitos y de libre acceso. De esta +manera, todas las personas involucradas en el proceso de investigación, ya sean +los propios científicos, instituciones de investigación y financiamiento, y +público en general, pueden contribuir y colaborar con el esfuerzo de +investigación. Con esto se garantiza que el trabajo científico sea abierto e +inclusivo, donde el investigador se dé cuenta que poner a libre disposición sus +trabajos le garantizan, entre otras cosas, el aumento del impacto y difusión de +sus investigaciones. + +Allí también se menciona que la ciencia abierta es una forma de producir +conocimiento científico, promoviendo la comunicación y acceso efectivo del +contenido de las investigaciones científicas en todas las áreas (instrumentos de +trabajo, resultados intermedios y finales) mediante la digitalización y las +bondades del internet. + +Cuando elaboramos un proyecto bajo la modalidad de ciencia abierta, por lo +general analizamos, describimos y descubrimos información que está contenida en +datos, lo cual se hace aplicando métodos estadísticos u otros similares. Estos +se pueden complementar con una o varias visualizaciones o gráficos que +permitirán, tanto a los analistas como a los lectores, tener una visión más +general de lo que las medidas numéricas o palabras describen. Además, una +visualización logra presentar resultados estéticamente más atractivos y captar +la atención en puntos donde se requiera un mayor enfoque. + +Para tener esto último un poco más claro, representémoslo en un ejemplo. +Supongamos que estamos estudiando las enfermedades en un período de tiempo dado +y en una región específica, y tenemos la información que corresponde a la edad, +sexo y la enfermedad que presentan los pacientes atendidos en los centros +hospitalarios de ese período. + +Entonces podemos considerar la estadística descriptiva como una de las técnicas +ideales, en este caso se calcularían estadísticos como la media para la edad, la +proporción para el sexo y el tipo de enfermedad. A su vez, podemos hacer cruces +de información a través de tablas de contingencia y a partir de estas elaborar +gráficos que complementarán esta información. Estos gráficos mostrarán, de forma +sintetizada, lo que los datos revelan y resultará más fácil hacer comparaciones. +Además los colores y las áreas de las figuras trazadas captarán la atención de +lo que verdaderamente se requiere para la toma de decisiones. Todo ello es una +clara y simple noción de lo que una visualización puede ayudar. + +A continuación veamos cinco bibliotecas o librerías de Python que puedes +implementar en tu proyecto de ciencia abierta: + +- pandas: Es una biblioteca que permite realizar tareas de manejo y análisis de + datos de forma rápida y eficiente. Se complementa con la biblioteca de + visualización Matplotlib. Puedes consultar más información en + https://pandas.pydata.org/. + + SciPy: Es uno de los paquetes centrales que componen la pila de SciPy. + Proporciona muchas rutinas numéricas eficientes y fáciles de usar, como las + rutinas de integración numérica, interpolación, optimización, álgebra lineal y + estadística. Esta descripción se encuentra disponible en + https://www.scipy.org/scipylib/index.html. + +- Matplotlib: es una de las primeras y más populares bibliotecas de + visualización de Python. En su [página web](https://matplotlib.org/) podemos + encontrar una corta descripción de ella: Matplotlib es una biblioteca muy + completa para crear visualizaciones estáticas, animadas e interactivas en + Python. Con esta biblioteca se pueden generar gráficos de barras, histogramas, + espectros de potencia, stemplots, scatterplots, gráficos de error, gráficos + circulares y muchos otros. + + Es uno de los métodos más simples para las representaciones básicas, está + diseñada con la filosofía de que deberías generar un gráfico simple con pocas + líneas de código, o simplemente una. Además, se complementa muy bien con otras + bibliotecas de análisis de datos, tal es el caso mencionado líneas arriba con + _pandas_. + +- Seaborn: es una biblioteca de visualización basada en Matplotlib, permite + hacer gráficos estadísticos visualmente atractivos, posee estilos + predeterminados y paletas de colores que están diseñados para obtener + resultados más estéticos y modernos. Podemos obtener gráficos de barras, + histogramas, circulares, gráficos de error, entre otros. + + Podemos encontrar más información de esta biblioteca en su + [página web](https://seaborn.pydata.org/). + +- Bokeh: Es una biblioteca de visualización que permite crear tanto gráficos + sencillos como especializados, dashboards y gráficos orientados a la web. Los + resultados de las visualizaciones constan de elegancia y son estéticamente + atractivos, los gráficos son muy versátiles. Es posible consultar más + información acerca de esta biblioteca en su + [página web](https://docs.bokeh.org/en/latest/index.html). + +Todas estas bibliotecas son de código abierto y cuentan con un soporte en la +web, existen foros y varios canales de información sobre ellas. No son las +únicas que puedes incluir en tu proyecto, hay muchas opciones más, te invitamos +a que explores y pruebes estas herramientas. + +En nuestro artículo +[**Herramientas de visualización en Python**](/blog/herramientas-de-visualizacion-en-python/) +puedes encontrar otras bibliotecas o librerías que te pueden interesar. diff --git a/content/blog/todas-las-posibilidades-que-te-ofrece-utilizar-figshare-en-tus-proyectos/header.png b/bkp/blogs/todas-las-posibilidades-que-te-ofrece-utilizar-figshare-en-tus-proyectos/header.png similarity index 100% rename from content/blog/todas-las-posibilidades-que-te-ofrece-utilizar-figshare-en-tus-proyectos/header.png rename to bkp/blogs/todas-las-posibilidades-que-te-ofrece-utilizar-figshare-en-tus-proyectos/header.png diff --git a/content/blog/todas-las-posibilidades-que-te-ofrece-utilizar-figshare-en-tus-proyectos/index.md b/bkp/blogs/todas-las-posibilidades-que-te-ofrece-utilizar-figshare-en-tus-proyectos/index.md similarity index 77% rename from content/blog/todas-las-posibilidades-que-te-ofrece-utilizar-figshare-en-tus-proyectos/index.md rename to bkp/blogs/todas-las-posibilidades-que-te-ofrece-utilizar-figshare-en-tus-proyectos/index.md index 899aefc13..8333b34df 100644 --- a/content/blog/todas-las-posibilidades-que-te-ofrece-utilizar-figshare-en-tus-proyectos/index.md +++ b/bkp/blogs/todas-las-posibilidades-que-te-ofrece-utilizar-figshare-en-tus-proyectos/index.md @@ -1,22 +1,22 @@ --- -title: "Todas las posibilidades que te ofrece utilizar figshare en tus proyectos" +title: + "Todas las posibilidades que te ofrece utilizar figshare en tus proyectos" slug: todas-las-posibilidades-que-te-ofrece-utilizar-figshare-en-tus-proyectos date: 2020-12-21 -author: Anavelyz Pérez +authors: ["Anavelyz Perez"] tags: [figshare, proyectos, plataforma] categories: [ciencia abierta, investigación abierta, acceso abierto] - -draft: false -usePageBundles: true +description: | + Figshare es un repositorio de acceso abierto en línea en el cual los usuarios pueden + poner a disposición todos los resultados de sus investigaciones. Esto de manera + que sean citables, compartibles y descubribles. Los resultados pueden incluir + cifras, los conjuntos de datos, imágenes y vídeos. thumbnail: "/header.png" -featureImage: "/header.png" +template: "blog-post.html" --- - - - ¿Qué es figshare? Es un repositorio de acceso abierto en línea en el cual los usuarios pueden @@ -26,8 +26,8 @@ cifras, los conjuntos de datos, imágenes y vídeos. -**figshare** fue ideado y desarrollado por Mark Hahnel, se lanzó originalmente en el -año 2011. "Hahnel diseñó e implementó esta plataforma como una alternativa +**figshare** fue ideado y desarrollado por Mark Hahnel, se lanzó originalmente +en el año 2011. "Hahnel diseñó e implementó esta plataforma como una alternativa propia para organizar, publicar y compartir, los recursos, los productos y los resultados que a partir de su investigación doctoral en biología de células madre, generaba y obtenía de forma complementaría" @@ -50,13 +50,13 @@ proyectos hasta la promoción de ellos. Veamos esto detenidamente. categorías y etiquetas que son fáciles de buscar, logrando así que los investigadores encuentren los datos que necesitan más rápido. -- Compartir tu trabajo: con esta plataforma tienes la posibilidad de hacer público - tu proyecto, compartir tus archivos y controlar el acceso a tus datos privados. - Adicional a esto puedes asignarle un DOI y obtener citaciones por los resultados - de tu investigación. +- Compartir tu trabajo: con esta plataforma tienes la posibilidad de hacer + público tu proyecto, compartir tus archivos y controlar el acceso a tus datos + privados. Adicional a esto puedes asignarle un DOI y obtener citaciones por + los resultados de tu investigación. - Opciones de acceso: Actualmente Figshare tiene tres opciones de acceso, un - acceso para investigadores, un acceso para instituciones y un acceso para + acceso para investigadores, un acceso para instituciones y un acceso para editores. El acceso para investigadores se conoce generalmente como free accounts. @@ -70,10 +70,10 @@ proyectos hasta la promoción de ellos. Veamos esto detenidamente. * Editar todo el contenido antes de que se publique * Colocar una marca de agua en los archivos correspondientes a la institución * Descartar los archivos que han sido publicados por error -* Permite alojar grandes cantidades de datos en sus artículos en - línea sin que ello afecte a su infraestructura. -* Se contará con estadísticas públicas sobre todas las vistas, descargas, - citas y otras alteraciones de los productos de su institución. +* Permite alojar grandes cantidades de datos en sus artículos en línea sin que + ello afecte a su infraestructura. +* Se contará con estadísticas públicas sobre todas las vistas, descargas, citas + y otras alteraciones de los productos de su institución. Para ver estas y otras características puedes visitar \[https://figshare.com/features\]. @@ -87,13 +87,12 @@ ampliar el conocimiento y promover la ciencia abierta. - Proyectos y productos propios de figshare: -“The State of Open Data” es uno de estos proyectos, se ha venido implementando -desde 2016, su principal objetivo es "aprender para ayudar a conformar el -futuro de los datos abiertos sobre la base de la información y las pruebas -reunidas en la comunidad". Además, se tiene en una sección en la cual se -consigue información, análisis, datos y encuestas referentes a 16 disciplinas -o sectores en los que se ha implementado la ciencia abierta. Para tener una -mejor idea de este proyecto puedes visitar el sitio web -\[https://stateofopendata.od4d.net/\]. +desde 2016, su principal objetivo es "aprender para ayudar a conformar el futuro +de los datos abiertos sobre la base de la información y las pruebas reunidas en +la comunidad". Además, se tiene en una sección en la cual se consigue +información, análisis, datos y encuestas referentes a 16 disciplinas o sectores +en los que se ha implementado la ciencia abierta. Para tener una mejor idea de +este proyecto puedes visitar el sitio web \[https://stateofopendata.od4d.net/\]. -"The Reproducibility Initiative”, es un proyecto en conjunto con Science Exchange, PLOS y Mendeley, cuyo objetivo es identificar y recompensar la @@ -117,9 +116,10 @@ y ayuda al crecimiento del conocimiento. **Al día de hoy, figshare ha recibido más de 26 millones de page views y más de 7.5 millones de descargas, tiene en su plataforma más de 2 millones artículos, más de 5 mil proyectos, más de 500 mil colecciones y más de 800 mil usuarios que -cargan o comparten sus archivos a través de ella. \[https://figshare.com/about\]** +cargan o comparten sus archivos a través de ella. +\[https://figshare.com/about\]** -* Referencias: +- Referencias: (Sitio oficial defigshare) \[https://figshare.com/\] diff --git a/content/blog/todo-lo-que-debes-saber-sobre-la-investigacion-colaborativa/header.png b/bkp/blogs/todo-lo-que-debes-saber-sobre-la-investigacion-colaborativa/header.png similarity index 100% rename from content/blog/todo-lo-que-debes-saber-sobre-la-investigacion-colaborativa/header.png rename to bkp/blogs/todo-lo-que-debes-saber-sobre-la-investigacion-colaborativa/header.png diff --git a/content/blog/todo-lo-que-debes-saber-sobre-la-investigacion-colaborativa/index.md b/bkp/blogs/todo-lo-que-debes-saber-sobre-la-investigacion-colaborativa/index.md similarity index 82% rename from content/blog/todo-lo-que-debes-saber-sobre-la-investigacion-colaborativa/index.md rename to bkp/blogs/todo-lo-que-debes-saber-sobre-la-investigacion-colaborativa/index.md index fe3607a29..5a03481ea 100644 --- a/content/blog/todo-lo-que-debes-saber-sobre-la-investigacion-colaborativa/index.md +++ b/bkp/blogs/todo-lo-que-debes-saber-sobre-la-investigacion-colaborativa/index.md @@ -2,22 +2,23 @@ title: "Todo lo que debes saber sobre la investigación colaborativa" slug: todo-lo-que-debes-saber-sobre-la-investigacion-colaborativa date: 2020-01-10 -author: Anavelyz Pérez +authors: ["Anavelyz Perez"] tags: [investigación colaborativa, equipos] -categories: [ciencia abierta, investigación abierta] - -draft: false -usePageBundles: true +categories: [ciencia abierta, investigación abierta] +description: | + La investigación colaborativa es un término que se le atribuye al hecho de + realizar o llevar a cabo investigaciones y/o proyectos donde participan más de + una persona, instituciones o empresas. La ventaja de este tipo de investigación + es la unión de distintos conocimientos, experiencias y perspectivas que pueden + resultar en innovaciones, aprendizajes mutuos y condiciones estables u optimas + para enfrentar obstáculos. thumbnail: "/header.png" -featureImage: "/header.png" +template: "blog-post.html" --- - - - La investigación colaborativa es un término que se le atribuye al hecho de realizar o llevar a cabo investigaciones y/o proyectos donde participan más de una persona, instituciones o empresas. La ventaja de este tipo de investigación @@ -106,7 +107,7 @@ cambios. Además, afianzará la confianza y toda la información estará respaldada. Existen diversos sistemas que permiten realizar un control de versiones, una de -ellos es *Git*. +ellos es _Git_. ## Limitaciones @@ -115,10 +116,10 @@ aparezcan en este caso las limitaciones. Pueden ser de carácter económico, social, personal, entre otros. El equipo debe estudiar y encontrar posibilidades que solventen estas situaciones. Existe la opción de delimitar la investigación. -En resumen, la investigación colaborativa presenta un conjunto muy interesante de oportunidades, -crecimiento grupal o individual e implementación de nuevas tecnologías, -innovaciones y cambios que pueden marcar la diferencia en pro de una mejor -sociedad. Cada uno de los entes involucrados debe tener en cuenta que tanto su -opinión como la de los demás es importante, la confianza, el respeto y los -distintos canales de comunicación son claves para lograr un recorrido productivo -para asi obtener un proyecto con buenos resultados. +En resumen, la investigación colaborativa presenta un conjunto muy interesante +de oportunidades, crecimiento grupal o individual e implementación de nuevas +tecnologías, innovaciones y cambios que pueden marcar la diferencia en pro de +una mejor sociedad. Cada uno de los entes involucrados debe tener en cuenta que +tanto su opinión como la de los demás es importante, la confianza, el respeto y +los distintos canales de comunicación son claves para lograr un recorrido +productivo para asi obtener un proyecto con buenos resultados. diff --git a/content/blog/tres-proyectos-de-ciencia-ciudadana-que-te-sorprenderan/header.png b/bkp/blogs/tres-proyectos-de-ciencia-ciudadana-que-te-sorprenderan/header.png similarity index 100% rename from content/blog/tres-proyectos-de-ciencia-ciudadana-que-te-sorprenderan/header.png rename to bkp/blogs/tres-proyectos-de-ciencia-ciudadana-que-te-sorprenderan/header.png diff --git a/bkp/blogs/tres-proyectos-de-ciencia-ciudadana-que-te-sorprenderan/index.md b/bkp/blogs/tres-proyectos-de-ciencia-ciudadana-que-te-sorprenderan/index.md new file mode 100644 index 000000000..a75fab1e9 --- /dev/null +++ b/bkp/blogs/tres-proyectos-de-ciencia-ciudadana-que-te-sorprenderan/index.md @@ -0,0 +1,151 @@ +--- +title: "Tres proyectos de ciencia ciudadana que te sorprenderán" +slug: tres-proyectos-de-ciencia-ciudadana-que-te-sorprenderan +date: 2020-02-12 +authors: ["Rainer Palm"] +tags: [comunidad, proyectos, basura, ciencia ciudadana] +categories: [ciencia abierta] +description: | + Alguna vez has querido saber como es realmente participar en una investigación + científica, sin necesariamente tener el entrenamiento o la educación del area? + Descubrir nuevas especies, identíficar cuerpos celestes, quizás simplemente + hacer trabajo de campo en las fronteras de tu propia ciudad, catalogando los + animales y plantas que coexisten en tu habitat local. Mediante proyectos y + aplicaciones de ciencia ciudadana, esto es una posibilidad, y ya hay una + diversidad de personas cotidianas que la han aprovechado, indirectamente + volviendose científicos. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +Alguna vez has querido saber como es realmente participar en una investigación +científica, sin necesariamente tener el entrenamiento o la educación del area? +Descubrir nuevas especies, identíficar cuerpos celestes, quizás simplemente +hacer trabajo de campo en las fronteras de tu propia ciudad, catalogando los +animales y plantas que coexisten en tu habitat local. Mediante proyectos y +aplicaciones de ciencia ciudadana, esto es una posibilidad, y ya hay una +diversidad de personas cotidianas que la han aprovechado, indirectamente +volviendose científicos. + + + +Alrededor del mundo, una multitud de gobiernos y instituciones ya estan +resolviendo problemas concretos utilizando ciencia ciudadana. Ya sea por que +consideran mucho más eficiente aprovechar el amplio alcance que les otorga, +porque lo consideran necesario para lograr conseguir una comunicación mas +directa entre los científicos y el entorno el cual estudian, porque piensan que +el vinculo entre los científicos y la gente común debe ser mas estrecha, o +porque requieren de la información que pueden obtener de reportes y +observaciones hechos durante el dia a dia de los ciudadanos, simplemente ven ahí +un potencial muy importante y explotable, y es de esperar que el foco de estos +proyectos se este ampliando cada vez mas y mas, desde problemas particulares de +biodiversidad o reporte de deslaves, hasta temas de políticas públicas y +decisiones legales. + +Pensando nada más en el momento actual en el que vivimos, vemos que hay muchas +oportunidades para participar en estos proyectos inclusive en lugares del mundo +donde no son muy comunes. Sólo hace falta tiempo libre y una conexión a internet +para empezar a transcribir documentos de la libreria del congreso +estadounidense[1], identificar animales en Australia[2] o ayudar a monitorearlos +en la India[3]. Todo esto sin ni siquiera ir a recolectar datos en el campo como +tal, lo cual pone otro gran montón de posibilidades sobre la mesa, las cuales +definitivamente solo hemos empezado a explorar. + +¿Tienes curiosidad por cual es el verdadero potencial de esta practica? Si +quieres saborear una pequeña muestra, solamente tienes que revisar los +siguientes proyectos que presentamos a continuación. + +## Butterfly Conservation + +Butterfly Conservation[4] es una ONG que trabaja con la protección de la vida +salvaje basada en el Reino Unido que, tal como su nombre lo indica, se dedica a +realizar investigaciones y proyectos que apuntan hacia la conservación y +restauración del habitat de mariposas y polillas, buscando tanto proteger +especies locales en peligro como apoyar y promover esfuerzos internacionales de +preservación. En su pagina comparten recursos tanto para aprender a identificar +especies individuales, como para ciertas prácticas de permacultura (siembra de +ciertas plantas en especifico, creación de un habitat reproductivo, etc.), que +otorgan a las mariposas y polillas un refugio dentro de tu jardín. Como +organización, tienen una multitud de proyectos de conservación dedicados a la +creación de mejores prácticas de agricultura y pastizales económicos, pero +repletos de polinizadores y flores silvestres. + +Sus investigaciones también utilizan prácticas de ciencia ciudadana. Permiten a +cualquier persona que esté interesada, trabajar como voluntario/a tanto en sus +oficinas como en el campo, en tareas de ayuda a organización de eventos y manejo +de reservas naturales, entre otros. También están abiertos a que cualquiera que +tenga la posibilidad, les apoye mediante monitoreo de especies dentro de +jardines y espacios urbanos. Cualquiera que viva junto a o cerca de una variedad +de mariposas o polillas dentro del Reino Unido puede hacer un registro de su +observación y así contribuir a una multitud de proyectos dentro de la +organización, ya sean de contar o identificar especies o investigar el estado y +salud del ambiente en el que conviven. + +## Científicos de la Basura + +Científicos de la Basura[5] es un programa de ciencia ciudadana de Chile +integrado y fundado por investigadores de la Universidad Católica del Norte, +cuya principal misión es educar a los escolares respecto a la ciencia y al +ambiente en el que viven, fomentando un respeto por el manejo de la basura e +involucrándolos en actividades que induce al trabajo de campo mediante su +realización, generando información científica que a su vez ayuda a diseñar +estrategias para que se resuelvan problemas particulares respecto a la +acumulación de basura, tanto en espacios urbanos como naturales. Junto a estas +actividades, también han desarollado muchas guías metodológicas para muestreos y +encuestas en diferentes áreas, de manera que cualquiera que desee puede realizar +estas investigaciones de forma independiente, así como guías para que profesores +de primaria puedan introducir estos temas de contaminación ambiental en un +curriculum escolar. + +Hasta ahora han realizado una número importante de investigaciones en +instituciones educativas distribuidas a lo largo de Chile. Hay desde +investigaciones realizadas por clubes escolares con metodologías estandarizadas, +como en 2009, donde el Club Explora del Colegio Los Carrera estudió el impacto +que tienen los humanos en la región de Coquimbo, principalmente en los humedales +y en el borde costero. O en 2014, cuando se realizó el proyecto "Investigando la +basura aprendemos ciencia", que abarcó muestreos y talleres realizados por los +profesores y sus alumnos en una variedad de escuelas. + +## Moon Zoo + +Moon Zoo\[6\] fue un proyecto lanzado en Mayo 2010, alojado en la plataforma +Zooniverse, donde usuarios registrados podían identificar, clasificar y medir +formas y relieves en la superficie de la Luna, cerca del sitio de aterrizaje de +la misión Apolo 17. De esta forma, catalogaban ciertas características +geomorfológicas a lo largo de la superficie lunar, como cráteres frescos y +relieves lineares, identificándolas entre millones de imágenes tomadas por el +satélite Lunar Reconnaissance Orbiter (LRO) de la NASA. Todo ello desde un +portal en el que analizaron, inclusive, las herramientas e interfaces utilizadas +por los usuarios para el ingreso de los datos, seleccionándolas y diseñándolas +para la encuesta. En este proyecto se prestó especial atención a los métodos de +agrupación de información y de filtración de datos, para evitar marcaciones +problemáticas, generando verificaciones por expertos. + +Entre algunas de las observaciones realizadas al proyecto, se indicaron ciertos +errores metodólogicos y otros más relativos al entrenamiento previo de los +usuarios que vacíen información, y el proceso de filtrado de datos; sin embargo, +los beneficios que les dio este acercamiento inusual al problema definitivamente +se hicieron notar. Entre estos beneficios destacan: la clasificar distribuida de +grandes cantidades de datos mediante observación y analísis independiente +asignado a voluntariados de Internet, lo cual permitió que este proceso se +realizara de una forma mucho mas rápida sin sacrificar necesariamente la calidad +de la investigación. + +Como puedes ver, ya hay muchos investigadores que consideran útil y hasta +necesaria la participación de los ciudadanos en sus estudios, y no como sujetos +en encuestas o entrevistas sino como colaboradores. Inclusive si no te convencen +mucho los proyectos de las lista, solamente hace falta buscar en internet para +conseguir docenas de ejemplos mas, en todo tipo de lugares alrededor del mundo. +Muchos presentan metodologías interesantes o inusuales y por lo tanto vistas +interesantes al proceso científico, y definitivamente se merecen tu atención. + +\[6\]: https://moonzoo.org/ "Moon Zoo"2 + +[1]: https://crowd.loc.gov/ "By The People" +[2]: https://volunteer.ala.org.au/wildlife-spotter "DigiVol - Wildlife Spotter" +[3]: https://www.bioatlasindia.org/bai-websites "Biodiversity Atlas - India" +[4]: https://butterfly-conservation.org/ "Butterfly Conservation" +[5]: http://www.cientificosdelabasura.cl "Científicos de la Basura" diff --git a/content/blog/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/Rplot.png b/bkp/blogs/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/Rplot.png similarity index 100% rename from content/blog/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/Rplot.png rename to bkp/blogs/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/Rplot.png diff --git a/content/blog/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/datosimportpandemia.gif b/bkp/blogs/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/datosimportpandemia.gif similarity index 100% rename from content/blog/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/datosimportpandemia.gif rename to bkp/blogs/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/datosimportpandemia.gif diff --git a/content/blog/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/header.png b/bkp/blogs/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/header.png similarity index 100% rename from content/blog/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/header.png rename to bkp/blogs/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/header.png diff --git a/content/blog/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/index.md b/bkp/blogs/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/index.md similarity index 61% rename from content/blog/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/index.md rename to bkp/blogs/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/index.md index a73ee5590..b1966e560 100644 --- a/content/blog/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/index.md +++ b/bkp/blogs/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/index.md @@ -2,29 +2,30 @@ title: "Visualiza tus datos en R con ggplot2 y gganimate" slug: visualiza-tus-datos-en-r-con-ggplot-y-gganimate date: 2022-04-08 -author: Ever Vino +authors: ["Ever Vino"] tags: [visualización de datos, ggplot2, gganimate] -categories: [ciencia abierta, código abierto, R] -aliases: ["/blog/0057-r-ggplot-bo/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/"] -draft: false -usePageBundles: true +categories: [ciencia abierta, código abierto, R] +description: | + Una gráfica es una buena manera de expresar los datos, estos ayudan a ver + detalles que simplemente pueden pasar desapercibidos cuando sólo se los analizan + numericamente, estos pueden tener aún mayor impacto si estan animados. ¿Por qué + no hacerlo?. En este artículo se describe como hacer animación usando ggplot2 y + gganimate en R. thumbnail: "/header.png" -featureImage: "/header.png" +template: "blog-post.html" --- - - - - - - -Una gráfica es una buena manera de expresar los datos, estos ayudan a ver detalles que simplemente pueden pasar desapercibidos cuando sólo se los analizan numericamente, estos pueden tener aún mayor impacto si estan animados. ¿Por qué no hacerlo?. En este artículo se describe como hacer animación usando ggplot2 y gganimate en R. - - +Una gráfica es una buena manera de expresar los datos, estos ayudan a ver +detalles que simplemente pueden pasar desapercibidos cuando sólo se los analizan +numericamente, estos pueden tener aún mayor impacto si estan animados. ¿Por qué +no hacerlo?. En este artículo se describe como hacer animación usando ggplot2 y +gganimate en R. ## Comenzando -Usamos R por ser un lenguaje especializado para ciencia de datos y tener una gran Comunidad Open Source. Antes de comenzar recomendamos tener las versiones actualizadas de R y su IDE RStudio. +Usamos R por ser un lenguaje especializado para ciencia de datos y tener una +gran Comunidad Open Source. Antes de comenzar recomendamos tener las versiones +actualizadas de R y su IDE RStudio. _Puedes descargar R y RStudio desde sus páginas web oficiales:_ @@ -34,8 +35,10 @@ _Puedes descargar R y RStudio desde sus páginas web oficiales:_ ### Instalación de pre-requisitos -Para este ejemplo usamos las bibliotecas de `rio`, `dplyr`, `ggplot2` y `gganimate`. Las instalamos con los siguientes comandos en R -_(Recuerde que para ejecutar una linea de Comando en el Editor de RStudio Es con Ctrl+Enter o puede escribirlo directamento en la Consola)_ +Para este ejemplo usamos las bibliotecas de `rio`, `dplyr`, `ggplot2` y +`gganimate`. Las instalamos con los siguientes comandos en R _(Recuerde que para +ejecutar una linea de Comando en el Editor de RStudio Es con Ctrl+Enter o puede +escribirlo directamento en la Consola)_ ```r install.package(rio) # Biblioteca para importar archivos csv o xlsx @@ -44,9 +47,12 @@ install.package(ggplot2) # Biblioteca para realizar las gráficas install.package(gganimate) # Biblioteca para realizar la animación ``` -## Preparación de los datos para graficar +## Preparación de los datos para graficar -Los datos usados pertenecen a la base de datos del INE [(Instituto Nacional de Estadística Bolivia)](https://www.ine.gob.bo), el archivo usado tiene el nombre de "Importaciones de Productos y Artículos de Bolivia 1992-2021p" +Los datos usados pertenecen a la base de datos del INE +[(Instituto Nacional de Estadística Bolivia)](https://www.ine.gob.bo), el +archivo usado tiene el nombre de "Importaciones de Productos y Artículos de +Bolivia 1992-2021p" Abrimos nuestras bibliotecas: @@ -63,7 +69,8 @@ Importamos los datos a un objeto llamado `libro` con: libro <- import(".my/path/DatosImportacionBolivia1992-2021.csv") ``` -Para ver la cabecera del libro, y para ver la estructura del `libro` ejecutamos respectivamente `head(libro)` y ` str(libro)`. +Para ver la cabecera del libro, y para ver la estructura del `libro` ejecutamos +respectivamente `head(libro)` y ` str(libro)`. ```r > head(libro) @@ -96,9 +103,16 @@ Para ver la cabecera del libro, y para ver la estructura del `libro` ejecutamos $ ARTÍCULOS DE CONSUMO : num 5.59 6.53 6.2 5.42 5.46 ... ``` -Es importante verificar el tipo de dato, antes de graficar, en este caso nos importa que la fecha tenga formato de `IDate` y los demás sean tengan formato de `num`. En caso de que la fecha no tenga formato `IDate` puedo tranformar la columna usando la el comando `columna<-as.Date(columna)`. +Es importante verificar el tipo de dato, antes de graficar, en este caso nos +importa que la fecha tenga formato de `IDate` y los demás sean tengan formato de +`num`. En caso de que la fecha no tenga formato `IDate` puedo tranformar la +columna usando la el comando `columna<-as.Date(columna)`. -Con las siguientes líneas de código, compactamos el número de columnas de nuestro `libro` en un nuevo objeto llamado `datos`. _(Notese que solamente utilizaremos las primeras 4 columnas del objeto libro)._ Es decir una columna para la fecha, una columna para su valor y otra columna que muestre su clasificación. +Con las siguientes líneas de código, compactamos el número de columnas de +nuestro `libro` en un nuevo objeto llamado `datos`. _(Notese que solamente +utilizaremos las primeras 4 columnas del objeto libro)._ Es decir una columna +para la fecha, una columna para su valor y otra columna que muestre su +clasificación. ```r # Simplificando nuestra tabla para realizar las gráficas @@ -124,11 +138,13 @@ Funciones auxiliares usadas: - **`libro$columna`**: para acceder al `columna` del `libro`. -- **`data.frame(columna1, columna2 ...)`**: para crear una nuevo `objeto de Datos`. +- **`data.frame(columna1, columna2 ...)`**: para crear una nuevo + `objeto de Datos`. - **`c(elemento1, elemento2, ...)`**: para juntar `elementos` en un vector. -- **`rep(elemento, n_veces)`**: para generar un vector con el `elemento` repetido `n_veces`. +- **`rep(elemento, n_veces)`**: para generar un vector con el `elemento` + repetido `n_veces`. - **`nrow(tabla)`**: para obtener el número de filas de tabla. @@ -147,7 +163,9 @@ Observemos la cabecera de `datos` para verificar, con `head(datos)` : ## Gráfica estática -Para graficar con `ggplot2`, es conveniente entender que esta biblioteca añade sus componentes en layers (capas), estos layers son objetos a los cuales se le puede modificar su apariencia y especificar de donde extraer sus valores. +Para graficar con `ggplot2`, es conveniente entender que esta biblioteca añade +sus componentes en layers (capas), estos layers son objetos a los cuales se le +puede modificar su apariencia y especificar de donde extraer sus valores. Asignamos a un objeto ggplot llamado p1 lo que vamos a graficar: @@ -170,22 +188,30 @@ p1 Funciones utilizadas -- **`theme_set(theme_bw())`**: - modifica el conjunto de colores usado en el tema para realizar la gráfica. +- **`theme_set(theme_bw())`**: modifica el conjunto de colores usado en el tema + para realizar la gráfica. -- **`ggplot(data)`**: esta es la primera capa a utilizarse inicialmente le asignamos nuestos datos `data` para que cree las dimensiones de las coordenadas y esta se herede a las otras capas. +- **`ggplot(data)`**: esta es la primera capa a utilizarse inicialmente le + asignamos nuestos datos `data` para que cree las dimensiones de las + coordenadas y esta se herede a las otras capas. -- **`geom_line(aes(x, y, color), size)`**: capa que hereda los datos de `ggplot()`, se los puede usar directamente con el nombre de sus columnas, grafica los datos `x` e `y` como líneas, las clasifica de acuerdo al `color` y `size` determina el grosor de sus líneas. +- **`geom_line(aes(x, y, color), size)`**: capa que hereda los datos de + `ggplot()`, se los puede usar directamente con el nombre de sus columnas, + grafica los datos `x` e `y` como líneas, las clasifica de acuerdo al `color` y + `size` determina el grosor de sus líneas. -- **`theme(legend.position)`**: capa que modifica la posición de la leyenda dentro gráfico, con `legend.position`, esta puede adquirir valores de `top`, `left`, etc. +- **`theme(legend.position)`**: capa que modifica la posición de la leyenda + dentro gráfico, con `legend.position`, esta puede adquirir valores de `top`, + `left`, etc. -- **`labs(x, y, color, title, subtitle)`**: capa que pone los nombres a eje `x` y al eje `y`, además de poner el nombre encima de las leyendas con `color`, el nombre título y subtítulo con `title` y `subtitle` respectivamente. +- **`labs(x, y, color, title, subtitle)`**: capa que pone los nombres a eje `x` + y al eje `y`, además de poner el nombre encima de las leyendas con `color`, el + nombre título y subtítulo con `title` y `subtitle` respectivamente. -![Importaciones de Bolivia 1991-2021](../../../images/blog/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/Rplot.png) +## Gráfica Animada -## Gráfica Animada - -Ya teniendo nuestra nuestra gráfica estática, vamos a realizar algunas modificaciones para que se resalten los datos de nuestro interés. +Ya teniendo nuestra nuestra gráfica estática, vamos a realizar algunas +modificaciones para que se resalten los datos de nuestro interés. Filtrando datos con fecha mayor al año 2019. @@ -193,11 +219,13 @@ Filtrando datos con fecha mayor al año 2019. datos <- filter(datos, datos$Fecha >= as.Date("2019-01-01")) ``` -- **`filter(datos, condicion)`**: evalua cada fila de `datos` y filtra de acuerdo a la `condicion`. +- **`filter(datos, condicion)`**: evalua cada fila de `datos` y filtra de + acuerdo a la `condicion`. - `as.Date(var)` convierte `var` a un formato de fecha `IDate` -Agregando un nuevo data frame periodos para resaltar las fechas de confinamiento por Covid19. +Agregando un nuevo data frame periodos para resaltar las fechas de confinamiento +por Covid19. ```r periodos <- @@ -238,14 +266,16 @@ p2 <- ggplot(data = datos) + p2 ``` -- **`geom_rect(data, alpha, aes(xmin, xmax, ymin, ymax, fill))`**: dibuja un rectangulo a partir de los datos en `Data`, - modifica su opacidad de acuerdo a `alpha`, - extrae los datos de acuerdo a `xmin, xmax, ymin, ymax`, - y los clasifica de acuerdo a `fill`. +- **`geom_rect(data, alpha, aes(xmin, xmax, ymin, ymax, fill))`**: dibuja un + rectangulo a partir de los datos en `Data`, modifica su opacidad de acuerdo a + `alpha`, extrae los datos de acuerdo a `xmin, xmax, ymin, ymax`, y los + clasifica de acuerdo a `fill`. -- **`lab(fill)`**: pone el nombre encima de la leyenda de los datos clasificados con `fill`. +- **`lab(fill)`**: pone el nombre encima de la leyenda de los datos clasificados + con `fill`. -Con las modificaciones ya hechas en p2, creamos el objeto `gganimate` llamado `anim` el cuál contendrá nuestra grafico a animar. +Con las modificaciones ya hechas en p2, creamos el objeto `gganimate` llamado +`anim` el cuál contendrá nuestra grafico a animar. ```r anim <- p2 + transition_reveal(Fecha) + @@ -258,14 +288,22 @@ anim <- p2 + transition_reveal(Fecha) + size = 15) ``` -- **`transition_reveal(var)`**: añade la capa de animacion del tipo transición usando como referencia la variable `var`. +- **`transition_reveal(var)`**: añade la capa de animacion del tipo transición + usando como referencia la variable `var`. -- **`geom_label((aes(x,y,label)) col, size)`**: - añade la capa de etiquetas del año dentro de la gráfica, con `aes(x, y, label)`: `x` e `y` son las coordenadas donde se grafica la etiqueta `label`, con `col` seleccionamos un color y con `size` el tamaño. +- **`geom_label((aes(x,y,label)) col, size)`**: añade la capa de etiquetas del + año dentro de la gráfica, con `aes(x, y, label)`: `x` e `y` son las + coordenadas donde se grafica la etiqueta `label`, con `col` seleccionamos un + color y con `size` el tamaño. -_Nota: geom_label() fué diseñado para graficar etiquetas que acompañen a la gráfica. En este ejemplo en específico fué usado como una etiqueta estática fijando sus coordenadas `x` e `y` en un sólo punto. Se optó por esta opción ya que genera un buen impacto visual._ +_Nota: geom_label() fué diseñado para graficar etiquetas que acompañen a la +gráfica. En este ejemplo en específico fué usado como una etiqueta estática +fijando sus coordenadas `x` e `y` en un sólo punto. Se optó por esta opción ya +que genera un buen impacto visual._ -Con el objeto `anim` creado podemos invocar la función `animate()` de `gganimate`. Una vez ejecutada la función se abrirá una ventana con el resultado en formato .gif. +Con el objeto `anim` creado podemos invocar la función `animate()` de +`gganimate`. Una vez ejecutada la función se abrirá una ventana con el resultado +en formato .gif. ```r animate( @@ -278,13 +316,21 @@ animate( ) ``` -- **` animate(anim, fps, duration, width, height, end_pause)`**: `animate()` funcion para generar la animación, `anim` objeto a animarse, - `fps` cantidad de frames por segundo, - `duration` duración de la animación en segundos, - `with`, `height` ancho y alto de la animación respectivamente en pixeles, - `end_pause` cantidad de veces a repetirse el último frame para la animación. - -Hay casos en los que extrañamente no se instalan los renders para hacer la renderización de la animación y aparece un error al tratar de ejecutar el código arriba mostrado, en ese caso puede probar con la siguiente solución: Ejecute en modo administrador RStudio e instale los renders con `install.packages("gifski")` para el render que viene por defecto con `gganimate`, tambien puede instalar el render magick con `install.packages("magick")` para tener otra opción para renderizar. Para saber que opciones tiene el render magick ejecute `help("magick_renderer")` y se le mostrara su breve manual. +- **` animate(anim, fps, duration, width, height, end_pause)`**: `animate()` + funcion para generar la animación, `anim` objeto a animarse, `fps` cantidad de + frames por segundo, `duration` duración de la animación en segundos, `with`, + `height` ancho y alto de la animación respectivamente en pixeles, `end_pause` + cantidad de veces a repetirse el último frame para la animación. + +Hay casos en los que extrañamente no se instalan los renders para hacer la +renderización de la animación y aparece un error al tratar de ejecutar el código +arriba mostrado, en ese caso puede probar con la siguiente solución: Ejecute en +modo administrador RStudio e instale los renders con +`install.packages("gifski")` para el render que viene por defecto con +`gganimate`, tambien puede instalar el render magick con +`install.packages("magick")` para tener otra opción para renderizar. Para saber +que opciones tiene el render magick ejecute `help("magick_renderer")` y se le +mostrara su breve manual. ![Importaciones de Bolivia durante la pandemia](datosimportpandemia.gif) @@ -306,13 +352,12 @@ anim_save(filename = "datosimportpandemia.gif", path = ".my/path/save/") ``` -**`anim_save(filename, animation, path)`**: -guarda el renderizado de `animation` con el nombre `filename` en la ruta `path`. - +**`anim_save(filename, animation, path)`**: guarda el renderizado de `animation` +con el nombre `filename` en la ruta `path`. ## Referencias -- [Instituto Nacional de Estadística Bolivia](https://www.ine.gob.bo) +- [Instituto Nacional de Estadística Bolivia](https://www.ine.gob.bo) - [Documentacion de R](https://www.rdocumentation.org) -______________________________________________________________________ +--- diff --git a/content/blog/ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion/header.png b/bkp/blogs/ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion/header.png similarity index 100% rename from content/blog/ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion/header.png rename to bkp/blogs/ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion/header.png diff --git a/bkp/blogs/ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion/index.md b/bkp/blogs/ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion/index.md new file mode 100644 index 000000000..96314d484 --- /dev/null +++ b/bkp/blogs/ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion/index.md @@ -0,0 +1,140 @@ +--- +title: + "¿Ya has probado los Cuadernos de Jupyter? Te explicamos qué son y cómo te + ayudarán en tu próxima investigación." +slug: ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion +date: 2020-01-13 +authors: ["Rainer Palm"] +tags: [jupyter, cuaderno] +categories: [ciencia abierta, código abierto, programación, IDE] +description: | + ¿Quieres cambiar tus artículos a un formato más intuitivo, legible y fácil de + editar? Si tu respuesta es sí, puedes hacerlo con los + [Jupyter Notebook](https://jupyter.org), una aplicación web que permite + incorporar código y texto a los documentos de una forma sencilla y fluida; + facilitando que otras personas colaboren en tu investigación. Utilizar estos + elementos permitirá ver la descripción y resultados de tu analísis de una forma + más gráfica y en tiempo real, algo especialmente útil para garantizar la + reproducibilidad de tus resultados. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + + +¿Quieres cambiar tus artículos a un formato más intuitivo, legible y fácil de +editar? Si tu respuesta es sí, puedes hacerlo con los +[Jupyter Notebook](https://jupyter.org), una aplicación web que permite +incorporar código y texto a los documentos de una forma sencilla y fluida; +facilitando que otras personas colaboren en tu investigación. Utilizar estos +elementos permitirá ver la descripción y resultados de tu analísis de una forma +más gráfica y en tiempo real, algo especialmente útil para garantizar la +reproducibilidad de tus resultados. + + + +El uso de Jupyter Notebook es bastante común en las comunidades científicas +actuales: por ejemplo, la creación de la foto de un agujero negro utilizó un +cuaderno de Jupyter cuyo código está en +[este repositorio de GitHub](https://github.com/achael/eht-imaging). Así como +este, existe una gran variedad de ejemplos de uso de cuadernos de Jupyter en +todo tipo de áreas, los cuales usualmente están disponibles en un repositorio +público de [GitHub](https://github.com). Veamos a continuación, con más +profundidad, de qué se trata esta aplicación. + +## ¿Qué es Jupyter? + +Jupyter se refiere a la organización de código abierto sin fines de lucro +llamada **Project Jupyter**, que es la principal organización que desarolla una +multitud de proyectos, entornos de ejecución principalmente en +[Julia](https://julialang.org), [Python](https://www.python.org) y +[R](https://www.r-project.org), de allí se construye su nombre. El principal +propósito de Jupyter es “apoyar la ciencia de datos interactiva y la computación +científica en todos los lenguajes de programación” +[(Jupyter)](https://jupyter.org/about). De hecho, todos sus proyectos son +desarrollados de forma abierta en GitHub bajo la licencia modificada de +[BSD](https://whatis.techtarget.com/definition/BSD-licenses). El proyecto +promete mantener disponible tanto el software como su código, para su uso libre. + +Sin duda, la característica más popular de Jupyter Notebook, es ser una +aplicación web que permite editar y compartir documentos (llamados "cuadernos de +jupyter") que contienen trozos de código, visualizaciones, ecuaciones, entre +otras, todas interactivas y ejecutadas en tiempo real. La integración de los +elementos _rich media_ en documentos intuitivos y sencillos de editar, la ha +convertido en una herramienta muy popular en la elaboración de artículos, +análisis e investigaciones científicas. + +Además de Notebook, el proyecto Jupyter ofrece un entorno de desarrollo llamado +[JupyterLab](https://jupyterlab.readthedocs.io), que posee una interfaz simple, +personalizable y capacidades modulares para que puedas añadir nuevos componentes +o plugins según lo consideres necesario. Jupyter Notebook y Jupyter-lab tienen +una interfaz muy parecida, sin embargo, este último ofrece más funcionalidades. + +## ¿Qué es un cuaderno de Jupyter? + +Un cuaderno de Jupyter es simplemente un archivo _.ipynb_ generado por la +aplicación web, que contiene una multitud de ‘celdas’ con código, texto Markdown +(en formato [LaTeX](https://www.latex-project.org)), o metadatos (_raw_). Al ser +interpretadas por Jupyter, estas celdas terminan teniendo una apariencia muy +similar a la de un documento de texto, y tras ejecutar las celdas que contienen +código, se muestra la salida en otra celda. Es muy común el uso de bibliotecas +como [matplotlib](https://matplotlib.org) para mostrar gráficos (dentro de las +celdas de código), pero gracias a su versatilidad, puede ser utilizado también +para mostrar videos o imágenes que cambien o se actualizen a lo largo del +tiempo, para mostrar enlaces a archivos locales o instalar _kernels_ de otros +lenguajes, lo cual amplía sus posibilidades. + +## ¿Cómo uso Jupyter? + +Si deseas hacer tu propio cuaderno de Jupyter y experimentar un poco, solamente +tienes que ir al [sitio web](https://jupyter.org/try), donde encontrarás varias +opciones para probar Jupyter con varios lenguajes de programación desde una +interfaz web, sin tener que instalar nada. Dentro de esta página, puedes acceder +a enlaces de entornos virtuales prefabricados dentro del sitio como +[MyBinder](https://mybinder.org). Mybinder es un sitio en el cual podrás crear +un entorno virtual a partir de un repositorio de github, con el que podrás +interactuar y experimentar con tus cuadernos de Jupyter. + +Si deseas utilizar Jupyter desde tu computadora, basta con instalarlo utilizando +_pip_ o _conda_. Sin embargo, la popular distribución +[Anaconda](https://www.anaconda.com) incluye los paquetes necesarios para +utilizar Jupyter, y es la opción recomendada por el propio Project Jupyter. +Simplemente tendrás que dirigirte al +[enlace de descarga](https://www.anaconda.com/distribution/) para instalarla. +Después de esto, podrás ejecutar Jupyter Notebook desde la terminal, y acceder a +la interfaz web desde la URL http://localhost:8888 (por defecto). + +## ¿Quién usa Jupyter? + +Jupyter es un proyecto apoyado abiertamente por empresas como Google (de hecho, +puedes hacer cuadernos de Jupyter en el propio Google Drive, utilizando Google +Colab), Microsoft e IBM. Además de una gran cantidad de universidades alrededor +del mundo. No es extraño, que en el propio GitHub se encuentren alrededor de 5 +millones de cuadernos de Jupyter (según un análisis que utiliza también un +cuaderno para mostrar sus resultados! +[(nbestimate)](https://github.com/parente/nbestimate), y que abarquen áreas +desde la ciencia de datos, estadística o economía, hasta las ciencias sociales o +psicología. También existe una gran cantidad de listas curadas +[(A gallery of interesting Jupyter Notebooks)](https://github.com/jupyter/jupyter/wiki/A-gallery-of-interesting-Jupyter-Notebooks) +con ejemplos de aplicaciones reales de Jupyter. + +Jupyter es, sin duda, una de las iniciativas de ciencia abierta más prometedoras +que hay. Cuenta con una popularidad inmensa incluso fuera de su área de enfoque, +y una accesibilidad bastante impresionante que permite a científicos, de todo +tipo de trasfondos, aprovechar de sus capacidades rich media en cuestión de +segundos. Y para aquellos que deseen entrar un poco más profundo en el tema, +existe una gran cantidad de recursos y documentación de apoyo dedicado a Jupyter +[(Jupyter Guide)](https://github.com/jupyter-guide/jupyter-guide) que hace de tu +aprendizaje algo bastante sencillo e indoloro. Llevar tus investigaciones a otro +nivel es cuestión de comenzar a aprender, ¡nada más! + +### Referencias + +- [Jupyter](https://jupyter.org/about) + +- [nbestimate](https://github.com/parente/nbestimate) + +- [A gallery of interesting Jupyter Notebooks](https://github.com/jupyter/jupyter/wiki/A-gallery-of-interesting-Jupyter-Notebooks) + +- [Jupyter Guide](https://github.com/jupyter-guide/jupyter-guide) diff --git a/bkp/opportunities/internship/cycles/2023-01.md b/bkp/opportunities/internship/cycles/2023-01.md new file mode 100644 index 000000000..69f1f3470 --- /dev/null +++ b/bkp/opportunities/internship/cycles/2023-01.md @@ -0,0 +1,22 @@ +--- +title: "OSL Internship Program Guideline" +description: "Internship Program Guideline" +date: "2023-10-30" +authors: ["OSL Team"] +template: single-sidebar.html +--- + +# Internship Program Cycle 2023-01 + +## Participating Projects + +Below is a list of projects that is current participating in the cycle 2023-01 + +| Repository Name | Description | +| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | +| conda-forge-warning | A panel that shows packages from conda-forge with no maintenance activities | +| satellite-weather-downloader | A system for downloading, transforming and analysing Copernicus weather data using Xarray. | +| makim | Make Improved | +| containers-sugar | Simplify the usage of containers | +| fqlearn | A graphic solver tool to teach mass transfer and thermodynamics. | +| pydatastructs | PyDataStructs aims to be a Python package for various data structures and algorithms (including their parallel implementations). | diff --git a/bkp/opportunities/internship/cycles/2024-01.md b/bkp/opportunities/internship/cycles/2024-01.md new file mode 100644 index 000000000..ba27fcc75 --- /dev/null +++ b/bkp/opportunities/internship/cycles/2024-01.md @@ -0,0 +1,398 @@ +--- +title: "OSL Internship Program Guideline" +description: "Internship Program Guideline" +date: "2023-12-19" +authors: ["OSL Team"] +template: single-sidebar.html +--- + +# OSL Internship/Apprenticeship Program Cycle 1: Winter/Spring 2024 + +We are excited to kick off the first cycle of the Open Science Labs (OSL) +Internship/Apprenticeship Program for 2024! This program offers a unique +opportunity for individuals to join as mentors or as students/collaborators. + +The Internship/Apprenticeship Program is a collaborative effort between +[Open Science Labs](https://opensciencelabs.org) and +[The GRAPH Network](https://thegraphnetwork.org), with The GRAPH Network +providing institutional support for the program. + +Please note that this internship program is unpaid, meaning there is no +financial compensation for either interns or mentors. Our goal is to facilitate +collaboration on projects and provide students and contributors with valuable +experience in engaging with open source initiatives. + +Below you'll find essential information about each role and how to get involved. + +## Guidelines for Mentors + +To submit a project, you need to be a core contributor or have approval from the +core members of the project. This step is crucial to ensure the success of your +project plan, as support from core members is essential. + +In our internship, we refer to a computer program, library, or tool as a +**PROJECT**. The tasks proposed for a project will be known as **PLAN** or +**PROPOSAL PLAN** if it's still in the proposal stage. + +You are invited to submit a list of ideas (proposal plans) for one or more +projects you are involved with. + +### Project Requirements + +The criteria for project proposals are: + +- Must be open source. +- Must have a Code of Conduct. +- Should have a clear list of tasks for the intern. +- Requires at least one mentor for guidance. + +This format is similar to that of Google Summer of Code. + +Each **proposal plan** should clearly define the minimum requirements, such as +programming languages, libraries, and necessary concepts. + +### How to Apply + +We welcome applications from everyone! You can apply at +[OSL Internship Project Application](https://tinyurl.com/osl-internship-projects-2024-1). + +A list of tasks/issues for each **proposal plan** can be organized as a GitHub +epic (an issue with a list of linked issues), a GitHub Milestone, a PDF link, or +similar formats (on GitLab, BitBucket, etc.). + +You may propose one or more projects, each with one or more plans. + +To get a clearer understanding of structuring a plan for your project, we +recommend reviewing our template available here: +[Project Plan Template](https://opensciencelabs.org/opportunities/internships/oss/templates/projects-ideas/). + +## Guidelines for Students/Collaborators + +The Open Science Labs internship is open to all who are interested in +contributing to open source projects. + +During the application process, applicants will be referred to as +**candidates**. + +Below are the details on eligibility and application instructions. + +### Requirements + +The primary requirement for applicants is to be at least 18 years old. + +Each project will have its own set of criteria that candidates must meet to be +considered for the role. + +The minimum weekly commitment for the internship is 20 hours. However, +dedicating more time, if possible, can greatly enhance the experience, providing +deeper insights into the project and its underlying technologies. + +The internship cycle typically spans three months. If needed, it may be +extended, subject to mutual agreement between the mentor and the +student/contributor. + +### How to Apply + +Starting January 5, 2024, the Open Science Labs team will release a list of +available projects. This list will be shared on +[OSL Discord](https://opensciencelabs.org/discord), +[LinkedIn](https://www.linkedin.com/company/open-science-labs/), and +[X/Twitter](https://twitter.com/opensciencelabs). + +Candidates should review the list of projects and contact the mentor(s) for the +project(s) they are interested in. Mentors will assess the candidate's +suitability based on the project's specific requirements and may assign initial +tasks to gauge the candidate's capabilities. + +Once these initial tasks are completed satisfactorily, the mentor will recommend +the candidate to officially apply to the internship program. The application +results will be announced on February 14, 2024. + +Please note, the list of participating projects will be available on January +5, 2024. Stay tuned for updates! + +### Recommendations for Internship Program Candidates + +Maximizing your chances in the Open Science Labs Internship Program begins with +careful preparation and engagement. Here's how you can get started: + +#### Selecting and Engaging with Projects + +- **Explore Project Options:** Review the complete list of proposed projects (to + be announced) to find those that align with your interests and skills. +- **Contact Mentors:** Reach out to mentors of the projects you're interested + in. While it's okay to explore a couple of projects, focusing on one or at + most two allows for deeper engagement and learning. +- **Contribute to Projects:** Before applying, try to have a few contributions + accepted and merged into the project. This demonstrates your commitment and + capability. **Note:** If you feel that your initially selected project is not + the right fit, it's okay to consider another project. However, remember to + communicate this change to your current mentor and express your gratitude for + their time and guidance. Open communication and courtesy go a long way in + maintaining positive relationships within the OSL community. + +#### Technical Preparation + +- **Familiarize Yourself with Git:** Basic knowledge of Git is essential, as all + collaboration will involve using this tool. Brush up on Git commands and + workflows to ensure you're ready. +- **Join the OSL Discord:** Engage with the community by joining the Open + Science Labs Discord server at + [OSL Discord](https://opensciencelabs.org/discord). You can join specific + groups through the #subs-groups channel. For any queries, the general channel + is your go-to resource. +- **Participate in Study Groups:** Enhance your skills by joining study groups + within the OSL community. These groups are a great way to sharpen your skills + and can be found via the #subs-groups channel on Discord. + +#### Focus Areas for Early Contributions + +- **Start with Accessible Issues:** Good first issues to tackle include + documentation updates, writing unit tests, and fixing small bugs. These + contributions are valuable and can serve as a great starting point. + +#### Application Process + +- **Apply Once Ready:** After receiving approval from your mentor, proceed to + apply for the internship program at the specified link (to be announced). + +## How the Internship Works + +### Communication Channels + +- **Student/Contributor and Mentor:** Interaction should occur on the platform + or channel specified by the mentor, such as Discord, Slack, GitHub, WhatsApp, + email, etc. + +- **Open Science Labs with Students/Contributors:** Official communication will + be through [OSL Discord](https://opensciencelabs.org/discord) in a designated + group/channel for the specific internship cycle. + +- **Open Science Labs with Mentors:** Communication with mentors will be + conducted via email. + +### Recommendations for Approved Interns + +Success in the Open Science Labs Internship Program goes beyond just completing +tasks. To make the most of this opportunity, we encourage you to adopt the +following best practices: + +#### Be Proactive in Communication + +- **Frequent Updates:** Keep your mentor informed about your progress, + challenges, and successes. Aim to provide updates once a day or every two + days. Proactive communication helps build a strong relationship with your + mentor and keeps your project on track. +- **Use Appropriate Channels:** Avoid direct messages (DMs) for project-related + discussions. Stick to the communication channels recommended by your mentor, + such as specific project channels or group discussions. + +#### Continuous Learning and Engagement + +- **Study Project Technologies:** Familiarize yourself with the technologies and + tools used in your project. Understanding these will boost your productivity + and contribution quality. +- **Participate in Study Groups:** Joining an Open Science Labs study group can + enhance your skills and provide additional community support. + +#### Document and Reflect + +- **Blog Posts:** Regularly write about your learning experiences on the Open + Science Labs Blog. Sharing new knowledge not only helps you organize your + thoughts but also creates a valuable record of your journey for future + reference. + +#### Seek Feedback + +- **Regular Check-ins:** Don’t hesitate to ask your mentor for feedback. This + ensures you are moving in the right direction and aligning with project goals. + +#### Utilize Supportive Technologies + +- **Leverage AI Tools:** Consider using technologies like ChatGPT to help + analyze problems, explore alternative solutions, and improve your code. These + tools can also assist in enhancing documentation and blog posts. + +By following these guidelines, you’ll not only contribute effectively to your +project but also enrich your overall learning and professional growth during the +internship. + +### Blogging Requirement + +During the internship, students/collaborators are expected to write blog posts +detailing new features, bug fixes, or improvements made to the project. These +posts should be published on the [OSL Blog](https://opensciencelabs.org/blog/) +and can also be cross-posted to the project's blog. + +### Evaluations + +The internship includes two major evaluations: + +- **Midterm Evaluation:** Mentors assess the progress of their + students/collaborators. + +- **Final Evaluation:** Students/collaborators evaluate their own participation, + project contributions, and interactions with mentors. + +## Timeline + +The following is the timeline for the OSL Internship Program Cycle 2024-01: + +- **December 1, 2023**: Call for Mentoring Organizations and Projects. +- **January 3, 2024**: Deadline for Mentoring Organizations to apply. +- **January 5, 2024**: Announcement of selected Mentoring Organizations. +- **January 9, 2024**: Call for Interns/Apprentices opens. +- **February 9, 2024**: Deadline for Interns/Apprentices applications. +- **February 11, 2024**: Selection of Interns/Apprentices by mentors. +- **February 14, 2024**: Announcement of approved Interns/Apprentices. +- **February 21-25, 2024**: Integration Phase – interns engage with mentors and + familiarize themselves with the project. +- **February 26, 2024**: Official Start Date. +- **April 8, 2024**: Mid-term Evaluation. +- **May 20, 2024**: Final Evaluation. +- **May 27-31, 2024**: Interns present their work. +- **June 3, 2024**: Official End Date; Certification process begins. + +## List of Participating Projects + +Below is the list of projects participating in the current internship cycle. +Each project includes key details to help candidates understand the scope and +requirements. + +### ArtBox + +- **Description**: ArtBox is a tool set for handling multimedia files with a + bunch of useful functions. +- **Organization/Project Webpage URL**: + +- **Contact**: Ivan Ogasawara (ivan.ogasawara@gmail.com) +- **Project Ideas URL**: +- **Application Record**: + + +### ArxLang/ASTx + +- **Description**: ASTx is an agnostic expression structure for AST. It is + agnostic because it is not specific to any language, neither to the ArxLang + project, although its main focus is to provide all needed feature for ArxLang. +- **Organization/Project Webpage URL**: +- **Contact**: Ivan Ogasawara (ivan.ogasawara@gmail.com) +- **Project Ideas URL**: +- **Application Record**: + + +### Envers + +- **Description**: Envers is a command-line tool (CLI) designed to manage and + version environment variables for different deployment stages such as staging, + development, and production. It provides a secure and organized way to handle + environment-specific configurations. +- **Organization/Project Webpage URL**: + +- **Contact**: Ivan Ogasawara (ivan.ogasawara@gmail.com) +- **Project Ideas URL**: +- **Application Record**: + + +### fqlearn + +- **Description**: This Project aims to facilitate the teaching of unit + operations and thermodynamics. +- **Organization/Project Webpage URL**: +- **Contact**: John Ever Vino Duran (evervino00@gmail.com) +- **Project Ideas URL**: +- **Application Record**: + + +### Makim + +- **Description**: Makim (or makim) is based on make and focus on improve the + way to define targets and dependencies. Instead of using the Makefile format, + it uses yaml format. +- **Organization/Project Webpage URL**: +- **Contact**: Ivan Ogasawara (ivan.ogasawara@gmail.com) +- **Project Ideas URL**: +- **Application Record**: + + +### noWorkflow + +- **Description**: The noWorkflow project aims at allowing scientists to benefit + from provenance data analysis even when they don't use a workflow system. It + transparently collects provenance from Python scripts and notebooks and + provide tools to support the analysis and management of the provenance. +- **Organization/Project Webpage URL**: +- **Contact**: João Felipe Nicolaci Pimentel (joaofelipenp@gmail.com) +- **Project Ideas URL**: + +- **Application Record**: + + +### OSL Web Page + +- **Description**: OpenScienceLabs web page, is a project that serves as a way + to present OSL to the world through a web page. +- **Organization/Project Webpage URL**: +- **Contact**: John Ever Vino Duran (evervino00@gmail.com) +- **Project Ideas URL**: + +- **Application Record**: + + +### PyDataStructs + +- **Description**: PyDataStructs project aims to be a Python package for various + data structures and algorithms (including their parallel implementations). +- **Organization/Project Webpage URL**: + +- **Contact**: Gagandeep Singh (gdp.1807@gmail.com) +- **Project Ideas URL**: + +- **Application Record**: + + +### SciCookie + +- **Description**: SciCookie is a template developed by + that creates projects from project templates. +- **Organization/Project Webpage URL**: + +- **Contact**: Ivan Ogasawara (ivan.ogasawara@gmail.com) +- **Project Ideas URL**: +- **Application Record**: + + +### Sugar + +- **Description**: Sugar aims to organize your stack of containers, gathering + some useful scripts and keeping this information centralized in a + configuration file. So the command line would be very simple. +- **Organization/Project Webpage URL**: +- **Contact**: Ivan Ogasawara (ivan.ogasawara@gmail.com) +- **Project Ideas URL**: +- **Application Record**: + + +## Useful Materials and Courses + +As you prepare for the Open Science Labs Internship Program, we recommend the +following resources to enhance your skills and knowledge. These materials cover +a range of topics essential for success in the program: + +- **Software Carpentry Lessons:** Offering tutorials on Git, Bash, Python, R, + and more, these lessons are invaluable for building a strong foundation in + software development. Access the lessons at + [Software Carpentry](https://software-carpentry.org/lessons/). + +- **Udacity CS212 - Design of Computer Programs:** This course, taught by Peter + Norvig, delves into advanced programming topics and is an excellent way to + deepen your understanding of computer programs. Enroll in the course at + [Udacity CS212](https://www.udacity.com/course/design-of-computer-programs--cs212). + +- **The GRAPH Network Courses:** Explore a range of courses offered by The GRAPH + Network, tailored to various aspects of data analysis. Find the courses at + [The GRAPH Network Courses](https://thegraphcourses.org/). + +These resources provide a great opportunity to prepare effectively for the +Internship Program and to develop a broad skill set in software development and +data analysis. diff --git a/bkp/opportunities/internship/cycles/2024-02.md b/bkp/opportunities/internship/cycles/2024-02.md new file mode 100644 index 000000000..d15b1f5d9 --- /dev/null +++ b/bkp/opportunities/internship/cycles/2024-02.md @@ -0,0 +1,406 @@ +--- +title: "OSL Internship Program II-2024 Guideline" +description: "Internship Program Guideline" +date: "2024-04-14" +authors: ["OSL Team"] +template: single-sidebar.html +--- + +# OSL Internship/Apprenticeship Program Cycle 2: II-2024 + +We are excited to kick off the second cycle of the Open Science Labs (OSL) +Internship/Apprenticeship Program for 2024! This program offers a unique +opportunity for individuals to join as mentors or as students/collaborators. + +The Internship/Apprenticeship Program is a collaborative effort between +[Open Science Labs](https://opensciencelabs.org) and +[The GRAPH Network](https://thegraphnetwork.org), with The GRAPH Network +providing institutional support for the program. + +Please note that this internship program is unpaid, meaning there is no +financial compensation for either interns or mentors. Our goal is to facilitate +collaboration on projects and provide students and contributors with valuable +experience in engaging with open source initiatives. + +Below you'll find essential information about each role and how to get involved. + +## Guidelines for Mentors + +To submit a project, you need to be a core contributor or have approval from the +core members of the project. This step is crucial to ensure the success of your +project plan, as support from core members is essential. + +In our internship, we refer to a computer program, library, or tool as a +**PROJECT**. The tasks proposed for a project will be known as **PLAN** or +**PROPOSAL PLAN** if it's still in the proposal stage. + +You are invited to submit a list of ideas (proposal plans) for one or more +projects you are involved with. + +### Project Requirements + +The criteria for project proposals are: + +- Must be open source. +- Must have a Code of Conduct. +- Should have a clear list of tasks for the intern. +- Requires at least one mentor for guidance. + +This format is similar to that of Google Summer of Code. + +Each **proposal plan** should clearly define the minimum requirements, such as +programming languages, libraries, and necessary concepts. + +### How to Apply + +We welcome applications from everyone! You can apply at +[OSL Internship Project Application](https://tinyurl.com/osl-internship-projects-2024-1). + +A list of tasks/issues for each **proposal plan** can be organized as a GitHub +epic (an issue with a list of linked issues), a GitHub Milestone, a PDF link, or +similar formats (on GitLab, BitBucket, etc.). + +You may propose one or more projects, each with one or more plans. + +To get a clearer understanding of structuring a plan for your project, we +recommend reviewing our template available here: +[Project Plan Template](https://opensciencelabs.org/opportunities/internships/oss/templates/projects-ideas/). + +## Guidelines for Students/Collaborators + +The Open Science Labs internship is open to all who are interested in +contributing to open source projects. + +During the application process, applicants will be referred to as +**candidates**. + +Below are the details on eligibility and application instructions. + +### Requirements + +The primary requirement for applicants is to be at least 18 years old. + +Each project will have its own set of criteria that candidates must meet to be +considered for the role. + +The minimum weekly commitment for the internship is 20 hours. However, +dedicating more time, if possible, can greatly enhance the experience, providing +deeper insights into the project and its underlying technologies. + +The internship cycle typically spans three months. If needed, it may be +extended, subject to mutual agreement between the mentor and the +student/contributor. + +### How to Apply + +Starting April 22, 2024, the Open Science Labs team will release a list of +available projects. This list will be shared on +[OSL Discord](https://opensciencelabs.org/discord), +[LinkedIn](https://www.linkedin.com/company/open-science-labs/), and +[X/Twitter](https://twitter.com/opensciencelabs). + +Candidates should review the list of projects and contact the mentor(s) for the +project(s) they are interested in. Mentors will assess the candidate's +suitability based on the project's specific requirements and may assign initial +tasks to gauge the candidate's capabilities. + +Once these initial tasks are completed satisfactorily, the mentor will recommend +the candidate to officially apply to the internship program. The application +results will be announced on February 14, 2024. + +### Recommendations for Internship Program Candidates + +Maximizing your chances in the Open Science Labs Internship Program begins with +careful preparation and engagement. Here's how you can get started: + +#### Selecting and Engaging with Projects + +- **Explore Project Options:** Review the complete list of proposed projects (to + be announced) to find those that align with your interests and skills. +- **Contact Mentors:** Reach out to mentors of the projects you're interested + in. While it's okay to explore a couple of projects, focusing on one or at + most two allows for deeper engagement and learning. +- **Contribute to Projects:** Before applying, try to have a few contributions + accepted and merged into the project. This demonstrates your commitment and + capability. **Note:** If you feel that your initially selected project is not + the right fit, it's okay to consider another project. However, remember to + communicate this change to your current mentor and express your gratitude for + their time and guidance. Open communication and courtesy go a long way in + maintaining positive relationships within the OSL community. + +#### Technical Preparation + +- **Familiarize Yourself with Git:** Basic knowledge of Git is essential, as all + collaboration will involve using this tool. Brush up on Git commands and + workflows to ensure you're ready. +- **Join the OSL Discord:** Engage with the community by joining the Open + Science Labs Discord server at + [OSL Discord](https://opensciencelabs.org/discord). You can join specific + groups through the #subs-groups channel. For any queries, the general channel + is your go-to resource. +- **Participate in Study Groups:** Enhance your skills by joining study groups + within the OSL community. These groups are a great way to sharpen your skills + and can be found via the #subs-groups channel on Discord. + +#### Focus Areas for Early Contributions + +- **Start with Accessible Issues:** Good first issues to tackle include + documentation updates, writing unit tests, and fixing small bugs. These + contributions are valuable and can serve as a great starting point. + +#### Application Process + +- **Apply Once Ready:** After receiving approval from your mentor, proceed to + apply for the internship program at the specified link (to be announced). + +## How the Internship Works + +### Communication Channels + +- **Student/Contributor and Mentor:** Interaction should occur on the platform + or channel specified by the mentor, such as Discord, Slack, GitHub, WhatsApp, + email, etc. + +- **Open Science Labs with Students/Contributors:** Official communication will + be through [OSL Discord](https://opensciencelabs.org/discord) in a designated + group/channel for the specific internship cycle. + +- **Open Science Labs with Mentors:** Communication with mentors will be + conducted via email. + +### Recommendations for Approved Interns + +Success in the Open Science Labs Internship Program goes beyond just completing +tasks. To make the most of this opportunity, we encourage you to adopt the +following best practices: + +#### Be Proactive in Communication + +- **Frequent Updates:** Keep your mentor informed about your progress, + challenges, and successes. Aim to provide updates once a day or every two + days. Proactive communication helps build a strong relationship with your + mentor and keeps your project on track. +- **Use Appropriate Channels:** Avoid direct messages (DMs) for project-related + discussions. Stick to the communication channels recommended by your mentor, + such as specific project channels or group discussions. + +#### Continuous Learning and Engagement + +- **Study Project Technologies:** Familiarize yourself with the technologies and + tools used in your project. Understanding these will boost your productivity + and contribution quality. +- **Participate in Study Groups:** Joining an Open Science Labs study group can + enhance your skills and provide additional community support. + +#### Document and Reflect + +- **Blog Posts:** Regularly write about your learning experiences on the Open + Science Labs Blog. Sharing new knowledge not only helps you organize your + thoughts but also creates a valuable record of your journey for future + reference. + +#### Seek Feedback + +- **Regular Check-ins:** Don’t hesitate to ask your mentor for feedback. This + ensures you are moving in the right direction and aligning with project goals. + +#### Utilize Supportive Technologies + +- **Leverage AI Tools:** Consider using technologies like ChatGPT to help + analyze problems, explore alternative solutions, and improve your code. These + tools can also assist in enhancing documentation and blog posts. + +By following these guidelines, you’ll not only contribute effectively to your +project but also enrich your overall learning and professional growth during the +internship. + +### Blogging Requirement + +During the internship, students/collaborators are expected to write blog posts +detailing new features, bug fixes, or improvements made to the project. These +posts should be published on the [OSL Blog](https://opensciencelabs.org/blog/) +and can also be cross-posted to the project's blog. + +### Evaluations + +The internship includes two major evaluations: + +- **Midterm Evaluation:** Mentors assess the progress of their + students/collaborators. + +- **Final Evaluation:** Students/collaborators evaluate their own participation, + project contributions, and interactions with mentors. + +## Timeline + +The following is the timeline for the OSL Internship Program Cycle 2024-01: + +- **April, 22**: Call for Interns/Apprentices opens. +- **May, 13**: Deadline for Interns/Apprentices applications. +- **May, 20**: Announcement of approved Interns/Apprentices and start of + bounding period +- **May, 27**: Official Start Date of Internship Period; an alternative for + projects not selected by GSoC to run under the OSL Internship Program with The + Graph Network support. +- **July, 8**: Mid-term Evaluation. +- **August, 26**: Final Evaluation. +- **September, 3**: Official End Date; Certification process begins. + +## List of Participating Projects + +Below is the list of projects participating in the current internship cycle. +Each project includes key details to help candidates understand the scope and +requirements. + +### ArtBox + +- **Description**: ArtBox is a tool set for handling multimedia files with a + bunch of useful functions. +- **Organization/Project Webpage URL**: + +- **Contact**: Ivan Ogasawara (ivan.ogasawara@gmail.com) +- **Project Ideas URL**: + +- **Application Record**: + + +### ArxLang/ASTx + +- **Description**: ASTx is an agnostic expression structure for AST. It is + agnostic because it is not specific to any language, neither to the ArxLang + project, although its main focus is to provide all needed feature for ArxLang. +- **Organization/Project Webpage URL**: +- **Contact**: Ivan Ogasawara (ivan.ogasawara@gmail.com) +- **Project Ideas URL**: + +- **Application Record**: + + +### Envers + +- **Description**: Envers is a command-line tool (CLI) designed to manage and + version environment variables for different deployment stages such as staging, + development, and production. It provides a secure and organized way to handle + environment-specific configurations. +- **Organization/Project Webpage URL**: + +- **Contact**: Ivan Ogasawara (ivan.ogasawara@gmail.com) +- **Project Ideas URL**: + +- **Application Record**: + + +### fqlearn + +- **Description**: This Project aims to facilitate the teaching of unit + operations and thermodynamics. +- **Organization/Project Webpage URL**: +- **Contact**: John Ever Vino Duran (evervino00@gmail.com) +- **Project Idea 1 URL**: +- **Project Idea 2 URL**: +- **Application Record**: + + +### pymedx + +- **Description**: This Project aims to fetch scientific papers metadata +- **Organization/Project Webpage URL**: +- **Contact**: John Ever Vino Duran (evervino00@gmail.com) +- **Project Ideas 1 URL**: +- **Project Ideas 2 URL**: +- **Project Ideas 3 URL**: + +### Makim + +- **Description**: Makim (or makim) is based on make and focus on improve the + way to define targets and dependencies. Instead of using the Makefile format, + it uses yaml format. +- **Organization/Project Webpage URL**: +- **Contact**: Ivan Ogasawara (ivan.ogasawara@gmail.com) +- **Project Ideas URL**: + +- **Application Record**: + + +### noWorkflow + +- **Description**: The noWorkflow project aims at allowing scientists to benefit + from provenance data analysis even when they don't use a workflow system. It + transparently collects provenance from Python scripts and notebooks and + provide tools to support the analysis and management of the provenance. +- **Organization/Project Webpage URL**: +- **Contact**: João Felipe Nicolaci Pimentel (joaofelipenp@gmail.com) +- **Project Ideas URL (only Idea 2 available)**: + +- **Application Record**: + + +### SciCookie + +- **Description**: SciCookie is a template developed by + that creates projects from project templates. +- **Organization/Project Webpage URL**: + +- **Contact**: Ivan Ogasawara (ivan.ogasawara@gmail.com) +- **Project Ideas URL**: + +- **Application Record**: + + +### Sugar + +- **Description**: Sugar aims to organize your stack of containers, gathering + some useful scripts and keeping this information centralized in a + configuration file. So the command line would be very simple. +- **Organization/Project Webpage URL**: +- **Contact**: Ivan Ogasawara (ivan.ogasawara@gmail.com) +- **Project Ideas URL**: + +- **Application Record**: + + +### ES-Journals + +- **Description**: An ElasticSearch instance for serving scientific journals + metadata. Currently, it has support for biorXiv and medrXiv. +- **Organization/Project Webpage URL**: + +- **Contact**: Ivan Ogasawara (ivan.ogasawara@gmail.com) +- **Project Ideas URL**: + + +### Growth-Forge + +- **Description**: GrowthForge is a simplified feedback exchange platform + designed to facilitate periodic feedback between individuals within specific + projects. It aims to streamline communication and insights sharing, enhancing + project collaboration and personal development. +- **Organization/Project Webpage URL**: + +- **Contact**: Ivan Ogasawara (ivan.ogasawara@gmail.com) +- **Project Ideas URL**: + + +## Useful Materials and Courses + +As you prepare for the Open Science Labs Internship Program, we recommend the +following resources to enhance your skills and knowledge. These materials cover +a range of topics essential for success in the program: + +- **Software Carpentry Lessons:** Offering tutorials on Git, Bash, Python, R, + and more, these lessons are invaluable for building a strong foundation in + software development. Access the lessons at + [Software Carpentry](https://software-carpentry.org/lessons/). + +- **Udacity CS212 - Design of Computer Programs:** This course, taught by Peter + Norvig, delves into advanced programming topics and is an excellent way to + deepen your understanding of computer programs. Enroll in the course at + [Udacity CS212](https://www.udacity.com/course/design-of-computer-programs--cs212). + +- **The GRAPH Network Courses:** Explore a range of courses offered by The GRAPH + Network, tailored to various aspects of data analysis. Find the courses at + [The GRAPH Network Courses](https://thegraphcourses.org/). + +These resources provide a great opportunity to prepare effectively for the +Internship Program and to develop a broad skill set in software development and +data analysis. diff --git a/bkp/opportunities/internship/mentors/index.md b/bkp/opportunities/internship/mentors/index.md new file mode 100644 index 000000000..3973fa6c4 --- /dev/null +++ b/bkp/opportunities/internship/mentors/index.md @@ -0,0 +1,78 @@ +--- +title: "OSL Internship Program Guideline" +description: "Internship Program Guideline" +date: "2023-10-30" +authors: ["OSL Team"] +template: single-sidebar.html +--- + +# Open Science Labs Mentor Guide + +The Open Science Labs Mentor Guide is a consolidated resource designed to guide +potential sub-organizations through the proposal and application process, and to +support approved mentors in fostering intern development. From project +submission to nurturing intern growth, and facilitating their successful +contributions to open source, this guide outlines the key steps and best +practices to ensure a rewarding mentorship experience in our community-driven +programs. + +## Part I: Applying to Become a Sub-Organization + +As a prospective sub-organization within Open Science Labs, you have the +opportunity to shape the future of open source by guiding and nurturing new +talent. Your contributions, in the form of project ideas and mentorship, are +crucial to the development of both individual contributors and the larger +community. This section of the guide will walk you through the application +process and help you submit your project proposals effectively. + +### Application Process + +When the call for sub-organizations opens, you are encouraged to apply with a +detailed outline of all the project ideas. A 'project' constitutes a +well-defined proposal targeting a specific software, package, or library with +distinct tasks. While there is no limit to the number of projects you can +propose, please note that OSL reserves the right to approve only a subset based +on our capacity and strategic focus. For Cycle 2, tied to GSoC, a maximum of two +projects may be submitted per organization. + +**Important Note**: Inclusion in GSoC for Cycle 2 is not a certainty, and OSL +will provide updates on this option once GSoC confirmations are received. + +## Part II: Recommendations for Approved Mentors + +Congratulations on being selected as a mentor for the OSL Internship Program! +You are about to embark on a rewarding journey of imparting knowledge and +facilitating growth. This part of the guide is crafted to support you in leading +an effective mentorship, outlining key activities and providing practical tips +for fostering a successful internship experience. + +### Conducting Effective Mentorship + +- **Proposal Guidance**: Assist the intern candidate in drafting a comprehensive + proposal for the program, detailing expected tasks and outcomes. +- **Regular Meetings**: Schedule consistent meetings (weekly or biweekly) with + the intern to discuss progress, challenges, and next steps. +- **PR Reviews and Direction**: Regularly review the intern's pull requests to + ensure they're aligned with the project's direction and maintain progress + within set timelines. +- **Blog Post Guidance**: Guide the intern in documenting their journey by + writing biweekly or monthly blog posts on https://opensciencelabs.org, + highlighting accomplishments and learnings. +- **Timeline Management**: Keep the intern informed of all important dates and + ensure they complete evaluations on time. +- **Presentation Preparation**: Support the intern in preparing a talk about + their project, which can be delivered within the OSL community or at relevant + events. + +### Additional Tips + +- **Extra Resources**: If an intern is struggling with certain concepts, + recommend additional study materials to aid their understanding. +- **Technical Advice**: Offer technical insights to enhance the intern's + performance and productivity, ensuring they contribute high-quality work to + the project. + +Mentoring with OSL is not just about overseeing work; it's about nurturing a new +generation of open source contributors. Your wisdom, experience, and +encouragement will help interns realize their potential and ensure they make a +meaningful impact on the open source community. diff --git a/bkp/pages/about/archives/index.md b/bkp/pages/about/archives/index.md new file mode 100644 index 000000000..25d47136f --- /dev/null +++ b/bkp/pages/about/archives/index.md @@ -0,0 +1,63 @@ +--- +title: Archives +--- + +# Archives + +## Pycafe charlas + + + + + + + + + + + +## DevOps Charlas + + diff --git a/bkp/pages/faq/index.md b/bkp/pages/faq/index.md new file mode 100644 index 000000000..020ca6f8b --- /dev/null +++ b/bkp/pages/faq/index.md @@ -0,0 +1,69 @@ +--- +title: FAQ +authors: ["Ever Vino"] +--- + +# FAQ + +## What is Open Science Labs (OSL)? + +Open science labs is a community that aims to gather people from all parts of +the world and creates an open space for teaching, learning and sharing topics +around open science and computational tools. + +## What activities do you perform? + +We create and contribute to the OpenSource community focused on Open Science, +creating articles about Open Science tools, DevOps Projects, Data Science and +Open Hardware. We also have information exchange spaces through Discord and we +develop Mentoring and specific training processes, favoring the acquisition of +new skills in those who contact us. + +## Who are the members of Open Science Labs? + +In the community there are several curious people with different professions and +who perform various activities and collaborate on a voluntary basis. Some of the +professions of those who are part of Open Science Labs are: technical skills in +electricity, environmental engineering, fullStack developers, political science +and computer engineering. + +## What specific activities are we currently doing? + +At Open Science Labs we are working on: + +- Implementation and maintenance of our website. +- DevOps mentoring. +- Tool guides for R and other frequently used tools in Open Science. +- Creation of articles on emerging technologies and Open Science. +- Management of social media. + +## Are you paying them anything? + +No, the community is maintained thanks to the volunteers who give their free +time to the community. However, we are planning to get support to sustain our +work. + +## I have some suggestions. How do I contact OSL? + +You can do it through Discord. There is almost always an administrator who can +answer you. [Discord Group](/discord) + +## Who manages OSL? + +We have a Steering Council, which meets weekly to set activities and goals for +the community. + +## What type of license does Open Science Labs have? + +Everything we share is under the +[CC BY-SA 4.0 License](https://creativecommons.org/licenses/by-sa/4.0/), meaning +that you can share, redistribute or transform the material as long as: proper +credit is given to the author and that if you transform them they must be +distributed under the same license. For more details about the license you can +visit the Creative Commons website +[Attribution-ShareAlike 4.0 Internacional](https://creativecommons.org/licenses/by-sa/4.0/). + +## What is your motivation for contributing to the Open Source community? + +We believe that education and technology should be as accessible as possible for +everyone. And to achieve this, Open Science Labs is a good place! diff --git a/content/guidelines/devops/discord-en.md b/bkp/pages/guidelines/devops/discord.md similarity index 59% rename from content/guidelines/devops/discord-en.md rename to bkp/pages/guidelines/devops/discord.md index 2834fa819..1e9897ca2 100644 --- a/content/guidelines/devops/discord-en.md +++ b/bkp/pages/guidelines/devops/discord.md @@ -1,28 +1,21 @@ --- -draft: true +title: Discord +slug: discord-en +date: 2019-04-08 +authors: ["Ivan Ogasawara"] +tags: ["devops", "discord"] +category: ["devops"] --- - - -Discord is our main comunication tool for our community. The direct link -to our discord is [http://discord.opensciencelabs.org](opensciencelabs.org/discord). +Discord is our main comunication tool for our community. The direct link to our +discord is [/discord](opensciencelabs.org/discord). ## Conventions -Each channel has a unique name with a prefix, according to the category. For example, -a channel inside the category Python starts with the prefix `py-`. +Each channel has a unique name with a prefix, according to the category. For +example, a channel inside the category Python starts with the prefix `py-`. Some category name are long and some times it is hard to find a prefix for that. But, it is important that the prefix has some relation to the category. @@ -37,9 +30,8 @@ We use bots to help us to maintain our server. ### MEE6 -For ranking we are using **MEE6**. We don't have any activity our any rewards using the -ranking score, but maybe in the future we can use it. - +For ranking we are using **MEE6**. We don't have any activity our any rewards +using the ranking score, but maybe in the future we can use it. ### Dyno @@ -62,22 +54,25 @@ When you have the group and the roles configured on **YAGPDB.xyz**, the next step is to create a custom messsage on **discord**, in the channel you want to have this subscription mechanism. -1. In the message, add a title, a general description and the emoticons and theirs -meaning (https://unicode.org/emoji/charts/full-emoji-list.html). +1. In the message, add a title, a general description and the emoticons and + theirs meaning (https://unicode.org/emoji/charts/full-emoji-list.html). 2. Get the message ID (you need to activate the development mode) -3. Run the following command `!yagpdb-rolemenu create (group name) -m (message id) -nodm`, -where `(group name)` and `(message id)` are placeholders and should be replaced by -the correct values. +3. Run the following command + `!yagpdb-rolemenu create (group name) -m (message id) -nodm`, where + `(group name)` and `(message id)` are placeholders and should be replaced by + the correct values. -**Note**: An alternative to **yagpdb** would be -[**carl-bot**](https://top.gg/bot/235148962103951360). But for now, **yagpdb.xyz** -seems to be working properly for our needs. +**Note**: An alternative to **yagpdb** would be +[**carl-bot**](https://top.gg/bot/235148962103951360). But for now, +**yagpdb.xyz** seems to be working properly for our needs. ## Development -We have an internal channel for discussions about discord: `#collab-devops-discord`. +We have an internal channel for discussions about discord: +`#collab-devops-discord`. -Alos, there is a discord server for development, where we can test bots, new +Alos, there is a discord server for development, where we can test bots, new configurations or new features. -If you want to join that server, you need to ask it in `#collab-devops-discord` channel. +If you want to join that server, you need to ask it in `#collab-devops-discord` +channel. diff --git a/bkp/pages/guidelines/fund-raiser/index.md b/bkp/pages/guidelines/fund-raiser/index.md new file mode 100644 index 000000000..549f3558a --- /dev/null +++ b/bkp/pages/guidelines/fund-raiser/index.md @@ -0,0 +1,207 @@ +--- +title: "Guía para Recaudación de Fondos" +date: 2019-04-08 +authors: ["Yurely Camacho"] +--- + + + +# Guía para Recaudación de Fondos + +## Patrocinadores fiscales + +Un patrocinador fiscal es una organización sin ánimo de lucro que comparte su +estatus 501(c)(3) con proyectos sin ánimo de lucro cualificados. Con este +estatus compartido, el proyecto no necesita constituirse como 501(c)(3), lo que +significa, entre otras cosas, que tampoco tiene que presentar sus propios +impuestos. + +### [Community Initiatives](https://communityin.org/) + +#### ¿Qué es Community Initiatives? + +Es un patrocinador fiscal dedicado cuyo único propósito es proporcionar la mejor +infraestructura para los líderes de las organizaciones sin ánimo de lucro. +Trabajan en varios temas y en diversas áreas geográficas, también varían en +cuanto a personal y presupuesto. + +#### [¿Cómo unirse a Community Initiatives?](https://communityin.org/apply/apply/) + +Para solicitar el patrocinio fiscal de Community Initiatives, los posibles +proyectos deben enviar un +[formulario de consulta](https://communityin.org/apply/new-business-inquiry-form/), +si parece que encajamos bien, el Vicepresidente de Servicios al Cliente nos +guiará a través del [proceso de solicitud](https://communityin.org/apply/). + +#### [¿Qué contiene el formulario de consulta?](https://communityin.org/apply/new-business-inquiry-form/) + +Allí se solicita información sobre: datos personales del solicitante, nombre, +sitio web, misión del proyecto y las áreas que lo comprenden, el presupuesto +previsto del proyecto para el próximo año, desde cuándo opera la organización +sus programas, si trabajan actualmente con un patrocinador fiscal o si han +trabajado alguna vez con uno de ellos, si se cuenta con un comité de consulta o +supervisión. También piden una aproximación de la cantidad de personas atendidas +anualmente, si la organización está dirigida por voluntarios, empleados, +contratistas independientes o una combinación de ellos y la forma en cómo se +llegó a conocer Community Initiatives. + +#### [¿Cómo es el proceso de solicitud?](https://communityin.org/apply/) + +1. Luego de enviar el formulario de consulta el Vicepresidente de Servicios al + Cliente de Community Initiatives se pondrá en contacto con nosotros para + realizar una llamada telefónica de presentación. En esta conversación + conocerán nuestro proyecto y determinarán si podemos aplicar. + +2. Si al terminar la llamada telefónica deciden que podemos solicitar el + patrocinio fiscal, debemos presentar una solicitud y la documentación de + apoyo para completar el proceso. + +Las solicitudes completas incluyen los siguientes documentos requeridos: + +- Carta de presentación solicitando el patrocinio fiscal. + +- Formulario de solicitud de cuatro páginas. + +- Presupuesto del primer año (se requiere la plantilla de Community + Initiatives). + +- Plan de recaudación de fondos a tres años. + +- Biografía y curriculum vitae del Director Ejecutivo. + +- Biografías de los miembros del Comité Asesor. + +- Material adicional del programa (opcional). + +Las solicitudes se aceptan trimestralmente. Los plazos de solicitud trimestral +para este año: + +- 7 de enero + +- 8 de abril + +- 17 de junio + +- 23 de septiembre + +3. Posteriormente el personal de Community Initiatives programará una reunión + para comprender mejor las necesidades operativas del proyecto y realizar una + evaluación de riesgos de las actividades propuestas. Será de 45 o 90 minutos + de acuerdo al tipo o modelo de solicitud considerada (A o C). + +4. La + [Junta directiva de Community Initiatives](https://communityin.org/meet-us/board-of-directors/) + debe aprobar la solicitud antes de que el proyecto se incorpore a su amplia + red. El estado de la solicitud erá notificado en el plazo de una semana tras + la revisión de la junta. + +5. Si aceptan la solicitud, se celebrará una reunión de orientación para + ayudarnos a sacar el máximo provecho de la asociación con Community + Initiatives; allí seleccionan una fecha de inicio que nos convenga. Si el + proyecto es aprobado, se debe realizar la inscripción en cualquier momento en + el plazo de un año desde la aceptación del proyecto. Los proyectos + seleccionados deben comenzar su labor en el plazo de un año a partir de la + aprobación de la junta directiva. + +#### [¿Qué servicios nos brinda Community Initiatives?](https://communityin.org/services/) + +Community Initiatives proporciona una administración completa en las áreas más +intensivas en tiempo y experiencia de la gestión sin ánimo de lucro, desde +recursos humanos, administración de nóminas, preparación y presentación de +impuestos, gestión financiera y más. Con Community Initiatives el 90% de +nuestros ingresos quedarían en el personal y los programas. + +Específicamente los servicios que ofrece son: + +- Manejo de **beneficios, nóminas y recursos humanos** entre ellos un manual de + personal actualizado, sistemas de contratación establecidos, plan para la + asistencia sanitaria de los empleados y otras prestaciones, administración de + las nóminas de los empleados y contratistas y expertos de guardia para + gestionar los problemas de recursos humanos. + +- **Administración del empleo**, cartas de oferta de trabajo y autorizaciones de + visado para empleados, ajustes salariales, ascensos, cambios de título, + aclaración de la FLSA, permisos de ausencia, etc. Revisión de causas de + despido, acuerdos de pago final, entrevistas de salida, despidos, reducciones + salariales, etc. Procesamiento de cheques, W-9s, 1099s y mantenimiento de la + información I-9. + + - *Administración de beneficios*: planes de salud y bienestar de los + + empleados, administración de planes de jubilación a través de nuestro 401(k), + administración de cuentas de gastos flexibles y administración de COBRA + + - *Gestión de riesgos y cumplimiento*: mantenimiento de los + + registros y la documentación del personal, cumplimiento normativo (ERISA, + FLSA, EEO y otras normativas federales y estatales), gestión de riesgos de + RR.HH. para la compensación de los trabajadores y el seguro de desempleo, + formación relacionada con el cumplimiento para los directores y gerentes de + proyectos (EEO, acoso sexual, etc.), plantillas de contratistas independientes + y su cumplimiento. + + - *Políticas de RRHH y relaciones con los empleados*: entrenamiento + + para la gestión del rendimiento, manual del empleado completo, asesoramiento + en materia de relaciones con los empleados, resolución de conflictos, gestión + y administración de reclamaciones y mediación. + +- **Gestión financiera**: cuentas por pagar, cobros en efectivo, estados + financieros mensuales, informes y análisis financieros, gestión del + presupuesto y de la tesorería, auditoría anual independiente e informes de + cumplimiento y asesoramiento financiero. + +- **Preparación y cumplimiento de impuestos**: declaraciones fiscales e + informativas federales, estatales y locales; recepción de donaciones y + subvenciones deducibles de impuestos, acuse de recibo de donaciones superiores + a 250 dólares, como exige el IRS; remisión y presentación de impuestos sobre + la nómina, licencias comerciales estatales y locales. + +- **Apoyo a las subvenciones**: colaboración en el desarrollo de solicitudes, + revisión de borradores de propuestas, seguimiento financiero de los fondos de + la subvención, control del cumplimiento de las subvenciones, seguimiento y + apoyo a los informes de las subvenciones. + +- **Gestión de riesgos y seguros**: Community Initiatives ofrece la siguiente + protección a todos sus proyectos patrocinados fiscalmente: Indemnización + laboral Responsabilidad civil general Responsabilidad civil general Propiedad + comercial Automóviles propios y alquilados Accidente Responsabilidad civil por + prácticas laborales Responsabilidad civil por delitos y robos de empleados + +- **Asesoramiento jurídico**. Community Initiatives ofrece acceso a expertos + legales en las siguientes áreas: marca comercial, propiedad intelectual, + demandas por discriminación, propiedad inmobiliaria, empleo y discriminación, + prórrogas del visado H-1 B, impuesto sobre la renta de las empresas no + relacionadas y acuerdos de asociación. Cuando el proyecto requiera un apoyo + legal altamente especializado o intensivo, Community Initiatives cuenta con un + experto legal a un precio reducido. + +- **Coaching**: los proyectos de Community Initiatives cuentan con un profundo + banco de especialistas en organizaciones no lucrativas junto con + [expertos en consultoría](https://communityin.org/meet-us/team/consulting-experts/) + para ayudar, entre otros, con temas relacionados con el marketing y las + comunicaciones, la consultoría estratégica, la recaudación de fondos, la + participación de la junta directiva y los voluntarios y otras cosas más. + +- **Gestión de donaciones y crowdfunding**: Cuando llegan las donaciones, + Community Initiatives se asegura de que cada contribución de 250 dólares o más + reciba una carta de reconocimiento del donante que cumpla con los requisitos + fiscales. Se asocia con [FundRazr](https://fundrazr.com/) una plataforma de + recaudación de fondos online de vanguardia. A través de este acuerdo de + colaboración, los proyectos de Community Initiatives tienen acceso gratuito a + una plataforma de donaciones personalizable con las siguientes + características: crowdfunding, baja tasa de tramitación, investigación de + donantes, informes de donaciones, sitio de donaciones de marca blanca (por una + tarifa nominal), a través de la asociación con + [WeDidIt](https://teamallegiance.com/wedidit/), se obtiene la financiación + rápidamente. + +#### [¿Cuáles son las tasas de cobro de Community Initiatives?](https://communityin.org/apply/fees-minimums/) + +- **Cuotas de patrocinio**: Community Initiatives cobra el 10% de los ingresos + brutos. Debido a la complejidad de los requisitos de información, cobra un 15% + para los fondos gubernamentales. + +- **Recaudación de fondos mínima**: aunque sirven a un número de proyectos con + presupuestos anuales millonarios, todos los proyectos de la red deben cumplir + con un requisito mínimo de **recaudación de fondos anual de 24.000 dólares.** diff --git a/bkp/programs/mentoring/gabriela_salas.JPG b/bkp/programs/mentoring/gabriela_salas.JPG new file mode 100644 index 000000000..a60235880 Binary files /dev/null and b/bkp/programs/mentoring/gabriela_salas.JPG differ diff --git a/bkp/programs/mentoring/index.md b/bkp/programs/mentoring/index.md new file mode 100644 index 000000000..72435ffc7 --- /dev/null +++ b/bkp/programs/mentoring/index.md @@ -0,0 +1,54 @@ +# Open Science Labs Mentoring Program + +## Introduction + +Welcome to the Open Science Labs Mentoring Program! Our mentoring initiative is +designed to offer an enriching environment for both mentors and mentees, +enabling them to grow professionally while contributing to the larger community +of open science and open source. If you are at any stage of your career and are +looking to advance your skills and make meaningful contributions, this program +is for you. + +## Benefits for Career Growth + +One of the primary advantages of participating in our mentoring program is the +unparalleled opportunity for career growth. Mentoring relationships often +provide not only technical guidance but also professional development. Whether +you're a novice looking for direction or an experienced professional looking to +advance, a mentor can provide invaluable insights into the industry, help you +set and achieve realistic goals, and provide feedback to improve your skills and +approach. + +## Networking Opportunities + +Mentoring can also significantly expand your professional network. Being part of +our program puts you in touch with individuals and organizations that can offer +different perspectives and opportunities you may not have encountered otherwise. +Networking through mentoring can lead to new job opportunities, collaborations +on projects, and even partnerships that can be beneficial for years to come. + +## Skill Enhancement + +Apart from soft skills like communication and teamwork, mentoring can greatly +aid in honing technical abilities. A mentor can provide targeted advice and +resources to help you become more competent in areas that are crucial for career +growth. This personalized guidance often results in faster and more sustainable +skill development compared to self-study or formal education. + +## Community and Giving Back + +Finally, our mentoring program isn't just about individual growth; it's also +about contributing to the broader community of open science and open source +enthusiasts. Experienced professionals who act as mentors find the experience +rewarding in its own right, as it allows them to give back to the community and +help others succeed. This cyclic nature ensures that each new generation is +better prepared and more involved, advancing the field as a whole. + +## Get Involved + +If the prospect of career growth, skill enhancement, and community involvement +excites you, we invite you to become part of our Mentoring Program. Whether +you're interested in becoming a mentor, a mentee, or both, there's a place for +you here. Reach out to us to learn more about how you can get involved and make +a difference +[here](https://github.com/OpenScienceLabs/request-forms/issues/new?assignees=EverVino%2C+xmnlab&labels=mentoring-request&projects=&template=es-mentoring-request.yaml&title=Solicitud+de+mentor%C3%ADa%3A+%3CINFORME+TU+NOMBRE+AQU%C3%8D%3E). diff --git a/content/mentoring/mentors.md b/bkp/programs/mentoring/mentors.md similarity index 86% rename from content/mentoring/mentors.md rename to bkp/programs/mentoring/mentors.md index d6ff0ae45..9c0d3997d 100644 --- a/content/mentoring/mentors.md +++ b/bkp/programs/mentoring/mentors.md @@ -1,12 +1,9 @@ -+++ -title = "Mentoras y Mentores" -description = "Mentoras y Mentores" -date = "2019-02-28" -aliases = ["mentors"] -author = "OSL Team" -sidebar = false -singlecolumn = true -+++ +--- +title: "Mentoras y Mentores" +description: "Mentoras y Mentores" +date: "2019-02-28" +authors: ["OSL Team"] +--- La mentoría es una técnica o proceso en el que una persona con experiencia @@ -16,10 +13,9 @@ singlecolumn = true apoya, alienta a sus aprendices y conservando apertura a preguntas y a escuchar. Se trata de ayudarse mutuamente a expandirse y crecer para que todas las personas aprendan. Para más informaciones, ingrese a la - Guía de Mentorías. + Guía de Mentorías. - ¡Encuentre aquí tu mentora o mentor! - +¡Encuentre aquí tu mentora o mentor!
@@ -289,3 +285,39 @@ singlecolumn = true
+ +
+
+
+ +
+
+
+
Gabriela Salas Cabrera
+ 5 cupos disponibles + Mentoría Grátis +

+ + Idiomas para la mentoría: + Español +
+ Ingeniera de Sistemas y estudiante de Maestría en Tecnologías de l informacion y comunicación, miembro de la organizacion de mujeres lideres en STEAM, posee experiencia como freelance y Desarrolladora de software. Areas de expertice: Python, JavaScript, ASP.NET, C#, SQL, Ciencia de Datos. +
+

+
+ Python + Ciencia de Datos + C# +
+ +
+
+
+
diff --git a/bkp/programs/packaging-support/index.md b/bkp/programs/packaging-support/index.md new file mode 100644 index 000000000..2973df808 --- /dev/null +++ b/bkp/programs/packaging-support/index.md @@ -0,0 +1,51 @@ +--- +title: "Packaging Support Program" +description: "Packaging Support Program" +date: "2023-08-27" +authors: ["OSL Team"] +--- + +# Open Science Labs (OSL) Packaging Support Program + +## Laying the Groundwork for Conda Packaging + +At Open Science Labs, we're laying the groundwork for a future-focused Packaging +Support Program. Our vision is to assist projects with packaging libraries +within the robust Conda/Conda-Forge ecosystem. While our full suite of services +is still under development, we are currently engaged in internal activities +aimed at equipping our associated projects with the knowledge and skills +necessary to begin packaging with Conda-Forge. + +### Current Initiatives + +Our present efforts center on: + +- **Internal Training**: Offering guidance and support to our affiliated + projects as they navigate the intricacies of Conda and Conda-Forge. +- **Foundation Building**: Establishing the baseline practices and + infrastructure required for effective Conda packaging. + +### Future Plans + +Looking ahead, we are excited about the potential to expand our support, which +will include: + +- **Comprehensive Training**: Developing training programs to help the wider + community in packaging and distribution. +- **On-Demand Packaging**: Providing targeted assistance to projects needing to + package and distribute their libraries effectively. + +### Get Involved + +As we build these initiatives, we invite you to: + +1. **Stay Tuned**: Watch for updates on the rollout of our full Packaging + Support Program. +2. **Get Familiar**: Start by learning about Conda and Conda-Forge, and explore + how packaging can benefit your projects. +3. **Prepare for the Future**: Consider how enhanced packaging support can + address distribution challenges within your projects. + +We're excited to pave the way for advanced packaging solutions within the OSL +community. Join us in this journey, and let's push the boundaries of open +science together! diff --git a/content/programs/virtual-labs/index.md b/bkp/programs/virtual-labs/index.md similarity index 90% rename from content/programs/virtual-labs/index.md rename to bkp/programs/virtual-labs/index.md index 6d1ad7192..9aeb4a5aa 100644 --- a/content/programs/virtual-labs/index.md +++ b/bkp/programs/virtual-labs/index.md @@ -1,12 +1,9 @@ -+++ -title = "Virtual Labs" -description = "Virtual Labs" -date = "2023-08-27" -aliases = ["virtual-labs"] -author = "OSL Team" -sidebar = false -singlecolumn = true -+++ +--- +title: "Virtual Labs" +description: "Virtual Labs" +date: "2023-08-27" +authors: ["OSL Team"] +--- # Virtual Labs by Open Science Labs (OSL) @@ -14,8 +11,8 @@ singlecolumn = true In today's dynamic scientific landscape, collaboration and community engagement are more crucial than ever. That’s why Open Science Labs is proud to introduce -Virtual Labs — a dedicated platform where scientific groups can collaborate, share -knowledge, and grow together. +Virtual Labs — a dedicated platform where scientific groups can collaborate, +share knowledge, and grow together. ### 🟢 **Basic Plan: Free Community Space** diff --git a/conda/dev.yaml b/conda/dev.yaml index 868c12df9..afc455dbb 100644 --- a/conda/dev.yaml +++ b/conda/dev.yaml @@ -1,10 +1,9 @@ -name: osl-page +name: osl-web channels: - nodefaults - conda-forge dependencies: - - opensciencelabs::hugo-extended - - pre-commit + - python <3.12 - pip - - pip: - - makim==1.8.3 + - poetry + - nodejs diff --git a/config/_default/config.toml b/config/_default/config.toml deleted file mode 100644 index 69ada013c..000000000 --- a/config/_default/config.toml +++ /dev/null @@ -1,25 +0,0 @@ -# set `baseurl` to your root domain -# if you set it to "/" share icons won't work properly on production -baseurl = "https://opensciencelabs.org/" # Include trailing slash -#title = "OpenScienceLabs" # Edit directly from config/_default/languages.toml # alternatively, uncomment this and remove `title` entry from the aforemention file. -#copyright = "© Content" -# canonifyurls = true -# paginate = 10 -# theme = "hugo-clarity" -disqusShortname = "" - -DefaultContentLanguage = "es" -# [languages] -# config/_default/languages.toml - -# [menus] -# config/_default/menus/menu.xx.toml - -[taxonomies] -category = "categories" -tag = "tags" -series = "series" -# authors = "author" - -[outputs] -home = ["HTML", "RSS", "JSON"] diff --git a/config/_default/configTaxo.toml b/config/_default/configTaxo.toml deleted file mode 100644 index ee76e43af..000000000 --- a/config/_default/configTaxo.toml +++ /dev/null @@ -1,23 +0,0 @@ -timeout = 30000 -enableInlineShortcodes = true -footnoteReturnLinkContents = "^" - -[privacy] - -[privacy.vimeo] -disabled = false -simple = true - -[privacy.twitter] -disabled = false -enableDNT = true -simple = true -disableInlineCSS = true - -[privacy.instagram] -disabled = false -simple = true - -[privacy.youtube] -disabled = false -privacyEnhanced = true \ No newline at end of file diff --git a/config/_default/languages.toml b/config/_default/languages.toml deleted file mode 100644 index 4e04c56b6..000000000 --- a/config/_default/languages.toml +++ /dev/null @@ -1,10 +0,0 @@ - -[es] - title = "Open Science Labs" - LanguageName = "Español" - weight = 1 - -[pt] - title = "Claridade" # just for the sake of showing this is possible - LanguageName = "Português" - weight = 2 \ No newline at end of file diff --git a/config/_default/markup.toml b/config/_default/markup.toml deleted file mode 100644 index 63e60b021..000000000 --- a/config/_default/markup.toml +++ /dev/null @@ -1,36 +0,0 @@ -[goldmark] - [goldmark.renderer] - hardWraps = false - unsafe = true # change to false to disable inclusion of rawHTML and math functions - xhtml = false - [goldmark.extensions] - typographer = false - - -[highlight] - anchorLineNos = false - codeFences = true - guessSyntax = true # - hl_Lines = "--" - lineNoStart = 1 - lineNos = true # always set to true # else line numbers won't show at all! even when you toggle them on in the UI - lineNumbersInTable = false # toggling this on (i.e to true) or deleting this line will break the code blocks functionality. Will - noClasses = false - style = "monokailight" - tabWidth = 4 - -# [highlight] -# anchorLineNos = false -# codeFences = true -# guessSyntax = false -# hl_Lines = '' -# hl_inline = false -# lineAnchors = '' -# lineNoStart = 1 -# lineNos = false -# lineNumbersInTable = true -# noClasses = true -# noHl = false -# style = 'monokailight' -# tabWidth = 4 - diff --git a/config/_default/menus/menu.es.toml b/config/_default/menus/menu.es.toml deleted file mode 100644 index d26dfc8ce..000000000 --- a/config/_default/menus/menu.es.toml +++ /dev/null @@ -1,137 +0,0 @@ -[[main]] - name = "Home" - url = "" - weight = -110 - -#[[main]] -# name = "Actividades" -# url = "post/archive/" -# weight = -109 - -# Submenus are done this way: parent -> identifier -[[main]] - identifier = "programs" - name = "Programs" - weight = 10 -[[main]] - parent = "programs" - name = "Incubator Program" - url = "/programs/incubator/" -[[main]] - parent = "programs" - name = "Internship Program" - url = "/programs/internship/" -[[main]] - parent = "programs" - name = "Affiliation Program" - url = "/programs/affiliation/" -[[main]] - parent = "programs" - name = "Ambassadors Program" - url = "/programs/ambassadors/" -[[main]] - parent = "programs" - name = "Partners Program" - url = "/programs/partners/" -[[main]] - parent = "programs" - name = "Packaging Support Program" - url = "/programs/packaging-support/" -[[main]] - parent = "programs" - name = "Virtual-Labs" - url = "/programs/virtual-labs/" -[[main]] - identifier = "mentoring" - name = "Mentorías" - weight = 121 -[[main]] - parent = "mentoring" - name = "Guía de Mentorías" - url = "/guidelines/mentoring/guide/" -[[main]] - parent = "mentoring" - name = "Mentoras y Mentores" - url = "mentoring/mentors" -[[main]] - name = "Acerca de" - identifier = "about" - weight = 122 -[[main]] - parent = "about" - name = "Guías" - url = "guidelines/" -[[main]] - parent = "about" - name = "Equipo" - url = "team/" -[[main]] - parent = "about" - name = "Asociados" - url = "/partners/" -[[main]] - parent = "about" - name = "Actividades" - url = "/archives/" -[[main]] - parent = "about" - name = "Reconocimientos" - url = "/acknowledges/" -[[main]] - parent = "about" - name = "FAQ" - url = "/es/faq/" - -#[[main]] -# name = "About" -# url = "about/" -# weight = 121 - -# social menu links -[[social]] - name = "youtube" - type = "social" - url = "/youtube" -[[social]] - name = "github" - type = "social" - weight = 2 - url = "https://github.com/OpenScienceLabs" -[[social]] - name = "twitter" - weight = 3 - url = "https://twitter.com/opensciencelabs" -[[social]] - name = "linkedin" - weight = 2 - url = "/linkedin" -[[social]] - name = "facebook" - type = "social" - url = "facebook" - weight = 4 -[[social]] - name = "discord" - type = "social" - url = "/discord" - weight = 5 -[[social]] - name = "rss" - weight = 6 - url = "index.xml" - - - -# other supported social links -# name = "youtube" -# url = "https://www.youtube.com/#" -# name = "facebook" -# url = "https://www.facebook.com/opensciencelabscommunity" -# name = "instagram" -# url = "https://instagram.com/#" -# name = "stackoverflow" -# url = "https://stackoverflow.com/#" -# name = "gitlab" -# url = "https://gitlab.com/#" -# name = "discord" -# url = "http://discord.opensciencelabs.org/" diff --git a/config/_default/menus/menu.pt.toml b/config/_default/menus/menu.pt.toml deleted file mode 100644 index 24c7cd52c..000000000 --- a/config/_default/menus/menu.pt.toml +++ /dev/null @@ -1,28 +0,0 @@ -[[main]] - name = "Início" - url = "" - weight = -110 - -# [[main]] -# name = "Arquivos" -# url = "post/rich-content/" -# weight = -109 - -# Submenus are done this way: parent -> identifier -[[main]] - name = "Links" - identifier = "Links" - weight = -108 -[[main]] - parent = "Links" - name = "LinkedIn" - url = "https://www.linkedin.com/" -[[main]] - parent = "Links" - name = "Twitter" - url = "https://twitter.com/" - -[[main]] - name = "Sobre" - url = "about/" - weight = -107 \ No newline at end of file diff --git a/config/_default/params.toml b/config/_default/params.toml deleted file mode 100644 index c0e8d2202..000000000 --- a/config/_default/params.toml +++ /dev/null @@ -1,147 +0,0 @@ -# enable search -enableSearch = true - -# socials -#twitter = "@janedoe" -#largeTwitterCard = false # set to true if you want to show a large twitter card image. The default is a small twitter card image -# introDescription = "Open Science Labs enfocada en compartir conocimiento" # Descripción del autor en el navside right -introURL = "about/" # set the url for the 'read more' button below the introDescription, or set to false to not show the button -# description = "A theme based on VMware's Clarity Design System for publishing technical blogs with Hugo." # Set your site's meta tag (SEO) description here. Alternatively set this description in your home page content file e.g. content/_index.md. Whatever is set in the latter will take precedence. -# keywords = ["design", "clarity", "hugo theme"] # Set your site's meta tag (SEO) keywords here. Alternatively set these in your home page content file e.g. content/_index.md. Whatever is set in the latter will take precedence. - -# showShare = false # Uncomment to not show share buttons on each post. Also available in each post's front matter. - -# Google analytics Id -ga_analytics = "UA-213158050-1" - -# Baidu analytics Id -# baidu_analytics = "XXXXXXXX" - -# limit the number of taxonomies links shown on the sidebar of each page by default. -numberOfTagsShown = 14 # Applies for all other default & custom taxonomies. e.g categories, brands see https://gohugo.io/content-management/taxonomies#what-is-a-taxonomy - -# Whether to default to storing images and other assets in the `static` directory, or use Hugo page bundles. -# Switch to `true` if you'd like to group assets with the post itself (as a "leaf bundle"). -# This can be overridden at the page level; what is set below acts as the default if no page variable is set. -# Details on page bundles: https://gohugo.io/content-management/page-bundles/#leaf-bundles -usePageBundles = false - -# Path variables -# -# By default, each of these directories are children of the `static` directory. -# -# In some Apache server installs, these directory names could conflict and you -# may want to change them. See: -# https://github.com/chipzoller/hugo-clarity/issues/74 -# -# If you change the names of these directories, be sure to copy the contents of -# the originals to get the files included with Hugo Clarity. -# -# Images: -imagesDir = "images/" # without a leading forward slash -# Icons: -iconsDir = "icons/" # without a leading forward slash -# Fonts: -fontsDir = "fonts/" # without a leading forward slash - -# Social media sharing image: Will be used on Twitter, Facebook, LinkedIn, etc. -# when a given page has no other image present. -fallBackOgImage = "images/thumbnail.png" - -# Logo image this extract the image from static folder -logo = "logos/osl-color-horizontal.png" - -# center logo on navbar -centerLogo = false # Set to "true" for centering or "false" for left aligned. - -# sets the maximum number of lines per codeblock. The codeblock will however be scrollable and expandable. -# codeMaxLines = 10 - -# disable showing line numbers by default. Switch to `true` if you'd rather have them on. -# codeLineNumbers = false - -# enable math notation. Switch to `true` to enable mathjax in your site. -enableMathNotation = false - -# directory(s) where your articles are located -mainSections = ["guidelines", "blog"] # see config details here https://gohugo.io/functions/where/#mainsections - -# Label Non inline images on an article body -figurePositionShow = false # toggle on or off globally -# you can toggle this behaviour on or off on per page using the same variable inside your articles frontmatter -figurePositionLabel = "Figure" # the text before image number e.g Figure 1.0 - -# Set the collapsed mobile navigation to either appear from the left or the right -mobileNavigation = "left" # if you prefer right change to 'right' - -# some site owners want to decide how they would like their sites to be introduced users. These settings give you as a site owner to decide how the user will view your site for the first time. - -# please note that you cannot enforce both modes at the same time. i.e by enforcing one mode, you priotise it over the other (by setting it to true). enforceDarkMode will be commented out - -# please also not that mode toggle UI will remain in place. That way, if a user prefers darkmode, they can have their way. - -enforceLightMode = false -# enforceDarkMode = false - -# customize footer icon. see issue https://github.com/chipzoller/hugo-clarity/issues/77 -footerLogo = "icons/osl-logo-black.svg" - -# Customize Sidebar Disclaimer Text -# sidebardisclaimer = true -# disclaimerText = "The opinions expressed on this site are my own personal opinions and do not represent my employer’s view in any way." - -# Text for the languages menu. -languageMenuName = "🌐" - -# Title separator, default to |. -# titleSeparator = "|" - -# Enable or disable comments globally. Default to true. -# comments = true - -# Enable or disable Utterances (https://github.com/utterance/utterances) Github Issue-Based Commenting -# utterances = true #Run the utterances script in the single.html layout to load https://utteranc.es comments -# utterancesRepo = "GHUsername/Repository.Name" # Utterances is enabled when this param is set -# utterancesTheme = "github-light" # Default: github-dark -# utterancesIssueTerm = "pathname" # Default: pathname - -# Maximum number of recent posts. (default: 8) -# numberOfRecentPosts = 8 - -# Maximum number of featured posts. (default: 8) -# numberOfFeaturedPosts = 8 - -# Pin featured posts in list. -# pinFeatured = true - -# Maximum number of pinned featured posts. (default: 8) -# numberOfPinnedPosts = 8 - -# Date format. Checkout https://gohugo.io/functions/format/#hugo-date-and-time-templating-reference for details. -# dateFormat = "2006-01-02" # Default to "Jan 2, 2006". -# customFonts = false # toggle to true if you want to use custom fonts only. - -# The year when ths website was created, this value is used in the copyright -# notice of the footer. -# since = 2016 - -# Show related content at the end of an article based on the 'series' taxonomy. Can be set in post front matter. -# showRelatedInArticle = false -# showRelatedInSidebar = false - -# website author -#[author] -# name = "OSL" -#photo = "logos/justlogo.png" #include this if you would like to show the author photo on the sidebar - -[plausible_analytics] -enable = false # to enable plausible analytics set to true. -websiteDomain = "example.com" # domain name of your website, most cases same as your base url -# plausibleDomain = "plausible.io" # default is set to plausible.io, only required if plausible is selfhosted -# scritpName = "plausible" # default is set to plausible, only required if using a custome name for script - -[matomo_analytics] -enable = false # To enable matomo analytics change to `true`. -websiteDomain = "example.com" # Set the domain name of your website, in most cases same as your base URL this is required. -matomoDomain = "matomo.example.com" # Set to Matomo domain -matomoSiteID = "1" # Default is set to 1, change this to the siteid being tracked diff --git a/content/_index.md b/content/_index.md deleted file mode 100644 index 60ec89d4b..000000000 --- a/content/_index.md +++ /dev/null @@ -1,6 +0,0 @@ -+++ -author = "OSL Team" -description = "A Open Source community for sharing knowledge" # Set your site's meta tag (SEO) description here. This overrides any description set in your site configuration. -keywords = ["open science", "data science", "latam"] # Set your site's meta tag (SEO) keywords here. These override any keywords set in your site configuration. -sidebar = false -+++ diff --git a/content/about.md b/content/about.md deleted file mode 100644 index 0157c4400..000000000 --- a/content/about.md +++ /dev/null @@ -1,49 +0,0 @@ -+++ -title = "About" -description = "Open Science Labs, sharing knowledge" -date = "2019-02-28" -aliases = ["about-us", "about-osl", "contact"] -author = "OSL Team" -sidebar = false -singlecolumn = true -+++ - -Open science labs is a community that aims to gather people from all parts of the world, specially from latin america countries and create an open space for teaching, learning and sharing topics around open science and computational tools. An english group is very important in this context because it increases the possibilities of collaboration in open projects. - -## Community - -We are using discord to organize our community. There you can decide which group you want to join, for example python, c++, compilers, open science, devops, languages (English, Spanish) , etc. - -Also, everyone is more than welcome to propose a study-group. If you want to study a specific topic, and want to gather more people to study that with you, we encourage you to propose a study-group. - -If you want to give a talk or tutorial about a specific topic, raise your voice in the channel #comm-general and we will be more than happy to help you to hold this event on discord. - -## Collaborate! - -If you want to join us, apply to be a volunteer here. - -Also, take a look into our Code of Conduct. - -We need help in areas, such as: - -* DevOps -* Articles -* Videos -* Community Management -* Social Media -* Diversity, Equity and Inclusion -* Events -* Documentation -* Mentoring -* Project Managements - -Join our community on [discord](https://opensciencelabs.org/discord). -Learn more and contribute on [GitHub](https://github.com/opensciencelabs). - -## Roadmap - -If you are interested in the Open Science Labs next steps, please check our Roadmap. - -## Governance - -For more information about our project governance, please check governance document. diff --git a/content/about.pt.md b/content/about.pt.md deleted file mode 100644 index 7b928c0fc..000000000 --- a/content/about.pt.md +++ /dev/null @@ -1,29 +0,0 @@ -+++ -title = "Sobre" -description = "Hugo, the world's fastest framework for building websites" -date = "2019-02-28" -aliases = ["sobre"] -author = "Hugo Authors" -draft = true -+++ - -Tradução em português. Apenas para demonstração, o resto do artigo não está traduzido. - - -Written in Go, Hugo is an open source static site generator available under the [Apache Licence 2.0.](https://github.com/gohugoio/hugo/blob/master/LICENSE) Hugo supports TOML, YAML and JSON data file types, Markdown and HTML content files and uses shortcodes to add rich content. Other notable features are taxonomies, multilingual mode, image processing, custom output formats, HTML/CSS/JS minification and support for Sass SCSS workflows. - -Hugo makes use of a variety of open source projects including: - -* https://github.com/yuin/goldmark -* https://github.com/alecthomas/chroma -* https://github.com/muesli/smartcrop -* https://github.com/spf13/cobra -* https://github.com/spf13/viper - -Hugo is ideal for blogs, corporate websites, creative portfolios, online magazines, single page applications or even a website with thousands of pages. - -Hugo is for people who want to hand code their own website without worrying about setting up complicated runtimes, dependencies and databases. - -Websites built with Hugo are extremelly fast, secure and can be deployed anywhere including, AWS, GitHub Pages, Heroku, Netlify and any other hosting provider. - -Learn more and contribute on [GitHub](https://github.com/gohugoio). diff --git a/content/acknowledges/index-en.md b/content/acknowledges/index-en.md deleted file mode 100644 index f7ff884b8..000000000 --- a/content/acknowledges/index-en.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "Agradecimientos a la Python Software Foundation por la subvención de nuestro proyecto de CookieCutter" -author: Anavelyz Perez -showdate: false -showreadtime: false -draft: true -aliases: ["/acknowledges/"] ---- - -## Python Sotfware Foundation (PSF) - - - - -Open Science Labs has been awarded a grant from the Python Software Foundation -[(PSF)](https://www.python.org/psf-landing/) in April 2023 to improve a Python -project template (for cookiecutter or cookieninja) that implements all (as far -as possible) the best practices recommended by pyOpenSci, but is not limited to -them. It offers all current best practice approaches and tools as options, -including CI, documentation, static static analysis tools, etc. Thanks to the -grant, dependencies will be and some configuration changes. - -You can visit the *OSL Python Package Template* project at: -https://github.com/osl-incubator/osl-python-template diff --git a/content/acknowledges/index-es.md b/content/acknowledges/index-es.md deleted file mode 100644 index ef1f91dba..000000000 --- a/content/acknowledges/index-es.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -showdate: false -showreadtime: false -usePageBundles: true -aliases: ["/acknowledges/"] ---- - -## Python Sotfware Foundation (PSF) - - - - -Open Science Labs ha recibido una subvención de la Python Software Foundation -[(PSF)](https://www.python.org/psf-landing/) en Abril del 2023 para mejorar una -plantilla de proyecto Python (para cookiecutter o cookieninja) que implementa -todas (tanto como sea posible) las mejores prácticas recomendadas por pyOpenSci, -pero no restringidas a eso. Ofrece todos los enfoques y herramientas de mejores -prácticas actuales como opciones, incluyendo CI, documentación, herramientas de -análisis estático, etc. Gracias a la subvención se actualizarán las dependencias -y se realizarán algunos cambios de configuración. - -Puedes visitar el proyecto *OSL Python Package Template* en: -https://github.com/osl-incubator/osl-python-template diff --git a/content/archives/index.md b/content/archives/index.md deleted file mode 100644 index 961f39ca1..000000000 --- a/content/archives/index.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -showdate: false -showreadtime: false -showauthor: false -aliases: ["/archives/"] ---- - -## Pycafe charlas - -{{< youtube hsrIDxiHkVk >}} - -
- -{{< youtube SkaXPIzolPs >}} - -
- -{{< youtube h4XeorBiV18 >}} - -
- -{{< youtube lPsOB8dEiNI >}} - -
- -{{< youtube vI6wppDdY_g >}} - -
- - -## DevOps Charlas - -{{< youtube sfBu6RiH07A >}} - -
- -## Anuncios de eventos -https://twitter.com/opensciencelabs/status/1570867241138245633?s=20&t=UjgCpGqlFdXKkZWXfVNP_g -{{< tweet user="opensciencelabs" id="1570867241138245633?s=20&t=UjgCpGqlFdXKkZWXfVNP_g" >}} - -
diff --git a/content/blog/_index.md b/content/blog/_index.md deleted file mode 100644 index 397d291e3..000000000 --- a/content/blog/_index.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -menu: - main: - name: Blog - identifier: blog - url: "blog/" - weight: 100 -title: "Blog" - ---- diff --git a/content/blog/algunos-proyectos-de-ciencia-e-inteligencia-ciudadana-para-atender-la-pandemia-del-covid-19/index.md b/content/blog/algunos-proyectos-de-ciencia-e-inteligencia-ciudadana-para-atender-la-pandemia-del-covid-19/index.md deleted file mode 100644 index f272ebb72..000000000 --- a/content/blog/algunos-proyectos-de-ciencia-e-inteligencia-ciudadana-para-atender-la-pandemia-del-covid-19/index.md +++ /dev/null @@ -1,202 +0,0 @@ ---- -title: "Algunos proyectos de ciencia e inteligencia ciudadana para atender la pandemia del COVID-19" -slug: algunos-proyectos-de-ciencia-e-inteligencia-ciudadana-para-atender-la-pandemia-del-covid-19 -date: 2020-04-16 -author: Yurely Camacho -tags: [covid19, proyectos, ciencia ciudadana] -categories: [ciencia abierta] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - -La enfermedad COVID-19 causada por el coronavirus SARS-CoV-2 actualmente -es una pandemia mundial. Por tal motivo su prevención resulta sumamente -importante, y para esto es indispensable nuestra participación activa -como ciudadanos. El rápido aumento de casos de COVID-19 ha llevado a -personas de distintos lugares a organizarse en proyectos de ciencia e -inteligencia colectiva o ciudadana para enfrentar esta enfermedad. -Puedes consultar más información sobre ciencia ciudadana en nuestro -artículo *Qué es ciencia ciudadana* (enlace a artículo -queescienciaciudadana). - - - -En este post mencionamos algunas iniciativas de ciencia e inteligencia -ciudadana que se han desarrollado en distintas partes del mundo, -relacionados con la atención al COVID-19: - -## Frena la curva - -Es una plataforma ciudadana desarrollada para canalizar y organizar la -energía social y la resiliencia cívica ante el Covid-19. Nació como una -iniciativa del Gobierno de Aragón y luego se convirtió en una plataforma -ciudadana donde participan gran cantidad de voluntarios, activistas, -emprendedores, empresas, organizaciones y laboratorios públicos de -innovación abierta provenientes de España y Latinoamérica. - -Frena la curva se originó como una respuesta de la sociedad civil -sirviendo de complemento a las medidas gubernamentales. En esta -plataforma los ciudadanos aprenden, comparten consejos y ayudan a otros -a prevenir la enfermedad. Conoce más en https://frenalacurva.net/. - -## Algunos proyectos en Barcelona-España - -### Barcelona desde casa - -Este proyecto nace de la rápida organización de la ciudadanía, agrupa -distintas iniciativas en cuatro ámbitos: cuidados colectivos y apoyo -mutuo, cultura, recursos educativos y para hacer deporte en casa. -Algunas de ellas son: fondo documental de las bibliotecas, equipamientos -culturales y festivales literarios, foro de experiencias y emociones, -compartir ejercicios para hacer en casa, juegos, recetas de cocina y -otras actividades. - -[Barcelona desde casa](https://www.decidim.barcelona) ofrece también -recursos digitales en abierto para que las personas puedan acceder -durante los días de aislamiento, busca ser compartida con la familia, -amigos y/o vecinos. La iniciativa estará activa mientras duren el -período de excepcionalidad y las medidas de aislamiento en España. - -### Barcelona Cultura - -Es una plataforma digital accesible desde -https://www.barcelona.cat/barcelonacultura/es, donde se muestran y -difunden actividades que mantienen presente el tejido cultural y el - -espíritu de los equipamientos públicos y privados de la ciudad, así como -las iniciativas culturales individuales. Aquí se observan actividades -donde se informa sobre museos, recursos literarios, blibliotecas, entre -otras. - -### Proyecto Radars - -Es una iniciativa comunitaria que tiene como propósito mejorar la -calidad de vida de las personas mayores, ofreciéndoles soluciones para -una parte de sus necesidades cotidianas. Los voluntarios son personas -que no forman parte de colectivos de riesgo y prestan apoyo en -actividades como: llevarles los alimentos cuando van a comprar, sacar la -basura, pasear perros, entre otras. Si deseas consultar más información, -visita -https://ajuntament.barcelona.cat/serveissocials/ca/canal/projecte-daccio-comunitaria-radars. - -## Covid-19 SG - -Es una web que muestra información de Singapur sobre los casos de -infección, la calle donde vive y trabaja la persona infectada, el -hospital al que ingresa, el tiempo promedio de recuperación, entre otros -detalles. Es una iniciativa del gobierno el cual ha adoptado el enfoque -abierto sobre los datos oficiales de las infecciones y manifiesta que -esta es la mejor manera de ayudar a las personas a tomar decisiones y -controlarse frente al Covid-19. Puedes acceder a esta información en -https://co.vid19.sg/. - -## Minería en redes sociales - -Ciudadanos de China y Hong Kong actúan ante la información poco fiable -sobre el Covid-19. Estas personas han estado archivando y traduciendo -datos de relatos personales de las redes sociales (Weibo, WeChat y -Douban) desde China para crear crónicas de testimonios de los afectados, -antes de que sean censurados por el gobierno, ya que no hay prensa -libre. Luego de seleccionada y contrastada la información con fuentes -oficiales o noticias creíbles, proceden a traducirlas o subtitularlas al -inglés y las publican en plataformas como Imgur, Reddit, Twitter y -YouTube. - -También han creado grupos de WhatsApp y Telegran para mantener -comunicadas a las personas ante la desconfianza de las fuentes -oficiales. Otras personas han desarrollado un mapa en vivo del virus, -junto con los titulares de las principales fuentes de noticias. Accede a -información más completa en -https://www.technologyreview.com/2020/02/02/349163/coronavirus-china-wuhan-hong-kong-misinformation-censorship/. - -## Juego de rompecabezas - -La Universidad de Washington adoptó un enfoque innovador para combatir -el Covid-19. Creó un juego de rompecabezas en el cuál el jugador debe -construir una proteína que pueda bloquear el virus para que no se filtre -en las células humanas, lo puede jugar cualquier persona, científicos y -público en general. Las ideas generadas por el juego que se consideren -mejor fundamentadas, serán probadas y posiblemente fabricadas por el -Instituto de Diseño de Proteínas de esta Universidad. Más información -en: -https://www.geekwire.com/2020/university-washington-coronavirus-puzzle-game-aims-crowdsource-cure/ - -## Chatbot Carina - -Es un asistente virtual basado en inteligencia artificial, desarrollado -en España por la empresa [1MillionBot](https://1millionbot.com) para -atender a millones de personas sobre inquietudes acerca del Covid-19. -Aparte de España, otros países como Colombia, Chile o Guatemala se han -unido a Carina para fomentar la difusión de información sobre -coronavirus. El chatbot contesta preguntas básicas y algunas -especializadas con respecto a contagio, síntomas, prevención y medidas -derivadas de la alarma del gobierno. - -Carina está a disposición de cualquier organismo público y entidades que -lo soliciten para contar con ella en sus páginas web o servicios de -información. La base de datos que maneja Carina está basada en -información de la Organización Mundial de la Salud (OMS), el Ministerio -de Sanidad y normativas gubernamentales, el Center For Disease, Control -and Prevention, artículos científicos e información de artículos de -prensa certificados. Encontrarás información adicional sobre Carina en -https://1millionbot.com/chatbot-coronavirus/ - -## OpenWHO - -Es una plataforma interactiva de la OMS que proporciona cursos en línea -a las personas que trabajan o se preparan para trabajar en epidemias, -pandemias y emergencias sanitarias. La plataforma cuenta, entre otros, -con un canal llamado COVID-19 que brinda recursos de aprendizaje para -los profesionales de la salud, los responsables de la adopción de -decisiones y el público en general sobre esta enfermedad. Encuéntralo en -https://openwho.org/channels/covid-19. - -De acuerdo a la evolución de la enfermedad la plataforma actualizará los -cursos, los cuales están disponibles en varios idiomas en el canal de -idiomas nacionales de COVID-19 en la misma plataforma. - -## Ayuda Innovadora a la Respiración (AIRE) - -Es un foro Español donde los participantes recopilan información, en -forma colectiva, en búsqueda de alternativas de código abierto, fáciles -de fabricar y baratas para desarrollar sistemas de ventilación en -pacientes con COVID-19. El proyecto surge como una actividad solidaria -totalmente desinteresada y es similar a otras ideas como [Open Source -Ventilator](https://hackaday.com/2020/03/12/ultimate-medical-hackathon-how-fast-can-we-design-and-deploy-an-open-source-ventilator). - -Al foro se han ido incorporando muchos voluntarios, como ingenieros, -fabricantes, emprendedores y médicos. Encuentra más información en -https://foro.coronavirusmakers.org/. - -Finalmente, destacamos que la ciencia e inteligencia ciudadana está -siendo un gran método para luchar contra el COVID-19, empleándose en -todo el mundo por comunidades y gobiernos para dar respuesta a esta -situación. Te animamos a que seas partícipe de cualquier proyecto de -ciencia ciudadana en tu comunidad, o te permitas emprender uno propio. - -### Referencias - -- [Proyecto Frena la Curva](https://frenalacurva.net/) - -- [Decidim Barcelona](https://www.decidim.barcelona) - -- [Barcelona Cultura](https://www.barcelona.cat/barcelonacultura/es) - -- [Proyecto Radars](https://ajuntament.barcelona.cat/serveissocials/ca/canal/projecte-daccio-comunitaria-radars) - -- [Covid-SG](https://co.vid19.sg/) - -- [Juego de rompecabezas Universidad de Washington](https://www.geekwire.com/2020/university-washington-coronavirus-puzzle-game-aims-crowdsource-cure/) - -- [Chatbot Carina](https://1millionbot.com/chatbot-coronavirus/) - -- [OpenWHO](https://openwho.org/channels/covid-19) - -- [AIRE](https://foro.coronavirusmakers.org/) diff --git a/content/blog/algunos-proyectos-entretenidos-de-codigo-abierto/index.md b/content/blog/algunos-proyectos-entretenidos-de-codigo-abierto/index.md deleted file mode 100644 index c89eefed2..000000000 --- a/content/blog/algunos-proyectos-entretenidos-de-codigo-abierto/index.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "Algunos proyectos entretenidos de código abierto" -slug: algunos-proyectos-entretenidos-de-codigo-abierto -date: 2020-01-10 -author: Rainer Palm -tags: [código, proyectos] -categories: [ciencia abierta, código abierto] -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Alrededor del mundo, gracias a la importancia del sector tecnológico a nivel global, existe una gran cantidad de programadores, todos con sus destrezas, afinidades y aspiraciones particulares que hacen de sus proyectos colaborativos algo interesante y único, contribuyendo con su toque personal. Debido a la gran prevalencia de prácticas de código abierto en plataformas tales como Github, utilizadas por la mayoría de los desarrolladores de software existentes, se puede ver en ocasiones cómo el proceso mediante el cual proyecto se llevó a cabo y cómo pensaron respecto a ciertos problemas que se presentaron, cómo previeron cada mínimo detalle necesario para reproducir y crear de manera independiente el producto final, ya sea una pieza de software, un diseño de hardware, o inclusive algo tan común pero no menos importante como lo es una foto o un sonido, reproducibles en todo sentido de la palabra. - - - -Todo esto puede hacer el proceso de ver que tipos de proyectos la gente ha realizado, algo bastante interesante, inclusive más allá de la útilidad que el producto final te podría aportar. Ver como otros desarrolladores han pensado en torno a problemas específicos es algo que puede resultar increíblemente productivo a la larga, ya que te permite reconfigurar tu mente y encontrar métodos de resolución de problemas en los cuales quizás no hayas pensado, y quizás te des cuenta de que existen otros problemas en la forma en la que comunmente planteas tu flujo de trabajo. - -Para encontrar cualquier cantidad de proyectos increíbles en todo tipo de áreas (ya sea inteligencia artificial, ingeniería eléctrica, la física, los videojuegos o el procesamiento de imágenes y sonido) solo hace falta un poco de curiosidad y algo de tiempo libre. A pesar de que existen muchas iniciativas que pueden llegar a parecer algo sencillas o no muy claras, hay muchas personas cuyo trabajo está lleno de pasión, y realmente se merece tu atención. Desde lectores digitales de tinta electrónica D.I.Y. hasta inteligencia artificial que compone canciones basadas en tu estilo, te sorprenderá la cantidad de creatividad que pueden mostrar. - -## Handmade Hero - -Handmade Hero[1] es un proyecto en marcha que intenta "crear un juego completo, de calidad profesional, acompañado por videos que expliquen cada línea de su codigo fuente". Se trata de directos de dos horas cada uno, hasta la fecha, han habido 609, mediante los cuales el programador (Casey Muratori) explica paso a paso cómo él crea un juego desde cero, desde la creación del entorno de programación en el cual se va a compilar el coóigo, pasando por una multitud de temas relacionados a escritura de código multiplataforma, salida de sonido, arquitectura del juego, manejo de memoría, renderización de gráficos, procesos de debugging, uso de OpenGL, voxeles, entre muchos otros más. En cuanto se lance el juego al mercado, éste se venderá junto al código fuente, el cual estará disponible bajo una licencia de acceso público después de dos años. - -## The Open Book - -The Open Book[2] es un proyecto disponible en GitHub que busca crear una alternativa completamente libre y abierta a aquellos dispositivos que están especializados para la lectura de libros y otros documentos digitales. Tal como lo plantean en la pagina del proyecto: "Los libros están entre los documentos más importantes de nuestra cultura, pero aún asi, todos los dispositivos de lectura - el Kobo, el Nook, la Kindle e inclusive el iPad son todos dispositivos cerrados, operando como piezas pequeñas autónomas de plataformas grandes y cerradas cuyos dueños no suelen tener los mismos intereses que sus lectores". Para este propósito, el Open Book esta diseñado de tal forma que el usuario pueda fácilmente añadir o quitar accesorios o pedazos de código según sea adecuado para sus necesidades, y tiene una documentación extensa en la cual se detalla tanto la preparación del circuito Arduino como las piezas necesarias y cómo ensamblarlas. - -## LifeTrac - -Formando parte de la iniciativa Open Source Ecology[3], como parte de un conjunto de modelos abiertos (llamado GVCS, o Global Village Construction Set[4]) que buscan ofrecer versiones de libre acceso de "aquellas 50 máquinas que se requieren para que exista la vida contemporánea", el LifeTrac[5] se trata, tal como su nombre lo indica, de un tractor multipropósito completamente abierto y de bajo costo. Resalta, además, por su diseño modular, con motores desmontables y partes que se comparten entre las demas máquinas de este conjunto, permitiendo que tenga la habilidad de 'cambiar' de forma rápida entre éstas. Este acercamiento al modelo le otorga además una vida útíl más larga debido a que le da una mayor facilidad de reparación. En su wiki ofrecen diagramas y planos detallados que permiten a cualquiera con las herramientas adecuadas fabricar cada pieza y ensamblarla sín restricción alguna respecto a su uso. - -## Magenta - -Magenta[6] es un proyecto de investigación multimedia utilizando Python y TensorFlow para "explorar el rol del *machine learning* en el proceso de creación del arte y la música". Similar a otras iniciativas de inteligencia artificial, tales como MuseNet[7], buscan crear algoritmos de entrenamiento y refuerzo profundo para la generación no solamente de archivos de audio, sino también de imágenes, dibujos, y otros materiales, con el propósito no tanto de "estorbar" o quizás "remplazar" artistas y músicos ya existentes, sino simplemente de proporcionarles herramientas inteligentes que actuén como una extensión de su flujo de trabajo actual. Si quieres ver los frutos de su investigación, puedes ver tanto los modelos que han creado hasta ahora en su GitHub como una lista de aplicaciones y demostraciones[8] que han preparado los autores del proyecto, los cuales incluyen un percusionista que genera ritmos basados en las melodías que toques[9], una inteligencia artificial que intenta emular tu estilo de composición[10], y inclusive similares aplicaciones que funcionan como plugins de Ableton Live[11]. - -[1]: https://handmadehero.org/ "Handmade Hero" -[10]: https://magenta.tensorflow.org/midi-me "MidiMe" -[11]: https://magenta.tensorflow.org/studio-announce "Magenta Studio" -[2]: https://github.com/joeycastillo/The-Open-Book "The Open Book" -[3]: https://www.opensourceecology.org/about-overview/ "Open Source Ecology" -[4]: https://wiki.opensourceecology.org/wiki/Global_Village_Construction_Set "Global Village Construction Set" -[5]: https://wiki.opensourceecology.org/wiki/LifeTrac "LifeTrac" -[6]: https://github.com/magenta/magenta "Magenta" -[7]: https://openai.com/blog/musenet/ "MuseNet" -[8]: https://magenta.tensorflow.org/demos/web/ "Web apps built with Magenta.js" -[9]: https://magenta.tensorflow.org/drumbot "DrumBot" diff --git a/content/blog/apache-superset/index.md b/content/blog/apache-superset/index.md deleted file mode 100644 index 9c7565d67..000000000 --- a/content/blog/apache-superset/index.md +++ /dev/null @@ -1,244 +0,0 @@ ---- -title: "Crea una aplicación web eficiente y atractiva para el manejo, exploración y visualización de datos con Apache Superset" -slug: apache-superset -date: 2022-10-26 -author: Yurely Camacho -tags: [apache superset, datos, visualización de datos, dashboard] -categories: [ciencia de datos, SQL] -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - -Fuente:[Apache Superset](https://superset.apache.org/) - -Si eres analista o científico de datos, investigador, trabajas en un -equipo de inteligencia de negocios o simplemente estás buscando una -plataforma atractiva que te permita explorar y visualizar tus datos de -manera rápida y eficiente a gran escala; aquí te presentamos Apache -Superset. Conoce con nosotros sus características más importantes, las -funcionalidades que ofrece, algunas empresas que lo utilizan y cómo -hacer tu primer gráfico y dashboard. - - - -## ¿Qué es Apache Superset? - -Es una plataforma moderna muy utilizada en equipos de inteligencia de -negocios. Una aplicación web de código abierto implementada en Python -que está en período de incubación en [The Apache Software Foundation -(ASF)](https://www.apache.org/) y es patrocinada por [Apache -Incubator](https://incubator.apache.org/). Cuenta con una interfaz -simple y permite al usuario crear y compartir dashboards, explorar, -filtrar y organizar datos a gran escala, esto significa que puedes -modificar la aplicación según tus necesidades. - -Esta iniciativa comenzó en Airbnb en 2015 como un proyecto de hackathon -y se unió al programa Apache Incubator en 2017. Para 2021, la Apache -Software Foundation anunció que Superset era un proyecto de alto nivel. -Puedes encontrar el proyecto alojado en -[GitHub](https://github.com/apache/superset). - - -## Características y funcionalidades - -- Es intuitivo y rápido. - -- Brinda una amplia variedad de opciones de gráficos y consultas que - facilitan la exploración y visualización de datos. Así como la - creación de reportes. - -- Es utilizado por usuarios con todo tipo de conocimientos. No necesitas - ser experto en programación o SQL para usarlo. - -- Permite la creación de dashboards interactivos y gráficos sin escribir código. - -- Es compatible con la mayoría de fuentes de datos basadas en SQL a - través de SQLAlchemy, entre ellas: [Amazon - Redshift](https://aws.amazon.com/es/redshift/), - [druid](https://druid.apache.org/), - [ClickHouse](https://clickhouse.com/), - [databricks](https://www.databricks.com/), - [MySQL](https://www.mysql.com/), - [SQLServer](https://www.microsoft.com/en-us/sql-server), - [SQLite](https://www.sqlite.org/index.html), - [PostgreSQL](https://www.postgresql.org/), entre otras. Puedes - consultar esta [lista con todas las fuentes de datos que soporta - Superset](https://superset.apache.org/docs/databases/installing-database-drivers/). - -- Ofrece un entorno llamado **SQL Lab** que permite hacer consultas SQL - para la exploración de los datos antes de la representación gráfica. - -- Proporciona un sencillo e intuitivo constructor de visualizaciones sin - código que te permite personalizar tus gráficos. - -- Tiene una arquitectura nativa de la nube. Permite escalar a grandes - entornos distribuidos y funciona bien dentro de contenedores. Es - flexible y permite elegir el servidor web, motor de base de datos, - cola de mensajes, backend de resultados y capa de almacenamiento en - caché. - -- Su instalación y configuración es rápida. - -- Permite trabajar con grandes configuraciones de *data lake* y *data warehouse*. - -- Brinda un modelo de seguridad con reglas complejas que pueden - configurarse de acuerdo a quién puede acceder y a qué características. - -- Tiene la posibilidad de añadir plugins de visualizaciones personalizados. - -Hemos visto una gran cantidad de ventajas y funcionalidades que ofrece -Superset. Debido a esto, existe una gran variedad de industrias y -empresas que lo utilizan en sus tareas, entre ellas se encuentran: -[Airbnb](https://es.airbnb.org/), [American -Express](https://www.americanexpress.com/), -[Netflix](https://www.netflix.com/ve/), [Udemy](https://www.udemy.com/), -[Twitter](https://twitter.com/). Puedes consultar una lista más amplia -[aquí](https://github.com/apache/superset/blob/master/RESOURCES/INTHEWILD.md) - -## EpiGraphHub: un ejemplo de Superset - -[EpiGraphHub](https://dash.epigraphhub.org/superset/welcome/) es una -aplicación web para el manejo y visualización de datos de salud pública. - -![EpiGraphHub](EpiGraphHub.jpg) -Fuente:[EpigraphHub Superset](https://dash.epigraphhub.org/superset/welcome/) - -Allí puedes crear una cuenta o ingresar con la cuenta de invitado para -la cual el usuario y la contraseña es *guest*. EpiGrapHub Superset te -ofrece una variedad de dashboards referentes, entre otras cosas, a datos -de COVID en distintos países y continentes. Allí se visualizan -características importantes en cada caso (sexo, fecha, grupos de edad, -número de casos positivos, división política, estado de salud, entre -otras). Podemos explorar estos datos a través de sus servidores. - -A continuación te mostramos un dashboard en el Superset de EpiGraphHub. - -![Superset](Superset.jpg) -Fuente:[EpigraphHub Superset](https://dash.epigraphhub.org/superset/welcome/) - -Puedes conocer más sobre EpiGrapHub en nuestro artículo: [EpiGraphHub: -un proyecto de código abierto para el análisis de datos de -calidad](https://opensciencelabs.org/blog/epigraphhub-un-proyecto-de-c%C3%B3digo-abierto-para-el-analisis-de-datos-de-calidad/) - -## Cómo iniciar con Superset - -A continuación te presentamos algunas formas diferentes de empezar con Superset: - -- Descarga el [código fuente del sitio web de The Apache - Foundation](https://dist.apache.org/repos/dist/release/superset/) - -- Descarga la [última versión de Superset desde - Pypi](https://pypi.org/project/apache-superset/) - -- Configura Superset localmente con un comando usando [*Docker - Compose*](https://superset.apache.org/docs/installation/installing-superset-using-docker-compose/) - -- Descarga el *Docker image* desde - [Dockerhub](https://hub.docker.com/r/apache/superset) - -- Instala la [última versión de Superset desde - GitHub](https://github.com/apache/superset/tree/latest) - -Puedes consultar sobre la instalación y configuración de Superset -[aquí](https://superset.apache.org/docs/installation/installing-superset-using-docker-compose). - -## Una introducción a cómo crear tu primer dashboard - -Si vas a utilizar Superset para tu flujo de trabajo de análisis y -exploración de datos, a continuación te mostramos algunos pasos -necesarios que te permitirán crear un gráfico y guardarlo en un -dashboard en esta aplicación. Puedes consultar un paso a paso más -detallado sobre esto en la [documentación oficial de -Superset](https://superset.apache.org/docs/creating-charts-dashboards/creating-your-first-dashboard/). - -- **Conectar Superset a una nueva base de datos**. Como Superset no - puede guardar los datos, debe conectarse a una base de datos existente - que soporte SQL. Inicialmente debemos añadir las credenciales de - conexión a esa base de datos para poder consultar y visualizar los - datos. - - Este paso puede obviarse si se utiliza Superset localmente a través de - Docker compose. Esto se debe a que está incluida, preconfigurada y disponible una - base de datos Postgres, llamada *examples*. - - Para hacer la conexión, seleccionamos la opción *Databases* del menú - *Data* y seguimos los pasos para crear y probar la conexión. - -- **Registrar una tabla en la base de datos**. Ahora seleccionamos las - tablas específicas (denominadas *datasets* en Superset) que deseemos - explorar. Esto lo hacemos seleccionando la opción *Data*, - luego *Datasets* y nuevo dataset (en la esquina superior derecha). - Seleccionamos la base de datos, el esquema, la tabla y añadimos estos - cambios. - -- **Personalizar las propiedades de las columnas**. Se configuran las - propiedades de las columnas como: tipo de dato, si la columna es - temporal, si debe ser filtrada, si es dimensional, cómo debe tratarla - Superset si es una columna de fecha-hora, entre otras. Esto se hace - para saber cómo deben manejarse las columnas del *dataset* al momento - de la exploración. - -- **Capa semántica de Superset**. Esta capa nos ofrece mejoras como - analistas, puede almacenar 2 tipos de datos calculados: - - 1. *Métricas virtuales*: podemos escribir consultas SQL con funciones - de agregación para varias columnas y colocar los resultados como - nuevas columnas disponibles para la visualización. - - 2. *Columnas calculadas virtuales*: también podemos hacer consultas - SQL que involucren cambios en la apariencia o el comportamiento de - una columna específica, por ejemplo, cambiar el tipo de dato que - almacena. No debemos usar funciones de agregación, como SUM, en las - columnas calculadas. - -- **Crear gráficos en la vista de exploración**. En Superset podemos - explorar los datos utilizando dos interfaces: - - 1. *Explore*: es un constructor de visualizaciones sin código. Es tan - simple como seleccionar el *dataset*, el tipo de gráfico que - corresponda, lo personalizamos y lo publicamos. - - 2. *SQL Lab*: es un IDE (Entorno de Desarrollo Integrado) que nos - permite preparar y unir los datos que son tomados en el flujo de - trabajo de *Explore*. - - Para crear un gráfico, si estamos en la pestaña *Datasets* hacemos - clic en el nombre del dataset y así inicamos el flujo de trabajo de la - vista *Explore*. Aquí se muestra *una vista del dataset* con una lista - de las columnas y las métricas (en el lado izquierdo). También se - observa una *vista previa de los datos* en la parte inferior. Esta - vista contiene las pestañas *Data* y *Customize* (datos y - personalizar, respectivamente), a partir de allí podemos interactuar - cambiando el tipo de visualización, seleccionando distintas métricas - para mostrar los datos y personalizando la estética del gráfico. Cabe - resaltar que cada vez que hacemos un cambio, debemos ejecutarlo - haciendo clic en el botón *RUN* de la parte superior. - -- **Guardar un gráfico en un dashboard**. Luego de crear el gráfico lo - guardamos haciendo clic en el botón *Save* en la parte superior de la - vista. Podemos guardarlo y añadirlo a un dashboard existente o a uno - nuevo. Para publicarlo, hacemos clic en *Save and goto Dashboard*. - Podemos cambiar el tamaño del gráfico, haciendo clic en el botón del - lápiz en la esquina superior derecha. - -Y !Esto es todo! hemos creado un gráfico y lo añadimos a un dashboard en -Superset. Existen muchas opciones de configuración y visualización de -datasets, es cuestión de que comiences a probar y explorar y te -sorprenderás de lo que puedes lograr con esta plataforma. - -### Otros recursos - -- Consulta el - [CONTRIBUTING.md](https://github.com/apache/superset/blob/master/CONTRIBUTING.md) - del proyecto si estás interesado en contribuir. Este contiene también - una guía detallada sobre cómo configurar un entorno de desarrollo. - - -### Referencias - -- [Website de Apache Superset](https://superset.apache.org/) - -- [Documentación oficial de Apache - Superset](https://superset.apache.org/docs/intro/) diff --git a/content/blog/aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta/index.md b/content/blog/aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta/index.md deleted file mode 100644 index 7053e0f2b..000000000 --- a/content/blog/aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta/index.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: "Aspectos clave en el manejo de equipos de ciencia abierta" -slug: aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta -date: 2020-01-20 -author: Rainer Palm -tags: [investigación colaborativa] -categories: [organización, gestión de equipos] -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - -Ya sea por temas de financiamiento, el uso de tecnologías de comunicación más avanzadas, o la necesidad de realizar proyectos interdisciplinarios, la investigación colaborativa es una práctica bastante frecuente. A pesar del enfoque histórico y el tratamiento en medios de comunicación, hacia descubrimientos individuales, y pese a la presencia de ciertos personajes carismáticos, la realidad hoy en día es otra: la gran mayoría de los científicos trabajan dentro de grupos donde los involucrados aportan al resultado final gracias a la retroalimentación constante, por encima de que muchas veces ni siquiera comparten la misma disciplina entre los investigadores vinculados. La eficiencia de la cooperación se hace notar por si sola, y la necesidad de dar resultados rápidos en proyectos cada vez más grandes, requiere de la creación de grupos con flujos de trabajos disciplinados y metodologías ágiles. - - - -Las prácticas de ciencia abierta (libre distribución de la información, disponibilidad de métodos, datos y herramientas usadas, colaboración abierta), son atractivas no solo por cuestiones éticas, sino también porque sirven de maravilla para el problema de organización de equipos. Además del uso de herramientas como Git para compartir código fuente y la información dentro de un grupo pequeño de investigadores para que todos puedan trabajar partiendo del mismo punto, el uso de los recursos compartidos libremente por otros y los posibles aportes o sugerencias de gente interesada en tu investigación puede resultar bastante significativo para tus proyectos. - -¿Cuáles son, entonces, las principales herramientas de una investigación colaborativa de ciencia abierta? Tomando en cuenta que necesitamos rapidez, disciplina, coordinación, y libre disponibilidad y colaboración entre todos los posibles integrantes de nuestro grupo, podemos afirmar que, por lo general, debemos usar las siguientes: - -## Control de versiones - -El uso de software de control de versiones y de plataformas que alojen sus respectivos repositorios en la nube (como Github, Gitlab, Docker, etc.) se ha vuelto bastante esencial tanto para cuestiones de ciencia abierta como para desarrollo de todo tipo de software, desde scripts pequeños de procesamiento de archivos hasta videojuegos o modelado 3D. La seguridad que te otorga el sistema de respaldo, el alojar tus archivos en la nube, y la facilidad con la que te deja colaborar con tus colegas, añadiendo juntos archivos y revisiones al repositorio de una forma orgánica, lo hace una herramienta indispensable para todo tipo de proyecto que utilice código. - -El libre acceso a tus proyectos mediante sus repositorios facilita también las tareas de divulgación de tu trabajo, localización de colaboradores, corrección errores en tu procedimiento, reproducción de tu investigación, y añadir tus proyectos a tu curriculum. - -## Manejo de equipos en tus repositorios - -Muchas plataformas que utilizan control de versiones, suelen ofrecer también herramientas para el manejo de equipos como la creación de cuentas, permitiendo restringir acceso a ciertas carpetas del repositorio, los cambios que hagan otros necesitan aprobación, se pueden asignar miembros del equipo para que revisen los cambios, etc. -Si no posees de manera explícita esta forma organizar tu equipo, te cuento que puede resultarte bastante beneficioso, especialmente si trabajas con colegas en distintas disciplinas. Sitios como Github permiten anexar grupos, establecer una jerarquía clara entre grupos, administrar automáticamente la membresía del equipo de Github mediante un proveedor de identidad (o IdP, tal como Azure AD), además de ofrecer una plataforma donde pueden debatir y discutir. Aprovechar estas herramientas al máximo es crucial a la hora de organizar grupos que no puedan verse en persona. - -## Metodología ágil - -El método ágil se refiere principalmente a un conjunto de prácticas que -implementan los principios descritos en el [manifiesto -ágil](http://agilemanifesto.org/iso/es/manifesto.html), creado en el 2001 por -personas que querían innovar en los modos tradicionales de gestionar proyectos -de software. En términos generales, estas metodologías intentan enfocar el -desarrollo del software hacia las necesidades de las personas y las interacciones -cliente-desarrollador, apuntando hacia la 'entrega temprana y continua de -software con valor'. De esta forma, se logra mantener un desarrollo constante, -funcional y transparente, entregando software funcional regularmente mediante un -flujo de trabajo sencillo y eficaz. - -Existen múltiples implementaciones de este método, una de las más populares siendo [Scrum](https://www.scrum.org/ ), un framework de procesos ágiles diseñado para manejar problemas complejos y adaptativos sin sacrificar valor, creatividad o productividad. Principalmente pensado para equipos pequeños de 10 miembros o menos, reemplaza un acercamiento algorítmico preprogramado, por uno heurístico que valora la capacidad de las personas de adaptarse y auto-organizarse en torno a problemas complejos emergentes. Para este objetivo, busca girar el proceso de trabajo en torno a 'sprints' que duren alrededor de un mes, donde, tras un proceso de planificación, se crea un producto usable (llamado un 'incremento') y se realiza una revisión del sprint. Se trata de una de las más famosas implementaciones gracias a que su efectividad ha sido comprobada empíricamente, para revisar esto puedes revisar el artículo [Scrum and CMMI – Going from Good to Great](https://sci-hub.se/10.1109/agile.2009.31). Scrum es comúnmente utilizado en empresas que desarrollan software, su uso en investigaciones científicas ya está siendo explorado. - -## Entrenamiento en políticas de ciencia abierta - -Uno de los principales problemas a la hora de llevar a cabo proyectos de ciencia abierta es que, debido a su relativa novedad, muchas empresas e instituciones no tienen un esquema de trabajo o de políticas orientadas hacia su logro, mucho menos personas capacitadas en el área que puedan ayudar. Además, una cantidad importante científicos consideran que la forma más práctica de aprender a usar estas herramientas es trabajando con ellas. - -Por lo tanto, es crucial para los proyectos de ciencia abierta capacitar a sus integrantes para desarrollar implementaciones de estas políticas mientras trabajan, basándose en cómo se realizan en otras instituciones (ya sean empresas o gobiernos). Revisando temas de derechos de autor, propiedad intelectual, acceso abierto, o datos de investigación, aclarando la disponibilidad tanto de la investigación como los datos y métodos utilizados. Para leer más sobre esto puede visitar [Open Science overview in Europe](https://www.openaire.eu/member-states-overview) y [Guidelines to the Rules on Open Access to Scientific Publications and Open Access to Research Datain Horizon 2020](https://ec.europa.eu/research/participants/data/ref/h2020/grants_manual/hi/oa_pilot/h2020-hi-oa-pilot-guide_en.pdf). - -## Incentivo a la ciencia abierta - -Muchos científicos pueden tener dudas respecto a los métodos de remuneración o el financiamiento que pueden recibir por una investigación que se ate a principios de ciencia abierta. Actualmente buena parte de la comunidad científica no conoce en detalle el concepto de ciencia abierta, y por lo general se toma el libre acceso a publicaciones como principal requerimiento para que una investigación sea 'abierta'. También, desconocen si las instituciones de investigación y cuerpos de financiamiento tienen lineamientos y directrices en cuanto a acceso libre en cuanto a las publicaciones se refiere. - -Por lo tanto, es necesario para todo grupo u organización interesado en la realización de ciencia abierta establecer reglas y políticas claras, y altamente recomendado que establezcan incentivos (tales como criterios de contratación que busquen individuos anteriormente involucrados en investigaciones abiertas o incorporación de ciencia abierta en el desarrollo, apoyo y evaluación de personal científico, que son recomendaciones de una organización danesa, [National Platform Open Science](https://www.openscience.nl/)) para integrar mas investigadores dentro de esta esfera. - -Un artículo donde puedes leer más al respecto es [Open science report: How to provide the skills researchers need?](https://www.zbw-mediatalk.eu/2017/08/report-wie-bekommen-forschende-die-qualifikationen-fur-open-science/). - -## Referencias - -- Manifiesto por el Desarrollo Ágil de Software. (s. f.). http://agilemanifesto.org/iso/es/manifesto.html -- Home. (s. f.). Scrum.org. https://www.scrum.org/ -- Jakobsen, C. R., & Sutherland, J. (2009). Scrum and CMMI Going from Good to Great. 2009 Agile Conference. doi:10.1109/agile.2009.31 -- Open Science overview in Europe. OpenAire. https://www.openaire.eu/os-eu-countries -- "Guidelines to the Rules on Open Access to Scientific Publications and Open Access to Research Datain Horizon 2020" https://ec.europa.eu/research/participants/data/ref/h2020/grants_manual/hi/oa_pilot/h2020-hi-oa-pilot-guide_en.pdf -- Fingerle, B. (2022, 25 marzo). Open Science Report: How to Provide the Skills Researchers Need? ZBW MediaTalk. https://www.zbw-mediatalk.eu/2017/08/report-wie-bekommen-forschende-die-qualifikationen-fur-open-science/ -- Open Science – Nationaal Programma Open Science. (s. f.). https://www.openscience.nl/ diff --git a/content/blog/caracteristicas-y-tips-utiles-que-te-ayudaran-sacar-el-maximo-provecho-de-conda/index.md b/content/blog/caracteristicas-y-tips-utiles-que-te-ayudaran-sacar-el-maximo-provecho-de-conda/index.md deleted file mode 100644 index eb4b8edd6..000000000 --- a/content/blog/caracteristicas-y-tips-utiles-que-te-ayudaran-sacar-el-maximo-provecho-de-conda/index.md +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: "Características y tips útiles que te ayudarán a sacar el máximo provecho de CONDA" -slug: caracteristicas-y-tips-utiles-que-te-ayudaran-sacar-el-maximo-provecho-de-conda -date: 2020-12-14 -author: Yurely Camacho -tags: [conda, empaquetado, paquetes, entorno virtual] -categories: [ciencia abierta, código abierto, desarrollo de software, DevOps] -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Si posees algún conocimiento sobre conda o visitaste anteriormente -nuestro artículo sobre Cómo instalar y comenzar a utilizar Conda (enlace -a artículo) donde dimos una breve definición sobre este potente gestor -de paquetes y entornos; puedes ahora, con el presente post, nutrirte de -más información pues mencionamos algunas características y -recomendaciones para que conozcas los usos de conda y puedas usarla de -manera eficiente y sin complicaciones. - - - -**Si usas Conda** - -- Puedes crear y configurar entornos virtuales solo con teclear unos - pocos comandos. Te recomendamos crear un entorno virtual para cada - proyecto que ejecutes o cada actividad donde los requerimientos sean - distintos. Específicamente el comando que permite crear el entorno es - `conda create --name nombre_entorno python x.x`, donde x.x es la versión - de python que deseas correr en ese entorno. - -- Este gestor analiza tu entorno actual, en lo referente a los paquetes - instalados y a las limitaciones de versión de los paquetes que - especifiques y analiza la forma de instalar dependencias compatibles. - Si esto no es posible, te informa que no puede ejecutar tu petición. - Esta es una ventaja muy importante en comparación con otros gestores - de paquetes como [pip](https://pip.pypa.io/en/stable/), el cual - instala el paquete que especifiques y sus dependencias, sin antes - verificar cualquier inconveniente que pueda llegar hasta dañar otros - paquetes. - -- Puedes abreviar muchas opciones de los comandos que usas con - frecuencia las cuales están precedidas por dos guiones (--) a sólo un - guión y la primera letra. Por ejemplo, `--name` y `-n`, `--envs` y - `-e` son lo mismo, es decir, si escribes uno u otro se ejecuta la - misma acción. - -- Para consultar los entornos virtuales que haz creado, ejecuta el - comando `conda info --envs`. Si tienes varios creados, el que aparezca - con un asterisco (\*) al lado del nombre es el que tienes activado - actualmente. - -- Para trabajar en cualquiera de los entornos virtuales que tengas - disponibles debes primero activarlo. Esto se realiza con el comando - `conda activate nombre_entorno` y cuando necesites salir del entorno - ejecuta `conda deactivate`. - -- Si deseas remover un paquete específico del entorno de trabajo actual, - ejecuta el comando `conda remove nombre_paquete` y si deseas eliminar - un paquete de otro entorno entonces ejecuta `conda remove -n nombre_entorno nombre_paquete`. - -- Para ver una lista de los paquetes que tienes instalados en el entorno - actual ejecuta `conda list` y para consultar los paquetes instalados - en otros entornos teclea `conda list -n nombre_entorno`. También - puedes acceder a la ayuda de los comandos de conda tecleando `--help` - o `-h` al final del comando. Por ejemplo, para mostrar la ayuda de - cómo instalar un paquete ejecuta `conda install -h`. - -- La documentación oficial de conda proporciona gran variedad de - comandos de conda para que puedas manejar paquetes y entornos - virtuales, accede a esta información en [este - enlace](https://docs.conda.io/projects/conda/en/latest/commands.html). - En los enlaces de la página señalada encontrarás ayuda para cada uno - de los comandos. - -- Recomendamos que accedas a [Bioconda](https://bioconda.github.io/), un - canal popular de conda que ofrece una gran variedad de distribuciones - de software para biología computacional. - -- Si te surgen dudas sobre el significado de algunas palabras referentes - a lo que es y lo que hace conda, puedes acceder a este - [Glosario](https://docs.conda.io/projects/conda/en/latest/glossary.html#) - para aclararlas. - -A continuación encontrarás enlaces con información y comandos que te -serán de gran ayuda para el manejo de paquetes y entornos virtuales con -conda. - -- [Cheat sheets de terceros](https://kapeli.com/cheat_sheets/Conda.docset/Contents/Resources/Documents/index) - -- [Cheat sheets de Continuum Analytics, compañía creadora de conda](https://docs.conda.io/projects/conda/en/latest/_downloads/843d9e0198f2a193a3484886fa28163c/conda-cheatsheet.pdf) - -En OpenScienceLabs te invitamos a indagar y a que comiences a usar -conda. Con la ayuda de este post y los recursos que hemos señalado, -estamos seguros que sacarás el mayor provecho de conda en tus proyectos. - -### Referencias - -- [Documentación Conda](https://conda.io/en/latest/) diff --git a/content/blog/ciencia-abierta/index.md b/content/blog/ciencia-abierta/index.md deleted file mode 100644 index 203b1c5cc..000000000 --- a/content/blog/ciencia-abierta/index.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "5 proyectos de inteligencia artificial que te sorprenderán" -slug: ciencia-abierta -date: 2021-02-08 -author: Rainer Palm -tags: [datos] -categories: [ciencia abierta, ciencia de datos, inteligencia artificial] -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - -Una de las areas de investigación mas prometedoras de la ultima decada es sín duda la inteligencia artificial. No solamente reune una increible cantidad de regiones del conocimiento que, superficialmente, son demasiado dispares (tales como la filosofía de la mente, la psicología, la biología, la robotíca, la lógica pura, entre muchas otras), sino que también los resultados de sus publicaciones se vuelven relevantes de forma retroactiva para las areas de la ciencia de cuya historia se nutre. El estudio y la utilización de las redes neuronales y el aprendizaje automático (o machine learning) ha demostrado ser increiblemente utíl no solamente a la hora de realizar investigaciones regulares con estas tecnícas, sino también para crear nuevas herramientas de simulación y experimentación, tanto para uso científico como el particular o comercial. - -Aunque el machine learning aun tiene sus problemas y misterios por resolver, ya como area de investigación ha producido muchos hallazgos y descubrimientos de increible importancia para la ingeneria de sistemas y demás areas relacionadas con la informatica. Ya para aquellos que trabajan día a día haciendo experimentos con librerias tales como [TensorFlow](https://www.tensorflow.org/) se vuelve una cuestión de suma importancia el andar pendiente de que nuevos artículos se publican o que nuevas aplicaciones se descubren para el machine learning, por no decir de que nuevas e increibles mejoras se podrían realizar a proyectos anteriores, tales como los llamados 'deep fake'. - -Muchas de las herramientas desarrolladas con inteligencia artificial poseen codigo fuente y bases de datos libremente disponibles para el publico. Ya sea para fines comerciales o simplemente como demostración, estan aquellas que a su vez poseen una aplicación web mediante la cual puedes interactuar con los scripts de una forma directa, realizando manipulación y generación de audio, imagenes o demás de una forma directa y sencilla, pero no por eso menos eficaz. De esta manera los usuarios pueden ver el funcionamiento del programa sin necesidad de compilarlo o de que el autór cree demostraciones, además que ayuda a difundir el proyecto si se permite la creación de contenidos independientes. - -## Tacotron2: Generación de audios donde se leen textos con las voces de personas reales - -[Tacotron2](https://github.com/Rayhane-mamah/Tacotron-2) se trata de una implementación por TensorFlow de una arquitectura de redes neuronales profunda que busca sintetizar habla a partir de texto. Enlazada a un modelo generativo de formas de ondas llamado WaveNet, el cual fue utilizado anteriormente para el mismo proposito, Tacotron2 entrena la red neuronal utilizando una base de datos de voces anteriormente grabadas para crear espectrogramas en la escala Mel, lo cual a su vez permite su utilización para emular las voces de personas vivas o inclusive ya muertas, dado que tengan la suficiente cantidad de grabaciones disponibles. Los resultados son impresionantes, y se pueden ver, por ejemplo, en el canal de YouTube llamado [Vocal Synthesis](https://www.youtube.com/channel/UCRt-fquxnij9wDnFJnpPS2Q), donde se leen copypastas y demas textos con las voces de Ronald Reagan, The Notorious B.I.G., Ayn Rand, o inclusive la Reina Elizabeth, o en el sitio [fifteen.ai](https://fifteen.ai/), donde se pueden generar audios con las voces de personajes de series animadas. - -## Animación de imagénes a partir de un video - -En el paper [First Order Motion Model for Image Animation](https://aliaksandrsiarohin.github.io/first-order-model-website/) creado por Siarohin et al. en el 2019, se demostró un framework que permite la creación de animaciónes a partir de una imagén base "fuente" y un video que "conduce" la animación, mediante el entrenamiento de una red neuronal con videos de una misma 'categoria'. Lo que esto permite es realizar cosas tales como cambiar las caras de las personas presentes en una grabación por las de otras, alterar el estilo de una animación, cambiar la ropa que tiene puesta una persona en un video, entre otras. Como te podrás imaginar, esto permite la creación tanto de deepfakes o videos promocionales 'falsos' como de otras alteraciones (dar vida a la Mona Lisa, por ejemplo), y es increiblemente convincente con la edición adecuada, como se puede observar en el video suplementario que muestran [First Order Motion Model for Image Animation](https://www.youtube.com/watch?v=u-0cQ-grXBQ). - -## MuseNet: Una red neuronal que 'continua' tu música - -[MuseNet](https://openai.com/blog/musenet/) es un proyecto muy simple: se trata simplemente de una red neuronal profunda que fue creada con el proposito de crear música. Sus creadores afirman que es capaz de crear piezas de 4 minutos con 10 instrumentos distintos, "y que puede combinar estilos desde el country hasta inclusive Mozart o los Beetles". Ya que ha sido entrenada a encontrar "patrones de armonia, ritmo y estilo aprendiendo a predecir el siguiente token en cientos de miles de archivos MIDI", se le puede pedir que, por ejemplo, utilize las primeras 6 notas de un Nocturne de Chopin para generar una pieza con una instrumentación pop rock, el cual es un ejemplo que se ve en la pagina. Además, OpenAI permite que cualquiera pruebe la generación de audio mediante esta red desde la pagina del proyecto para que cualquiera cree nuevas composiciones. - -## Una inteligencia artificial que 'mira' a traves de las paredes mediante señales WiFi - -En este paper [RF-Pose](http://rfpose.csail.mit.edu/#Paper) publicado por Zhao et al. se presenta una aplicación llamada RF-Pose que analiza las señales radio en las frecuencias WiFi, aprovechandose que estas señales inalambricas traspasan las paredes y se reflejan del cuerpo humano, para estimar poses 2D. Para estimar la pose, unicamente es necesaria la señal inalambrica, siendo aspectos relevantes del individuo tales como altura o anchura predichos a partir de esta. Por lo tanto, aunque sea igualmente eficaz para predecir poses 2D como lo es la visión humana, la diferencia radica en que es capaz de predecir estas inclusive si su 'vision' esta siendo interferida por un obstaculo, tal como una pared. Los resultados en [AI Senses People Through Walls](https://www.youtube.com/watch?v=HgDdaMy8KNE) llegan a ser asombrosos, y a la vez, algo perturbadores. - -## Detección de cancer de seno mediante un sistema de inteligencia artificial - -La mamografía es la principal herramienta que tienen los medicos a mano para identificar y prevenir el cancer de seno antes de que síntomas mas serios ocurran. Sin embargo, exige que hayan expertos que identífiquen y interpreten dentro de las imagenes generadas por este proceso ciertas anormalidades, lo cual esta sujeto al error humano y, por lo tanto, sufre de tasas subóptimas de falsos positivos y negativos. Por lo tanto, en este paper [International evaluation of an AI system for breast cancer screening](https://deepmind.com/research/publications/International-evaluation-of-an-artificial-intelligence-system-to-identify-breast-cancer-in-screening-mammography) publicado por Etemadi et al. en el 2020 se buscó crear un sistema que utilizara la inteligencia artificial para ayudar a los medicos a identíficarlo, y sorprendentemente, se encontro que el sistema no solamente funcionaba, sino que reducia los errores de manera significativa, aunque obviamente no era immune a ellos. También, los autores creen que con este tipo de sistemas se podrían realizar de una forma mucho mas eficaz esta detección en los paises que no posean los recursos necesarios para realizarla en números mayores. - -## Referencias - -- [TensorFlow](https://www.tensorflow.org/) -- [Tacotron2](https://github.com/Rayhane-mamah/Tacotron-2) -- [Vocal Synthesis](https://www.youtube.com/channel/UCRt-fquxnij9wDnFJnpPS2Q) -- [fifteen.ai](https://fifteen.ai/) -- [First Order Motion Model for Image Animation](https://aliaksandrsiarohin.github.io/first-order-model-website/) -- [First Order Motion Model for Image Animation](https://www.youtube.com/watch?v=u-0cQ-grXBQ) -- [MuseNet](https://openai.com/blog/musenet/) -- [RF-Pose](http://rfpose.csail.mit.edu/#Paper) -- [AI Senses People Through Walls](https://www.youtube.com/watch?v=HgDdaMy8KNE) -- [International evaluation of an AI system for breast cancer screening](https://deepmind.com/research/publications/International-evaluation-of-an-artificial-intelligence-system-to-identify-breast-cancer-in-screening-mammography) diff --git a/content/blog/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-markdown/index.md b/content/blog/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-markdown/index.md deleted file mode 100644 index c56a753ba..000000000 --- a/content/blog/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-markdown/index.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: "Cinco cosas que no debes olvidar al trabajar con Markdown" -slug: cinco-cosas-que-no-debes-olvidar-al-trabajar-con-markdown -date: 2020-01-24 -author: Yurely Camacho -tags: [markdown] -categories: [ciencia de datos] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - -Si eres una persona que escribe constantemente artículos para blogs o informes, utilizando para ello editores de texto convencionales, detente en este momento y pregúntate: ¿Qué pasaría con todo el trabajo que he venido -escribiendo con mi editor de texto si ya no pudiera volver a utilizarlo? ¿Te asusta verdad?, y si no es tu caso imagínate, ¿si esto le ocurre a una persona que por años ha estado escribiendo un libro? Para combatir esa incertidumbre, puedes comenzar a escribir en texto plano y darle formato con la ayuda de **Markdown**. - - - -Markdown es una herramienta creada en 2004 con la finalidad de convertir (**texto plano**)[https://es.wikipedia.org/wiki/Archivo_de_texto] a formato HTML (HyperText Markup Language)[https://es.wikipedia.org/wiki/HTML], usando para ello una serie de caracteres en diferentes casos, guiones o asteriscos por ejemplo, para iniciar una lista, entre otros. También es denominado como un (**Lenguaje de marcado**)[https://es.wikipedia.org/wiki/Lenguaje_de_marcado] que emplea texto plano y te permite obtener texto con formato, esto es, títulos, imágenes, negritas, cursivas, enlaces, entre otros. Markdown combina las ventajas que proporciona el texto plano con la necesidad de darle formato a lo que escribes y reducir los inconvenientes si la finalidad es exportar el contenido a la web. - -Cuando te encuentres con un archivo `.md` significa que está escrito en Markdown. Puedes escribir texto en Markdown en cualquier editor (por ejemplo, en Windows con el Bloc de notas). El proceso de transformar o interpretar el Markdown a formato HTML, PDF u otro tipo de formato, se realiza con editores de texto creados específicamente para manejar este lenguaje. Los cuales están disponibles para que trabajes online u offline. - -Esta herramienta está siendo ampliamente utilizada en la actualidad por las personas que escribimos artículos para la web regularmente. Y te decimos *escribimos* porque los artículos de este blog están editados con Markdown. - -A continuación vamos a mencionar, sin orden de importancia, cinco cosas que no debes olvidar al trabajar con Markdown: - -## 1. Existen editores para cualquier sistema operativo (SO) - -El sistema operativo de tu computador, ya sea Windows, Linux o Mac OS, no es una limitante para usar Markdown. Puedes leer o editar texto en Markdown donde quieras o usar estos útiles editores que te sugerimos, que van destinados a usuarios iniciados y profesionales en el uso del lenguaje: - -### Para trabajar online - - -- [**Dillinger**](https://dillinger.io/) -- [**StackEdit**](https://stackedit.io/) - - -### Según el Sistema Operativo - - -- [**Typora**](https://www.typora.io/) (cualquier SO) -- [**WriteMonkey**](https://writemonkey.com/) (Windows) -- [**Laverna**](https://laverna.cc/) (cualquier SO) -- [**Haroopad**](http://pad.haroopress.com/) (cualquier SO) -- [**Caret**](https://caret.io/) (cualquier SO) -- [**ReText**](https://github.com/retext-project/retext) (Linux) -- [**Boostnote**](https://boostnote.io/) (cualquier SO) -- [**Mark Text**](https://marktext.app/) (cualquier SO) -- [**VSCode**](https://code.visualstudio.com/) (cualquier SO) - -## 2. Dile adiós a la engorrosa sintaxis HTML - -Si aún no utilizas Markdown, puedes comenzar ahora mismo, su sintaxis es simple y legible. Sabemos que al escribir en HTML estamos propensos a cometer errores debido a las famosas etiquetas de apertura y cierre y a la legibilidad en la estructura del texto. Incluso puedes emplear Markdown sin tener conocimientos sobre HTML. Atrévete, sácale provecho al uso de este lenguaje quedarás impresionado. - -## 3. Puedes hacer diferentes cosas - -El Markdown no es solamente usado para escribir y publicar artículos en la web. Puedes implementarlo para distintas tareas, tales como: tomar notas y apuntes, escribir informes, un libro, tesis, foros, entre otros. -## 4. Accesible y compatible - -Puedes trabajar con Markdown en editores online y offline, como te mencionamos anteriormente. Por tal motivo, puedes acceder y editar archivos `.md` desde distintos dispositivos: tablets, computadores de escritorio, teléfonos inteligentes. Puedes leer este tipo de archivos de texto independientemente del editor, esto quiere decir que Markdown es compatible con otros formatos. De la misma manera, puedes ejecutar código, comentarlo y escribir texto en Markdown al mismo tiempo. Por ejemplo, utilizando Cuadernos de Jupyter o RMarkdown, entre otras herramientas. - -Si deseas conocer más acerca de los cuadernos de Jupyter, te invito a que revises nuestro artículo [¿Ya has probado los Cuadernos de Jupyter? Te explicamos qué son y cómo te ayudarán en tu próxima investigación.](https://opensciencelabs.org/blog/ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion/). - -## 5. Usando caracteres le das formato al texto - -Así como lo acabas de leer, el formato en archivos Markdown se especifica mediante algunos caracteres como #, \*, -, !, (), [], "", ?, entre otros. Por ejemplo, si al comienzo de una línea dejas un espacio, luego de colocar una almohadilla (#) se activa el formato de título, donde el número de almohadillas seguidas indica el nivel del título. Asimismo, si escribes una palabra entre asteriscos el resultado de la conversión a HTML es la palabra en cursivas, si la encierras con dos asteriscos en negrita y tres en negrita y cursiva a la vez. Estos son algunos ejemplos. En los archivos Markdown puedes también añadir enlaces e imágenes a tu escrito. - -Puedes aprovechar desde ahora mismo el potencial de Markdown para tu vida académica y/o profesional, para comenzar cualquier proyecto colaborativo o simplemente tomar apuntes. Hay que resaltar que el usuario final, por ejemplo, las personas que leen tus artículos, no notan que escribes con Markdown. Sin embargo, el lenguaje está pensado para garantizar la comodidad y eficiencia del escritor. - -Acá te dejamos algunos enlaces a manuales e información importante sobre Markdown: - -- Guía breve de Markdown (http://fobos.inf.um.es/R/taller5j/30-markdown/guiabreve.pdf) -- Información sobre Markdown (https://markdown.es/) -- Blog (https://joedicastro.com/pages/markdown.html) - -### Referencias - -[Página del proyecto Markdown, John Gruber](https://daringfireball.net/projects/markdown/) - -[Blog sobre Markdown](https://markdown.es/) (https://markdown.es/editores-markdown/) diff --git a/content/blog/cinco-cosas-que-te-ayudaran-gestionar-mejor-los-datos-de-tus-proximos-proyectos/index.md b/content/blog/cinco-cosas-que-te-ayudaran-gestionar-mejor-los-datos-de-tus-proximos-proyectos/index.md deleted file mode 100644 index fda63ded6..000000000 --- a/content/blog/cinco-cosas-que-te-ayudaran-gestionar-mejor-los-datos-de-tus-proximos-proyectos/index.md +++ /dev/null @@ -1,177 +0,0 @@ ---- -title: "Cinco cosas que te ayudarán a gestionar mejor los datos de tus próximos proyectos" -slug: cinco-cosas-que-te-ayudaran-gestionar-mejor-los-datos-de-tus-proximos-proyectos -date: 2020-01-19 -author: Yurely Camacho -tags: [datos, proyectos, gestión] -categories: [ciencia de datos, investigación abierta] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Los datos se consideran, y así debe ser, la materia prima para realizar -distintas actividades como la investigación, la toma de decisiones -basadas en estadísticas, la divulgación de información, la colaboración -entre proyectos y otras. Por tal motivo si estás manejando datos -(independientemente de la cantidad) lo mejor es garantizar una buena gestión de ellos. - - - -Si estás leyendo esto es porque algo te motivó a conocer más sobre la -gestión de datos y lo que debes poner en práctica para lograrlo. -Comencemos por decir que **gestión de datos** está relacionada con el -manejo de datos durante todo su ciclo de vida, es decir, desde que son -recopilados o tomados de otras fuentes, hasta que se culminan las -operaciones con ellos y/o son depositados finalmente para que sean -utilizados por otros. La gestión de datos comprende una serie de prácticas, procedimientos, -procesos y manejo de sistemas informáticos para ejercer control sobre los -datos disponibles, ya sea en una organización, para un proyecto de -investigación o en cualquier actividad donde la base fundamental sea el -tratamiento de datos. - -En este post no vamos a conocer en profundidad el amplio tema de -la gestión de datos, pero si te daremos algunas sugerencias y recomendaciones -para que, si estás ejecutando un proyecto, estas por iniciar alguno o -hasta ahora tienes pensado hacerlo, puedas gestionar mejor los datos que -se generen en este proceso. Los tips que te mostramos a continuación -están basados fundamentalmente en la gestión de datos de investigación, -pero pueden ser replicados fácilmente en otras actividades donde el -protagonista sean los datos. Comencemos. - -1. **Selecciona y organiza tus datos** - -En cualquier proceso investigativode investigación se reúnen diversos conjuntos de -datos, los cuales en la mayoría de ocasiones son de dimensiones grandes. -El principal objetivo es garantizar que tus datos adopten los principios -[FAIR](https://www.go-fair.org/fair-principles/) (Fáciles de encontrar -(findable), accesibles, interoperables y reusables). Inicialmente -necesitas organizar los datos por carpetas de acuerdo a cada tema que -consideres. Teniendo en cuenta que al final de la investigación te -aconsejamos que tengas una carpeta donde se encuentren los datos -"crudos", datos procesados y resultados. - -Resulta importante que decidas los datos que verdaderamente son -necesarios de preservar a largo plazo y qué datos eliminar, para lo cual -te sugerimos limpiar tus datos y eligir aquellos que pueden ser útiles. -Si en ocasiones necesitas llevar un control sobre todas las operaciones -o cambios en tus datos, puedes utilizar herramientas como Git (enlace a -artículo Git de cero a cien) para llevar un control de versiones. - -2. **Documenta y cita los conjuntos de datos que utilices** - -Al igual que con cualquier recurso bibliográfico, los conjuntos de datos -que utilices en tus proyectos que sean provenientes de terceros, deben -ser citados siguiendo los estándares de acuerdo al tema que estes -tratando. La citación adecuada de los datos de investigación brinda -distintos beneficios, entre ellos: La investigación tiene mayor -publicidad, promueves la reutilización de datos y puedes recibir un -estímulo por usar y publicar los conjuntos de datos. Asimismo puedes -comparar distintas publicaciones que usen el mismo conjunto de datos y -sustentar las conclusiones de los investigadores o encontrar -disimilaridades en los resultados. - -Un tema realmente importante en el mundo de los datos abiertos, el -código abierto, y en fin, en la Ciencia abierta, es el de la -**documentación de los datos**. La tarea de documentar es básicamente -generar, preservar y dar acceso a toda la información sobre el contexto -de los datos, su contenido y estructura, el proceso de generación o -recopilación,la forma como van a ser utilizados (operaciones a ser -realizadas), las transformaciones a las que han sido sometidos, entre -otras operaciones que garanticen su reutilización e interpretación -adecuada, ya sea por parte de las personas que los han creado o por -otras personas interesadas en ello. Sugerimos que esta actividad -comience junto con la investigación, para que no se obvie información -importante. - -No se podría hablar de documentar datos sin mencionar a los -**metadatos**. Podemos referirnos a ellos como *"datos sobre los datos"* -y nos permiten describirlos de forma estructurada y normalizada para lo -cual existen estándares generales y especializados. - -3 **Garantiza la seguridad y la reutilización de los datos** - -Los datos siempre están expuestos a amenazas de seguridad, por ejemplo, -acceso y manejo no autorizado, corrupción del conjunto de datos y -también su pérdida parcial o total. Las siguientes alternativas podrán -ayudarte a proteger tus datos: - -- Contar con un repositorio personal (respaldo) para los datos y el - proyecto general, por ejemplo, utilizando unidades en red dentro de la - institución, un repositorio institucional (si es el caso) o un - repositorio personal (por ejemplo, en GitHub). -- Guardar los datos en la nube. -- Nunca olvides el uso de contraseñas robustas, capaces de resistir - ataques informáticos. - -4 **Guarda tus datos en repositorios** - -Para facilitar el acceso, preservación, reutilización y seguridad de los -datos, te recomendamos que los deposites en repositorios creados para -esto, o puedes crear tu propio repositorio. Esto no excluye la -posibilidad de compartir los datos de tus proyectos de manera informal, -por ejemplo, mediante una solicitud de correo electrónico. Sin embargo, -esta no es la manera adecuada de hacerlo, ya que existen plataformas que -te brindan la posibilidad de que tus datos estén a la disposición de -cualquiera, por ejemplo, [GitHub](https://github.com/). Si usamos estas -herramientas hacemos que otros investigadores puedan utilizar nuestros -datos, o en otros casos hacer que un proyecto de investigación sea -colaborativo (enlace a artículo investigacion_colaborativa e -investigacion_colaborativa con git). - -De la misma manera, puedes depositar tus datos en algunos repositorios -que se encuentran disponibles de acuerdo al tema de estudio, para lo -cual debes informarte sobre sus políticas y tomar una decisión sobre -distintas alternativas que tengas, donde te garanticen los derechos como -recolector de datos y la seguridad de los mismos. - -Si almacenas los datos de tu proyecto en un repositorio puedes conseguir -financiamiento, ya que actualmente crece la cantidad de empresas que -tienen esto como un requisito. Asimismo puedes protegerlos y hacer que -tu tiempo y recursos invertidos estén de alguna manera "compensados". - -5 **Forma parte de la promoción en la apertura y licenciamiento de datos** - -Como se mencionó al inicio, debes garantizar en la medida de lo posible, -que tus datos sigan los principios FAIR. Para promover esa apertura -existen condiciones referentes a la reutilización de un conjunto de -datos, las cuales varían dependiendo del tipo de investigación y de cada -caso en particular. Sin embargo, la ciencia abierta (enlace a artículo -de ciencia_abierta) promueve el máximo grado posible de apertura de los -datos de investigación, esto quiere decir que si tu propósito es "hacer -ciencia abierta" necesitas comenzar por asignar licencias abiertas a tus -datos, o con la menor cantidad de restricciones posibles. - -Las licencias especifican claramente las condiciones bajo las cuales se -pueden reutilizar los conjuntos de datos y las operaciones que se pueden -realizar con estos, además de las condiciones con respecto a la -propiedad intelectual. Existen estándares de -[licencias para la apertura de los datos](https://help.data.world/hc/en-us/articles/115006114287-Common-license-types-for-datasets) -las cuales pueden ser usadas libremente. - -Ya te hemos dado algunas sugerencias para que manejes mejor los datos de -tus proyectos, recuerda que esto puede ser replicado para cualquier tipo -de proyecto que estés realizando o tengas pensado ejecutar. Si continuas -indagando sobre el tema de la gestión de datos, puedes toparte con algo -denominado **Plan de Gestión de Datos**, el cual es un documento formal -donde se plazma toda la información referente a los procesos y tareas a -los cuales serán sometidos los datos durante todo su ciclo de vida. En -resumen, es un documento que debe tomar en cuenta todos los aspectos que -te mencionamos anteriormente. - -Esperamos que te haya servido esta información y de ahora en adelante -comiences a ponerla en práctica en el manejo de datos de tus proyectos. - -**Referencias** - -[Comunidad global de gestión de datos](https://dama.org/) -[Gestión de datos de investigación](https://biblioguias.cepal.org/c.php?g=495473&p=3390849) -[Recomendaciones para la gestión de datos de investigación](http://digital.csic.es/bitstream/10261/173801/1/Maredata-recomendaciones-ESP.pdf) diff --git a/content/blog/cinco-tips-para-aumentar-tu-productividad-con-git/index.md b/content/blog/cinco-tips-para-aumentar-tu-productividad-con-git/index.md deleted file mode 100644 index 414fd1c95..000000000 --- a/content/blog/cinco-tips-para-aumentar-tu-productividad-con-git/index.md +++ /dev/null @@ -1,169 +0,0 @@ ---- -title: "Cinco tips para aumentar tu productividad con Git" -slug: cinco-tips-para-aumentar-tu-productividad-con-git -date: 2020-02-05 -author: Yurely Camacho -tags: [git, ramas, repositorios, cambios] -categories: [desarrollo de software, control de versiones, aprendizaje] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - -En otros de nuestros artículos publicados, te hablamos sobre [Git de 0 a -100](https://opensciencelabs.org/blog/git-de-en-diez-sencillos-pasos/) e -[investigación colaborativa con -Git](https://opensciencelabs.org/blog/investigacion-colaborativa-con-git/). Allí -hemos repasado sobre las bondades de este sistema y su uso actual en la -colaboración en proyectos abiertos, grandes o pequeños, manejándolos con mayor -eficiencia e inspección al ser un sistema de control de versiones distribuido, lo -que indica que cada desarrollador tiene el historial completo de su repositorio -de manera local y existe una copia central. - - - -No solo los desarrolladores de software utilizan Git. Esta herramienta -es útil en los casos donde necesites llevar a cabo proyectos -colaborativos: por ejemplo, si tienes un blog, puedes gestionar los -artículos y almacenarlos en un repositorio de Git. - -En este post te presentamos algunos tips para que tu trabajo en git sea -más productivo, posiblemente, que lo que ha sido hasta ahora. - -1. **Maneja las ramas adecuadamente** - -Como te mencionamos en nuestro artículo [Git de 0 a 100 en diez sencillos -pasos](https://opensciencelabs.org/blog/git-de-en-diez-sencillos-pasos/) puedes -manejar distintas ramas en tu repositorio. En cada rama, se registran todos los -cambios hechos por quienes la utilizan y también puedes realizar operaciones -entre las ramas como su fusión, por ejemplo. Generalmente, las ramas son -empleadas para desarrollar funcionalidades aisladas unas de otras. Por defecto -el repositorio se crea con una rama, denominada "master". - -En el manejo de ramas debes considerar, entre otras cosas, lo siguiente: - -- Cualquier repositorio tiene o debería tener mínimo dos ramas: una - conocida como *master*, que es la rama de producción, y la segunda - rama, que se deriva de master, en la cual se desarrollan nuevas - funciones o se corrigen fallos encontrados en master. A esta rama se - le suele denominar *develop*. - -- Puedes crear ramas derivadas de *develop* para desarrollar otras - funcionalidades y/o corregir detalles de esta rama, suelen denominarse - *features*. - -- En la rama *master* solo deben estar las modificaciones definitivas del - proyecto, es decir, no debes "tocarla" hasta que estés seguro - que los cambios en el proyecto no arrojen problemas al momento de - hacer pruebas. - -- Debes mantener actualizada la rama donde trabajes con la rama de donde se derivó. - -- Evita mezclar cambios de diferentes ramas. - -- Verifica la rama donde te encuentras al momento de editar cualquier - archivo, así evitas realizar cambios y subirlos a la rama equivocada y - afectar el desarrollo de todo el equipo de trabajo. Esto es sumamente - necesario. - -2. **Crea alias para los comandos de git que más utilices** - -Con Git, a diario tecleas cierta cantidad de comandos, algunos que -pueden tornarse repetitivos. Además, esta herramienta no ofrece la -función de autocompletado. Puedes ser más productivo, si creas *alias* -para aquellos que más utilices. El alias es un "nombre" que, en este -caso, le asignamos a un comando de Git para que sea más corto, esto nos -permite ejecutar la misma acción tecleando menos, es decir, nos ayuda a -ahorrar tiempo y son más fáciles de recordar. - -Para fijar alias a los comandos utiliza `git config --global`. Por ejemplo: - -``` -$ git config --global alias.br branch -$ git config --global alias.st status -$ git config --global alias.ci commit -``` - -De ahora en adelante escribes `git br` en lugar de `git branch` y así -para los demás del ejemplo. No existe un estándar para la creación de -alias, todo dependerá de que te sientas a gusto con ellos. A medida que -aumentes tu trabajo con Git, utilizarás frecuentemente otros comandos, -si te sientes a gusto no dudes en crear alias para ellos. - -3. **Juntar commits en uno solo** - -En la mayoría de ocasiones existen proyectos con muchas ramas, varios -colaboradores y, por tanto, muchos commits. Para ahorrar tiempo y hacer el -trabajo menos tedioso, puedes unir los commits. - -Esta alternativa requiere que tomes en cuenta algunas cosas: - -- No se recomienda mezclar cambios de diferentes ramas. - -- Evita, en la medida de lo posible, que los cambios sean de distinto - tipo (por ejemplo, un cambio en un archivo de texto y otro en uno de - código), previniendo inconvenientes si por algún motivo debes luego - deshacer los cambios. - -4. **Puedes utilizar alguna interfaz gráfica para manejar Git** - -Tal vez usar el terminal para gestionar Git puede resultarte al -principio algo complejo, mayormente si estás iniciándote con el control -de versiones. Por eso puede resultarte conveniente emplear algunos -clientes gráficos de Git, para gestionar los proyectos de una forma -visual e intuitiva y acelerar tu trabajo. Muchos de ellos son totalmente -gratuitos, de código abierto y los hay para cualquier sistema operativo. - -En la wiki de Git puedes encontrar una lista más completa de los -[clientes de Git](https://git.wiki.kernel.org/index.php/Interfaces,_frontends,_and_tools#Graphical_Interfaces) - -Las interfaces gráficas se adaptan a distintos flujos de trabajo, es -decir, algunas incluyen más funcionalidades que otras. No obstante, -ninguna puede considerarse mejor que otra, solamente que cada una se -ajusta a las necesidades de los usuarios. Vamos, ¡anímate a usar alguna de ellas! - -5. **Más sobre los commits y otras recomendaciones** - -- Al comenzar una nueva sesión de trabajo, deberías hacer un `fetch` o - un `pull` para traerte los últimos cambios. De esta manera, evitas - conflictos en el futuro al sobrescribir el trabajo de los demás sin - necesidad. - -- Haz commit con frecuencia, no tengas miedo de hacer - commits con cosas sin terminar y que se muestren así en el - histórico. - -- Cada vez que tengas código que deseas guardar puedes hacer commit. Ten - presente que al hacerlo no necesariamente debes hacer un push. - Puedes hacer commits en tu repositorio local para proteger y llevar un - control de tu trabajo. - -- Revisa siempre los cambios antes de subirlos y asegúrate de confirmar - en el commit lo que realmente necesites. - -- El mensaje de commit debe ser conciso pero al mismo tiempo - informativo. - -- No subas cambios directamente a la rama *master*, siempre y cuando no lo - amerite. - -Te hemos presentado algunos tips para que tengas un mejor manejo y mayor -productividad al utilizar git en tus proyectos. Tal vez muchas de ellas -son evidentes; sin embargo, por más mínimas que nos puedan parecer, -debemos tenerlas presentes para evitar molestias en el proyecto y en el -grupo de trabajo y aumentar así nuestra productividad en el control de -versiones con Git. - -**Referencias** - -- [Git Book](https://git-scm.com/book/es/v2) - -- [Domina Git desde cero](https://sargantanacode.es/post/using-git-aliases-to-increase-our-productivity) - -- [Los 10 mandamientos del control de código fuente](https://www.campusmvp.es/recursos/post/los-10-mandamientos-del-control-de-codigo-fuente.aspx) diff --git a/content/blog/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/index.md b/content/blog/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/index.md deleted file mode 100644 index 21e6bf9e7..000000000 --- a/content/blog/code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion/index.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: "Code Abbey una plataforma para mejorar tu habilidad en programación" -slug: code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion -date: 2022-03-22 -author: Ever Vino -tags: [codeabbey, retos de programación] -categories: [programación] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - -Alguna vez te has pregundado, ¿Cómo puedo mejorar mis habilidades de programación?. Este artículo tiene la respuesta, te mostraremos una de las mejores plataformas para que puedas practicar programación resolviendo problemas. - - - -## ¿Qué es Code Abbey ? - ->Creemos que hay tres cosas que nos guían al éxito: Practica, Practica y ¡Practica! - -[Code Abbey](https://www.codeabbey.com/) es una plataforma, impulsada y mantenida por Rodion Gorkovenko con ayuda de la comunidad de Code Abbey, contiene gran cantidad de problemas con dificultad variable, desde una simples sumas, hasta algunas donde tienes que aplicar conceptos de Inteligencia Artificial. -Puedes resolver los problemas en varios lenguajes: C, C++, C#, Python, Java, JavaScript e incluso con algunos menos conocidos como: Turing y Brainf\*\*k. - -## ¿Cómo funciona? - -Puedes registrarte con una cuenta de gmail, facebook o de GitHub. - -![Portada CodeAbbey](codeabbey.png) - -Un vez hecho el **Login** puedes ver los problemas haciendo click en la pestaña **Problems**. -Seleccionado el problema se te abrira la siguiente ventana: - -![Portada CodeAbbey problemas](problems1.png) - -La primera sección podrás ver el enunciado del problema y un ejemplo de entrada y salida de lo solicitado. -Cuando tengas la resolución del problema (script o código), lo haces correr con los datos de entrada del test (**Test Data**). - -![Portada CodeAbbey problemas](problems2.png) - -La solución que arroje tu programa la copias en el espacio vacio de de **You Answer**. Luego le puedes dar click a **Submit**, una vez se haya comprobado que la respuesta es correcta, la resolución del problema será dada como válida. - -Otra forma de verificar que tu código arroja la respuesta correcta es pegar el código a la plataforma en el espacio vacio que encuentra por encima del boton **Submit**, y hacerla correr con los botones que se encuentran en la parte inferior derecha, haciendo click en el botón de tu lenguaje de programación hará correr el script con los datos de test data y escribira la solución en la parte de **Your Answer** y guardará tu código en la plataforma. Es recomendable guardar el código en la plataforma incluso si no haces correr y sólo subes la respuesta manualmente, esto permite la compobracion para lo administradores de Code Abbey de que estas resolviendo los problemas por tu cuenta. - -Una vez tu solución haya sido validada se te añadiran puntos de _Enlightment_ (que están calculados en base a la cantidad de personas que resolvieron el mismo problema) y con base a los problemas resueltos se te asignará un rango dentro de la comunidad. - ->**Zealus Coder rank** -Cuando resuelvas 120 problemas de los marcados con negrita o con la etiqueta c-1, puedes reclamar el certificado de **CodeAbbey Zealous Coder**, que certificará que resolviste los problemas difíciles de la plataforma. -Como forma de motivar a que más mujeres entren al mundo de la programación, Code Abbey da un diploma honorario a las chicas que resuelvan 85 problemas y el rango de **Fanatic Girl-Coder**. - -## ¿Por qué resolver problemas en Code Abbey? - -Muy aparte de la satifacción de resolver problemas, ascender rangos, pertenecer a una comunidad y/o obtener un certificado que puedas presumir en tus redes. Se tiene que tener en cuenta que la resolución de estos problemas, ayudan a afinar tus habilidades en programación, porque para la resolución de los problemas se requieren conocimientos de conceptos básicos, estadística, estructura de datos, algoritmos de busqueda, ordenación, criptografía, teoría de números, entre otros. -Estos problemas, pueden ayudarte a prepararte para entrevistas y/o para mejorar tu propio código, viendo cómo lo han resuelto los demás (esta opción se habilita cuando tu solución sea tomada como válida). - -## ¿Qué hacer cuando un problema es muy complicado? - -Puedes ir a la sección de **Volumes** de la plataforma y darle una leida, y si no basta puedes darle un vistazo a los siguientes recursos: - -* [**CS50X**](https://pll.harvard.edu/course/cs50-introduction-computer-science?delta=0): Curso gratuito, ideal para los que empiezan a programar. -* **Python Crash Course - Eric Matthes**: Libro para iniciantes en python. -* [**Learn X in Y**](https://learnxinyminutes.com/). Recurso web para aprender cualquier lenguaje de programación. -* **Grokking algorithms- Aditya Bhargava**: Libro para preparte en problemas complicados. -* **Craking the Coding interview - Gayle Laskmann**: Libro para preparte en problemas complicados. - -Libros para mejorar tus matemáticas -* **Mathematics for Computer Science - Eric Lehman and Tom Leighton** -* **Introduction to algorithms - Thomas H. Cormen** -* **Algorithm Design - Jon Kleinberg** - -## ¿Sitios similares? - -* [ROSALIND](https://rosalind.info/problems/locations/) Orientado a problemas de programación en Bioinformática. -* [Project Euler](https://projecteuler.net/) Contiene poblemas matemáticos y de programación. -* [algo.is](https://algo.is/) Problemas de competición de programación. -* [exercism](https://exercism.org/) Contiene problemas variados de programación. - -## Referencias -[Code Abbey](https://www.codeabbey.com/) diff --git a/content/blog/como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto/index.md b/content/blog/como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto/index.md deleted file mode 100644 index 474a961ac..000000000 --- a/content/blog/como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto/index.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: "¿Cómo aplicar la investigación reproducible a proyectos de código abierto?" -slug: como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto -date: 2020-03-09 -author: Yurely Camacho -tags: [código, reproducibilidad] -categories: [ciencia abierta, investigación abierta, código abierto] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - -Los avances en la ciencia están fuertemente relacionados con la reproducibilidad en las investigaciones. Resulta muy importante lograr que otras personas puedan reproducir nuestros trabajos. ¡Imagínate la aceptación que tendría una investigación si todos los intentos posteriores de ratificar los resultados fracasan! - - - -De acuerdo con estudios y encuestas online, como la realizada por la revista -internacional semanal sobre ciencia [Nature](https://www.nature.com/) acerca de -la [reproducibilidad en la investigación](https://youtu.be/j7K3s_vi_1Y), más del -70% de los 1576 investigadores participantes en la encuesta, no han podido -reproducir las investigaciones de otros científicos, y más del 50% han fallado -en la reproducción de sus propios experimentos. De allí que el tema de la -reproducibilidad es considerado como uno de los principales retos de los -científicos y de las revistas que publican dichas investigaciones, en especial -para garantizar su veracidad. Otro resultado relevante de dicho estudio, es que -el 52% de los investigadores encuestados respondieron afirmativamente a la -consideración de que, hoy día, hay una significativa *crisis de -reproducibilidad* actual. - -De manera general, consideramos a una investigación como reproducible, si el desarrollo conceptual de la misma tiene adjunto y abierto el *código informático* con la documentación mínima necesaria e instrucciones que permitan repetir los cálculos realizados para obtener los resultados en el documento, es decir, que pueda ser reproducida a partir de los datos originales. Asimismo, permite auditar el procedimiento de cálculo y los métodos estadísticos empleados. Este concepto debe diferenciarse del término replicabilidad, que se refiere a la posibilidad de repetir el mismo estudio con la información proporcionada en la investigación pero con nuevos datos. - -Bajo el enfoque de código abierto y reproducibilidad en las investigaciones, lo que se quiere hacer es que las herramientas implementadas en la investigación y el código generado para el procesamiento de los datos (para aquellas investigaciones que lo generen), sea "abierto" para cualquiera que esté interesado en reproducir nuestra investigación. Recordemos que uno de los principios de la investigación reproducible, mencionado en nuestro artículo [¿Cuáles son los principios de la investigación reproducible?](https://opensciencelabs.org/blog/cuales-son-los-principios-de-la-investigacion-reproducible/), es la *metodología abierta* que, básicamente, busca compartir el procedimiento llevado a cabo antes, durante y después de la investigación, lo cual da confianza a la hora de compartir los resultados y también anima a revisar los pasos de tu investigación y permite a otros verificarlo. - -Otro aspecto valioso a tomar en cuenta si la investigación tiene código y queremos que sea reproducible, es la documentación. Como lo mencionamos en [nuestro artículo sobre Documentación de código abierto](https://opensciencelabs.org/blog/si-ya-usas-codigo-abierto-te-contamos-como-puedes-sacarle-mayor-provecho-tu-documentacion-para-tus-articulos-y-publicaciones/), este es un factor muy importante a la hora de crear proyectos accesibles e inclusivos y también debe considerarse como un aspecto importante para hacer reproducible el proyecto de código abierto. Junto con la documentación resulta necesario listar los requerimientos para la ejecución del código, donde se incluya la especificación de las plataformas para que funcione el código, las versiones de paquetes o dependencias que se requieran para la interpretación y usabilidad del código a mediano y largo plazo, todo esto garantiza el principio de *transparencia* de una investigación reproducible que contiene código. - -Para que un proyecto de código abierto sea reproducible, también debe estar depositado en un repositorio de acceso abierto bajo plataformas como GitLab o GitHub, las cuales permiten llevar un control de versiones sobre las actualizaciones y cambios que se realizan al cabo del tiempo en el proyecto, para que cualquiera pueda conocer su trayecto y pueda o no, colaborar en él. Como lo mencionamos en [nuestro artículo sobre código abierto](https://opensciencelabs.org/blog/que-es-el-codigo-abierto-y-como-puede-ayudarte/) una de las comunidades más grandes de código abierto a nivel internacional es [GitHub](https://github.com/), que nos permite crear y consultar repositorios sobre investigaciones previas, pudiendo necesitar reproducir alguna de ellas o alojar nuestro proyecto para que sea reproducible y colaborativo. - -Bajo el mismo enfoque, la utilización de [cuadernos de Jupyter](https://jupyter.org), por ejemplo, es altamente recomendado porque permite en un mismo espacio, hacer el análisis y a la vez mostrar comentarios sobre los pasos del experimento. La decisión de implementar o no una herramienta, depende de la decisión del investigador, no obstante bajo el pensamiento de ciencia abierta, se debe buscar en la medida de lo posible, que dichas herramientas se encuentren bajo los estándares de esta "forma de hacer ciencia". - -Otro concepto que se maneja en el ámbito de código abierto e investigación reproducible es el de *Software de investigación abierto o Software de investigación de Código Abierto*, que según el [Manual de capacitación sobre ciencia abierta de la -FOSTER](https://book.fosteropenscience.eu/es/) se refiere al uso y desarrollo de software para el análisis, la simulación y la visualización cuyo código fuente completo está disponible, compartiéndose con una licencia que perita su redistribución y modificación. Mediante la implementación de este tipo de software, se garantiza la reproducibilidad en la investigación, poniendo a disposición de cualquiera los datos junto con el código generado en la investigación y permitiendo también la reutilización de este software para otras investigaciones. - -Si haces que tu investigación sea reproducible, poniendo en práctica los elementos que te hemos mencionado en este post, aumentará la probabilidad de aceptación de investigadores, harás que tu código pueda ser ejecutado por otras personas en tareas repetitivas, reducirás el riesgo de errores, facilitarás la colaboración de otros investigadores, la detección de errores y la revisión. Si publicas el código, facilitas la comprensión del artículo y evita malas interpretaciones, aumentarás el impacto de las publicaciones: citas, reconocimiento, reutilización, coautorías, y ahorrarás tiempo y esfuerzo al reutilizar código en otros proyectos. - -Garantiza que tu investigación sea reproducible, no formes parte de la crisis actual de reproducibilidad. ¡Haz la diferencia! - -### Referencias - -- [Ciencia reproducible, qué, por qué, cómo](https://www.revistaecosistemas.net/index.php/ecosistemas/article/view/1178/973) - -- [Manual de capacitación sobre ciencia abierta de la FOSTER](https://book.fosteropenscience.eu/es/) - -- [Nature, reproducibilidad](https://www.nature.com/news/1-500-scientists-lift-the-lid-on-reproducibility-1.19970) diff --git a/content/blog/como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones/index.md b/content/blog/como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones/index.md deleted file mode 100644 index 51113cd62..000000000 --- a/content/blog/como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones/index.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -title: "¿Cómo aplicar los principios de acceso abierto en tus investigaciones?" -slug: como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones -date: 2020-03-30 -author: Anavelyz Perez -tags: [open science] -category: [open access] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Al realizar una investigación estamos sujetos a distintos panoramas en -los cuales nuestro criterio tiene un papel muy importante, porque de -ello va a depender cosas tales como la difusión, edición y evaluación -del proyecto. De acuerdo con esto, los trabajos de investigación han -venido adoptando esquemas formales y estructuras de manera tal que se -conviertan en estándares para todos. Al principio, para lograr esto, se -recurría al asesoramiento de editores que por lo general estaban -adscritos a una revista específica. - - - -Con el paso del tiempo y la inclusión en la sociedad de distintas -herramientas tales como la Internet, han surgido nuevas maneras para que -el investigador o grupo de trabajo publiquen los resultados finales, una -de ellas es la publicación bajo acceso abierto. Este enfoque logra que -los proyectos estén disponibles de forma libre y gratuita, en Internet o -cualquier otro medio. Además se permite copiar, utilizar o distribuir el -contenido de nuestras investigaciones. Cosa que puede no ocurrir bajo -otro enfoque, donde las limitaciones son mayores y los costos de la -investigación tienen una alta probabilidad de aumentar. Asimismo, se -cuenta con personas profesionales dedicadas a editar o algún software -que estandariza el contenido de manera gratuita o a un costo más bajo en -comparación a la forma inicial de las publicaciones. - -En España, por ejemplo, cuando se desea difundir bajo acceso abierto -contamos con dos opciones: ruta verde (repositorios) y ruta dorada -(revistas doradas y revistas híbridas). La ruta verde implica el -depósito y difusión en acceso abierto de resultados de investigación en -repositorios (institucionales, como DIGITAL.CSIC, temáticos, como arXiv, -o generalistas como Zenodo). La ruta dorada hace referencia a la -publicación de artículos revisados por pares en revistas de acceso -abierto [https://digital.csic.es/dc/accesoAbierto.jsp]. - -## ¿Cómo se organiza el acceso abierto? - -El acceso abierto tiene varios principios que permiten que se pueda -llevar a cabo de la mejor manera. Comencemos dándole un vistazo al -principio de promover el conocimiento. - -La **promoción del conocimiento** consiste en lograr que más personas -reciban el mensaje de la investigación, de manera que se fortalezca la -relación entre el bienestar de la población y el conocimiento -científico. - -¿Cómo lo podemos aplicar? A través de actividades, incentivos y difusión -de la información en distintos medios con un lenguaje que todos manejen. -Además de ello, podemos incluir la estrategia de proporcionar -herramientas y asistencia a los académicos para depositar sus artículos -revisados por pares en repositorios electrónicos abiertos. Este proceso -también se fundamenta en los distintos recursos tangibles o intangibles -que se pueden impartir, estos recursos son principalmente revistas y -repositorios. - -Otro principio es la **integración de diferentes disciplinas** tanto en -las investigaciones como de manera individual en repositorios. Esto -implicaría que los archivos publicados estén claramente definidos por el -tipo de disciplina(s) que abarcan. Para aplicarlo se recomienda utilizar -etiquetas que representen con certeza los temas que son tratados en la -investigación. A su vez se tienen algunas investigaciones hechas bajo la -ayuda de varios profesionales de distintas áreas. - -El **respeto de los derechos de autor** y otras herramientas para -garantizar el acceso abierto permanente a todos los artículos que se -publican, son otros principios que se deben tener muy presentes porque -aseguran que los elementos del Acceso Abierto estén en orden y -complementen un buen trabajo. Para aplicar esto se conocen algunos casos -en los que se tienen prácticas de autoarchivo: los investigadores -depositan y difunden documentos en repositorios institucionales o -temáticos. Y como resultado de la segunda estrategia, hemos visto la -creación de revistas de acceso abierto que brindan acceso gratuito a los -lectores y permiten la reutilización de sus contenidos con muy pocas -restricciones. - -El acceso abierto debe brindar, en un contexto general, información para -que logre exponer grandes investigaciones así como, cultivar el -conocimiento en la sociedad a través del tiempo e incentivar el proceso -de investigación futuro. Las herramientas son brindadas por distintas -organizaciones y equipos de trabajo. Casos que lo demuestran son los -diferentes repositorios como: - -* ACS (American Chemical Association) -* arXiv -* BioMed Central -* Cambridge University Press -* Copernicus Publications -* F1000Research -* Frontiers -* IntechOpen -* Knowledge Unlatched -* MDPI -* Open Library of Humanities -* Oxford University Press -* PeerJ. -* Pensoft Publishers -* PLOS ONE -* PNAS -* Royal Society of Chemistry (RSC) -* SCOAP3 -* Springer Open - -Que brindan opciones para que los investigadores puedan hacer visibles sus -resultados. - -Referencias: - -http://bibliotecas.csic.es/publicacion-en-acceso-abierto - -[DIGITAL.CSIC Ciencia Abierta](https://digital.csic.es/dc/accesoAbierto.jsp) - -[Universidad de Jaén](https://libereurope.eu/wp-content/uploads/2017/09/OpenAccess5Principlesposter.jpg) - -[UCRIndex](https://ucrindex.ucr.ac.cr/?page_id=896) - -[Manifiesto de Ciencia Abierta y Colaborativa](https://ocsdnet.org/wp-content/uploads/2015/04/Manifesto-Infographic-Spanish-1.pdf) diff --git a/content/blog/como-documentar-tu-proyecto-de-ciencia-abierta/index.md b/content/blog/como-documentar-tu-proyecto-de-ciencia-abierta/index.md deleted file mode 100644 index df56c7b01..000000000 --- a/content/blog/como-documentar-tu-proyecto-de-ciencia-abierta/index.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: "¿Cómo documentar tu proyecto de ciencia abierta?" -slug: como-documentar-tu-proyecto-de-ciencia-abierta -date: 2020-05-04 -author: Yurely Camacho -tags: [proyectos, documentación] -categories: [ciencia abierta, desarrollo de software] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Para hacer reproducible una investigación y que ésta pueda ser verificada a largo plazo, debes contar con un registro donde tomes nota de todos los pasos realizados durante este proceso, lo cual servirá, al mismo tiempo, para que tu proyecto sea comprensible por personas ajenas a él y así puedan desarrollar algún interés sobre el mismo. A todo el proceso de registro de esa información se le conoce como **Documentación**. - - - -La documentación es una buena práctica de la investigación y es de suma importancia en cualquier proyecto de ciencia abierta. Si no documentamos, al pasar el tiempo las personas tendrán que comenzar de cero y terminarán sin entender el contenido de nuestro proyecto. Además, estando bajo los estándares de la ciencia abierta, el «no documentar» sería una falta grave a sus principios. - -De una manera un poco formal, podemos decir que la documentación es un proceso o una práctica que consiste en registrar y/o informar sobre la ejecución de ciertas tareas en algún tema determinado. La documentación de un proyecto se fundamenta, en última instancia, en la realización de varios documentos explicativos que van a depender del alcance y la temática del proyecto en desarrollo. - -En cualquier proyecto de ciencia abierta que desarrolles o participes, debes tener presente la importancia de contar con una buena documentación que respalde e informe las labores durante todo el proceso, es decir, un registro de actividades, herramientas y recursos que comprende desde la conceptualización del proyecto, planificación, recolección de los datos, herramientas computacionales y recursos utilizados, la metodología del procesamiento de los datos, los resultados, cuadernos de investigación y otros. Esto quiere decir que, en general, debes documentar toda la metodología utilizada en el desarrollo del proyecto, es decir, la manera cómo se va a realizar cada paso dentro de la misma, incluyendo los resultados. - -En lo que respecta a los datos, es necesaria información descriptiva de -los conjuntos de datos utilizados, el código informático resultante de -su procesamiento estadístico (puedes usar -[Jupyter](https://jupyter.org/) para juntar el código informático con -texto), las pautas de la gestión de datos (o propiamente un *Plan de -Gestión de datos*) donde se reflejen la normativa para hacer que el -proyecto se lleve a cabo bajo los estándares de la ciencia abierta -(plataformas de acceso abierto empleadas para la disponibilidad de los -datos, licencia utilizada, entre otras). En pocas palabras te -recomendamos el registro de toda la información referente a la -investigación para lograr, además, que los datos de investigación -cumplan los principios [FAIR](https://www.go-fair.org/fair-principles/), -es decir, sean **localizables, accesibles, interoperables y reutilizables**. - -El proceso de documentación generalmente lo lleva a cabo solo una persona y lo comparte con las demás, o se reparten esta tarea entre varios miembros del proyecto. Sea cual sea la persona que lo hace, los documentos varían a lo largo del tiempo y como deben estar compartidos, te recomendamos usar cualquier opción para el control de versiones con [Git](https://git-scm.com/) -para centralizar la información, implementando también otra herramienta -para la gestión de los documentos como -[Sphinx](https://www.sphinx-doc.org/en/master/). - -La documentación de un proyecto de ciencia abierta, en general, debe estar estructurada de la siguiente manera: una introducción de todos los apartados de la documentación y que sirva como una visión general de todo el contenido incluyendo el problema, enfoque, objetivos, requisitos y producto final. Debe incluir un desglose de las funciones que cada persona tiene dentro del proyecto y las tareas que debe realizar para cumplir los objetivos propuestos, con fechas tentativas de entrega de resultados para llevar un control efectivo de las tareas y sus datos de contacto. Asimismo debe incorporarse en el documento información referente a las herramientas informáticas utilizadas en el proyecto, el tipo de licencia asignada al proyecto, el lugar donde se guardarán los datos (según corresponda) del proyecto, siempre cumpliendo con los principios de la ciencia abierta. Y no debes olvidar incluir toda la información referente a los conjuntos de datos, código informático generado y los resultados obtenidos. - -La documentación no sólo es importante para la reproducibilidad sino que también aumenta la probabilidad que las personas ajenas al proyecto puedan entenderlo, interesarse en él y, además, realizar aportes. Si, por ejemplo, se está ejecutando un proyecto de desarrollo, la documentación del código es muy importante para que, pasado el tiempo, el mismo equipo de desarrollo pueda recordar lo que hicieron en algún momento o intentar replicar el código escrito por otros. Información adicional sobre la documentación en este tipo de proyectos puedes consultarla en este post sobre [Documentación -con Sphinx y -Python](https://medium.com/qu4nt/documentaci%C3%B3n-con-sphinx-y-python-9a777403cb68). - -A continuación, te dejamos tips y comentarios adicionales que consideramos pueden ser útiles para elaborar la documentación de tu proyecto de ciencia abierta: - -- Si estás en un proyecto y no has comenzado a documentarlo te recomendamos que empieces pronto, la documentación aunque es un proceso que requiere dedicación y tiempo, al final te ahorrará muchos inconvenientes. - -- Resulta más fácil documentar el material de un proyecto, si se hace en correspondencia con cada etapa del proceso. - -- Si necesitas hacer visible tu proyecto, en muchas ocasiones, es una buena práctica documentar en inglés, debido a la gran cantidad de investigaciones y organismos financiadores que se encuentran en países de habla inglesa. - -- Al momento de documentar debes usar un lenguaje claro y comprensible. El documento final debe ser lo suficientemente extenso para especificar todas las características del proyecto pero también contar con la mayor precisión posible. - -- Cuando documentes, todo debe estar detallado, no deben existir las obviedades. Cosas que para ti son obvias, no lo son para los demás. - -- Los documentos deben estar escritos empleando un lenguaje adecuado para las personas que lo utilizarán. - -- La documentación puede incluir todos los gráficos, bosquejos y esquemas que ayuden a complementar la información. - -En líneas generales, la documentación te ayudará a organizar las tareas, delegar funciones, establecer fechas y tener un control sobre la metodología, recursos y resultados antes, durante y después de la finalización del proyecto. Asimismo servirá de soporte, permitirá su trascendencia en el tiempo y facilitará su reproducción o replicación -En OpenScienceLabs te animamos a que comiences a documentar tu proyecto -y que tomes en cuenta esta buena práctica para futuros desafíos. - -## Referencias - -[Manual de Capacitación sobre Ciencia abierta](<(https://book.fosteropenscience.eu/es/)>) -[Guía de expertos en Gestión de Datos](https://www.cessda.eu/Training/Training-Resources/Library/Data-Management-Expert-Guide) -[5 reglas básicas y 5 pasos para documentar tu proyecto web](https://www.socialancer.com/como-documentar-un-proyecto-web/) diff --git a/content/blog/como-instalar-y-comenzar-utilizar-conda/index.md b/content/blog/como-instalar-y-comenzar-utilizar-conda/index.md deleted file mode 100644 index 1748aca64..000000000 --- a/content/blog/como-instalar-y-comenzar-utilizar-conda/index.md +++ /dev/null @@ -1,186 +0,0 @@ ---- -title: "Cómo instalar y comenzar a utilizar Conda" -slug: como-instalar-y-comenzar-utilizar-conda -date: 2020-12-03 -author: Yurely Camacho -tags: [conda, empaquetado, paquetes, gestor, entorno virtual] -categories: [ciencia abierta, código abierto, desarrollo de software, DevOps] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Conda es un sistema de gestión de entornos y de paquetes que funciona en -Windows, Linux y MacOs. Inicialmente se creó para programas Python y -está escrito en python, pero puede implementarse para cualquier -lenguaje. - - - -Es de código abierto y está publicado bajo la licencia BSD por -[Continuum Analytics](http://www.continuumanalytics.com/). Trabaja con -"canales"(channels); las ubicaciones de los repositorios en los que -busca paquetes. Te permite instalar, ejecutar y actualizar paquetes y -sus dependencias de manera rápida. Se utiliza mediante línea de comandos -en el Anaconda Prompt o en una ventana de terminal. En lo referente a la -gestión de entornos, con conda puedes crear, guardar, cargar y cambiarte -de entorno fácilmente en tu ordenador local. - -Un **entorno de conda** es un directorio con una colección específica de -paquetes de conda que has instalado. Puedes activar o desactivar -fácilmente los entornos y los demás que tengas no se verán afectados. -Con conda también puedes crear ***entornos virtuales***; una herramienta -que crea espacios aislados con las dependencias que requieren los -diferentes proyectos que tengas. - -Conda también es un paquete y está incluido en todas las versiones de -[Anaconda](https://anaconda.org/); una distribución libre y abierta​ de -Python y R, [Miniconda](https://docs.conda.io/en/latest/miniconda.html), -una pequeña versión de Anaconda que incluye pocos paquetes en -comparación con esta, [Anaconda -Repository](https://docs.continuum.io/anaconda-repository/) y [Anaconda -Enterprise](https://www.anaconda.com/products/enterprise). Está -disponible también en -[conda-forge](https://anaconda.org/conda-forge/conda); un canal -comunitario. - -## Instalando Conda - -Como mencionamos en líneas anteriores, conda está incluido en todas las -versiones de Anaconda y Miniconda. Por tal motivo, para obtenerla debes -instalar alguna de ellas o comprar [Anaconda -Enterprise](https://www.anaconda.com/products/enterprise). Necesitas una -computadora con sistema de 32 o 64 bits. Para Miniconda 400MB de espacio -en disco y 3GB para descargar e instalar Anaconda. - -- *Elige Anaconda* si estás comenzando en conda o python, quieres tener - instalados automáticamente más de 7500 paquetes científicos y si - cuentas con el espacio suficiente en disco. - -- *Elige Miniconda* si estás dispuesto a instalar individualmente el - paquete que necesites, cuentas con poco espacio en disco y por eso no - puedes instalar Anaconda y/o si deseas un acceso rápido a conda y - python. - -A continuación detallamos los pasos a seguir para una instalación -regular de acuerdo al sistema operativo. - -1. **Descarga Anaconda o Miniconda según el sistema operativo** - -- Puedes descargar Anaconda [en este enlace](https://www.anaconda.com/products/individual) - -- Para descargar Miniconda [ingresa en este enlace](http://www.bicentenariobu.com/) - -Puedes escoger, según el sistema operativo, una versión con un -instalador gráfico o instalador por línea de comandos. Si no deseas -ingresar comandos en una ventana de terminal, elige el instalador -gráfico (Interfaz gráfica de usuario *GUI*). - -Independiente de que uses Anaconda o Miniconda y si no estás seguro de -la opción a descargar, te recomendamos elegir su versión más reciente. -Asimismo, si cuentas con otras instalaciones o paquetes de python, no es -necesario desinstalarlas o borrarlas. Solo instala Anaconda o Miniconda -normalmente. - -2. **Una vez descargado el instalador debes hacer lo siguiente**: - -### En Windows - -- Dirígete a la carpeta donde se encuentra el archivo descargado y haz - doble click. Es un archivo .exe. - -- Sigue las instrucciones. - -### En MacOS - -- Miniconda: - - - En una ventana del terminal ejecute `bash Miniconda3-latest-MacOSX-x86_64.sh` - -- Anaconda: - - - Dirígete a la carpeta donde se encuentra el archivo descargado y haz - doble click. Es un archivo .pkg. - -* Sigue las instrucciones de las pantallas de instalación - -* Debes cerrar y volver a abrir la ventana del terminal para que los - cambios se realicen. - -### En Linux - -En una ventana del terminal ejecuta: - -- Miniconda: - -`bash Miniconda3-latest-Linux-x86_64.sh` - -- Anaconda: - -`bash Anaconda3-latest-Linux-x86_64.sh` - -- Sigue las instrucciones de las pantallas de instalación. - -- Debes cerrar y volver a abrir la ventana del terminal para que los - cambios se realicen. - -Para todos los casos *Acepta los valores por defecto si durante la -instalación no estás seguro de alguna configuración. Luego puedes -cambiarlos* - -**Para probar la instalación independientemente del sistema operativo haz lo siguiente:** - -- Abre una ventana del terminal o Anaconda Prompt (en Windows desde el - menú de inicio), luego ejecuta el comando `conda list`. Si la - instalación ha sido exitosa debe aparecer una lista con los paquetes - instalados. - -## Actualización de conda - -Para actualizar conda debes abrir una ventana del terminal o Anaconda -Prompt (en Windows desde el menú de inicio), luego navega hasta la -carpeta de Anaconda o Miniconda (según el caso) y allí ejecutar el -comando `conda update conda`. - -## Primeros pasos con conda - -Para que te familiarices, el comando `conda` es el principal y con él -puedes, entre otras cosas, consultar y buscar el índice del paquete que -desees, crear nuevos entornos de conda e instalar y actualizar paquetes -en los entornos existentes. - -A continuación te presentamos algunos de los comandos de conda que puedes probar inicialmente: - -`conda --version` Verifica que conda está instalado y funcionando en tu sistema. - -`conda list` Muestra una lista de los paquetes instalados. - -`conda search nombre_paquete` Busca un paquete. - -`conda install nombre_paquete` Instala un paquete. - -`conda update nombre_paquete` Actualiza un paquete. - -Puedes consultar sobre los argumentos y usos de algunos comandos conda -en [este -enlace](https://docs.conda.io/projects/conda/en/latest/commands.html). -La documentación oficial de conda te ofrece una [guía de 20 minutos para -iniciarte en -conda](https://docs.conda.io/projects/conda/en/latest/user-guide/getting-started.html) -y probar sus principales características. - -Si necesitas de la gestión de paquetes y entornos, no dudes en usar -conda. En un próximo artículo te dejaremos algunos tips para que saques -el mayor provecho a trabajar con conda, no te lo pierdas. - -#### Referencias - -- [Documentación oficial Conda](https://docs.conda.io/projects/conda/en/latest/index.html) diff --git a/content/blog/como-presentar-tu-codigo-como-un-articulo-cientifico/index.md b/content/blog/como-presentar-tu-codigo-como-un-articulo-cientifico/index.md deleted file mode 100644 index bfa2f71d3..000000000 --- a/content/blog/como-presentar-tu-codigo-como-un-articulo-cientifico/index.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "¿Cómo presentar tu código como un artículo científico?" -slug: como-presentar-tu-codigo-como-un-articulo-cientifico -date: 2020-03-04 -author: Rainer Palm -tags: [artículos, publicación, código, herramientas] -categories: [ciencia abierta, código abierto] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Muchos científicos emplean la creación de software cuando desarollan sus investigaciones, usando herramientas tales como scripts y simulaciones, personalizadas y adaptadas a sus necesidades. En los casos en que no es así, igual la mayoría termina empleando analísis computacional de alguna manera, con software prediseñado para graficar, realizar calculos elementales, visualizar estadísticas o datos que luego se mostrarán dentro de la presentación de su investigación. Sea como sea, lo cierto es que cada vez el rol del desarrolador y el del científico estan más relacionados, exigiendo que estas dos disciplinas se vinculen de forma más estrecha. - - - -Lo que hace esto mucho más interesante es el hecho de que el desarrollo de software está íntimamente involucrado en múltiples áreas de investigación, no sólo porque se utiliza como herramienta, si no de que este desarrollo en sí y los resultados que ofrece pueden traducirse en un problema a abarcar por un estudio. Este es un acercamiento utilizado frecuentemente en papers que tratan temas tales como simulaciones computacionales de procesos químicos variados, aplicaciones posibles de algoritmos de inteligencia artificial y comportamiento de esta en ámbitos particulares, problemas de lógica, y muchos otros más, involucrando una inmensa cantidad de ramas de la ciencia e incluso fuera de esta! - -Si tienes un proyecto de desarrollo de software cualquiera relacionado con la ciencia, así sea nada más una herramienta creada durante tu investigación, quizás sea oportuno buscar la forma de publicarlo, posiblemente adjunto a un paper mas extenso. Hay muchas razones por las cuales lo deberias hacer, independientemente del propósito principal de tu trabajo (divulgación del conocimiento, estandares de reprodubilidad, dejar que los demas aprendan de tu trabajo, etc.), y la labor requerida es prácticamente nula si ya te has tomado el tiempo de escribir y documentar mínimamente tu codígo. Inclusive si consideras que tu código no es lo suficientemente bonito como para publicarse, le podría servir a alguien, así sea nada más para verificar tu investigación. - -## Documentación del proceso de desarrollo - -Para mostrar posibles usos de tu software, dar a conocer el razonamiento de tus meétodos, y ayudar a entender por qué tu código funciona, es muy importante que, preferiblemente durante el proceso de desarrollo, te tomes el tiempo de escribir de forma rigurosa una documentación que describa con profundidad tanto los pasos que has tomado a lo largo del proyecto, como por qué has pensado que esa ha sido la mejor forma de llevar a cabo tus metas. Esto implica decir con exactitud cuáles herramientas, lenguajes de programación, librerias, scripts, etc., has utilizado, así como dar un recuento de los problemas, tanto conceptuales como prácticos, encontrados durante el desarrollo, trazando un marco de referencia para el funcionamiento de tu código, y por supuesto, mencionar fundamentos de tu investigación, estudios y artículos anteriores escritos sobre problemas relacionados con el tema. - -El uso de diagramas o esquemas para representar el modelado analítico de los problemas en cuestión o para ilustrar de una forma mas abstracta o intuitiva el funcionamiento del programa, es bastante útil a la hora de ayudar a otros entender como funciona, y es importante si piensas luego presentar tu trabajo en ámbitos menos formales. - -## Visualización de resultados - -Como extensión de lo que se dijo antes, puedes pensar en formas en las cuales se puede visualizar tu código, ya sea mediante una simulación en tiempo real, visualizaciones de estadísticas creadas con herramientas como R Studio, creación de interfaces gráficas u otros métodos, siempre teniendo las particularidades de tu investigación en mente. Con esto logras un mayor grado de accesibilidad y se te hace más fácil divulgar el fruto de tus labores, presentando tus conclusiones de una forma más atractiva sin perder credibilidad. Además, si presentas tu código dentro de un notebook con Jupyter o una herramienta similar, puedes hacer que tus lectores interactúen con tu código de una manera directa, sin mucha complicación, ejecutándolo en tiempo real desde una interfaz web y generando gráficas de manera inmediata. - -## Publicación de datos y codigo junto al paper - -Además de subir tu código junto a tu artículo en repositorios de Git o Docker, puedes usar sitios como IEEE DataPort [1] para subir bases de datos para que cualquiera pueda acceder a ellos de una forma sencilla, siendo los conjuntos de datos asignados un DOI para identificarlos rápidamente. Por lo general, subirlos a un archivo de datos de investigación te proveerá con referencias y identificadores persistentes, sin importar que luego actualices los archivos subidos. Si no es así, puedes usar Zenodo[2] o Figshare[3] para crear una copia permanente y citable, con un identificador DOI, de la versión actual de tu repositorio. Agregar las citas al propio software es también una opción. - -Recuerda además siempre revisar con cuidado los lineamientos del journal para el cual estes pensando escribir, teniendo en cuenta como les será mas fácil acceder y reproducir tu código. Si subes tu código y datos para que puedan ser vistos por cualquiera, deberías también declarar abiertamente sus términos de uso, licencias y demás. - -[1]: https://ieee-dataport.org/ "IEEE DataPort" -[2]: https://zenodo.org/ "Zenodo" -[3]: https://figshare.com/ "Figshare" diff --git a/content/blog/cuales-son-los-principios-de-la-investigacion-reproducible/index.md b/content/blog/cuales-son-los-principios-de-la-investigacion-reproducible/index.md deleted file mode 100644 index c4a7da803..000000000 --- a/content/blog/cuales-son-los-principios-de-la-investigacion-reproducible/index.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: "¿Cuáles son los principios de la investigación reproducible?" -slug: cuales-son-los-principios-de-la-investigacion-reproducible -date: 2020-01-31 -author: Rainer Palm -tags: [reproducibilidad, datos] -categories: [ciencia abierta, investigación abierta] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - -¿Como puedes tener total confianza y seguridad en que tu metodología es sensata, y de que tu investigación ha dado resultados certeros y facil de verificar? ¿Son veraces los estudios y descubrimientos de otros científicos? - - - -Ciertamente, la capacidad de validar y repetir el proceso llevado a cabo por los investigadores es algo crucial a la hora de responder estas preguntas. Nos encontramos en un momento historico en el que podemos, mediante tecnologías digitales, acercarnos cada vez mas a satisfacer un criterio infalible de reproducibilidad en algunas areas (como la ciencia de datos). Escribir cada uno de los pasos realizados ya es una practica inherente al proceso de investigación en sí, debido a la necesidad de coordinar proyectos en los que colaboran cientos de personas, y al desarrollo de software que permite grabar y compartir este proceso de una forma eficiente y completa. - -Aun así, paradojicamente, nos encontramos también en medio de una crisis en las ciencias, donde los resultados de una gran cantidad de experimentos son dificiles o imposibles de replicar \[1\], ya sea debido a ciertos limites en la investigación en sí o por otras razones. Siendo la reproducibilidad uno de los pilares del método científico como tal, estos dos hechos, tomados juntos, se hacen algo desconcertantes. Quizás sea importante repasar exactamente que consideramos como investigación reproducible y cuales son sus principios o metas, y que iniciativas o herramientas hay para asegurar esa condición. - -## ¿Qué hace reproducible una investigación? - -Podemos llamar a una investigación reproducible si ésta puede ser repetida por otros. En términos estrictos, esto simplemente significa que, contando con las herramientas necesarias, cualquiera puede tomar la descripción o grabación del experimento o estudio en cuestión para volverlo a realizar y verificar si el resultado es el mismo o lo suficientemente parecido (en tal caso, se dice que los resultados son replicables). - -Para que una investigación sea reproducible, por ende, se requiere que sus métodos, datos, herramientas y configuración, sean descritos de una forma detallada y precisa, dependiendo del área de conocimiento, y que esta información sea legible tanto por un ser humano como por una computadora. Esto, obviamente, se complica cada vez más dependiendo del tamaño de la investigación y su complejidad. Ciertas herramientas, como [Jupyter](https://jupyter.org), permiten realizar el analísis y, a la vez esquematizan y muestran comentarios sobre los pasos del experimento, dentro de un mismo entorno de trabajo, lo cual ayuda bastante. Sín embargo, al final del dia esto depende primordialmente de las decisiones que tome el investigador, y no hay ninguna herramienta que garantiza la reproducibilidad simplemente por ser usada. - -En ese caso, ¿en torno a qué aspectos deberían tomar las decisiones los usuarios? ¿Cuáles preceptos éticos deben seguir para dirigirse hacia una investigación reproducible? En la siguiente sección hablaremos de los principios de la investigación reproducible. - -## Cuales són los principios de la investigación reproducible? - -- **Transparencia**. Es importante recordar que, tal como cualquier otra cosa que te puedas imaginar (la realización de un plato de cocina, una canción, una pintura, etc.), sólo se puede decir que una investigación es reproducible si se pueden ver y entender los pasos que llevaron a su realización. Si realizas análisis de datos o elaboras algún tipo de código, por ejemplo, es necesario que tengas disponible toda la información referente al entorno (paquetes, configuraciones, carpetas del proyecto, dependencias, etc.) gracias a los cuales ejecutar el código, además de que es necesario que esté comentado rigurosamente para que otros puedan entender exactamente por qué funciona. - -- **Métodologia abierta.** Siendo la ciencia una práctica colaborativa, es de bastante importancia mantener un alto grado de transparencia, como anteriormente mencionamos. Es importante también añadir que obligarte a compartir el procedimiento que llevaste a cabo no sólo te da mas confianza a la hora de compartir tus resultados, sino que también te anima a revisar cada paso dado y pensar si fue el correcto (y permite a otros verificar lo mismo, también). - -- **Enlazamiento de los resultados a los datos iniciales.** Una investigación reproducible sistematiza su procedimiento de forma tal que se pueden ver claramente los datos de entrada, como estos fueron generados y por que proceso se analizan estos, ademas de hacerlos disponibles libremente (en cuanto sea aplicable). De esta forma, se traza una ruta desde los datos de salida hacia los de entrada, y viceversa. - -Estos tres principios se pueden aplicar independientemente del tipo de investigación. Claramente, será mucho más fácil compartir un entorno virtual que el Acelerador de partículas (en inglés Large Hadron Collider, LHC), pero lo importante es hacer tanto los datos como detalles respecto a la forma en la que fueron generados libremente disponibles, haciendo el experimento repetible, y por tanto, verificable por la comunidad científica. - -##Que herramientas hay para realizar investigación reproducible? - -Sin duda, independientemente del tipo de trabajo que estés realizando, existe una variedad de opciones de software para lidiar con el problema de documentar, archivar, y esquematizar datos y archivos de una forma limpia y organizada, sin necesidad de tardar muchas horas describiendo estos en texto plano. Según Stodden et. al (2013)\[2\], hay cuatro tipos generales de herramientas en uso: - -- **Computación autoría y publicación alfabetizada.** Ésta describe herramientas que permiten la creación de documentos que integran elementos rich media (codigo y demás) junto a texto (por lo general en Markdown o LaTeX) y demas archivos multimedia para presentar reportes que generan resultados tanto visuales como textuales en tiempo real. En este ambito, sin duda una de las mas populares es Jupyter, que soporta una cantidad abrumadora de lenguajes de programación (principalmente Julia, Python y R) sin perder sencillez o intuitividad. - -- **Control de versiones.** Se refiere a aquellas herramientas que te permiten rastrear tu trabajo a lo largo del tiempo, tomando registro de los cambios y evoluciones que toma. De esta forma, permiten tanto volver a un punto anterior en el analísis sin empezar desde cero, como observar como cambia la investigación y las ideas referentes a ella cronologicamente. El sistema de control de versiones git es sin duda el mas popular, con una variedad de servicios web disponibles dependiendo de tus necesidades (tales como GitHub o Gitlab). - -- **Registro de procedencia de los datos.** Procedencia se refiere a mantener un registro de la cronologia y historia de los objetos de investigación, tales como datos, codigo fuentes, figuras, y resultados. Entre estas herramientas estan VisTrails, Kepler y Taverna. - -- **Herramientas que capturan y preservan un entorno de software.** Algo increiblemente importante pero a la vez dificil y complicado de hacer es instalar y configurar una red de versiones especificas de dependencias, paquetes y herramientas para uso compartido entre tus colaboradores. Existen varios niveles de virtualización disponibles para llevar a cabo esta tarea, tanto la emulación completa de un entorno virtual especifico (como lo hacen Virtualbox of VMWare) o nada mas la creación de instancias separadas de espacios de usuario (como Docker). - -\[1\] https://www.displayr.com/what-is-the-replication-crisis/ -\[2\] http://stodden.net/icerm_report.pdf diff --git a/content/blog/dataverse-y-su-potencial-para-proyectos-de-ciencia-abierta/index.md b/content/blog/dataverse-y-su-potencial-para-proyectos-de-ciencia-abierta/index.md deleted file mode 100644 index 515409c2e..000000000 --- a/content/blog/dataverse-y-su-potencial-para-proyectos-de-ciencia-abierta/index.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: "Dataverse y su potencial para proyectos de ciencia abierta" -slug: dataverse-y-su-potencial-para-proyectos-de-ciencia-abierta -date: 2020-08-08 -author: Rainer Palm -tags: [datosverse, datos, repositorios] -categories: [ciencia abierta, datos abiertos, acceso abierto] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -A lo largo de un proyecto de investigación suelen experimentarse dificultades en cualquiera de sus fases: desarrollo, su divulgación, promoción, en la publicación de los datos de forma abierta, en su catalogación o en su disposición de forma abierta para ser consultado en cualquier investigación. En cualquiera de estos casos, Dataverse[1] es una solución que promete no solamente incorporar al flujo de trabajo métodos rápidos para asegurar que los datos cumplan los principios FAIR[2], sino también ofrece un espacio donde alojarlos organizados en conjuntos, agrupando metadatos y codigo clasificados con su propio numero DOI, en repositorios llamados 'Dataversos'. - - - -Dataverse es un proyecto que ya cuenta con apoyo de una cantidad de universidades y instituciones prestigiosas alrededor del mundo. Por ejemplo, la universidad Harvard destaca por su repositorio Dataverse público[3] en el cual yace una enorme cantidad de conjuntos de datos (incluyendo metadatos, código y documentación) en todo tipo de áreas y, además está libre para el uso en investigaciones tanto dentro como fuera de la comunidad Harvard. Estos datos pueden ser accedidos bajo políticas de acceso abierto y términos de uso establecidos por cada equipo científico, permitiendo la réplica y reutilización del trabajo alojado en el sitio. Por lo tanto, es una iniciativa bastante atractiva cuando se desea difundir el trabajo realizado, ya que hace que tus datos sean visibles mediante el uso de motores de busqueda y manejadores de referencias. - -Para entender por qué ha ganado tanta tracción este proyecto, es importante primero saber de qué se trata exactamente, y cómo se llevó a cabo. - -## Que es Dataverse? - -Dataverse es una aplicación web de código abierto para 'compartir, preservar, citar, explorar, y analizar datos de investigación'. Cuenta con una multitud de características para cumplir con este objetivo: al subir los archivos a la plataforma, estos son almacenados y preservados de manera que permanezcan iguales al día en que se subieron. También permite organización por 'carpetas' mediante los llamados dataversos, haciéndote propietario de la plataforma en la que subes los datos y enlazándolos, de esta forma, de forma permanente a tu usuario, al tiempo que permite integrar de forma continua tus publicaciones y los datos que estas utilizan. Todo esto con el propósito fundamental de asegurar que tus datos te sean acreditados, estando, al mismo tiempo, alojados y preservados por años por venir. - -Su nombre viene del hecho que Dataverse funciona mediante un repositorio (la instalación de software) que a su vez aloja archivos virtuales llamados dataversos. Los dataversos se componen de conjuntos de datos, y los conjuntos de datos tienen metadatos descriptivos, archivos, documentación, código, y demás. Si el usuario quisiera, puede incluir otr databerso dentro de ellos. Al publicar los conjuntos de datos, se le asigna una citación formal académica y un identificador DOI asociado a ellos, para que la utilices a la hora de escribir artículos en tus redes o paginas web. - -Dataverse, por lo tanto, cuenta con varias APIs abiertas (de búsqueda, acceso y depósito de archivos) para darle un grado mayor de interoperabilidad y permitir una integración más limpia y ligera dentro de el esquema de trabajo de cualquier investigador, archivista o editor. - -## Quien usa Dataverse? - -Además del repositorio de Harvard anteriormente mencionado, en la pagina principal del sitio web de Dataverse se encuentra un mapamundi en el que se señalan las instalaciones públicas de repositorios Dataverse, con mayor concentración de éstos en Norte America y Europa, aunque se ven varias también en America Latina, Africa y Asia. Algunas de estas estan pensadas no solamente para uso local, sino también para países y regiones vecinas, como el ACSS Dataverse[4] de Lebanon, el cual contiene conjuntos de datos producidos en paises árabes. Además, a pesar de limitaciones respecto al envío de archivos, muchos de estos sitios permiten acceder los dataversos de forma gratuita sin importar que seas investigador o parte de la institución o comunidad en cuestión. - -Al incentivar a los investigadores a usar una plataforma abierta para publicar y compartir los datos que ellos mismos utilizan, se hace práctica la distribución y publicación de estos bajo una licencia abierta que permita su acceso y replicación entre terceros. Esta es una forma algo indirecta, pero aun así posiblemente eficaz para lograr que se realice y presente una ciencia realmente abierta mediante el uso de aplicaciones abiertas y eficientes en su realización, sin modificar o añadir pasos innecesarios en su práctica. Mención aparte merece el hecho de tener una gran utilidad para los propios investigadores, ya que permite asegurar su acreditación adecuada en publicaciones que contengan su trabajo. - -Es posible que en el futuro este tipo de práctica se hagan comunes, y que haya una multitud de repositorios de aplicaciones como Dataverse alrededor del mundo, que albergen el conjunto del trabajo científico realizado en las regiones donde estén localizados. De esta manera, existiría la posiblidad de que las conclusiones de los investigadores y instituciones sean realmente juzgadas, criticadas y revisadas también por ciudadanos comunes, haciendo que cualquier tipo de decisión política que dependa del trabajo científico, dependa también de los aportes de estos. - -[1]: https://dataverse.org/ "Dataverse" -[2]: https://www.go-fair.org/fair-principles/ "FAIR" -[3]: https://dataverse.harvard.edu "Harvard Dataverse" -[4]: https://dataverse.theacss.org "ACSS Dataverse" diff --git a/content/blog/epigraphhub/index.md b/content/blog/epigraphhub/index.md deleted file mode 100644 index c7ff1a2a7..000000000 --- a/content/blog/epigraphhub/index.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: "EpiGraphHub: un proyecto de código abierto para el análisis de datos de calidad" -slug: epigraphhub -date: 2022-09-28 -author: Anavelyz Pérez -tags: [epigraphhub, visualización de datos, análisis, datos, epidemiología] -categories: [ciencia abierta, código abierto] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" - ---- - - -¿Quieres realizar un análisis y no encuentras datos?, ¿quieres realizar visualizaciones como dashboards o gráficos?, o simplemente explorar, ¿cómo puedes analizar datos? -Entonces este artículo es para ti. Vamos a describir EpiGraphHub, un proyecto de código abierto orientado al análisis de datos de calidad. - - - -## ¿Qué es EpiGraphHub? - -Es una plataforma de código abierto que integra y permite gestionar datos de diversas fuentes. Fue diseñada principalmente para describir datos de salud pública, pero incluye otros tópicos como socio-economía, demografía o censos. Esto es posible porque posee conectores a muchas bases de datos y conjuntos de datos abiertos. - -Con EpiGraphHub podemos hacer exploraciones rápidas y dashboarding (gráficos interactivos). Además, puede servir como backend de datos para apps analíticas. - -Sus funciones de visualización están impulsadas por [Apache Echarts](https://echarts.apache.org/), está compuesta por un servidor de bases de datos Postgresql integrado con un frontend web Apache Superset personalizado para el acceso y la exploración de datos. - -Cuenta con servidores, lo que nos permite acceder a grandes cantidades de datos sin que tengamos que preocuparnos si nuestro computador soporta o no cientos de datos. - -EpiGraphHub, al ser un proyecto de código abierto permite que cualquiera pueda tomarlo y trabajar con él, lo hace disponible para programadores, empresarios, analistas de datos y el público en general. Otro aspecto importante es que puede conectarse a bases de datos locales, remotas o en la nube, incluso hojas de cálculo de Google y su equipo está constantemente recopilando conjuntos de datos abiertos relevantes. Esto nos permite más opciones en la exploración de datos. - -## Bibliotecas de EpiGraphHub - -Además de permitir hacer análisis visual, EpiGraphHub se complementa con bibliotecas, las cuales están diseñadas para proporcionar a los usuarios externos toda la funcionalidad analítica utilizada para potenciar la plataforma y sus aplicaciones. - -Las bibliotecas permiten realizar o aplicar: - -- Estadística Bayesiana -- Análisis epidemiológico -- Modelado matemático -- Análisis de Costo-efectividad -- Pronósticos -- Aprendizaje automático -- Minería de textos -- Análisis Geoespacial - -Esto se encuentra disponible para los lenguajes de programación [R](https://github.com/thegraphnetwork/r-epigraphhub/blob/main/epigraphhub.Rproj) y [Python](https://github.com/thegraphnetwork/epigraphhub_py). - -## ¿Cómo utilizar la plataforma EpiGraphHub? - -Este procedimiento es muy sencillo, debes acceder a su dirección web: https://dash.epigraphhub.org/. Luego puedes crear un usuario o emplear la cuenta de invitado (usuario:guest y contraseña:guest). - -Para la cuenta de invitado no tienes todas las opciones disponibles, pero con ella puedes explorar los datasets y las bases de datos en los servidores. También tienes acceso a los dashboards y gráficos que los miembros del proyecto han generado. - -![egh](egh_map.png) - -Si creas una cuenta tendrás una opción adicional en la que puedes realizar consultas a través de SQL y personalizar los datos de acuerdo a lo que necesites. - -En caso de que deseas ver un tutorial de cómo funciona EpiGraphHub puedes dar clic [aquí](https://youtu.be/JOxbiovCtdE). - -## ¿Cómo unirse a la comunidad de EpiGraphHub? - -Si quieres formar parte de la comunidad de EpiGraphHub, puedes unirte a su servidor en [Discord](https://discord.gg/56thARPrnJ). Allí tienes un espacio para expresar tus preguntas, sugerencias o estar atento a los próximos eventos organizados en la comunidad. - -## ¿Cómo contribuir en EpiGraphHub? - -EpiGraphHub al ser un proyecto de código abierto crea espacios en los que es posible contribuir, su repositorio principal se encuentra en [GitHub](https://github.com/thegraphnetwork/EpiGraphHub#contributing) por lo que los issues y la forma en que podemos brindar nuestro granito de arena se encuentra expresado allí. Igualmente, si tienes dudas puedes acudir a Discord. - -En resumen, EpiGraphHub es una herramienta que nos permite acceder y analizar datos a través de sus servidores, lo cual logra que trabajemos sin preocuparnos por la cantidad y el espacio que pudiesen ocupar en nuestro computador. También podemos utilizar sus funcionalidades para analizar datos almacenados en local y obtener resultados interesantes que no percibimos a simple vista en los datos. Además de esto, los gráficos y dashboards que podemos obtener a través de la plataforma son muy llamativos y podemos interactuar fácilmente con la información, recordemos que provienen de Apache Echarts. - -Si ya le echaste un vistazo a este proyecto puedes dejarnos tus comentarios a cerca de lo que percibiste y si te gustó. - -## Referencias - -- GRAPH Network. (2022, 1 junio). EpiGraphHub: a data integration platform for health | Flavio Coelho [Vídeo]. YouTube. Recuperado 28 de septiembre de 2022, de https://www.youtube.com/watch?v=8Mz52O_VzVc&feature=youtu.be - -- Welcome to EpigraphHub libraries documentation! — EpigraphHub Library 2022-01-01 documentation. (s. f.). Recuperado 28 de septiembre de 2022, de https://epigraphhub-libraries.readthedocs.io/en/latest/ - -- EpiGraphHub. (s. f.). Recuperado 28 de septiembre de 2022, de https://epigraphhub.org/superset/welcome/ - -- Epidemias, D. M. A. (2022, 4 abril). Introduction to EpigraphHub. YouTube. Recuperado 28 de septiembre de 2022, de https://www.youtube.com/watch?v=JOxbiovCtdEf&feature=youtu.be \ No newline at end of file diff --git a/content/blog/ethereum-merge-is-coming-pero-que-significa/index.md b/content/blog/ethereum-merge-is-coming-pero-que-significa/index.md deleted file mode 100644 index dd388e27b..000000000 --- a/content/blog/ethereum-merge-is-coming-pero-que-significa/index.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: "Ethereum merge is coming. ¿Pero qué significa?" -slug: ethereum-merge-is-coming-pero-que-significa -date: 2022-03-22 -author: Alan Hurtarte -tags: [ethereum, transacciones, bitcoin, criptomoneda] -categories: [tecnología, web3] -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - -Oh sweet summer child, Ethereum ya no será el mismo, está evolucionando, al mismo tiempo que todo el ecosistema. No es secreto que todo el ecosistema crece, y a una velocidad agigantada. La masiva adopción de Ethereum trajo consigo problemas a la red como: -* Transacciones con gas demasiado alto (provocando transacciones de alto costo) -* Transacciones demasiado lentas. No te puedes imaginar pagar un café o una hamburguesa con Ethereum si el proceso tarde 5 o 10 minutos en validarse. -* Debido a las dos anteriores, demasiado consumo de energía eléctrica. - - - -Estos problemas lo sufren las dos blockchains más grandes del momento, bitcoin y Ethereum. En el caso de bitcoin, la solución es ligthing network. Para Ethereum, es este merge. - - -![Meme GOT](meme-summer.jpeg) - -Este puede ser uno de los cambios más esperado por la comunidad, trae consigo un gran cambio en el modo en que valida las transacciones, actualmente utiliza un mecanismo llamado POW (proof of work) y cambia a un mecanismo llamado POS (proof of stake). Este cambio mejorará la descentralización y el reducir bastante el consumo de energía que con eso traerá menores costos. - -### Proof of work Vs. Proof of stake -![Eth POW vr POS](eth-pow-pos.png) - -El concepto de **Proof of Work** existe desde antes de los crypto assets. La primera idea fue publicada por Cynthia Dwork y Moni Naor en un artículo publicado en 1993, sin embargo, no fue hasta 1999 que el término "Proof of work" fue creada por Markus Jakobsson. - -Pero, ¿Por qué se usa esto?. En el white paper de bitcoin, Satoshi Nakamoto teoriza que la única manera de vulnerar la fuerza de la red de bitcoin es a través de un ataque del 51% de la red. Por eso, propone el uso de proof of work para prevenir una entidad de ganar un control mayoritario sobre la red. Al aplicar proof of work en este sentido, se argumenta es la idea central necesaria para bitcoin, ya que permite un sistema de consenso realmente honesto y distribuido. - -Así es como funciona actualmente bitcoin y Ethereum con el proof of work: -1. Un grupo de transacciones son agrupadas en un memory pool (mempool). -2. Los mineros verifican cada transacción en el mempool que se legitima al resolver un problema matemático. -3. El primer minero en resolver el problema obtiene una recompensa con un nuevo bitcoin recién minado y el costo de la transacción. -4. El mempool verificado, ahora llamado bloque, es añadido a la blockchain. - -Ahora el **Proof of Stake**, tiene el mismo propósito de validar transacciones y conseguir un consenso; sin embargo, se diferencia de proof of work, ya que no involucra un problema matemático a resolver. Ahora el validador de cada bloque se escoge determinísticamente basado en su **stake**. El stake es cuantas monedas/tokens posee. Ya podrás suponer que al no tener que resolver un problema matemático, la eficiencia energética de este sistema es mucho mayor, y esto lleva a menores costos de transacción. Además, que este sistema puede proveer un mejor incentivo para la salud de la red, al promover acumular moneda/tokens. - -### Porque del merge -Ethereum tiene muchos problemas, y este merge busca solucionar el blockchain trilemma -* Seguridad -* Descentralización -* Escabilidad - -### Que beneficio trae el merge -* Descentralización y seguridad: El merge requiere un mínimo de nodos y hacer más fácil de correr un nodo. Para correr un nodo necesitas tener 32 ETH. -* Sostenibilidad: Proof of stake usa al menos 99% menos energía que proof of work. - - -![Energy scale per Transaction](energy.png) - - - -## ETH 2.0 -![Ethereum panda](ethereum_panda.png) - -Este cambio en Ethereum ya venía siendo discutido desde el 2018, y había sido añadido al roadmap, pero se dieron cuenta de varias cosas: -* Tomaría años en entregar por completo el roadmap. -* Hacer el cambio completo de PoW a PoS, requeriría una migración por parte de las aplicaciones existentes - -Entonces surgió la propuesta Eth1+Eth2 = Ethereum. Donde: -* Eth1 = Execution Layer (actual red) -* Eth2 = Consensus Layer (el merge) - -El Consensus Layer es donde estará implementado el PoS, de esa manera se podrá aplicar el merge, sin requerir cambios en los usuarios actuales de la red. Este cambió lo explican más a fondo aquí [The Great TH2 renaming](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/). - -![Ethereum roadmap](upgrade_path.png) -## Conclusión -Para el usuario final no significará un cambio en billetera o en como interactúa con la red. Pero si verá los beneficios al tener transacciones más rápidas y de menor costo. Esto nos acercará a una blockchain más útil para el día a día, intercambiando valor. -Es emocionante ver los cambios suceder y como se va mejorando el ecosistema. - -## Fuentes -* [The great renaming](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/) -* [The Ethereum merge is comming thread](https://twitter.com/JackNiewold/status/1506779959242764288) -* [The Ethereum merge](https://ethereum.org/en/upgrades/merge/#main-content) -* [Pow and Pos explained](https://hackernoon.com/consensus-mechanisms-explained-pow-vs-pos-89951c66ae10) diff --git a/content/blog/git-de-en-diez-sencillos-pasos/index.md b/content/blog/git-de-en-diez-sencillos-pasos/index.md deleted file mode 100644 index 1ce189d39..000000000 --- a/content/blog/git-de-en-diez-sencillos-pasos/index.md +++ /dev/null @@ -1,237 +0,0 @@ ---- -title: "Git de 0 a 100 en diez sencillos pasos" -slug: git-de-en-diez-sencillos-pasos -date: 2020-01-08 -author: Rainer Palm -tags: [git, repositorios, github] -categories: [desarrollo de software, control de versiones] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -¿Necesitas aprender [Git](https://git-scm.com/) para manejar con mayor -eficiencia y control tus proyectos y trabajos? Ya sea para desarrollo de -software, creación de páginas web, investigaciones científicas, o para -manejar tus escritos, te podría ser muy útil aprovechar la seguridad que -te da Git para el control de versiones, o la facilidad con la que -permite la investigación colaborativa. Además, podría serte de mucha -ayuda a la hora de buscar empleo en tu área de trabajo, ya que los -proyectos y contribuciones que tengas almacenados en Git te servirán como -parte de tu currículo. Sin embargo, puede parecerte algo intimidante -debido a la gran diversidad de opciones que te proporciona, además del -uso requerido de la línea de comandos en la aplicación Git. Pero si -sigues los 10 pasos que presentamos a continuación, te darás cuenta de -lo sencillo que puede resultar subir y manejar archivos en tu primer -repositorio, crear varias ramas en el mismo y compartir archivos con -colaboradores. - - - -## 1. Crea tu cuenta en Github - -Aunque es posible emplear git a nivel local, es preferible que utilices -una plataforma que te permita alojar repositorios en la nube, tal como -[Github](https://github.com/) o [Gitlab](https://about.gitlab.com/) para -difundir fácilmente tu trabajo. Puedes [registrar una cuenta -Github](https://github.com/join), donde simplemente tendrás que -proporcionar tus datos y seguir los pasos de creación de cuenta. Luego -de registrarla, podrás seleccionar un plan de pago cuando -quieras, o simplemente usarlo de forma gratuita. - -## 2. Crea tu primer repositorio - -Inmediatamente después de crear tu primera cuenta, Github te guiará hacia la -creación de tu primer repositorio, a través de https://github.com/new, donde -tendrás que ponerle un nombre y una descripción. Github automáticamente genera -el repositorio con un archivo `README.md`, el cual es un simple archivo de texto -que será visto al entrar en la página del repositorio. Este archivo tiene -información importante acerca del repositorio, el propósito de los archivos que -están allí y de cómo está organizado. También puedes incluir en él algún enlace -a la página web del proyecto (si la tienes), o un correo para contactos e -información. - -## 3. Instala Git en tu computadora - -Para poder subir archivos a tu repositorio desde tu disco duro, tendrás -que instalar Git en tu computadora. Simplemente descárgalo desde -https://git-scm.com/, o, si estás usando Linux, instálalo mediante el -gestor de paquetes de tu distribución buscando el paquete git. Después -podrás usarlo en la línea de comandos. Verifica si se instaló -correctamente ejecutando - -``` -git –-help -``` - -## 4. Clona un repositorio - -Cuando creas un repositorio Git, automáticamente se crea una carpeta -oculta `.git` con información de los archivos y ramas de tu repositorio, -los cambios a estos y el último commit. Tu repositorio en Github también -contiene esta carpeta, así que, para ahorrarte un dolor de cabeza, -deberías clonarlo (copiarlo en tu ordenador), ya sea descargándolo desde -su página o en la línea de comandos escribiendo: - -``` -git clone https://github.com/(tu usuario)/(nombre del repositorio).git - -``` - -También puedes copiar la URL del repositorio desde la página. - -## 5. Agrega archivos a tu repositorio y haz tu primer commit - -Cada vez que realizas cambios en tu repositorio (ya sea modificando, -agregando o borrando archivos), deberás sincronizarlos haciendo lo que -se conoce como un commit. Puedes utilizar los comandos: - -``` -git add {nombre de tu archivo} -``` - -``` -git rm {nombre de tu archivo} -``` - -para hacer cambios en la copia local de tu repositorio, ya sea añadir y -modificar o eliminar archivos, respectivamente. Antes de sincronizar los -cambios, debes ‘empaquetarlos’ en un commit, mediante el comando - -``` -git commit -m “{descripción de los cambios}” -``` - -Después podrás sincronizar ese commit con el servidor de Github -utilizando el comando - -``` -git push origin master -``` - -Con aplicaciones gráficas como Github Desktop u otra similar, podrás -realizar estos cambios de una forma mucho más intuitiva. - -## 6. Maneja distintas ramas de tu repositorio - -Cuando creas tu repositorio con git, este solo tiene una rama principal -o “default”, la cual se denomina `master`. En git, una rama es una -especie de ‘apuntador’ que señala a una serie específica de commits. -Cuando quieras hacer cambios en tus archivos, para realizar pruebas sin -afectar el funcionamiento del código alojado en la nube que ya sabes que -funciona, puedes crear otra rama. Si los resultados son de tu agrado, -podrás sincronizar ambas ramas más tarde. - -Para crear otra rama, simplemente ejecuta: - -``` -git checkout -b {nombre de tu rama} -``` - -Esto hará que, a partir de ahora, todos los cambios que realices a -tus archivos sean parte de la rama que has creado. - -Si deseas sincronizar tu nueva rama con el servidor de Github, ejecutas: - -``` -git push origin {nombre de tu rama} -``` - -Igual que para hacer cambios en master, deberás hacer un commit para -sincronizar los cambios locales con el repositorio de Github. - -## 7. Realiza un merge - -El comando `git checkout` nos permite cambiar de rama dentro del -repositorio. Puedes usarlo para volver a hacer cambios en la rama master -con el siguiente comando: - -``` -git checkout master -``` - -Si estás satisfecho con los cambios que has hecho en la rama, puedes -hacer un merge, lo que quiere decir que se fusionan los cambios hechos -en la rama secundaria con los de la rama en la que estás ubicado -actualmente (en este caso, master) de la siguiente manera: - -``` -git merge {rama con cambios} -``` - -Git intentará hacer este proceso automáticamente, pero puede ser que -hayan conflictos entre ramas con los cambios hechos. En este caso, -tendrás que editar los archivos que te muestra Git, y agregarlos -manualmente ejecutando - -``` -git add {nombre de archivo} -``` - -## 8. Verifica cambios con tu copia local - -En caso de que tu copia local del repositorio no tenga los cambios -hechos hasta el último commit en la rama que estás trabajando, puedes -actualizarla ejecutando - -``` -git pull -``` - -Para ver los cambios que se han realizado entre las distintas ramas del -repositorio, ejecuta el comando - -``` -git diff {rama fuente} {rama a comparar} -``` - -También puedes ver la historia del repositorio (los commits hechos a lo -largo del tiempo) usando el comando `git log`. Recomendamos que primero -ejecutes `git log –help` para ver como puedes aprovechar mejor esta -herramienta. - -## 9. Propone cambios a repositorios de terceros - -En caso de que quieras hacer un commit a un repositorio que sea de otra -persona, simplemente tendrás que ir a la página del repositorio en -Github, hacer un **fork** (una copia personal de ese repositorio, como un -puente hacia el original), y clonarlo en tu computadora. - -Luego de crear los commit deseados y subirlos a tu fork, podrás -dirigirte a la página donde este se encuentra y dar clic a **New pull -request** (o solicitud de extracción). Esto te llevará a una página -donde puedes evaluar los cambios que has hecho y crear una solicitud -para que los propietarios del repositorio los fusionen con su rama -master. - -## 10. Acepta o niega cambios propuestos - -Cuando un colaborador siga los pasos descritos anteriormente y haga una -solicitud de extracción en tu repositorio, podrás verificar los cambios -que se han realizado en el commit de su fork, además puedes ver su -descripción y las sugerencias que han dado. Podrás entonces conversar -con ellos en los comentarios de la solicitud de extracción, y -dependiendo de lo que consideres apropiado, aceptar o negar los commit -propuestos y fusionar su fork con la rama master de tu repositorio. - -En caso de que quieras que un colaborador pueda contribuir al proyecto -sin necesidad de aprobar sus commit, podrás invitarlos mediante la -página de *Parámetros* (accesible desde la página del repositorio), -simplemente dando clic a *Colaboradores* en la barra lateral izquierda -y añadiendo su nombre de usuario de GitHub. - -Si has seguido todos los pasos hasta ahora, felicidades, ya puedes -considerarte oficialmente un usuario de git. Mantener y actualizar tus -propios repositorios y colaborar con los demás usuarios de Github es más -sencillo de lo que parece. Si así lo deseas, puedes seguir buscando -información acerca de cómo aprovechar git al máximo, ya sea a través del -libro [Pro Git](https://git-scm.com/book/es/v2/) o en la documentación -de [Github](https://help.github.com/en/github). diff --git a/content/blog/google-summer-of-code-week-4th-and-7th-midterm-evaluation/index.md b/content/blog/google-summer-of-code-week-4th-and-7th-midterm-evaluation/index.md deleted file mode 100644 index 2262f8cdb..000000000 --- a/content/blog/google-summer-of-code-week-4th-and-7th-midterm-evaluation/index.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: "Google Summer of Code- Week 4th & 7th Midterm Evaluation" -slug: google-summer-of-code-week-4th-and-7th-midterm-evaluation -date: 2023-07-25 -author: Ankit Kumar -tags: [google summer of code, gsoc, open-source open-sciencelab] -categories: [open-source, gsoc] - -draft: false -usePageBundles: true -thumbnail: "/GSoC-Vertical.png" -featureImage: "/GSoC-Vertical.png" ---- - -## Google Summer of Code- Week 4th & 7th Midterm Evaluation -In this article, I will share the progress for Week 4th week to 7th week for my contribution to Open-science labs as a part of Google Summer of Code 2023. - - - -As my Google Summer of Code journey continued, I found myself faced with an exciting yet daunting task: implementing a whole new build-system as an option for templates in the esteemed Open-Science Lab. This endeavor demanded meticulous planning, unwavering dedication, and the exploration of various build-systems, including Maturin, Hatchling, Scikit-build, and `pybuild11`. - -In this period, I started working on to add support for `Maturin` build-system. - -### Maturin - -[**Maturin**]() was the first build-system I explored. Its unique approach of building Python bindings for Rust libraries intrigued me, and I wondered if it could provide a novel solution to the lab's needs. The seamless blending of Python and Rust offered the potential for unparalleled performance and memory efficiency in research projects. However, I faced a steep learning curve to master the intricacies of Rust and its integration with Python. Overcoming these challenges was a significant achievement, and I managed to create a functional prototype that demonstrated Maturin's potential to revolutionize the Open-Science Lab's workflow. My contribution to this issue is [here](https://github.com/osl-incubator/scicookie/pull/152) - -After merging this pull request, I started to add support for `Hatchling` build-system. - -### Hatchling - -[**Hatchling**]() known for its user-friendly nature, was my next target. It promised to simplify the build and deployment processes, which could be particularly beneficial for newcomers to the lab and projects with straightforward requirements. Integrating Hatchling into the lab's ecosystem required thorough documentation and integration tests to ensure its smooth adoption. Overcoming initial hurdles, I was elated to see the positive response from the lab's community as they began adopting Hatchling for their projects. My contribution to this issue is [here](https://github.com/osl-incubator/scicookie/pull/144) - -After completetion of this issue, I jumped to a task to add support for `Scikit-Build-Core`. - -### Scikit-build-core - -[**Scikit-build-core**]() a cross-platform build-system, offered a robust option for integrating CPython extensions. While challenging to implement, I recognized its potential to support projects with complex native code dependencies. My experience with Scikit-build exposed me to advanced build and packaging concepts, and I was thrilled to see it complementing the existing build-systems in the lab, catering to a broader range of projects. My contribution to this issue is [here](https://github.com/osl-incubator/scicookie/pull/161) - -### Conclusions - -In conclusion, my Google Summer of Code experience with implementing new build-systems for the Open-Science Lab was a transformative journey. Overcoming hurdles with Maturin, embracing user-friendliness with Hatchling, exploring the potential of Scikit-build.I realized the importance of innovation and adaptability in the world of open-source development. This experience has not only enriched my technical skills but also instilled in me a passion for contributing to projects that drive positive change in the world of scientific research. As I look to the future, I am excited to continue this journey, collaborating with the open-source community to create solutions that empower researchers and advance the boundaries of knowledge. - -You can read my previous blog [here](https://medium.com/@ayeankit) - -If want to connect with me on LinkedIn [here](https://www.linkedin.com/in/ayeankit/). Github [here](https://github.com/ayeankit). diff --git a/content/blog/herramientas-de-visualizacion-en-python/index.md b/content/blog/herramientas-de-visualizacion-en-python/index.md deleted file mode 100644 index 07435e1f4..000000000 --- a/content/blog/herramientas-de-visualizacion-en-python/index.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: "Herramientas de visualización en Python" -slug: herramientas-de-visualizacion-en-python -date: 2020-05-29 -author: Anavelyz Perez -tags: [visualización de datos, bibliotecas, código, herramientas] -categories: [Python] -aliases: ["/blog/0037-visualizacion_python/herramientas-de-visualizacion-en-python/"] -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -En uno de nuestros artículos, específicamente [10 razones para usar Python en tu próximo proyecto de investigación](http://opensciencelabs.org/blog/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/), se da un recorrido por las ventajas que brinda el lenguaje de programación Python, de allí podemos extraer algunas de sus características tales como: - - - -- [Python](http://python.org/) es un lenguaje de alto nivel, es decir, es un lenguaje de programación muy intuitivo, diseñado de forma tal que el código escrito sea fácil de leer y entender. -- Con pocas líneas de código se pueden hacer diversas actividades. -- Es multiplataforma, indicando que se puede ejecutar en distintos sistemas operativos, como: Windows, Linux o Mac OS. -- Existe una gran cantidad de recursos y apoyo disponibles sobre este lenguaje, a través de grupos de consulta y foros de discusión. -- Posee un número importante de bibliotecas que reciben mantenimiento y apoyo regular por parte de desarrolladores y usuarios. Estas bibliotecas son utilizadas en diversos campos como la estadística y la ciencia de datos. - -Tenemos entonces que Python es un lenguaje con características ideales para llevar a cabo proyectos en muchas áreas, cuenta con elementos que lo hacen potente para manipular grandes cantidades de datos y se han desarrollado herramientas que posibilitan, facilitan y hacen su uso más dinámico. En este artículo nos enfocaremos principalmente en describir algunas de las herramientas de visualización sobre este lenguaje; cuando nos referimos a visualización se hace alusión al hecho de ver, observar o captar a través de un gráfico lo que está sucediendo y no vemos a simple vista en los datos. - -Una de las principales herramientas de visualización son las bibliotecas destinadas a ello. Las bibliotecas de visualización son estructuras de código formalmente distribuidas de manera tal que la podemos descargar y utilizar en nuestros proyectos en el que empleamos Python. Las principales ventajas de estas bibliotecas reside en el ahorro de tiempo y el uso de pocas líneas de código al momento de programar. Al ser bibliotecas de visualización nos permiten crear, mostrar y editar uno o varios gráficos a la vez. Recuerda que, en algunos textos encontraremos la palabra **librería** en vez de **biblioteca**, se pudiesen usar como sinónimos. - -Algunas de las bibliotecas más populares en Python para este caso son: - -* [matplotlib](https://matplotlib.org/): Es una biblioteca de visualización que -permite realizar visualizaciones estáticas, animadas e interactivas en -Python. Con ella se pueden generar gráficos de barras, histogramas, -espectros de potencia, stemplots, scatterplots, gráficos de error, gráficos -circulares y muchos otros. En su sitio oficial de Internet hay una serie de -tutoriales y ejemplos de lo que podemos hacer con ella. - -* [seaborn](https://seaborn.pydata.org/): Al igual que matplotlib, es una -biblioteca que brinda grandes opciones para realizar gráficos. De hecho, esta -biblioteca está basada en matplotlib. La diferencia principal se encuentra en -sus estilos y paletas de colores que son más estéticos y visualmente atractivos. - -* [Bokeh](https://docs.bokeh.org): Es una biblioteca de visualización muy -completa porque permite hacer cualquier tipo de diagrama gráfico. Es -ideal para presentaciones basadas en la web, proporciona la construcción de -gráficos elegantes y versátiles de forma concisa. Una de las ventajas -importantes de esta biblioteca con respecto a las demás es su capacidad para -tener un alto rendimiento ante grandes cantidades de datos. Sus elementos se -pueden clasificar en tres grupos importantes: - -``` -- Gráficos rápidos, son aquellos que se pueden realizar con pocas líneas de código. - -- Especialidades de matplotlib, gráficos que modifican y mejoran los gráficos de matplotlib. - -- Dirigido a desarrolladores e ingenieros de software. -``` - -* [Plotly](https://plotly.com/): Es una herramienta de visualización en línea -que ha desarrollado bibliotecas tanto para Python como para R. Es la opción -más útil y fácil para crear visualizaciones altamente interactivas en la web -(dashboard). - -* [Pygal](http://www.pygal.org/): Al igual que las bibliotecas que hemos -descrito anteriormente Pygal permite realizar cualquier gráfico con pocas -líneas de código, esta tiene la particularidad de estar principalmente -orientada a la creación de gráficos en formato SVG, lo cual indica que -cualquiera de nuestros resultados puede ser editado en un editor de imágenes -e imprimirlos en una resolución de muy alta calidad. - -* [Ggplot](http://ggplot.yhathq.com/): Es un conjunto de métodos para graficar -basado en GGplot2 de R y la gramática de los gráficos. Los resultados se -generan rápidamente y con pocas líneas de código. - -* [Altair](https://altair-viz.github.io/): es una biblioteca de visualización -estadística para Python, basada en Vega y Vega-Lite (gramáticas de -visualización). Permite construir una amplia gama de visualizaciones -rápidamente. - -De esta forma te dejamos la referencia de algunas de las herramientas de visualización de Python, pero hay otras muchas y puedes conseguir más información en la web. Debes tener en cuenta que a diario podemos encontrar nuevas alternativas y actualizaciones importantes de cada una de ellas. Para hacer uso de las bibliotecas podemos recurrir a interfaces de visualización como [Jupyter Notebook](http://jupyter.org/), [Zeppelin Notebook](http://zeppelin.apache.org/), [Google Colab](http://colab.research.google.com/), entre otras. diff --git a/content/blog/herramientas-de-visualizacion-en-r/index.md b/content/blog/herramientas-de-visualizacion-en-r/index.md deleted file mode 100644 index 4cc89ca92..000000000 --- a/content/blog/herramientas-de-visualizacion-en-r/index.md +++ /dev/null @@ -1,201 +0,0 @@ ---- -title: "Herramientas de visualización en R" -slug: herramientas-de-visualizacion-en-r -date: 2020-04-09 -author: Yurely Camacho -tags: [datos, visualización de datos, lattice, ggplot2, tidyverse, ggmap, plotly, shiny] -categories: [ciencia abierta, código abierto, R] -aliases: ["/blog/0032-visualizacionR/herramientas-de-visualizacion-en-r/"] -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Sin duda, los datos deben considerarse como la materia prima para cualquier -proyecto de ciencia abierta, pues todos se basan en el manejo de datos de -distintos tipos. Para *entender esos datos* debe realizarse una inspección -visual de su comportamiento. Esto se conoce como *Visualización de Datos*, que -consiste en generar representaciones gráficas de las variables que componen un -conjunto de datos para obtener información fácilmente interpretable de lo que -ellos nos quieren decir y así, poder comunicarla de una manera asertiva. - - - -La visualización es un método de exploración de datos que muestra, de una -mirada, algunas cosas que de otra forma hubiese sido muy difícil observar. Por -tanto, se suele realizar al comienzo de cualquier análisis estadístico formal o -para la presentación de resultados en informes descriptivos de datos. La -visualización de datos se ve grandemente influenciada por su calidad y -capacidades de las herramientas computacionales y software estadísticos -utilizados para ello. Es aquí donde la decisión del analista de datos por -escoger entre uno u otro lenguaje de programación y/o paquete estadístico es -sumamente importante. - -En esta oportunidad, te hablamos de las capacidades para la -visualización de datos que posee el [Lenguaje estadístico -R](https://www.r-project.org/). - -R es fundamentalmente un lenguaje de análisis estadístico y, por tanto, -tiene en su librería "base" soporte incorporado para gráficos. Otras -funcionalidades avanzadas se incorporan mediante la instalación de -paquetes encontrados en https://cran.r-project.org y son generados por -una gran comunidad activa de desarrolladores de R. Puedes acceder a más -información que te proporcionamos acerca de R en nuestro artículo [¿Qué es el Lenguaje R y cómo puede ayudarte en tus proyectos?](https://opensciencelabs.org/blog/que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos/). - -R posee una [**Galería de gráficos**](https://www.r-graph-gallery.com/), -esto es una colección de gráficos hechos en R, cuyos ejemplos están -basados mayormente en el uso de tidyverse y ggplot2. En ella se muestran -cientos de gráficos con su código reproducible disponible. Cualquier -persona puede sugerir un gráfico o informar de errores. - -En cuanto a la parte de generación de gráficos, en R existen dos -*motores gráficos*, esto se trata de una serie de funciones que permiten -realizar manipulaciones gráficas básicas: como: trazar líneas, dibujar -puntos, curvas, entre otros elementos. Estas funciones no son manejadas -directamente por los usuarios, si no utiliza funciones de alto nivel -(como la función `plot`). Estos motores son: "El motor tradicional o -base de R" y "El motor *grid*". - -Las funciones básicas de R para gráficos como, `plot`, `hist`, `boxplot` y -otras, están desarrolladas bajo el motor tradicional de R. No obstante, para -construir otro tipo de gráficos no es suficientemente adecuada. Por tal motivo, -[Paul Murrell](https://www.stat.auckland.ac.nz/~paul/) desarrolló el motor grid. - -## Algunas consideraciones sobre el motor tradicional de R - -En su paquete base R cuenta con varias funciones para la producción de -gráficas, la mayoría de las cuales se encuentran en el paquete -`graphics`. Algunas de las funciones son: - -- `plot()` por defecto realiza un diagrama de dispersión. Si se cambia - el argumento `type`, permite realizar, por ejemplo, gráficos de líneas - o series de tiempo, entre otras. - -- `hist()` para un histograma. - -- `barplot()` permite hacer un gráfico de barras. - -- `boxplot()` para un diagrama de caja y bigotes. - -- `pie()` o `piechart()` gráfico circular o de sectores. - -Para todos los gráficos que se pueden hacer bajo el motor tradicional -de R, se pueden fijar múltiples elementos, algunos son: márgenes, -espacios, títulos, colores, tipos de marcadores, grosor de líneas. -Además de los gráficos mencionados anteriormente, también se pueden -realizar gráficos de coordenadas polares, eventos, pirámides de edades, -matrices de dispersión, gráficos de independencia y de estrellas, -realizar combinaciones de gráficos, colocar curvas a histogramas, -efectos de sombreado. También se pueden obtener gráficos para -representar la salida de un modelo estadístico como: regresión lineal -simple, análisis de componentes principales, series de tiempo, cartas o -diagramas de control. - -Esos gráficos pueden ser almacenados para su posterior reutilización en -cualquier tipo de documento. Para lo cual se usa el paquete base -`grDevices` que permite aplicar funciones de dispositivos gráficos como -`pdf()` y `png()`. - -A continuación daremos una descripción breve sobre algunos paquetes -útiles para la visualización de datos en R. - -### lattice - -El paquete fue escrito por [Deepayan Sarkar](https://www.isid.ac.in/~deepayan/) -con el objetivo de mejorar los gráficos básicos de R, proporcionando mejores -valores por defecto y tiene la capacidad de mostrar, de una manera fácil, las -relaciones multivariantes. Está desarrollado bajo el motor gráfico grid. Con -este paquete puedes realizar los gráficos *trellis*, que describen situaciones -complejas (mayormente multivariantes) como la relación entre variables -condicionada a una o más variables, representándolo en un sólo gráfico -organizado en paneles. Además, tiene la funcionalidad para generar gráficos en -3D, puedes consultar la [documentación de este -paquete](http://cran.fhcrc.org/web/packages/lattice/) para más información. - -### ggplot2 - -Es un paquete apoyado en el motor grid. Fue desarrollado por [Hardley -Wickham](https://hadley.nz/) como una implementación de como una implementación -de la metodología de visualización de datos llamada *The Grammar of Graphics* -cuya idea consiste en especificar de manera independiente las componentes del -gráfico y luego combinarlas. Es un paquete ampliamente difundido y utilizado en -la actualidad por los analistas de datos. Mantiene una estética elegante y -profesional. Este paquete viene incluido dentro de -[tidyverse](https://www.tidyverse.org/) que engloba un conjunto de paquetes para -ciencia de datos. Se pueden realizar gráficos interactivos y animados. - -Básicamente, los componentes del paquete son: **Estéticas** (color, forma -de un punto, relleno, entre otras), **Capas** (o geoms en el paquete) -por ejemplo, `geom_point`, `geom_line`, `geom_histogram`, `geom_bar`, -`geom_boxplot`, **Facetas** y **Temas**, referentes a aspectos -estéticos, por ejemplo, ejes, etiquetas, colores de fondo, tamaño de los -márgenes y otros. Puedes consultar más sobre este poderoso paquete en -su [página web](https://ggplot2.tidyverse.org/). - -### ggmap - -Permite la representación de información georreferenciada, tiene la misma -arquitectura que ggplot2. Ggmap permite añadir a los gráficos de ggplot2, una -capa cartográfica adicional para lo cual usa recursos disponibles en la web a -través de APIs de Google y otros. Puedes encontrar más información en la -[documentación de -ggmap](https://www.rdocumentation.org/packages/ggmap/versions/3.0.0). - -### plotly - -Con plotly puedes realizar gráficos interactivos y dinámicos de calidad -de publicación, sumamente útiles para los resultados que se difunden a -través de Internet. Permite hacer gráficos de líneas, dispersión, área, -barras, error, cajas, histogramas, mapas térmicos, subgráficos, de -múltiples ejes y gráficos 3D. Es gratuito y de código abierto con -licencia del MIT, puedes ver la fuente, informar de los problemas o -contribuir en GitHub. Funciona sin conexión y no requiere ningún -registro de cuenta. Más información en https://plot.ly/r/. - -### shiny - -Es una herramienta que permite crear aplicaciones web interactivas de -una manera fácil, con esto los usuarios interactúan con sus datos sin -tener que manipular el código, para lo cual solo hace falta conocimiento -de R y no HTML, por ejemplo. Por medio de este paquete se pueden -construir y personalizar fácilmente interfaces gráficas sobre páginas -web mediante pocas líneas de código. -El paquete proporciona varias aplicaciones de ejemplo que puedes usar -para aprender sus principios básicos. Consulta más información en -(enlace a documentación o sitio web de shiny). - -### Otros paquetes - -- El paquete **rgl** con el que se realizan gráficos interactivos en 3D. - Se pueden representar incluso formas geométricas en 3D. - -- Existen librerías en R para poder conectar y explorar los datos desde Google - Analytics: **googleAuthR** y **googleAnalyticsR**. Para utilizarlas se - necesitan en una el token Google Analytics, y en la otra, habilitar Google - Cloud y su API, respectivamente. - -- Paquete **ellipse** y **scatterplot3d** poseen varias funciones para - realizar gráficos básicos y en 3D respectivamente. - -R es muy potente para el análisis estadístico, puedes probar con -distintos paquetes y adoptar el que cumpla tus necesidades y -expectativas. Esperamos que este repaso por algunos de ellos te haya -motivado a indagar un poco más sobre la importancia de la visualización -de los datos y la potencia de R para hacerlo. - -#### Referencias - -- *R para profesionales de los datos: una introducción*. Gil Carlos. - Abril 2018. - -- *Gráficos Estadísticos con R*. Correa Juan y González Nelfi. - Universidad Nacional de Colombia, Sede Medellín. 2002. - -- [R Users Group Ecuador](https://rpubs.com/RUsersGroup-Ecuador/graf). diff --git a/content/blog/ibis-framework/index.md b/content/blog/ibis-framework/index.md deleted file mode 100644 index 832cb90fa..000000000 --- a/content/blog/ibis-framework/index.md +++ /dev/null @@ -1,657 +0,0 @@ ---- -title: "Ibis - Escalonando a Análise de Dados com Expressões Ibis" -slug: ibis-framework -date: 2022-08-03 -author: Luã Bida Vacaro -tags: [ibis, dataframe, datos, pandas] -categories: [ciencia abierta, datos abiertos, acceso abierto, Python, SQL] - -draft: false -usePageBundles: true -thumbnail: "/header.jpg" -featureImage: "/header.jpg" ---- -# Escalonando a Análise de Dados com Expressões Ibis - -[Ibis Framework](https://github.com/ibis-project/ibis/) é uma biblioteca Python que gera expressões de busca em banco de dados. O framework foi idealizado por [Wes McKinney](https://github.com/wesm), o mesmo criador do Pandas, voltado para integração de diferentes Engines de Bancos de Dados através de Expressões Ibis com Python. - -Enquanto os motores de busca e análise de dados crescem e ficam mais robustos com o avanço da era dos Dados, algumas complicações podem ser encontradas em diferentes ambientes de desenvolvimento. Um dos exemplos mais comuns é o crescimento de aplicações que realizam buscas SQL em um banco de dados, com o tempo as buscas se tornam complexas e de difícil leitura. - -Atualmente o Ibis possui 12 backends em seu escopo, alguns deles são responsáveis pela manipulação dos dados, outros, como por exemplo o SQLAlchemy, são responsáveis pela tradução das expressões Ibis em buscas SQL, etc. Você pode conferir todos os backends [aqui](https://ibis-project.org/docs/3.1.0/backends/). - - - -## Setup e Base de Dados - -O Ibis pode ser instalado via `pip` ou `conda`. Nos exemplos a seguir utilizaremos apenas a instalação padrão do Ibis, mas você pode conferir como instalar outros Backends como o [Google BigQuery](https://github.com/ibis-project/ibis-bigquery/), [Apache Impala](https://github.com/ibis-project/ibis-bigquery/), [PostgreSQL](https://ibis-project.org/docs/3.1.0/backends/PostgreSQL/) dependendo da sua necessidade. - - -```python -!mamba install ibis-framework matplotlib sqlalchemy -c conda-forge -y -``` - -Estaremos trabalhando com um dataset disponibilizado pelo Ministério da Saúde em formato CSV. - - -```python -!wget -c https://data.brasil.io/dataset/covid19/caso_full.csv.gz && gunzip -c caso_full.csv.gz > data/caso_full.csv -``` - - -```python -import matplotlib.pyplot as plt -import pandas as pd -import sqlite3 -import ibis -``` - -## Como funciona o Ibis? - -O Ibis, a partir da criação de Expressões, se consitui em uma camada de abstração entre as Engines de banco de dados e o usuário final. Em seu backend, o Ibis utiliza Pandas como sua Engine de execução, então podemos ler o arquivo CSV com a função `read_csv()` do Pandas: - - -```python -df = ibis.backends.pandas.pd.read_csv('data/caso_full.csv') -``` - - -```python -df.head() -``` - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
citycity_ibge_codedateepidemiological_weekestimated_populationestimated_population_2019is_lastis_repeatedlast_available_confirmedlast_available_confirmed_per_100k_inhabitantslast_available_datelast_available_death_ratelast_available_deathsorder_for_placeplace_typestatenew_confirmednew_deaths
0Rio Branco1200401.02020-03-17202012413418.0407319.0FalseFalse30.725662020-03-170.001cityAC30
1NaN12.02020-03-17202012894470.0881935.0FalseFalse30.335392020-03-170.001stateAC30
2Rio Branco1200401.02020-03-18202012413418.0407319.0FalseFalse30.725662020-03-180.002cityAC00
3NaN12.02020-03-18202012894470.0881935.0FalseFalse30.335392020-03-180.002stateAC00
4Rio Branco1200401.02020-03-19202012413418.0407319.0FalseFalse40.967542020-03-190.003cityAC10
-
- - - - -```python -df.info() -``` - - - RangeIndex: 3853648 entries, 0 to 3853647 - Data columns (total 18 columns): - # Column Dtype - --- ------ ----- - 0 city object - 1 city_ibge_code float64 - 2 date object - 3 epidemiological_week int64 - 4 estimated_population float64 - 5 estimated_population_2019 float64 - 6 is_last bool - 7 is_repeated bool - 8 last_available_confirmed int64 - 9 last_available_confirmed_per_100k_inhabitants float64 - 10 last_available_date object - 11 last_available_death_rate float64 - 12 last_available_deaths int64 - 13 order_for_place int64 - 14 place_type object - 15 state object - 16 new_confirmed int64 - 17 new_deaths int64 - dtypes: bool(2), float64(5), int64(6), object(5) - memory usage: 477.8+ MB - - -E para demonstrar o verdadeiro poder do Ibis, iremos transformar nosso arquivo CSV em uma Base de Dados SQL. Na instalação padrão do Ibis, o backend SQL é o `sqlite3`, então nos exemplos a seguir utilizaremos SQLite para realizar buscas na base de dados. Caso queira utilizar outra Engine SQL, como [BigQuery](https://github.com/ibis-project/ibis-bigquery/) ou [Postgres](https://ibis-project.org/docs/3.1.0/backends/PostgreSQL/), acesse a [documentação oficial](https://ibis-project.org/docs/3.1.0/backends/PostgreSQL/) e siga instruções de instalação. - - -```python -df.to_sql('casos_covid19_BR', sqlite3.connect('data/casof.db')) -``` - - - - - 3853648 - - - - -```python -con = ibis.sqlite.connect('data/casof.db') -casos = con.table('casos_covid19_BR') -``` - -O Ibis, junto com o SQLAlchemy, utiliza grafos para representar suas Expressões. Portanto é possível visualizar todas as etapas ocorridas no Backend com a configuração de representação de grafos ativa. Da mesma forma, podemos representar o Schema da nossa tabela através da função `display()`: - - -```python -ibis.options.graphviz_repr = True -display(casos) -``` - - - -![png](output_14_0.png) - - - -Assim como no Pandas, as colunas podem ser chamadas diretamente. Entretanto, como o Ibis funciona por padrão em [`Lazy mode`](https://ibis-project.org/docs/3.1.0/tutorial/03-Expressions-Lazy-Mode-Logging/?h=lazy), o resultado da query não fica armazenado em memória e ela só será executada utilizando o comando `execute()`. O lazy mode busca diminuir a utilização da memória, ao invés de executar a busca quando o objeto é instanciado, o Ibis retorna uma expressão contendo os parâmetros de busca, executando a busca somente quando necessário: - - -```python -# Semelhante ao pandas, podemos realizar uma busca SQL que retorna os valores max. e min. da coluna -data_min = casos.date.min().name('first_entry') -data_max = casos.date.max().name('last_entry') -``` - - -```python -print(data_min.execute()) # Dia da primeira entrada registrada na base de dados -print(data_max.execute()) # Dia da última entrada registrada na base de dados -``` - - 2020-02-25 - 2022-03-27 - - -## E por que usar Ibis ao invés das ferramentas SQL diretamente? - - -- Ibis, por ser uma ferramenta escrita em Python, é atraente para quem não tem tanta familiaridade com SQL. Ao automatizar as buscas, novos desenvolvedores poderão entender como as buscas são feitas na Engine SQL. -- Com o crescimento da aplicação, os parâmetros de busca em SQL podem se tornar confusos e de difícil replicação. Com o Ibis é possível portabilizar as Expressões para serem reutilizadas em outras buscas sem a necessidade de reescrever código. -- Caso você esteja trabalhando com diferentes Engines SQL, seja por causa do tamanho da base de dados, por exemplo. Com o Ibis é possível rapidamente conectar à uma Engine que consiga lidar diferentes volumes de dados ([ClickHouse](https://ibis-project.org/docs/3.1.0/backends/ClickHouse/), [HeavyAI](https://github.com/heavyai/ibis-heavyai), etc) e continuar com o mesmo fluxo de trabalho. - -Por exemplo: já vimos que é possível criar buscas SQL através de expressões Ibis, entretanto, o oposto também pode ser visualizado. Com a função `compile()` podemos retornar os parâmetros da busca realizada pela Expressão Ibis na base de dados. Ou seja, é possível realizar análises das buscas na base de dados com facilidade, pois o Ibis te mostra como fez para retornar o resultado desejado: - - -```python -print(data_min.compile()) -``` - - SELECT min(t0.date) AS first_entry - FROM main."casos_covid19_BR" AS t0 - - -Um dos pontos chave do Ibis, é a possibilidade de criar Expressões com o resultado de interesse, renomeá-las, e utilizá-las para outras buscas sem precisar repetir código: - - -```python -total_new_cases = casos['new_confirmed'].sum().name('total_new_cases') -total_new_deaths = casos['new_deaths'].sum().name('total_new_deaths') -``` - - -```python -total_new_cases -``` - - - - - -![png](output_23_0.png) - - - - - -```python -epiweek_covid = casos.group_by('epidemiological_week').aggregate(( - total_new_cases, - total_new_deaths, - )) - -print(epiweek_covid.compile()) -``` - - SELECT t0.epidemiological_week, sum(t0.new_confirmed) AS total_new_cases, sum(t0.new_deaths) AS total_new_deaths - FROM main."casos_covid19_BR" AS t0 GROUP BY t0.epidemiological_week - - -Lembra que o Ibis utiliza o Pandas como Backend de execução? Podemos agora salvar o Pandas DataFrame gerado na execução em uma variável para termos acesso às funções do Pandas: - - -```python -df = epiweek_covid.execute() -df.head() -``` - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
epidemiological_weektotal_new_casestotal_new_deaths
020200940
1202010330
22020112310
3202012193530
42020135476183
-
- - - - -```python -df['week'] = df['epidemiological_week'].astype(str).str[4:6] -df['year'] = df['epidemiological_week'].astype(str).str[0:4] - -df.pop('epidemiological_week') -df.insert(0, 'year', df.pop('year')) -df.insert(1, 'week', df.pop('week')) -df.head() -``` - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
yearweektotal_new_casestotal_new_deaths
020200940
1202010330
22020112310
3202012193530
42020135476183
-
- - - - -```python -df = df.head(15) -plt.bar(df.week, df.total_new_cases) -plt.bar(df.week, df.total_new_deaths) -plt.xlabel('Epidemiological week') -plt.ylabel('Population') -plt.legend(['New cases', 'New deaths']) -plt.show() -``` - - - -![png](output_28_0.png) - - - -## Manipulando os dados e inserindo novas colunas: - -Os DataFrames gerados pelo Pandas Engine são estáticos. Isso quer dizer que ao manipular os dados, as expressões não alteram o DataFrame em si, mas preparam os parâmetros de busca para gerar um novo DataFrame a partir do comando `execute()`, que pode ser visualizado, armazenado e exportado. - -No exemplo abaixo, estaremos parametrizando a busca a ser realizada na base de dados. Com uma sintaxe "Pandas-like", pode-se imaginar que estaremos manipulando o DataFrame em si. Entretanto, o Ibis armazena o resultado desejado para que a busca seja realizada somente quando o resultado deve ser exibido, executando-o. Ao extrair as colunas como em `percentage_cases`, por exemplo, uma query SQL é armazenada - -Operações matemáticas entre as colunas podem ser escritas de maneira Pythonica com o Ibis e facilmente adicionadas em outros critérios de busca: - - -```python -percentage_cases = (casos['new_confirmed'] / casos['estimated_population'] * 100).name('porc_cases') -``` - -Assim como em SQL, `when clauses` podem ser usadas para extrair apenas certas partes dos dados. Neste exemplo estaremos extraindo as informações dos estados do Sul do país, para que no final seja retornado um DataFrame com os parâmetros definidos. Com o modo de gráficos ativo, podemos visualizar os passos armazenados nos parâmetros de busca: - - -```python -south_br = (casos.state.case() - .when('SC', 'Santa Catarina') - .when('RS', 'Rio Grande do Sul') - .when('PR', 'Parana') - .end() - .name('Regiao Sul')) - -south_br -``` - - - - - -![png](output_32_0.png) - - - - -Compilando as buscas com os parâmetros, podemos visualizar a query que acabamos de criar e que será executada com a função `execute()`: - - -```python -# Query SQL referente a `percentage_cases`: -print(percentage_cases.compile().compile( - compile_kwargs={"literal_binds": True})) -``` - - SELECT (t0.new_confirmed / t0.estimated_population) * 100 AS porc_cases - FROM main."casos_covid19_BR" AS t0 - - - -```python -# Query SQL referente a `south_br` -print(south_br.compile().compile( - compile_kwargs={"literal_binds": True})) -``` - - SELECT CASE WHEN (t0.state = 'SC') THEN 'Santa Catarina' WHEN (t0.state = 'RS') THEN 'Rio Grande do Sul' WHEN (t0.state = 'PR') THEN 'Parana' ELSE CAST(NULL AS TEXT) END AS "Regiao Sul" - FROM main."casos_covid19_BR" AS t0 - - -Agora que temos a porcentagem de casos e a região separadas em duas variáveis, podemos agregar as buscas e encontrar as porcentagem de casos nos estados em questão e retorná-lo em Dataframe: - - -```python -# Agregando as duas queries SQL como se fosse um Pandas DataFrame: -sul = casos.group_by(south_br).aggregate(percentage_cases.mean().name('Media Casos')).dropna() -print(sul.compile().compile(compile_kwargs={"literal_binds": True})) -``` - - SELECT t0."Regiao Sul", t0."Media Casos" - FROM (SELECT CASE WHEN (t1.state = 'SC') THEN 'Santa Catarina' WHEN (t1.state = 'RS') THEN 'Rio Grande do Sul' WHEN (t1.state = 'PR') THEN 'Parana' ELSE CAST(NULL AS TEXT) END AS "Regiao Sul", avg((t1.new_confirmed / t1.estimated_population) * 100) AS "Media Casos" - FROM main."casos_covid19_BR" AS t1 GROUP BY CASE WHEN (t1.state = 'SC') THEN 'Santa Catarina' WHEN (t1.state = 'RS') THEN 'Rio Grande do Sul' WHEN (t1.state = 'PR') THEN 'Parana' ELSE CAST(NULL AS TEXT) END) AS t0 - WHERE t0."Regiao Sul" IS NOT NULL AND t0."Media Casos" IS NOT NULL - - - -```python -# O resultado da query com o DataFrame desejado: -sul.execute() -``` - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Regiao SulMedia Casos
0Parana0.018670
1Rio Grande do Sul0.028637
2Santa Catarina0.029332
-
- - - -## Conclusão - -Como pudemos ver, o Ibis é uma ferramenta poderosa para acelerar sua análise de dados, capaz de integrar diferentes engines SQL com o Pandas, o Framework traz melhorias de performance e legibilidade ao código Python. Crie e realize buscas SQL como se estivesse trabalhando com um Pandas DataFrame, mas com uma economia de memória e alta portabilidade! Com o Ibis é possível utilizar o mesmo padrão de trabalho para desenvolvimento e produção, acelerar seus testes unitários, escalonar a aplicação para diferentes bases de dados, e muito mais! - -### Referências - -- https://ibis-project.org/ -- https://github.com/ibis-project/ibis diff --git a/content/blog/investigacion-colaborativa-con-git/index.md b/content/blog/investigacion-colaborativa-con-git/index.md deleted file mode 100644 index 761fead09..000000000 --- a/content/blog/investigacion-colaborativa-con-git/index.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -title: "Investigación Colaborativa con Git" -slug: investigacion-colaborativa-con-git -date: 2020-01-20 -author: Anavelyz Pérez -tags: [git, ramas] -categories: [ciencia abierta, investigación abierta, desarrollo de software, control de versiones] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -La Investigación colaborativa surge en el momento en el que varias -entidades, que pueden estar especializadas en diferentes áreas, se -establecen un mismo objetivo o proyecto. La finalidad de una -investigación bajo este modelo es encontrar soluciones, descubrir o -explicar comportamientos de un fenómeno en particular el cual puede ser -económico, social, político, científico, entre otros. - - - -La investigación colaborativa se presenta en distintas ocasiones donde -se requiera un ciclo colaborativo de acuerdo a las necesidades que se -presenten en un proyecto, se busca brindar aportes significativos en la -sociedad o entorno. - -A continuación te mostramos algunos ejemplos en los cuales puede resultar -útil implementar este tipo de investigación: - -- Un departamento de una organización está ayudando a otro que tiene una - deficiencia con respecto a la optimización de sus actividades. - -- Los cultivos de una localidad se están viendo afectados por una plaga; - esa plaga es similar a una ocurrida años atrás. Para estudiar las - causas, consecuencias y prevenir futuros episodios como este, se han - reunido varios biólogos expertos junto con historiadores, ingenieros - agrónomos y especialistas en otras áreas. - -- Un grupo de expertos en diversas disciplinas tienen en mente crear un - documento que sea pieza fundamental en la conformación del presupuesto - nacional del siguiente año fiscal. - -- Un diseñador industrial está proponiendo un rediseño de uno de los - productos de la empresa en la que trabaja. Para ello realiza un - estudio con la ayuda de sus compañeros expertos en marketing y - estadística. Con esto busca obtener una mejor perspectiva de los - usuarios, sus necesidades y aceptación del mercado en general. - -- Una institución privada desea financiar las actividades de una - fundación. Para lo cual recurre a un grupo de expertos con la - finalidad de evaluar y presentar un esquema del presupuesto y la - descripción de lo que debe invertir para obtener los mejores - resultados. - -Cada una de las situaciones ejemplificadas requieren de la participación -de distintos grupos multidisciplinarios que pueden estar formados por -personas, entidades, institutos o grupos de trabajo que interactúen a la -vez con la información. Esto puede ser de manera individual, en paralelo -o en conjunto para conformar lo que sería el proyecto final. La idea es -que, todos los miembros del equipo que llevarán a cabo el proyecto, -cumplan con tareas especificas según sus conocimientos o aptitudes. - -Las tareas asignadas a cada miembro pueden o no depender -condicionalmente unas de otras y deben promover el cambio y fomentar la -participación. Esto implica que el proyecto estará sujeto a cambios -constantes por la integración de nuevas ideas. Es aquí cuando nos -podemos plantear ¿Cómo almacenamos todos los cambios que ocurren hasta -que es alcanzado el objetivo final? ¿Qué debemos hacer si un miembro del -proyecto elimina por accidente información importante?. - -Para esto proponemos el uso de los *sistemas de control de versiones* -(VCS, por sus siglas en inglés) pues nos permiten almacenar todos los -cambios realizados y la información asociada a ellos. En este caso te -recomendamos el uso de **Git**. - -## Git - -Es un sistema de control de versiones que se diferencia de sus similares -por la forma en la que manejan sus datos; Git lo hace como una secuencia -de copias instantáneas. Además, "todo es verificado mediante una suma de -comprobación (*checksum* en inglés) antes de ser almacenado, y a partir -de ese momento es identificado mediante esta, esto quiere decir que es -imposible cambiar el contenido de cualquier archivo o directorio sin -que Git lo sepa". - -Para ejecutar la mayoría de las operaciones en Git solo se necesitan -archivos y recursos locales. Estas funcionalidades te permiten hacer -investigación colaborativa y que la información siempre esté -salvaguardada. - -Por otro lado Git, al igual que otros VCS, posee un sistema de -ramificación; el cual consiste en tomar la versión principal del -proyecto para poder trabajar en ella individualmente, pero sin alterar -la versión original, manejando así una especie de copia de esta. Hechas -las modificaciones, la rama puede volver a fusionarse con el archivo de -origen. - -Tal vez pienses que el proceso de creación de ramas es lento y tedioso, -debido a la cantidad de contenido o información en el proyecto, pero en -Git esto resulta rápido y sencillo. Una de las ventajas de utilizar -ramas es que, como colaborador, puedes trabajar de manera separada y -eficiente, sin alterar la versión principal. Así mismo, puedes crear -subproyectos constituidos por ramas de las cuales se deriven otras -ramas. - -Git te permite obtener tu propio repositorio remoto o utilizar otros -alternativos, con lo cual obtendrás el máximo provecho a la información -y a su vez compartirás conocimiento rompiendo barreras de distancia. - -La investigación colaborativa con Git es ideal para crear grandes movimientos y -proyectos. Los avances y cambios llegarán en poco tiempo, los equipos de trabajo -pueden crear ambientes amigables de trabajo y cada aporte puede ser cuestionado -de manera positiva consultando a los involucrados oportunamente, respetando su -autoría y tiempo de dedicación al proyecto. - -Referencia: -**The entire Pro Git book**. Autores: Scott Chacon y Ben Straub diff --git a/content/blog/la-importancia-de-la-integridad-en-los-datos-manejados-en-los-dashboards/index.md b/content/blog/la-importancia-de-la-integridad-en-los-datos-manejados-en-los-dashboards/index.md deleted file mode 100644 index 66fcd3054..000000000 --- a/content/blog/la-importancia-de-la-integridad-en-los-datos-manejados-en-los-dashboards/index.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: "La importancia de la integridad en los datos manejados en los dashboards" -slug: la-importancia-de-la-integridad-en-los-datos-manejados-en-los-dashboards -date: 2020-05-14 -author: Anavelyz Pérez -tags: [datos, dashboard, herramientas, código] -categories: [ciencia de datos] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - -Si trabajamos en una empresa o institución pública o simplemente queremos ver el comportamiento de nuestros datos, podemos pensar en realizar uno o varios gráficos. Los gráficos son representaciones visuales de los datos que nos permiten comprenderlos, compararlos, analizarlos y describirlos de forma tal que se tenga una noción más clara de lo que ocurre con ellos. - - - -En este artículo nos centraremos en los dashboards que son representaciones gráficas de los datos. Como representaciones de gráficos, pueden estar conformadas por una o varias visualizaciones con la particularidad de ser o no interactivos. Los dashboards son utilizados principalmente para ver y evaluar la calidad de un negocio o el cambio de algunos valores específicos a través del tiempo. También permite observar el comportamiento de alguna variable y sugerir estudios más profundos en relación a lo que sucede. - -Ya te habíamos mostrado, en el artículo Te hablamos del uso de dashboards para visualización de datos de tu próximo proyecto. En ese artículo, definimos los dashboards como: - -Los dashboards son herramientas de manejo de información que se vinculan entre sí a través de APIs, servicios, librerías y código de una manera dinámica por 'debajo' de la interfaces de usuarios, es decir, mostrando los resultados de esta interacción en una interfaz web o aplicación móvil, a través de gráficos y visualizaciones que al instante presentan los llamados indicadores de rendimiento (Key Performance Indicators KPI por sus siglas en inglés), o cualquier otro tipo de indicadores, acerca de un negocio, proceso, departamento, sitio web, o servidor. Prácticamente cualquier cosa que necesite ser monitorizada de forma constante puede utilizar los dashboards. Debido a su naturaleza como frontend, son completamente personalizables para cualquier propósito al que los quieras aplicar, sólo hace falta crear los scripts necesarios para hacerlo. - -Ahora, ¿Qué es lo primordial para elaborar un dashboard? - -Para elaborar dashboards son necesarios los datos, estos serán la materia prima que permitirá crearlos. Debemos tener en cuenta que los datos puedan almacenar la información que deseamos extraer o contabilizar. Una vez que se tengan disponibles los datos se debe tener claro cuáles son las variables o valores que se desean estudiar y así trazar un plan en el que se definan los tipos de gráficos que serán presentados en los dashboards. - -Por otro lado, se deben definir las herramientas que utilizaremos para su elaboración. De estas herramientas existen varias: desde una hoja de cálculo hasta aplicaciones de software especializado. En el caso de software libre y código abierto, existen bibliotecas que permiten crear dashboards de manera rápida y sin muchas líneas de código. Por mencionar algunas están Bokeh y Plotly que son librerías de código abierto para Python. En la sección frameworks y librerías diseñadas para dashboards del artículo Te hablamos del uso de dashboards para visualización de datos de tu próximo proyecto encontrarás una descripción un poco más amplia de las herramientas que se pueden emplear para esta elaboración. - -¿Qué es la integridad en los datos? y ¿cuál es su importancia en los dashboards? - -La integridad en los datos se refiere a su fiabilidad, es decir, a que la información que muestran sea exacta, completa, homogénea, sólida y coherente. Al tener integridad en los datos es muy probable que la información que se obtenga a través de estos sea verídica y muestre la realidad. - -Por ello, es de gran importancia que los datos involucrados en la creación de los dashboards tengan integridad. Permitiendo de esta manera presentar gráficos claros, sin sesgos o alteraciones, se evitarían posibles problemas de interpretación y la toma decisiones basadas en esta información es más confiable. - -Otro aspecto que brinda la integridad de los datos en los dashboards es la facilidad para agrupar la información y la segmentación de lo que puede o no ser relevante. - -Tengamos en cuenta que la integridad de los datos se ve alterada en el momento en que un valor en el conjunto de los datos ha sido modificado por equivocación, se ingresa uno o varios datos erróneos o si simplemente fue alterado por alguna circunstancia asociada al proceso de su obtención. Para prevenir esto es importante la supervisión del proceso de obtención de los datos así como su correcta depuración o pre-procesamiento. - -En resumen tenemos que los dashboards son una excelente herramienta para describir los procesos que ocurren con los datos, pero para ello es vital que estos últimos sean tales que contengan la mayor información, sean fiables de manera que cuenten con integridad para así lograr el objetivo de describir y tener mayor visión de lo que en verdad ocurre. - -Los dashboards son clave en la visualización de datos. Debemos ser consientes de que un dato puede ser simplemente un valor, pero descubrir lo que este significa puede causar impacto, mover o cambiar procesos cuando se requiera, en una en un proyecto, en organización, en una comunidad o hasta en un país. diff --git a/content/blog/la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones/index.md b/content/blog/la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones/index.md deleted file mode 100644 index 1bf413bc0..000000000 --- a/content/blog/la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones/index.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: "La investigación abierta, el manejo de repositorios y control de versiones" -slug: la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones -date: 2020-02-28 -author: Anavelyz Perez -tags: [versionado, repositorios] -categories: [ciencia abierta, investigación abierta, desarrollo de software, control de versiones] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Las investigaciones son esenciales en el avance tecnológico y social -porque nos permiten encontrar respuestas a muchas dudas e hipótesis que -surgen diariamente, así como encontrar soluciones a acontecimientos que -lo requieran. Por ello, cuando se menciona el término investigación -abierta, se hace alusión a aquella investigación que toma en cuenta los -elementos de la ciencia abierta. - - - -En el blog [*NeoScientia*](https://neoscientia.com/ciencia-abierta/) se -menciona que la investigación abierta impulsa la apertura al público de -las investigaciones de forma libre y gratuita. Lo cual consiste en que -se publiquen las metodologías, procesos y datos obtenidos por resultados -directos o derivados, fomentando con ello la colaboración entre -profesionales. En este sentido, la investigación abierta abre horizontes -en los cuales se expone una mayor cantidad de información, la difusión -de los proyectos es mayor y se cuenta con más apoyo al tener una serie -de personas trabajando en un mismo proyecto. - -Es aquí cuando nos podemos preguntar acerca de las herramientas e -instrumentos que lo harán posible y que debemos manejar para trabajar en -un proyecto de investigación abierta, teniendo en cuenta que se -necesitan espacios en donde se comparta y difunda la información, -preferiblemente a través de la web, para que su acceso sea a nivel -universal. Por ello, el acceso a los datos de las investigaciones -abiertas debe ser fácil y seguro, así como la edición de los archivos -involucrados debe estar monitoreada de manera que no se pierdan aspectos -vitales. - -De acuerdo con lo anterior, una herramienta necesaria son los -repositorios, que son una especie de depósito de archivos digitales. Su -objetivo es organizar, almacenar, preservar y difundir, en modo de -acceso abierto (Open Access), la producción intelectual resultante de la -actividad académica, científica, social o según sea el tema de la -investigación. Cuando se cuenta con un repositorio se tendrá un espacio -en el cual más personas pueden acceder a lo que se ha logrado con las -investigaciones y, a su vez, estas personas formarán un ambiente -colaborativo en donde se validarán y discutirán los resultados, se -construirán también nuevos aportes y se dispondrá de más información. - -Una de las herramientas más difundidas en el manejo de repositorios es -**Git**. Cuando trabajamos en conjunto para lograr un objetivo, debemos -contar con un mecanismo mediante el cual la mayoría trabajen a la vez. -Si estamos cerca y el número de personas en la investigación es pequeño, -este proceso puede resultar fácil y los resultados se pueden trabajar en -un mismo archivo sin que pase desapercibido algún cambio. Mientras que, -si estamos trabajando a distancia y con un numeroso grupo de personas -resultará difícil verificar los cambios y editar en un solo documento. - -Para solucionar este problema, podemos recurrir al control de versiones. -En nuestro artículo [Investigación Colaborativa con Git](https://opensciencelabs.org/blog/investigacion-colaborativa-con-git/) -se menciona que el control de versiones nos permite almacenar todos los -cambios que ocurren durante el proceso de avance hasta que es alcanzado -el objetivo final y si algún miembro del equipo hace cambios durante el -proceso y conformación final del proyecto, estos quedarán registrados -junto con la información asociada a ellos. Logrando así que elementos -vitales de las investigaciones no se pierdan fácilmente, debido a cualquier -confusión o error. Lo que ocurre en tus documentos estará respaldado. -Por todo ello es que afirmamos que una herramienta potente para el -control de versiones es Git. - -En un contexto más amplio tenemos que, al realizar investigaciones -abiertas, se deben manejar adecuadamente los repositorios para obtener -una mayor cantidad de información disponible y, a su vez, contribuir -para que sea más abundante. Además, si se combina esto con el control de -versiones se tiene una retroalimentación continua donde personas con -distintos puntos de vista pueden colaborar. La combinación de estas -herramientas tendrá como resultado la existencia de más elementos -disponibles a nivel informativo, divulgativo y experimental en distintas -áreas y lo más importante, de manera segmentada. Es destacable mencionar -que los manejadores de repositorios tienen un motor de búsqueda, lo cual -nos permite acceder a lo que necesitamos de manera eficiente. Por otro -lado, con el control de versiones podemos tener versiones certificadas y -actualizadas de la información. - -Existen repositorios remotos, que combinan las funcionalidades de un -repositorio con el control de versiones. De manera general, un -repositorio remoto es una versión de un proyecto en específico que se -encuentra alojado en internet. Estos repositorios pueden tener permisos -especiales de manera que todos o algunos de los miembros del equipo de -trabajo pueden editar. Esta edición será compartida para cada uno. Esto -se logra a partir de la gestión de repositorios remotos lo cual podemos -hacer con Git, implicando conocer cómo añadir repositorios nuevos, -eliminar aquellos que ya no son válidos, gestionar ramas remotas e -indicar si están bajo seguimiento o no, y otras cosas más. Te invitamos -a revisar nuestro artículo [Git de 0 a 100 en diez sencillos -pasos](https://opensciencelabs.org/blog/git-de-en-diez-sencillos-pasos/). - -## Referencias - -[Biblioteca de la Universidad de Extremadura](https://biblioguias.unex.es/c.php?g=572093&p=3944864) - -[Oficina de conocimiento abierto](http://oca.unc.edu.ar/2018/08/21/repositorios-de-datos-de-investigacion-y-de-ciencia-abierta/) - -[Blog Neoscientia](https://neoscientia.com/ciencia-abierta/) diff --git a/content/blog/los-laboratorios-sociales-y-el-manejo-del-covid-19/index.md b/content/blog/los-laboratorios-sociales-y-el-manejo-del-covid-19/index.md deleted file mode 100644 index 125bbf03b..000000000 --- a/content/blog/los-laboratorios-sociales-y-el-manejo-del-covid-19/index.md +++ /dev/null @@ -1,203 +0,0 @@ ---- -title: "Los laboratorios sociales y el manejo del COVID-19" -slug: los-laboratorios-sociales-y-el-manejo-del-covid-19 -date: 2020-07-06 -author: Yurely Camacho -tags: [laboratorios sociales, covid19, ciencia ciudadana] -categories: [ciencia abierta] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - -![header](../../../images/blog/los-laboratorios-sociales-y-el-manejo-del-covid-19/header.png) - -Frente a la pandemia ocasionada por la enfermedad COVID-19 se han -desarrollado en todo el mundo, distintas prácticas de ciencia abierta -para hacerle frente. Una de ellas son los **Laboratorios Sociales** -donde los integrantes desarrollan y difunden actividades virtuales -respecto a este tema. Recordemos que los laboratorios sociales son -espacios donde cualquier ciudadano puede participar, colaborando con -otros, compartiendo sus conocimientos, ideas y experiencias con el -propósito de generar proyectos que ofrezcan propuestas o soluciones para -mejorar situaciones diversas. - - - -En este post mencionamos algunos laboratorios sociales y los proyectos -que han desarrollado continuamente con respecto al manejo del COVID-19 y -observaremos el trabajo desempeñado en conjunto de algunos de ellos. - -### [FrenaLaCurva](https://frenalacurva.net/) - -FrenaLaCurva es un referente en cuanto a plataformas que desarrollan y -ofrecen iniciativas para el manejo del COVID-19, mediante -[**Laboratorios Ciudadanos -Distribuidos**](https://frenalacurva.net/laboratorios-ciudadanos/) con -el fin de detectar buenas ideas y personas interesadas en ayudar a -llevarlas a cabo, mediante la experimentación, colaboración e innovación -ciudadana para afrontar la situación de la pandemia. La plataforma cuenta con la -participación de más de 10 países, entre ellos Brasil, Argentina, -Colombia, Uruguay, Alemania. - -Algunas iniciativas de los Laboratorios Ciudadanos Distribuidos de -FrenaLaCurva son: - -- Red Comunitaria para la Atención alimentaria A Coruña - -- #yaVoyXti, app colaborativa de solidaridad en tiempos de coronavirus - -- Diario literario de un confinamiento - -Todas estas iniciativas y otras desarrolladas por esta plataforma ayudan -a la comunidad en su cotidianidad frente a a pandemia, brindándoles -espacios para que interactúen y se sientan acompañados. Puedes consultar -[aquí](https://drive.google.com/drive/folders/1zDYuT0bf0MAGD15bmYsxIBpDEhwbf16P) -toda la información sobre los proyectos. - -### [MIT MediaLab](https://www.media.mit.edu/) - -Los MediaLab son tipos de laboratorios sociales, y el Instituto de -Tecnología de Masachussets (MIT) cuenta con uno. Bajo este ámbito el MIT -MediaLab está dedicado a los proyectos de investigación en la -convergencia del diseño, la multimedia y la tecnología. Ofrece varios -recursos y proyectos para el manejo del COVID-19 como instituto de -investigación. Entre ellos se encuentran: - -- [Centro de Información COVID-19](https://covid19.mit.edu/) - -Ofrece las últimas actualizaciones, orientación y recursos para ayudar a -apoyarle durante la pandemia. - -- [Proyecto sobre comunidades resilientes y COVID-19](https://www.media.mit.edu/projects/resilient-communities-and-covid19/overview/) - -Es un proyecto de la mano con el grupo City Science para abordar la -resiliencia. - -- [Observatorio COVID-19](https://c19observatory.media.mit.edu/) - -Este proyecto es una colaboración del MIT con el Banco Mundial y se -refiere al seguimiento mundial de la evolución en tiempo real del -COVID-19 mediante la cuantificación del distanciamiento social y el -impacto económico. - -- [Pandemic Response CoLab](https://www.pandemicresponsecolab.org/) - -El propósito del proyecto es: - -- Identificar los problemas clave relacionados con COVID-19 - -- Desarrollar soluciones a estos problemas - -- Reclutar personas y recursos para implementar estas soluciones - -El proyecto ofrece un dashboard, el [Pandemic Response Data Dashboard](https://www.pandemicresponsedata.org/) que recopila datos fiables y oportunos para ayudar a la comunidad científica a encontrar las soluciones más impactantes a la pandemia. - -### [MediaLab UGR](https://medialab.ugr.es) y [LabIN Granada](https://labingranada.org/) - -MediaLab UGR es un laboratorio social de la Universidad de Granada que, -entre otras cosas, promueve convocatorias abiertas para la presentación -de propuestas y la participación en el desarrollo colaborativo de -proyectos para la Universidad y la sociedad en general. - -Por su parte, LabIN Granada es un laboratorio social nacido en 2007 para -Granada, y en este momento de aislamiento social, funciona como una -herramienta para conectarnos desde la solidaridad y la creatividad. - -Estos laboratorios, en ocasiones, trabajan en conjunto en la -planificación y desarrollo de proyectos para el bienestar social. Uno de -ellos es la iniciativa [LabIN #UGRenCasa](https://ugrencasa.labingranada.org/), un espacio de -encuentro para la comunidad universitaria y la ciudadanía durante el -confinamiento con el fin de proponer ideas para vivir mejor y compartir -experiencias sobre esta situación y qué podemos aprender de ello para el -futuro. - -### [MediaLab Prado](https://www.medialab-prado.es) - -La actividad de MediaLab Prado se estructura en grupos de trabajo, -convocatorias abiertas para la producción de proyectos, investigación -colaborativa y comunidades de aprendizaje en torno a temas muy diversos \[https://www.medialab-prado.es\]. -MediaLab Prado está constituido por varios laboratorios, uno de ellos el [InCiLab](https://www.medialab-prado.es/laboratorios/incilab) un laboratorio de innovación ciudadana. - -Una de las iniciativas de InCiLab frente al COVID-19 son los [Laboratorios Bibliotecarios en confinamiento](https://www.culturaydeporte.gob.es/cultura/areas/bibliotecas/mc/laboratorios-bibliotecarios/jornadas/confinamiento.html) bajo la tutela del Ministerio de Cultura y Deporte de España. Se trata de un espacio de encuentro para reflexionar sobre el impacto que tendrá la pandemia en las bibliotecas y proponer soluciones a nuevos retos. - -Continuemos con otro laboratorio y algunos de sus proyectos: - -### [BID Lab](https://bidlab.org/es/) - -Es el laboratorio de innovación del Grupo Banco Interamericano del -Desarrollo (BID). Se encarga de movilizar financiamiento, conocimiento y -conexiones para impulsar la innovación y promover la inclusión en -América Latina y el Caribe \[https://bidlab.org/es/\]. - -BID Lab ofrece un sitio web [RESPONDIENDO AL -COVID-19](https://bidlab.org/es/coronavirus) donde se presentan -proyectos que abordan los efectos sanitarios y económicos del COVID-19. -Algunas de esas iniciativas se muestran a continuación: - -- [COVID-19 Mapa de Innovadores de América Latina y el Caribe](https://bidlab.org/es/map-LAC-innovators-Covid-19) - -El mapa muestra los innovadores, emprendedores y -[startups](https://es.wikipedia.org/wiki/Empresa_emergente) de América -Latina y el Caribe, que proponen soluciones para moderar los desafíos -ocasionados por el COVID-19. - -- [CONECTOR Digital COVID-19](https://bidlab.org/es/conector-digital/inicio) - -Es un punto de encuentro y colaboración para apoyar a las empresas, -emprendedores y ciudadanos de América Latina y el Caribe con recursos de -innovaciones digitales, colaboración para potenciar el impacto de -sus soluciones, el intercambio de ideas, experiencias e información de -valor durante el tiempo de confinamiento. - -- [CivicLytics- Escucha ciudadana para no dejar a nadie atrás](https://covid19-civiclytics.citibeats.com/#/) - -CivicLytics es un observatorio que busca entender las percepciones y -preocupaciones de los ciudadanos de América Latina y el Caribe respecto -a la pandemia, mediante el uso de inteligencia artificial. Este proyecto -es apoyado por el BID Lab. - -### !Aislados pero unidos! - -El trabajo conjunto entre laboratorios sociales para manejar la COVID-19 -se evidencia en varias situaciones. Por ejemplo, el MediaLab UGR se unió -a FrenaLaCurva como laboratorio participante, puedes ver la noticia -[aquí](https://medialab.ugr.es/noticias/medialab-ugr-se-une-a-frenalacurva-net-una-iniciativa-para-hacer-frente-a-la-crisis-del-covid-19/). - -También Medialab Prado se suma a la iniciativa de FrenaLaCurva: -[Desafíos Comunes. Festival de innovación abierta Frena la Curva](https://frenalacurva.net/desafios-comunes/), accede a la noticia desde [este link](https://www.medialab-prado.es/noticias/desafios-comunes-festival-de-innovacion-abierta-frena-la-curva-proyectos-seleccionados). Desafíos comunes es una convocatoria para iniciativas vecinales, proyectos de emprendimiento e innovación social, y experiencias -colaborativas desde el sector público. - -Estos son algunos laboratorios sociales que han estado trabajando en el -manejo del COVID-19 con información breve sobre sus proyectos, anímate a -acceder a sus sitios web y obtén más detalles. - -**!Anímate!** - -Como ciudadano, investigador, emprendedor o simplemente amante de las -buenas prácticas de ciencia abierta, no te quedes atrás y participa o -crea un proyecto durante este tiempo de aislamiento y distanciamiento -social. En OpenScienceLabs te animamos a que no lo dejes para después, -puedes comenzar ahora. - -#### Referencias - -- [FrenaLaCurva](https://frenalacurva.net/) - -- [MIT MediaLab](https://www.media.mit.edu/) - -- [MediaLab UGR](https://medialab.ugr.es) - -- [LabIN Granada](https://labingranada.org/) - -- [MediaLab Prado](https://www.medialab-prado.es) - -- [BID Lab](https://bidlab.org/es/) - -- [socialab](https://socialab.com) diff --git a/content/blog/nft-mas-que-un-jpg/index.md b/content/blog/nft-mas-que-un-jpg/index.md deleted file mode 100644 index 42442a51d..000000000 --- a/content/blog/nft-mas-que-un-jpg/index.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: "NFT. Más que un JPG" -slug: nft-mas-que-un-jpg -date: 2022-04-08 -author: Alan Hurtarte -tags: [nft, criptomoneda, Blockchain] -categories: [tecnología] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Quizá hayas escuchado el término NFT últimamente. Títulos de noticias descabelladas como [«Porque este CryptoPunk NFT fue vendido por \$532 millones de USD»](https://www.cnet.com/news/why-this-cryptopunk-nft-sold-for-532-million-sort-of/) o [«Memes clásicos que fueron vendidos como NFT»](https://mashable.com/article/classic-memes-sold-nft-prices). - -En este último artículo, se hace mención al meme de la «novia posesiva» que fue vendido por \$411,000.00 USD. - - - -![Overly attached Girlfriend MEME](nft-girlfriend-overly-attached.jpeg "Overly attached Girlfriend MEME") - -## Pero, ¿Qué es un NFT? - -Equivocadamente, se entiende como un JPG, o sea, un archivo de imagen. Si le doy click derecho y "guardar imagen", ¿también tendría el NFT?, y ¿gratis?. - -Recientemente, se hizo viral el hecho de que en un torrent estaban todos los NFTS actuales, una colección billonaria, descargable para cualquiera. - -![Torrents de NFTs](nft-torrents.jpeg "Torrents de NFTs") - -NFT es mucho más que una imagen, o un video, o una canción. Es la representación digital de una propiedad. Imagina un sistema totalmente independiente, inmutable, donde se reconoce tu propiedad. Por el momento lo que está pegando, es arte, más específico, artes visuales digitales (imágenes y videos). Sin embargo, no te extrañes ver campañas de NFT que sean mucho más que imágenes, que podrían ser canciones, películas, cortos y lo que puedas imaginar digital. - -Dejando claro que es mucho más que una imagen, entonces podemos decir que un NFT es un registro de propiedad, validado por una cadena de bloques, descentralizada e inmutable, que nunca caducará. Creo que en este punto la pregunta es: ¿Qué no podría ser un NFT?, bueno, hay muchas cosas que no pueden ser digitales, pero imagina todo lo que sí pueden, y todo lo que ya lo es. - -Leí el caso de un músico que creó su proyecto, su propio token, en vez de ser bitcoin o eth, y lo usó para juntar fondos para su disco. Los fans pudieron dar apoyo a su artista favorito, colaborando a su crowdfunding, y obtienen cierta cantidad del token del artista (un NFT). Al tener ingresos por su nuevo álbum, el artista le dio parte de las regalías a los que tenían los NFTs. - -Podrás leer más aquí: [NFTs are revolutionizing the music industry too](https://fortune.com/2021/10/29/nfts-music-industry/). Esto nos lleva a lo que realmente mueve la web 3.0, propiedad de nuestros bienes digitales (ownership). - -Lo cierto es que, el NFT le viene a dar más poder e independencia al artista. Jack Conte, el CEO de Patreon, es un músico independiente que notó un fenómeno: se esforzaba minuciosamente por hacer sus videos musicales, le metía todo su dinero para hacer sus videos creativos, con stop motion, y proyecciones, y nada pasaba, unas cuantas vistas en sus videos de youtube. Luego notó que a pesar de tener éxito en youtube, y que la gente llegaba a sus presentaciones, no lograba ser económicamente sostenible. Tienes talento, tienes fans, y entregas constantemente tu arte, ¿Qué es lo que falta?. - -El modelo de negocio actual se trata del intermediario. Amazon no hace dinero fabricando productos, AirBnb no hace dinero alquilando sus propiedades, Uber no hace dinero con sus propios autos. Todos son intermediarios, y sus modelos de negocio les permiten ganar mucho dinero manejando el uso de la propiedad ajena. Lo mismo pasaba con Jack y youtube, así que creó Patreon, una plataforma en la que los fans apoyan al artista directamente. Para mí esta es la primera versión de la revolución del arte, y el NFT solo va a venir a acelerarlo. Imagina que ser artista o creador de contenido, ya no sea una carrera en las que tus familiares te dirían «de eso no vas a poder vivir», «pero necesitas una carrera de verdad». - -## ¿Estamos ante una burbuja? - -Hay muchas opiniones al respecto, y como en cualquier tema te recomiendo hacer tu propia investigación y llegar a tus propias conclusiones, especialmente si hay dinero en juego. - -Personalmente, pienso que si esto es una burbuja, los precios son ridículamente altos y eventualmente se normalizarán. - -Es importante entender que, la burbuja aquí es el precio, no la tecnología, y esta tecnología vino para quedarse. - -![Burbuja de las .com](dotcom-bubble.webp "Bubuja de las .com") - -La burbuja de las “.com” es algo que resuena cuando se habla de este punto. Cuando vino la tecnología de la web 2.0, se creó una burbuja, que explotó y apenas 2 de cada 10 compañías sobrevivieron. Sin embargo, la tecnología se quedó, y nos dio los gigantes tech que tenemos hoy en día como: google, facebook, twitter, etc. - -Claro, el NFT actual hace una intersección entre dos mundos que no todos tenemos acceso, el invertir cantidades ridículamente altas de dinero en arte, y la tecnología disruptiva que no está lista para ser mainstream. Si le quitamos la tecnología, solo nos queda gente gastando un montón de dinero en representaciones visuales que son interpretadas. Y eso ya pasa, hay pinturas y arte moderno que hoy en día se venden por precios ridículamente altos. Así que el consejo es, no le busques el sentido al precio del arte, entiende la tecnología por detrás, y no te dejes engañar o cegar por JPGs de millones de dólares. diff --git a/content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/index.md b/content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/index.md deleted file mode 100644 index 2f2be53c4..000000000 --- a/content/blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/index.md +++ /dev/null @@ -1,342 +0,0 @@ ---- -title: "10 Plataformas que te ayudarán en la gestión de tu grupo de trabajo." -slug: plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo -date: 2021-01-23 -author: Mariangela Petrizzo Páez -tags: [comunicación, gestión] -categories: [organización, gestión de equipos] -aliases: ["/blog/0050-10herramientasgestionequipos/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/"] -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - -El manejo de los equipos de trabajo es interés constante para Open -Science Labs, porque tenemos la convicción de que un equipo de trabajo -bien manejado puede crecer en conjunto y construir mejores resultados -para la ciencia abierta. - - - -Ya en artículos anteriores hemos hablado de [las herramientas que pueden -utilizarse en el manejo de investigación -reproducible](https://opensciencelabs.org/blog/como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto/) -en equipos de trabajo, o [cuáles son los aspectos clave a tener en -cuenta en el manejo de equipos de ciencia -abierta](https://opensciencelabs.org/blog/aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta/), -y en este artículo queremos profundizar un poco más y mostrarte nuestra -perspectiva del propósito de examinar no solo las herramientas -utilizadas, sino también las prácticas de trabajo en equipo. - -## Los equipos de trabajo y su organización - -Recientemente ha sido muy difundido [este -artículo](https://critter.blog/2021/01/12/if-it-matters-after-today-stop-talking-about-it-in-a-chat-room/)) -en el cual Mike Crittenden muestra su perspectiva sobre las herramientas -que se utilizan en las comunicaciones internas y de cómo unas prácticas -comunicativas inadecuadas pueden conducir a retrabajo y estrés en los -equipos. - -La premisa del autor en su artículo es que, en muchas ocasiones, la -comunicación en los equipos de trabajo genera un problema adicional -cuando algunos temas, que deberían trabajarse en mayor profundidad y con -mayor dedicación, se acumulan al verterse en herramientas pensadas para -conversaciones breves y puntuales. - -Este *problema adicional* que mencionamos tiene varias aristas. En -primer lugar, muchas de las herramientas de colaboración pensadas para -equipos de desarrollo tienen, además de las conexiones con repositorios, -espacios de chats (canales) para que los equipos puedan tener un espacio -de conversación. Sin embargo, estos chats que están generalmente -pensados para conversaciones de alcance temporal corto, no cuentan con -dispositivos que faciliten su seguimiento y, pese a ello, terminan -utilizándose para conversaciones que pueden nutrirse de ser llevadas, -por ejemplo, a través de una discusión en el manejador de *issues* de -los proyectos en una plataforma como [Github](http://github.com). - -Vaciar conversaciones con detalles técnicos, diálogos en grupos de chat, -en ocasiones conversaciones paralelas, interrumpidas por cualquier -integrante del grupo con algún sticker o pregunta no relacionada, sin -lugar a dudas hacen mucho más complicado llevar el seguimiento a -detalles que, por ser determinantes para el desempeño del equipo o de -alguna tarea, seguro se benefician de un trabajo más individualizado en -un espacio que posibilite su seguimiento y sistematización posteriores. - -No vamos a construir una crítica a ultranza del uso de chats en las -comunicaciones grupales, de hecho, tienen un papel muy importante en el -tratamiento de decisiones muy puntuales, recordatorios o incluso, con -propósitos de distensión y relajación, especialmente si se trabaja de -forma remota. Sin embargo, sostenemos la idea de que los grupos de -trabajo necesitan que la gestión de sus procesos internos se adecúe a -las actividades que realizan, a fin de facilitarlas sin hacerlas -excesivamente complejas, y sabemos que hay plataformas que pueden -hacerlo posible. - -## Prácticas sanas en los equipos de trabajo - -Todo equipo de trabajo gira en torno, al menos, de un proyecto. Los -proyectos se organizan en torno a hitos y estos en función de tareas y -actividades cuya concresión debe organizarse y gestionarse. En medio de -todo esto, ocurre el flujo de presupuestos y asignación de recursos -financieros y también de tiempo. - -Los equipos de trabajo en desarrollo de software no son la excepción en -este sentido. Aunque, en muchas ocasiones, se trate de equipos pequeños -con varios proyectos, resulta vital identificar los componentes y las -personas que lideran cada uno de sus procesos. Por ello, organizar las -tareas, definir los flujos de información para la gestión de actividades -y hacer seguimiento de los alcances, logros y problemas del equipo, a -menudo requiere, no solo del uso de una herramienta que lo facilite, -sino también que el equipo asimile y haga propias las prácticas -necesarias para ello, convirtiéndolas en hábitos colectivos. - -Si nos centramos de forma estricta en la organización del trabajo, -sabemos cómo los equipos de ciencia abierta deben cultivar algunas -prácticas, y ahora sabemos que esto puede lograrse con el fomento en el -uso de dispositivos que las faciliten: - -1. Control de versiones integrado a los dispositivos de comunicación, - -2. Manejo de issues y sub-grupos en los repositorios, - -3. Metodología ágil para identificar hitos, metas, tareas y seguimiento, - -4. Entrenamiento en políticas de ciencia abierta para todo el equipo de trabajo, e - -5. Incentivo a la ciencia abierta apoyando el desarrollo de habilidades - no solo para el desarrollo, sino también para la sistematización y la - socialización de los avances. - -Afortunadamente existen varias herramientas que pueden ayudar a -integrar, en un esquema *todo en uno* estas distintas prácticas. Sin -embargo, sabemos que también es bastante probable que tu equipo de -trabajo termine trasladando prácticas cotidianas que pueden no ayudar -mucho en el aprovechamiento de estas herramientas. - -Para apoyarte en la decisión de cuál herramienta utilizar, hemos -preparado para ti y para tu equipo, esta revisión de opciones para -trabajo en equipos de desarrollo y otras formas de colaboración que, de -seguro, podrán ayudarte a compaginar de una forma más adecuada el -trabajo a distancia con el logro de los objetivos en tus proyectos. - -## Las herramientas elegidas - -Hemos seleccionado 10 de las herramientas más utilizadas en el trabajo -en equipo, algunas de uso general y otras de uso específico. La mejor -recomendación en este punto es que conozcas las prácticas que tu equipo -realiza y el propósito que tendría la incorporación de una herramienta, -para tomar la decisión sobre cuál herramienta utilizar. - -### 1. [Asana](http://asana.com) - -Asana es una plataforma en línea que permite la gestión de proyectos y -grupos de trabajo. Es gratuita para personas o equipos que están -comenzando, aunque tiene limitaciones en cuanto al manejo de tareas -(solo hasta 1.000 tareas por equipo), número de integrantes de cada -equipo (hasta 15) y ofrece más de 100 integraciones que están -disponibles de forma gratuita. Asana, cuenta con un espacio de gestión -de proyectos, actualización de estatus de proyectos, priorización de -tareas, mensajes, conversaciones integradas sobre cada tarea programada, -tablero tipo Kanban y calendario. - -![Asana](Asana1.png) - -Cuenta también con plantillas que pueden adaptarse a los requerimientos -que tenga cada tipo de proyecto. Estas plantillas son bastante prácticas -si lo que deseas es comenzar a organizar y planificar las tareas del -equipo pero no tienes muy claro cuáles herramientas utilizar. Puede que -algunos de los componentes del proyecto sean de pago pero, en líneas -generales, los que están disponibles en la versión gratuita cumplen con -los propósitos mínimos requeridos de planificación. Ofrece integraciones -con varias aplicaciones como Dropbox, Jira, MSTeams, Box y Zoom entre -otros. - -### 2. [Discourse for teams](http://teams.discourse.com) - -Discourse for teams es una versión de Discourse orientada a equipos de -trabajo, pensada para mejorar su productividad. Ofrece organización de -las conversaciones, un calendario que actualiza a hora local las citas y -actividades en agenda, un buscador que permite localizar información a -través de distintos tipos de documentos: desde conversaciones hasta -documentación en wikis. Asimismo, brinda personalización de los temas -del escritorio y la interfaz, además de algunos aspectos de seguridad -como encriptación de conversaciones y dos factores de autenticación en -las cuentas. - -![Discourse](Discourse1.png) - -El enfoque de Discourse es la conversación que puede seguirse a través -de notificaciones por correo e incluye integraciones interesantes para -equipos de desarrollo como Slack, Github y Zendesk. - -### 3. [Slack](http://slack.com) - -Sin lugar a dudas esta es la aplicación que domina el mercado de -aplicaciones de comunicación para equipos, esto pese al grupo nada -despreciable de personas y equipos que se resisten a utilizar Slack. Es -un software que posibilita que los equipos de trabajo organicen sus -intercambios de información en canales públicos o privados, facilita la -búsqueda de información, intercambio de archivos y conexión con -aplicaciones como Google Drive, Trello, Confluence, Jira, Asana y -Zendesk. - -![Slack](Slack1.png) - -Otra funcionalidad que tiene Slack, es que permite conectar el trabajo -entre equipos/empresas diferentes, así como integrar videollamadas y -mensajería, y ofrece la función de generación de flujos de trabajo. - -### 4. [Twist](http://twist.com) - -Twist es una plataforma que, al igual que otras reseñadas en este -artículo, incluye espacio para gestionar el trabajo colaborativo remoto -y también generar conversaciones entre los integrantes de los equipos. -Twist promete estar centrada en la conversación que ocurre entre los -equipos de trabajo, permitiendo que esté disponible y transparente para -todos los integrantes del equipo, organizada por temas de trabajo, -estructurándola para que sea sencillo retomar o entender una -conversación luego de un tiempo sin participar en ella. De esta forma, -la conversación de los equipos de trabajo ocurre de forma asíncrona pero -no deja de ser un apoyo a los procesos internos. Quienes conocen Slack -verán en Twist, a primera vista, una interfaz muy similar que muestra -las conversaciones agrupadas en canales y por mensajes individuales. -Twist incorpora, sin embargo, la opción de visualizar y localizar las -conversaciones también por temas. - -![Twist](twist1.png) - -Al igual que Slack, Twist facilita la configuración personalizada de las -notificaciones, menciones e información suministrada a los integrantes -del equipo y facilita la conexión con aplicaciones muy utilizadas por -equipos de desarrollo como Github. Una comparativa que presenta Twist -con su competencia directa, Slack, enfatiza en la posibilidad de -organizar el proceso de comunicación entre los integrantes del equipo -evitando que se sientan abrumados por el constante flujo de mensajes, -notificaciones e información de Slack. - -### 5. [Carrot](http://carrot.io) - -Carrot es otra de las varias aplicaciones ideadas para favorecer el -proceso de comunicación en equipos de trabajo, remotos o no. El aspecto -diferenciador de Carrot es manejar las comunicaciones como feeds -personalizados y tratando cada mensaje como una noticia. Es un proyecto -Open source que es gratuito para organizaciones sin fines de lucro. - -![08f960fd.png](Carrot1.png) - -Un aspecto interesante de Carrot es que muestra estadísticas de los -mensajes dentro de una conversación, además de permitir compartir -mensajes con canales específicos de Slack a través de su integración. -Permite incorporar bloques de código y encabezados con formato H2, -además de encuestas y recordatorios generales para los equipos de -trabajo y configuración de tema en modo oscuro. Es una aplicación -relativamente joven que cuenta con mejoras continuas. - -### 6. [Threads](http://threads.com) - -A diferencia de las aplicaciones que hemos reseñado hasta aquí, Threads -solo está disponible como aplicación descargable en computadoras de -escritorio (ambiente Windows o Mac) y en móbiles (Apple y Android). Se -centran en un caso de uso exitoso por parte de la empresa Buffer, que -optó por utilizar esta herramienta para mejorar la comunicación entre su -equipo de trabajo. Los números que exponen en ese caso de uso son -realmente interesantes, registrando hasta un 80% de mejora en la -productividad de los empleados de un equipo que, como el de Buffer, está -totalmente distribuido a lo largo y ancho del mundo. - -![Windows_app](thread.png) - -Esta aplicación está centrada, al igual que las otras reseñadas, en dar -estructura, orden y sistematización a la conversación de los equipos. La -forma en que Buffer expone que la ha utilizado, echa mano de tarjetas de -conversación, hilos y espacios en los cuales se puede dar lugar a chats -para distensión del equipo de trabajo, pero también acceso a los -distintos temas manejados a través de chats organizados a modo de -tarjetas y un buscador que promete hacer mucho más sencilla la -localización de conversaciones específicas. - -### 7. [Basecamp](http://basecamp.com) - -Basecamp es otra de las aplicaciones disponibles para el manejo de las -actividades grupales, que incluye mensajes, manejo de tableros de tareas -pendientes, calendarios, vinculación de documentos y archivos, chats -grupales y un banco de preguntas comunes. Ofrece la posibilidad de -programar las notificaciones para garantizar tiempos de descanso en -lugar de la exigente conectividad que imponen aplicaciones como Slack. - -![838028b1.png](Basecamp1.png) - -Este producto incluye una opción gratuita para uso personal, con la -posibilidad de manejar hasta 3 proyectos, 20 usuarios y 1GB de -almacenamiento en la nube. - -### 8. [Flarum](http://flarum.org) - -A diferencia de las aplicaciones presentadas antes, Flarum está centrada -en servir de plataforma para conducir los foros en páginas y portales -web, y por ello ofrece una especie de interfaz renovada de la interfaz -de foros web. Es un software de licencia abierta que garantiza su -expansividad y flexibilidad a las necesidades de los equipos de trabajo. - -![Flarum](Flarum1.png) - -Después de 6 años de desarrollo, Flarum 1.0.0 fue finalmente lanzado en -2021. Permite el manejo de etiquetas lo cual le permite organizar de una -forma más pulcra la lista de discusiones visibles, tanto a través de la -barra lateral como de las banderas indicadas junto a cada discusión -dentro de la lista de las más recientes. - -### 9. [Keybase](http://keybase.io) - -Keybase es una aplicación gratuita, de código abierto, disponible para -pc y móbiles. Enfatiza en sus capacidades para manejo de mensajería y y -envío de archivos de forma encriptada. Aunque no está pensada de forma -exclusiva para el manejo del trabajo en equipos, resulta un apoyo -importante por la vinculación con aplicaciones como Github y Google -Drive, por ejemplo. - -![Keybase](Keybase1.png) - -Permite el uso de etiquetas, el diseño de canales, el manejo de -conversaciones particulares, la localización de mensajes y archivos de -forma relativamente flexible. Se conecta también con identidades -públicas, lo cual permite el manejo de comunidades amplias. Aunque se -centra en el cifrado como valor agregado, y aunque resulta un poco -pesada en su funcionamiento para algunos dispositivos, resulta muy -potente para el manejo de conversaciones importantes para los equipos de -trabajo. - -### 10. [Notion](http://notion.so) - -Notion es una aplicación que incluye herramientas para buena parte de -las tareas más necesarias en los equipos de trabajo: comunicación -(chats), tareas (tasks) y bases de conocimiento (wikis) entre otras. La -posibilidad de reordenar esta información en función de, por ejemplo, -los proyectos y sus etiquetas, le aporta a Notion una flexibilidad mayor -al momento de ser implementada en los equipos de trabajo. - -![Notion](Notion1.png) - -A quienes conocen Paper Dropbox, el manejo de los documentos de Notion -puede resultarles muy similar en cuanto a las menciones, la inclusión de -tareas y otros elementos que facilitan, dentro de los documentos, abrir -y concretar discusiones dentro de los equipos de trabajo. Es gratuita -para uso personal con acceso ilimitado a bloques y páginas, -sincronización entre servicios y hasta 5 integrantes de un equipo de -trabajo. - -## ¿Cuál recomendamos? - -Creemos que hemos abordado de forma precisa las opciones más destacables -de cada una de las aplicaciones seleccionadas. Aunque, el manejo de -conversaciones separadas, buscadores, calendarios y de tableros kanban -puede agilizar la gestión de las actividades a realizar por los equipos -de trabajo, sin embargo, el mensaje es hacia no perder de vista que la -primera atención que debemos prestar es a los procesos de los grupos de -trabajo. diff --git a/content/blog/por-que-deberias-considerar-carpentries-como-una-referencia-para-aprender-ciencia-de-datos/index.md b/content/blog/por-que-deberias-considerar-carpentries-como-una-referencia-para-aprender-ciencia-de-datos/index.md deleted file mode 100644 index fc475369b..000000000 --- a/content/blog/por-que-deberias-considerar-carpentries-como-una-referencia-para-aprender-ciencia-de-datos/index.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: "Por qué deberías considerar a The Carpentries como una referencia para aprender ciencia de datos" -slug: por-que-deberias-considerar-carpentries-como-una-referencia-para-aprender-ciencia-de-datos -date: 2021-03-08 -author: Anavelyz Pérez -tags: [carpentries, datos, proyectos] -categories: [ciencia de datos, aprendizaje] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - -Cuando estamos por aprender y comprender al máximo sobre algo en específico, es vital que tengamos fuentes de información que nos hagan este proceso más sencillo, y que ante cualquier duda que tengamos la ayuda sea oportuna. - - - -"The Carpentries es un proyecto que engloba las comunidades de instructores, capacitadores, mantenedores, ayudantes y simpatizantes de Software Carpentry, Data Carpentry, y Library Carpentry que comparten la misión de enseñar habilidades básicas de computación y ciencia de datos a los investigadores." -(https://carpentries.org/about/) - -Este proyecto es ideal para aprender ciencia de datos porque brinda una serie de materiales diseñados para ello. Hay dos modalidades de enseñanza, una que comprende talleres y otra en formato semestral. Los planes de estudio que ofrece The carpentries varía de acuerdo a las tres comunidades que engloba. Esto es porque cada una se centra en un aspecto práctico orientado a la necesidad del investigador. Para conocer un poco mejor acerca de ello veamos las siguientes descripciones, - -- Data Carpentry, facilita y desarrolla lecciones para talleres orientados a un área de estudio específico, de modo que se enseña a los investigadores las habilidades más relevantes para su dominio; utilizando ejemplos de su tipo de trabajo. Por lo tanto, por esta comunidad podemos encontrar varios tipos de talleres y planes de estudios organizados por dominio. Actualmente, los dominios son: ecología, biología, genómica, Ciencias Sociales y datos geoespaciales. Descripción extraída de: https://datacarpentry.org/lessons/ - -- Software Carpentry tiene como objetivo ayudar a los investigadores a ser más capaces de escribir software para aplicaciones de investigación. Esto significa centrarse en los lenguajes de programación, entornos de scripting y aplicar el control de versiones para gestionar el código. - Los talleres de Software Carpentry emplean una pedagogía de tipo práctico para ayudar a los investigadores a crear confianza y capacidad en el UNIX Shell (BASH), Python o R y el software de control de versiones Git. Opcionalmente, posee módulos para pruebas de unidades y SQL. - Software Carpentry es una manera de empezar a construir algunas habilidades y destrezas computacionales en una comunidad de investigación. Las habilidades prácticas y los métodos con los que se enseñan resultan ser útiles para otras enseñanzas avanzadas de seguimiento. Para ver esta descripción y otros aspectos fundamentales visita https://software-carpentry.org/lessons/ o https://cookbook.carpentries.org/the-carpentries.html#software-carpentry - -- Library Carpentry, posee un plan de estudios básico que actualmente consiste en nueve lecciones. Estas han sido enseñadas muchas veces, y han sido refinadas después de la retroalimentación del instructor y del estudiante. Las lecciones introducen términos, frases y conceptos en el desarrollo de software y la ciencia de datos, cómo trabajar mejor con las estructuras de datos y cómo utilizar expresiones regulares para encontrar y comparar datos. Presenta la interfaz de línea de comandos de estilo Unix, y enseña la navegación básica en el shell, así como el uso de bucles y tuberías para vincular los comandos del shell. También introduce el grep para buscar y unir grupos de datos entre archivos. Los ejercicios cubren el conteo y la extracción de datos. Además, cubre el trabajo con OpenRefine para transformar y limpiar datos, y los beneficios de trabajar en colaboración a través de Git/GitHub y la utilización del control de versiones para realizar un seguimiento de su trabajo. Para encontrar esta descripción y más información, visita: https://librarycarpentry.org/lessons/ - -Con estas descripciones se hace notar el empeño de estas comunidades por lograr que los investigadores tengan las herramientas necesarias a la hora de implementar análisis de datos y otros elementos importantes en sus investigaciones. Lo mejor de esto es que van desde lo más básico hasta lo que se considera pertinente para que el conocimiento quedé plasmado en cada estudiante. -También, es valioso mencionar que todas las lecciones se distribuyen bajo la licencia CC-BY y son libres para su reutilización o adaptación, con atribución. Esto ha generado que las personas las utilicen en lecciones, en cursos, para construir nuevas lecciones o para el aprendizaje autoguiado. - -Ahora, en torno a todo lo anterior, se tiene que - -- Existe una o varias comunidades que respaldan este proyecto y las lecciones que han desarrollado. - -- El contenido de sus lecciones están disponibles en la web bajo un formato que da la facilidad para reutilizar su contenido. - -- El acceso a los materiales desarrollados por el proyecto puede hacerse mediante sus websites. -En **Library Carpentry** los encontramos en la sección [*OUR LESSONS*](https://librarycarpentry.org/lessons), en el caso de **Data Carpentry**, en [*LESSONS*](https://datacarpentry.org/lessons/); para **Software Carpentry** también existe una sección [*LESSONS*](https://software-carpentry.org/lessons/). De manera general y resumida podemos conseguir los planes de estudio de Carpentries en la sección [*LEARN/OUR CURRICULA*](https://carpentries.org/workshops-curricula/). - -- Las lecciones están bien estructuradas. En el caso de Data Carpentry se encuentran clasificadas según un dominio y, a pesar de esto, los conocimientos impartidos también se pueden aplicar a otras áreas. Mientras que Software Carpentry y Library Carpentry son ideales para aprender elementos de la programación haciendo uso de bibliotecas y otras herramientas vitales en el análisis de datos. - -- Puedes tener acceso a contenidos nuevos con el trascurso del tiempo. - -- Tus dudas, sugerencias y aportes serán atendidas por la comunidad. - -- Puedes encontrar lecciones tanto en Inglés como en Español. - -Estas son algunas de las tantas razones por la cual deberías considerar The Carpentries como una referencia para aprender ciencia de datos. Te invitamos a que le des un vistazo a este proyecto y nos dejes tus impresiones. diff --git a/content/blog/psf-scicookie/index-en.md b/content/blog/psf-scicookie/index-en.md deleted file mode 100644 index a4df45425..000000000 --- a/content/blog/psf-scicookie/index-en.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: "PSF funding open source projects development: SciCookie" -slug: psf-funding-open-source-projects-development-scicookie -date: 2023-09-22 -author: Anavelyz Perez, Yurely Camacho -tags: [psf, osl, scicookie, grant, community, collaboration, development] -categories: [open source, software development, python] - -draft: false -usePageBundles: true -thumbnail: "/header.svg" -featureImage: "/header.svg" ---- - - - - - -In this article, we will share our experience in applying for and -executing a Python Software Foundation (PSF) grant on behalf of Open -Science Labs (OSL), submitted between January and February 2023. The -proposal was submitted to contribute to the development and maintenance -of SciCookie, a Python tool within the [OSL incubation -projects](https://opensciencelabs.org/programs/incubator/). - -We'll begin by introducing SciCookie, highlighting its key features and -aspects that might interest you. Then, we'll go over the grant -application process and share our reflections on the experience, along -with the lessons we learned. - -## What is SciCookie? - -As we mentioned at the beginning, SciCookie is a Python tool designed to -provide a Python project template. Its main goals are to simplify the -process of creating your projects and save you a considerable amount of -time because, according to your needs and planning, it gives you a -starting point for the configuration of your project. SciCookie provides -several tools that are as up-to-date as possible and adheres to -community standards. - -SciCookie is mainly based on PyOpenSci recommendations regarding the -tools, libraries, best practices and workflows employed by the -significant Python scientific groups. The elements we mention are listed -as options, which means that you can adapt various approaches in your -project, through a text interface (TUI) provided by SciCookie. - -SciCookie is available from [PyPI](https://pypi.org/project/scicookie/) -and [conda](https://anaconda.org/conda-forge/scicookie). You can also -visit its repository at -[GitHub](https://github.com/osl-incubator/scicookie). - -Now that you know a bit about this project, let's tell you about PSF and -how it supports the Python community. - -## What is PSF and how does it support the Python community? - -The Python Software Foundation (PSF) is an organization dedicated to -the advancement and improvement of open source technologies. Its mission -is to promote, protect and advance the Python programming language. In -addition, it supports and facilitates the development/growth of the -Python developers community; a diverse and international community. - -Among the programs that PSF promotes to achieve its mission, there is a -*Grants Program*, where proposals for projects related to the -development of Python, technologies associated with this programming -language and educational resources, are welcome. Since the creation of -the program, PSF has supported several interesting projects, you can -click [here](https://www.python.org/psf/records/board/resolutions/) to -see the list or have a clearer notion of the proposals, and maybe you -will be encouraged to apply with new projects or ideas. - -You should know that the PSF in the grants program evaluates a number of -aspects in each proposal, including the usefulness of the project and -the impact on the Python community. In case you want to know more, we -recommend you visit the space that PSF has on its website for the -[grants program](https://www.python.org/psf/grants/). - -So far, we have given you a brief overview of the main aspects of the -two parties involved: SciCookie and PSF. We will continue by telling you -about the grant application, what motivated us, the arranging and -assigning tasks. - -## What was the grant application process like? - -The PSF grant application process was a long and challenging, but also -very rewarding. It began with careful planning and research. We studied -the needs of the scientific community and found a project that could -help meet those needs. In other words, we build on a strong case for the -grant. - -We were studying the different projects within the Open Science Labs -incubation program; where there are a series of approaches and -technologies implemented, including Python projects associated with -DevOps, Data Science, and scientific projects. The option that was best -suited to apply for the grant in our case was SciCookie; because it is a -very useful tool and is focused on helping the Python community. - -After completing the planning and research, we began the formal -application process. This included completing an online form and -submitting a detailed proposal. The proposal contains a project -description, timeline, budget and impact section. In our case and in -order to review each aspect carefully, we produced a [file with the -responses](https://github.com/OpenScienceLabs/grant-proposals/blob/96263f736e7f36eb22a3dd1baa16376fd1782e98/psf_proposal.md) -[1] and filled in the budget scheme (template provided by the PSF). -This process was done under the advice of the OSL Steering Council. - -In addition to the above, a series of issues were created and edited in -the project repository, in order to be clear about the activities to be -carried out and the time it would take to develop them in case the -proposal was approved. - -Once we had submitted our proposal, we had to wait some months for a -decision. It was a period of great uncertainty, but finally we received -the news that our proposal had been accepted! - -## How was the workflow? - -With the PSF grant, we were able to start developing and maintaining -SciCookie part-time. We worked with some community developers to add new -features, improve documentation and fix bugs. This included the creation -of a [user -guide](https://github.com/osl-incubator/scicookie/blob/main/docs/guide.md) -to help enthusiasts and developers to use SciCookie. - -In terms of task specification, as we described in the previous section, -a series of issues were generated in the project repository, and each -one of us handled some of the issues on a weekly basis via Pull Requests -(PRs). These were approved by members of the Open Science Labs team, who -were also on hand throughout the execution of the proposal. - -Being a bit more specific about the follow-up, we had from an initial -meeting where we discussed the fundamental aspects of the project and -set up what was necessary to carry it out, to weekly meetings to present -our progress, to check if we had any obstacles or doubts that did not -allow us to move forward. Likewise, each PR was reviewed and if there -were any observations, we had feedback on this. - -In summary, we can tell you that it was quite a dynamic workflow, where -a friendly space was built and allowed us to learn a lot. - -![Flujo de trabajo](workflow.png) - -> We would like to take this opportunity to thank [Ivan -> Ogasawara](https://github.com/xmnlab) and to [Ever -> Vino](https://github.com/EverVino), for their time and dedication. -> Both are active members of OSL and members of the steering council; -> they were there to support us and clarify our questions. - -Here we tell you about our experience and the collaboration phase. - -## How was our learning process? - -SciCookie provided us, for the first time, with the opportunity to make -such a significant contribution to an open science and open source -project. It also allowed us to acquire new knowledge about some aspects -and technologies linked to the Python programming language, since at -that time, our knowledge was more oriented to the use of libraries, -objects, loops, among others. - -About this learning process we can tell you that we did not know many -things and it was necessary to learn along the way, sometimes this was a -bit challenging but, in general, very profitable. Among the anecdotes -that we rescued is that, a couple of times, we "exploded" the code and -we didn't know why; the cause was that we didn't know the exact use of -single or double quotes, double braces, spaces or tabs within the -template. But then we were able to move forward and we even made -improvements in the workflow of the project. - -Regarding the latter, we can certainly tell you that learning curves are -always steep. At the beginning you see everything uphill, but when you -are familiar with the technology and the tools, everything becomes -easier. Daring is always the first step. - -On the other hand, if you are interested in collaborating on open source -projects, it is vital to have basic knowledge of Git and GitHub version -control tools, and to understand their essential commands such as git -pull, git push, git rebase, git log, git stash, among others. You may -also need knowledge of conda and poetry. We also learned a bit of jinja2 -and make, and reviewed knowledge of function creation, conditional -evaluation, GitHub workflow, documentation aspects and some of the -technologies associated with it. - -In summary, the experience of applying for and executing a PSF grant was -a valuable experience. We learned a lot about the process, how to -develop and maintain a Python tool, what structure a Python library or -package project should have, and how to build a community around an open -source project. We are also grateful for the support of the PSF, which -has allowed us to make a contribution to SciCookie. We feel satisfied -with the work we have done and are excited about the future of this -tool. - -To all that we have told you, we add an invitation to collaborate on -open source or open science projects and, if you have already done so, -we encourage you to continue to do so. We were often motivated by seeing -our PRs being approved, we shared feelings of achievement and new -challenges and, most importantly, we were applying what open source -promotes: small collaborations make big changes and add to the projects, -achieving good and useful results. - -After all this, you may wonder about the barriers to collaboration. We -dedicate the following lines to describe what we rescued from our -experience. - -## Can you find barriers to collaboration? - -The progress of your contributions depends on you. It is vital to ask -questions and not get bogged down by doubts. Often there is someone who -can show you that the problem you thought was big was simply a small -one, perhaps the code didn't work because it was single quotes instead -of double quotes, for example. - -From the OSL community we can highlight that it focuses on creating -friendly, opportunity-filled spaces where you can share and acquire new -knowledge, eliminating barriers and discrimination. Perhaps you can find -these same characteristics in other open science and/or open source -projects. - -That's why we want to invite you again to support and join the diverse -Python and open source community. It's an excellent experience and the -fact of contributing to something that can be useful to other people is -quite satisfying. - -In general, collaborating on open source projects is a great way to -improve your programming skills, you also have the opportunity to work -with other developers and learn from them, get feedback on your work. If -you want to support or boost your project, the first thing to do is to -get started. Many communities are open to new contributions and -innovative ideas. - -Leave us your comments if you want to know more about what we have told -you in this space :D - -[1] **Additional note**: SciCookie originally went by the name of -cookiecutter-python and then renamed to osl-python-template. - -Graphic elements of the cover were extracted from [Work -illustrations by Storyset](https://storyset.com/work), and then edited -to conform to the article. diff --git a/content/blog/pyopensci-un-promotor-de-la-ciencia-abierta/index.md b/content/blog/pyopensci-un-promotor-de-la-ciencia-abierta/index.md deleted file mode 100644 index 4a1116fed..000000000 --- a/content/blog/pyopensci-un-promotor-de-la-ciencia-abierta/index.md +++ /dev/null @@ -1,213 +0,0 @@ ---- -title: "pyOpenSci: un promotor de la ciencia abierta" -slug: pyopensci-un-promotor-de-la-ciencia-abierta -date: 2020-08-06 -author: Yurely Camacho -tags: [pyopensci] -categories: [ciencia abierta, revisión abierta por pares, código abierto, Python] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Las distintas disciplinas que abarca la ciencia abierta trabajan de -manera conjunta; tal es el caso del código abierto, la investigación -abierta y reproducible y los datos abiertos. En el presente artículo -tratamos sobre **pyOpenSci**, un proyecto al servicio de la ciencia, -desarrollado bajo el enfoque de estas disciplinas. Si eres un -programador, quieres desarrollar (o estás desarrollando) algún paquete -científico con -[Python](https://opensciencelabs.org/blog/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/) -y que sea aceptado por una gran comunidad de *pythonistas*, entonces -aquí está lo que necesitas saber para lograrlo. - - - -## ¿Qué es [pyOpenSci](https://www.pyopensci.org/)? - -pyOpenSci, también conocido como pyOpenScience, es un proyecto encargado -de promover la ciencia abierta mediante el apoyo al desarrollo, la -[*revisión por -pares*](https://es.wikipedia.org/wiki/Revisi%C3%B3n_por_pares) y la -publicación abierta de **paquetes científicos escritos en Python** que -cuenten con una buena -[documentación](https://opensciencelabs.org/blog/como-documentar-tu-proyecto-de-ciencia-abierta/) -y estén probados previamente. Estos paquetes son utilizados para -recopilar, descargar y transformar datos científicos con una metodología -de trabajo abierta y reproducible. - -El modelo de trabajo del proyecto está basado en la comunidad -[rOpenSci](https://ropensci.org/). pyOpenSci no trabaja solo, tiene una -fuerte vinculación con la [Journal of Open Source Software -(JOSS)](https://joss.theoj.org/), una revista que fomenta la revisión -por pares, la aceptación y la publicación de software de código abierto. -Por tanto, estas dos comunidades pueden verse como complementarias entre -sí. El enfoque en el proceso de revisión de pyOpenSci es más práctico -que el de la JOSS. Con pyOpenSci los autores pueden publicar sus -paquetes con un [DOI](https://www.doi.org/) (Digital Object Identifier) -de manera que puedan ser citados y encontrados por los buscadores de -artículos científicos. - -En este momento (noviembre 2022), pyOpenSci es un proyecto patrocinado -fiscalmente por Community Initiatives, razón por la cual se ha reanudado -la revisión del software desde septiembre de 2022. - -## Inicios de pyOpenSci, un relato de su fundador - -El proyecto pyOpenSci surgió por el pythonista [**Steve -Moss**](https://about.me/gawbul), el cual en el post [Facilitating Open -Science with Python](https://ropensci.org/blog/2013/05/16/pyopensci/), -publicado en el blog de rOpenSci en mayo del 2013, manifiesta las -razones de *¿Por qué Python?*, *¿Por qué pyOpenSci?* donde textualmente -dice: "quería, ante todo, facilitar la mejora del campo científico, -permitiendo y promoviendo la apertura y el intercambio dentro y entre -las comunidades científicas. Creo que solo es posible que la ciencia -progrese si se hace completamente transparente" (traducción propia al -español). De allí es donde se fundamentan los ideales de pyOpenSci. - -El proyecto pretende mejorar y facilitar la apertura de la investigación -científica. Para ese momento Steve Moss tenía la esperanza de poder -incentivar a los investigadores a utilizar pyOpenSci para desarrollar, -compartir y comprometerse con sus estrategias y así hacer posible la -ciencia abierta. Para esto esperaba poder ofrecer talleres, sesiones de -formación, consultoría y apoyo y que pyOpenSci participara en -actividades de divulgación dentro de las comunidades. Algo que también -expresa en su artículo. - -## ¿Cómo puedes contribuir a pyOpenSci? - -Puedes involucrarte en este proyecto de distintas maneras, a -continuación te las presentamos: - -- [**Súmate al foro comunitario**](https://pyopensci.discourse.group/). - Un espacio donde se discuten los temas de interés y se publican los - anuncios de nuevas reuniones. - -- **Envía un paquete**. Hazlo para apoyar a la comunidad científica de - Python en general y a la de pyOpenSci en específico. - -- **Puedes ser un revisor de paquetes**. - -- **Ayuda con la infraestructura técnica**. Tanto el sitio oficial del - proyecto como los otros sitios web, por ejemplo, necesitan - mantenimiento y desarrollo. - -- **Participa activamente en la divulgación de pyOpenSci**. Comenta a - tus amigos y colegas, haz mención del proyecto en eventos abiertos y - en tus redes sociales. !Transmite la información para hacer crecer - esta comunidad! - -## Colaboradores - -Según el fundador de pyOpenSci, para colaborar se necesita lo siguiente: -"Además de un amor por Python, uno debería tener un amor por ser abierto -y transparente sobre los temas que les apasionan". Esto lo expresó en su -post para la comunidad **rOpenSci** en 2013 (mencionado anteriormente). -Donde resalta que, para ese momento, solo era él en pyOpenSci y hasta la -actualidad más de 30 personas han colaborado con el proyecto, -conformando una comunidad diversa de personas con un fin común: ofrecer -un lugar práctico en torno al software científico en Python y donde se -promuevan las buenas prácticas de ciencia abierta. - -Aquí te mencionamos algunas personas que han contribuido y son miembros -activos de pyOpenSci: [Leah Wasser](https://github.com/lwasser), [Chris -Holdraf](https://github.com/choldgraf), [Max -Joseph](https://github.com/mbjoseph), [Ivan -Ogasawara](https://github.com/xmnlab) miembro del Consejo Directivo de -nuestra plataforma Open Science Labs. - -## Paquetes pyOpenSci - -La comunidad pyOpenSci es la encargada de desarrollar, presentar, -revisar y promover los paquetes de software científico en Python. Al ser -una comunidad abierta, **cualquiera puede enviar un paquete para su -revisión**. Puedes conocer los paquetes que se encuentran actualmente en -revisión accediendo a [este repositorio -GitHub](https://github.com/pyOpenSci/software-review/issues) y los -aceptados [aquí](https://www.pyopensci.org/python-packages/). - -Algunos de los paquetes aprobados hasta ahora por pyOpenSci son: - -- Lectura, desplazamiento temporal y la escritura de datos de sensores - [devicely](https://github.com/hpi-dhc/devicely) - -- Exploración y visualización de datos espaciales - [earthpy](https://github.com/earthlab/earthpy). - -- Diapositivas de [Jupyter Notebooks]( -https://opensciencelabs.org/blog/ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion/) con - [Nbless](https://github.com/py4ds/nbless). - -- Validación de las estructuras de datos manejadas por - [pandas](https://pandas.pydata.org/) con - [Pandera](https://github.com/pandera-dev/pandera). - -- Datos geoquímicos - [pyrolite](https://github.com/morganjwilliams/pyrolite). - -- Integrar conjuntos de datos multimétricos - [OpenOmics](https://github.com/JonnyTran/OpenOmics) - -Pasemos ahora a conocer algunos de los sitios y recursos técnicos que -mantiene el proyecto (además de las reuniones y el foro). - -## pyOpenSci blog - -En este [blog](https://www.pyopensci.org/blog/) se abordan distintos -tópicos, entre ellos: - -- Eventos y actividades planificadas. - -- Paquetes que han pasado por el proceso de revisión. - -- Desafíos de pyOpenSci en la enorme comunidad de Python. - -## Otros recursos y sitios relacionados - -- [Organización pyOpenSci Github](https://github.com/pyOpenSci). - Contiene el [repositorio de revisión de - software](https://github.com/pyOpenSci/software-review) y otros. - -- [pyOpenSci - cookiecutter](https://cookiecutter-pyopensci.readthedocs.io/en/latest/) - es una plantilla que facilita el empaquetado del código Python. - -- [Guía de desarrollo de - paquetes](https://www.pyopensci.org/python-package-guide/) y [Guía de - revisión por pares](https://www.pyopensci.org/peer-review-guide/) con - información para los autores y revisores de los paquetes, que incluye - todo el proceso. Es lo primero que debes leer si estás interesado en - enviar un paquete a pyOpenSci. - -- [Repositorio de Gobernanza de - pyOpenSci](https://github.com/pyOpenSci/governance). Donde se discuten - la dirección y el alcance de pyOpenSci. También ofrece notas de las - reuniones de la comunidad. - -La comunidad pyOpenSci está abierta para que envíes un paquete, te -conviertas en revisor, ayudes a difundir sus actividades y buenas -prácticas o para que participes en los foros donde tomarán en cuenta tus -intervenciones. De esta manera, estarás contribuyendo con la comunidad -científica de Python. - -### Referencias - -- [Web site del Proyecto](https://www.pyopensci.org/) - -- [Web site de Steve Moss (fundador de - pyOpenSci)](https://about.me/gawbul) - -- [Facilitating Open Science with - Python](https://ropensci.org/blog/2013/05/16/pyopensci/) - -- [pyOpenSci Promoting Open Source Python Software To Support Open - Reproducible - Science](https://ui.adsabs.harvard.edu/abs/2019AGUFMNS21A..13W/abstract) diff --git a/content/blog/que-es-ciencia-ciudadana/index.md b/content/blog/que-es-ciencia-ciudadana/index.md deleted file mode 100644 index 334dcfe29..000000000 --- a/content/blog/que-es-ciencia-ciudadana/index.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: "¿Qué es ciencia ciudadana?" -slug: que-es-ciencia-ciudadana -date: 2020-02-03 -author: Rainer Palm -tags: [ciencia ciudadana, comunidad] -categories: [ciencia abierta, investigación abierta] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Comúnmente, existe una visión de la ciencia que la dibuja como una actividad que se realiza de forma solitaria y apartada del grupo más numeroso de la sociedad, que es desarrollada por científicos *asociales* y que realizan sus investigaciones de forma privada, casi oculta, y comparten su descubrimientos solamente entre una comunidad selecta de individuos, casi todos hombres, hablando con un vocabulario rebuscado y imposible de entender. - - - -Ya sea para buscar nuevas ideas, integrar más la comunidad científica en ámbitos populares, para obtener colaboradores con los que trabajar, o para que una mayor cantidad de personas adquieran conocimientos o habilidades relacionadas con una investigación, la ciencia ciudadana involucra tanto científicos y profesionales como a gente común, actuando como voluntarios en su proceso, es decir, en la "recolección y analísis sístematico de los datos, desarollo de teconlogías, pruebas de fenomenos naturales, y la difusión de esas actividades"[1], para de esta forma romper generar un impacto mayor. - -Esta no es exactamente una práctica o idea nueva, pues ya antes tuvo otros nombres, como investigación participativa. Sin embargo, las nuevas tecnologías de comunicación (como las redes sociales) han ayudado a que la ciencia ciudadana disfrute de una especie de renacimiento. Hay una multitud de historias con gran notoriedad de personas totalmente desconocidas y ajenas a la comunidad científica que, gracias a tener la oportunidad de aportar su granito de arena, terminan descubriendo objetos celestes desconocidos, clasificando galaxias, identíficando especies de aves, etc. Estas personas son lo que se conocen como "cientificos ciudadanos", personas comunes y corrientes que contribuyen con trabajo y datos a proyectos de investigadores académicos. - -Aunque es imposible saber con exactitud quienes fueron los primeros científicos ciudadanos (ya que la *ciencia* como institución es relativamente reciente), se sabe que nuestros antepasados, sin ser exactamente investigadores o fílosofos dedicados, solian practicar una especie de astronomía amateur, haciendo la parte de observadores cuidadosos que simplemente, de forma intuitiva, descubrían cuerpos estelares y monitoreaban aves y otros animales. En la era moderna, se considera que los colonizadores americanos fueron los primeros científicos ciudadanos como tal, registrando información exhaustiva acerca del clima y la geografía, en un intento de entender cuando iban a caer las tormentas, usando datos de una limitada cantidad de personas y buscando patrones que podrián aparecer si se juntaban todos estos juntos. - -## Porque ciencia ciudadana? - -Existen muchos motios por los cuales la ciencia ciudadana debe recuperar su papel en los aportes de la ciencia moderna. Te enumeramos algunos de los más notables: - -- **Recolección de datos**: Dependiendo del objeto de estudio en cuestión, la participación de una cantidad de personas de una variedad de trasfondos y localidades puede ser necesaria para obtener una muestra lo suficientemente amplia y exhaustiva. La colaboración de estas en forma de recolección de ciertos datos (comportamiento de especies animales, estudio del movimiento de ciertas plantas, alertas de plagas, etc.) puede ser fundamental para la investigación, sin exigir necesariamente un sacrificio muy grande en cuanto a tiempo y esfuerzo se refiere. - -- **Educación mediante la practica**: La ciencia ciudadana ofrece una oportunidad perfecta para que quienes normalmente no se mueva en un entorno de laboratorio científicos, pueda comenzar a participar en proyectos como investigadores, y para que también de esta forma empiecen a desarollar aptitudes y habilidades referentes al area en la que trabajen, sin mencionar los conocimientos que obtengan como resultado del estudio conducido. - -- **Colaboración libre y abierta**: Los proyectos de ciencia ciudadana suelen estar abiertos a todo tipo de personas, siempre y cuando estas quieran involucrarse: sin importar que sean estudiantes, profesores, trabajadores, jubilados, desempleados, etc. Los equipos científicos suelen establecer una plataforma mediante la cual pueden participar los ciudadanos. Por ejemplo, juegos que intenten explotar al máximo las capacidades intuitivas y racionales de las personas, necesarias para algún problema difícil de resolver, como Foldit [2], o aplicaciones que apunten a una audiencia regional, o en ciertos casos, internacional; y luego recojer datos desde ahí. De esta forma se puede recolectar datos desde una variedad de entes o grupos de personas de manera paralela. Es cierto que un equipo científico no puede estar en todos los lugares al mismo tiempo, pero de esta forma se pueden expandir el foco de la investigación sin sacrificios significativos. - -- **Retroalimentación**: La ciencia ciudadana se establece una especie de diálogo entre los ciudadanos que aportan sus datos y los científicos que aportan sus conocimientos y enseñan métodos y analisis de estos. En esta relación "entrada-salida", se logra plantear el problema estudiado dentro de parametros mucho mas amplios, obteniendo una nueva perspectiva que es una especie de síntesis entre la ciudadana y la científica. Los beneficios de estos se pueden ver principalmente en la area de cambio clímatico y biodiversidad, cuyas afirmaciónes suelen depender en estudios realizados mediante ciencia ciudadana[3]. - -## Quienes hacen ciencia ciudadana? - -Como fue anteriormente mencionado, podemos ver el impacto que puede hacer esta colaboración primordialmente en áreas donde se le deja la tarea de clasificar y encontrar patrones a los ciudadanos. Un gejemplo interesante en este sentido, es el proyecto Penguin Watch [4], que permite a cualquiera aportar su granito de arena hacia 'entender cambios en la población de los pingüinos, y en sus índices de supervivencia y reproducción', mediante observación de fotos tomadas por drones y aviones, identíficando tanto pinguinos adultos y bebes como huevos de estos, y otros animales. Sitios como Zooniverse[5] albergan una variedad de este tipo de proyectos, donde se les permite a ciudadanos comunes colaborar en proyectos tan extravagantes como Galaxy Zoo: Clump Scout, donde se estan buscando galaxias 'grumosas', pocas y aisladas en la gran fabrica del universo, aprovechando el incremento en el uso de instrumento de observación de astros. - -Para encontrar ejemplos de ciencia ciudadana que se hace en nuestro ámbito regional, solo hace falta buscar. En sitios como Ciencia Ciudadana en España[6], se muestran una variedad de instituciones y su localidad dentro de un mapa, permitiendo a cualquiera facilmente participar y investigar mas en cuanto a estos proyectos. En Cuba, por ejemplo, el desarollo de ciencia ciudadana ha aportado mucho a programas de monitoreo de su biodiversidad, principalmente destinados a apoyar estudios de conservación de aves[7]. En proyectos como estos, se puede ver fácilmente en que áreas es mas eficaz la ciencia ciudadana: problemas en los que se puede establecer de forma facil una plataforma por la cual interactuan ciudadanos y cientificos, donde estos podrán realizar la tarea de forma relajada y así ayudar a encontrar patrones. - -[1]: http://www.openscientist.org/2011/09/finalizing-definition-of-citizen.html "Finalizing a Definition of 'Citizen Science' and 'Citizen Scientists'" -[2]: https://fold.it/ "Foldit" -[3]: https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0106508 "The Invisible Prevalence of Citizen Science in Global Research: Migratory Birds and Climate Change" -[4]: https://www.zooniverse.org/projects/penguintom79/penguin-watch "Penguin Watch" -[5]: https://www.zooniverse.org/ "Zooniverse" -[6]: https://ciencia-ciudadana.es/ "Ciencia Ciudadana en España" -[7]: http://repositorio.geotech.cu/xmlui/handle/1234/1226 "Los Árboles, las Aves de la Ciudad y Yo: Proyecto de Ciencia Ciudadana del Museo Nacional de Historia Natural, de Cuba." diff --git a/content/blog/que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo/index.md b/content/blog/que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo/index.md deleted file mode 100644 index 9753d87a2..000000000 --- a/content/blog/que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo/index.md +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: "Te contamos qué es el Data Version Control (DVC) y por qué es necesario que tu equipo sepa cómo utilizarlo" -slug: que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo -date: 2021-03-22 -author: Yurely Camacho -tags: [dvc, datos, versionado] -categories: [ciencia abierta, investigación abierta, desarrollo de software, control de versiones] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - -Cuando colaboramos en proyectos que involucran un manejo y -transformación constante de conjuntos de datos y/o modelos derivados de -estos, nos vemos en la necesidad de indagar y poner en práctica técnicas -que permitan tener un control de todos los cambios realizados en ellos -durante la investigación; para lo cual se necesitan herramientas que lo -hagan posible. Allí entra en juego el *Control de versiones de datos* o -Data Version Control (DVC). - - - -En este apartado definimos brevemente el control de versiones de datos, -mencionamos algunas herramientas o *Sistemas de control de versiones* -que permiten hacerlo y también listamos las ventajas que tiene su uso en -equipos de trabajo. - -En nuestro artículo [Investigación colaborativa con -Git](https://opensciencelabs.org/blog/investigacion-colaborativa-con-git/) -mencionamos que los *Sistemas de control de versiones* permiten -almacenar los cambios realizados en los archivos en todas sus fases de -desarrollo y también la información asociada a ellos (fecha y autoría de -los cambios). En la mayoría de ocasiones, se utilizan en entornos de -desarrollo de software, pero son realmente útiles cuando necesitamos un -control sobre cualquier tarea que estemos ejecutando. Para este caso -hablamos de transformar conjuntos de datos y experimentar, por ejemplo, -modelos de Machine Learning donde el seguimiento de todos los pasos y -dependencias entre el código y los conjuntos de datos es fundamental. - -En el control de versiones de datos (y en general, de cualquier tipo de -archivo), podemos ver las versiones como "fotografías" que registran el -estado en ese momento del tiempo. Luego se van tomando más fotografías -(guardando nuevas versiones) a medida que se hacen modificaciones, en -este caso, a conjuntos de datos o a *scripts* de actualización o -transformación de estos (especificación y prueba de modelos). De tal -forma que podamos experimentar modelos, observar qué modelos funcionaban -con cuál conjunto de datos, reproducir experimentos anteriores o -restaurar la investigación a una versión antigua en cualquier momento. - -A continuación se mencionan algunas herramientas de software libre para -el versionado de conjuntos de datos y bases de datos. - -- [DVC](https://dvc.org/) -- [Pachyderm](https://www.pachyderm.com/) -- [Liquibase](https://www.liquibase.org/) -- [Dat](https://dat.foundation/) -- [Git lfs](https://git-lfs.github.com/) -- [Git-annex](https://git-annex.branchable.com/) - -En este punto hablaremos un poco sobre DVC, una de las herramientas más -utilizadas para el versionado de datos en la actualidad. - -### [DVC](https://dvc.org/) - -Es una herramienta gratuita y de código abierto empleada, mayormente, en -proyectos de ciencia de datos y Machine Learning facilitando la -colaboración y reproducibilidad. La parte central del DVC es el -versionado de datos para archivos grandes, modelos de Machine Learning, -conjuntos de datos y flujo de trabajo. Como DVC hace que los proyectos -sean reproducibles y compartibles; podemos saber cómo se construyeron y -probaron los modelos y cómo han sido transformados los datos originales. -DVC está basado en -[Git](https://opensciencelabs.org/blog/git-de-en-diez-sencillos-pasos/); -aunque puede funcionar de manera autónoma (pero sin capacidad de -versionado). "Es como un Git solo para Datos". - -Esta herramienta se desarrolló en un 98% bajo el lenguaje de -programación **Python**. - -#### Características principales - -- DVC funciona sobre los repositorios de Git y tiene una interfaz y un - flujo de línea de comandos similares a este. - -- No requiere la instalación y el mantenimiento de bases de - datos. - -- Puede ser ejecutado en los principales sistemas operativos (Linux, - Windows y MacOS). Funciona independientemente de los lenguajes de - programación o de las bibliotecas de Machine Learning utilizadas en el - proyecto. - -- Es rápido de instalar, no depende de APIs o servicios externos. - -[Aquí puedes acceder al Repositorio de GitHub del proyecto DVC](https://github.com/iterative/dvc) - -## Ventajas de implementar el control de versiones de datos - -El tener un seguimiento de los cambios en conjuntos de datos y scripts -de especificación y prueba de modelos en una investigación, proporciona una serie de -beneficios o ventajas como las mencionadas a continuación: - -- Guardan toda la historia del proyecto. - -- El trabajo en equipo es más sencillo, debido a la especificación de - fechas y autorías de cambios; aumentando la capacidad de colaborar en - un proyecto. - -- Permite el acceso compartido a los archivos y el desarrollo de ramas - para experimentar cambios. - -- No te preocupes si alguien comete un error o sobrescribe algo - importante, puedes volver a versiones anteriores en cualquier momento. - -- Facilita la reproducibilidad de modelos de aprendizaje automático en - ciencia de datos. - -- Permite que los desarrolladores de un proyecto, que trabajan en un mismo - archivo de datos, combinen de forma eficiente las ideas y cambios. - -En **OpenScienceLabs** te invitamos a utilizar el versionado de datos y de -modelos de Machine Learning con DVC, para que puedas llevar un -seguimiento adecuado de los cambios de los conjuntos de datos y modelos -durante todas las fases del proyecto, haciendo más eficiente dicho -proceso. - -#### Referencias - -- [Herramientas de control de versiones](https://blog.dinahosting.com/herramientas-de-control-de-versiones/) - -- [Website oficial de la herramienta DVC](https://dvc.org/) diff --git a/content/blog/que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos/index.md b/content/blog/que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos/index.md deleted file mode 100644 index 7de2df17a..000000000 --- a/content/blog/que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos/index.md +++ /dev/null @@ -1,235 +0,0 @@ ---- -title: "¿Qué es el Lenguaje R y cómo puede ayudarte en tus proyectos?" -slug: que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos -date: 2020-01-17 -author: Yurely Camacho -tags: [rstudio, rmarkdown, proyectos, markdown] -categories: [ciencia de datos, estadística, R, aprendizaje] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Si eres una persona con deseos de desarrollar proyectos de código -abierto que puedan ser compartidos, quieres replicar y /o mejorar -proyectos existentes o convertirte en un científico de datos, es muy -probable que hayas leído o escuchado sobre el [Lenguaje -R](https://www.r-project.org/). En este post daremos un paso breve sobre -sus características, las posibilidades de emplearlo en tus proyectos y -las oportunidades laborales que tendrás cuando aprendas a utilizarlo. - - - -Antes de conocer sobre R, vamos primero a resaltar la importancia que -tiene y ha tenido la **Estadística** en distintos ámbitos, ya te darás -cuenta por qué lo hacemos. Como profesional en cualquier área, habrás -estudiado o al menos te mencionaron la palabra estadística. El mundo y -las situaciones cotidianas están rodeadas de incertidumbre y la -estadística es la disciplina que se encarga de estudiarla. Sin embargo, -para implementarla y conocer su gran potencialidad, resulta necesario -manejar una herramienta que sea fácil de aprender, que cuente con la -aprobación de un gran número de analistas de datos, que esté en -constante actualización y que sea demandada en grandes empresas. En -efecto, el lenguaje R cumple con estos y otros requerimientos. - -R fue desarrollado por los estadísticos [**Robert -Gentlemann**](https://en.wikipedia.org/wiki/Robert_Gentleman\_(statistician)) -y [**Ross Ihaka**](https://en.wikipedia.org/wiki/Ross_Ihaka) del -Departamento de Estadística de la [**Universidad de -Auckland**](http://www.nuevazelanda.cl/universidades/university-of-auckland.htm) -en 1993. El acrónimo R se deriva de los nombres de sus desarrolladores. -Actualmente es un proyecto de software libre para la computación -estadística y los gráficos. Es *colaborativo, gratuito, de código -abierto* y se encuentra a cargo del **R Development Core Team**. Esto -quiere decir, que detrás del proyecto existe una comunidad de usuarios y -programadores que buscan mejorar y desarrollar nuevas funcionalidades -para el lenguaje. R se perfila como un lenguaje para estadísticos, sin -embargo cualquier persona interesada puede utilizarlo. Está pensado para -que los usuarios implementen funciones estadísticas, desde las más -básicas como el cálculo de promedios, la generación de publicaciones con -aplicaciones web, la aplicación de técnicas de machine learning, hasta -la generación de gráficos interactivos y de alta calidad. Tienes todo lo -que necesitas en un mismo lenguaje. - -Puedes utilizar R a través de línea de comandos, sin embargo te -recomendamos que utilices un **Entorno de Desarrollo Integrado (IDE)**, -por ejemplo [**RStudio**](https://rstudio.com/) (el cual desde octubre -del 2022 se convertirá en [Posit](https://posit.co/)) que es uno de los -más utilizados por su fácil empleo y las amplias funcionalidades que -ofrece. - -Ahora bien, ya que conoces un poco más sobre R, quizás en este momento -te preguntarás: - -**¿De qué me puede servir aprender este lenguaje?** - -La respuesta es simple pero extensa, aquí te presentamos algunas razones -para que te animes a utilizar R: - -- Si necesitas resumir, visualizar y analizar cualquier cantidad de - datos, R es una buena alternativa porque es fácil de - aprender. Solo necesitas tener a disposición un computador, tiempo y - sed de conocimientos. - -- Cualquier funcionalidad estadística, como el cálculo de medidas - descriptivas, la generación de gráficos potentes y de alta calidad - (estáticos y dinámicos) pueden ser fácilmente implementados con R. - Tienes todo lo que necesitas en un mismo lenguaje. - -- Mediante la generación de - [**Scripts**](https://es.wikipedia.org/wiki/Script) puedes tener - almacenado y a disposición inmediata el código y los datos originales - (por ejemplo un archivo .csv más el script de R) para resolver un - problema en particular. Esto te permite reutilizarlo y también - compartirlo haciéndolo *reproducible y colaborativo*. - -- Los entornos de desarrollo integrado, como *Rstudio*, facilitan el - desarrollo y te permiten manejar el lenguaje de una manera amigable. - En una ventana podrás ejecutar el código, en otra se mostrará la - salida, también tienes una ventana para ver las variables que has - guardado y otra disponible para que guardes tu script, todo en un - mismo lugar. - -![RStudio](img/RStudio.png) - -- R te permite obtener resultados detallados y generar reportes - profesionales con ayuda de herramientas como - [**Rmarkdown**](https://rmarkdown.rstudio.com/). Con esta - funcionalidad puedes exportarlos a formatos como HTML y PDF. Tu jefe, - o la persona interesada en tus reportes, quedará impresionado cuando - le presentes un informe detallado utilizando R. - -- Como mencionamos antes, es un software de gran demanda en el mundo - laboral, y conocerlo puede mejorar tus posibilidades de empleo. - Actualmente las empresas buscan analizar sus datos para tomar - decisiones informadas y en base a ello, obtener ventajas competitivas. - Por tal motivo, si cuentas con algunas habilidades para el - procesamiento y análisis de datos, puedes darle valor a tu perfil - profesional utilizando R. - -- Si te animas, muy pronto podrás formar parte de los desarrolladores de - R incorporando librerías y paquetes para funciones estadísticas. - -- Aunque no tienes que ser un estadístico ni un programador para usar R, - te recomendamos que aprendas los aspectos básicos sobre la - interpretación de estadísticas y gráficos, y de dónde se derivan; esto - te será de gran ayuda a la hora de generar reportes y/o interpretar - resultados. Lo más importante es la disposición y el ánimo que tengas, - recuerda que R es fácil de aprender. - -- En la web, en libros y tutoriales disponibles en la [página oficial de - R](https://www.r-project.org/) encontrarás la documentación necesaria - para que aprendas a utilizar este lenguaje y conozcas las funciones y - paquetes a tu disposición. El acceso a la documentación de R es - totalmente gratuita, una de las características más resaltantes del - lenguaje. - -- Con R puedes procesar datos de distintos formatos ya que, entre otras - cosas, permite leer datos de diferentes software como SPSS, SAS o - Excel. - -- El sistema operativo de tu computador tampoco es un inconveniente a la - hora de trabajar con R, ya que es compatible con Windows, Linux y - MacOS. - -- Como R es de código y acceso abierto, permite hacer control de - versiones usando una herramienta como - [**Git**](https://git-scm.com/), entre otras. - -- Actualmente se encuentran disponibles más de 2300 bibliotecas - desarrolladas en R y puedes descargarlas a través del [Comprehensive R - Archive Network (CRAN)](https://cran.r-project.org/mirrors.html). - ¡Imagina todo lo que puedes hacer para procesar tus datos con estas - bibliotecas!. - -En el post [**Gigantes informáticos dan su apoyo al lenguaje de -programación -R**](https://diarioti.com/gigantes-informaticos-dan-su-apoyo-al-lenguaje-de-programacion-r/88705) -indican que [*Microsoft*](https://www.microsoft.com/es-ve), -[*Google*](https://about.google/), -[*HP*](http://welcome.hp.com/country/us/en/c/welcome.html) y -[*Oracle*](https://www.oracle.com/index.html) se han sumado al consorcio -R porque apoyan el desarrollo de este lenguaje. Si esto es así, debe ser -porque tiene altas potencialidades ¿qué opinas? - -De la misma manera, grandes e influyentes empresas reconocen sus -capacidades, entre ellas [*NASA*](https://www.nasa.gov/), [*Banco -Santander*](https://www.santander.com/es/home), -[*Samsung*](https://www.samsung.com/), [*Western -Union*](https://www.westernunion.com/ve/es/home.html), -[*eBay*](https://ve.ebay.com/), [*Honda*](https://www.honda.com/), -[*Hyundai*](https://www.hyundai.es/), [*Avon*](https://www.avon.com/), -[*Nestle*](https://www.nestle.com/), entre otros según lo mencionado en -[este -post](https://www.maximaformacion.es/blog-dat/para-quien-esta-pensado-r-software/). - -**Quizás también te preguntarás ¿tiene inconvenientes?** - -Pues si, aunque R es potente en el ámbito estadístico y de ciencia de -datos, *no es un lenguaje de programación de propósito general*. Los -lenguajes de propósito general, como su nombre lo indica, pueden ser -utilizados con distintos fines, entre ellos la comunicación entre -computadoras y dispositivos, el acceso y manejo de bases de datos, el -diseño de imágenes o páginas, la creación de sistemas operativos, -compiladores, entre otras cosas y, como ya mencionamos, R es utilizado -principalmente como un lenguaje estadístico. Asimismo, en algunos casos, -puede resultar lento si se compara con otros lenguajes de programación, -como Python. - -A continuación presentamos dos estudios formales donde se refleja el -lugar que ocupa R con respecto a su uso. - -1. La [**20ª Encuesta Anual de KDnuggets Software Poll - 2019**](https://www.kdnuggets.com/2019/05/poll-top-data-science-machine-learning-platforms.html) - la cual contó con más de 1.800 participantes, donde *Python* obtuvo - el primer lugar. Sin embargo, R no se queda atrás en esta encuesta y - junto con otro lenguaje llamado *RapidMiner* son usados - aproximadamente por el 50% de los participantes. - -1. En el **Estudio de popularidad de lenguajes de programación** [PYPL - PopularitY of Programming Language](https://pypl.github.io/PYPL.html) - basado en la cantidad de tutoriales que se buscan en google, para - este año R ocupa el séptimo lugar. - -Quizás estés pensando que no saber programar es una limitante para -aprender R. Eso no debería preocuparte, porque hay una cantidad -importante de tutoriales que pueden aportarte ideas para comenzar, y -también puedes probar con códigos de ejemplo y datos reales que son de -acceso abierto. En las referencias te dejamos algunos enlaces de -tutoriales de R, libros y algunas Cheatsheets (hojas de referencia). - -### Algunos libros para que te inicies con R - -[Libro R para principiantes](https://cran.r-project.org/doc/contrib/rdebuts_es.pdf) - -La traducción al español de “An Introduction to R”. [Libro "Una -Introducción a -R"](https://cran.r-project.org/doc/contrib/R-intro-1.1.0-espanol.1.pdf) - -### Hojas de referencia "Cheatsheets" - -[Manejo de -datos](https://rstudio.com/wp-content/uploads/2015/03/data-wrangling-spanish.pdf) - -[Rmarkdown](https://rstudio.com/wp-content/uploads/2015/03/rmarkdown-spanish.pdf) - -#### Referencias - -[Website de R](https://www.r-project.org/) - -[R, un lenguaje y entorno de programación para análisis -estadístico](https://www.genbeta.com/desarrollo/r-un-lenguaje-y-entorno-de-programacion-para-analisis-estadistico) - -[QUÉ ES R -SOFTWARE](http://www.maximaformacion.es/blog-dat/que-es-r-software/) - -[¿PARA QUIÉN ESTÁ PENSADO R -SOFTWARE?](https://www.maximaformacion.es/blog-dat/para-quien-esta-pensado-r-software/) diff --git a/content/blog/que-es-el-open-science-framework/index.md b/content/blog/que-es-el-open-science-framework/index.md deleted file mode 100644 index 3ccd56260..000000000 --- a/content/blog/que-es-el-open-science-framework/index.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "Que es el Open Science Framework?" -slug: que-es-el-open-science-framework -date: 2021-04-19 -author: Rainer Palm -tags: [osf, framework, proyectos] -categories: [ciencia abierta, investigación abierta] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - -El Open Science Framework (OSF)[1] es un conjunto de herramientas diseñadas tanto para organizar, facilitar y mantener el proceso de vida de la investigación, como para la captura de los distintos estados que esta toma a lo largo de su realización. Mediante la creación de un "proyecto" (asociado a un DOI) y su respectiva wiki en su sitio web[1], los usuarios son llevados a un dashboard donde podrán administrar de manera sencilla archivos, componentes ("subproyectos"), metadatos, usuarios, y demás, con su respectivo registro de actividad, que junto a un sistema de control de versiones permiten la eficaz revisión de cualquier error que se presenté. - - - -Este sistema fue creado por el Center for Open Science (COS)[2], una organización sin fines de lucro fundada en el 2013 en Charlottesville, Virginia con el proposito de incentivar e incrementar la integridad, reproducibilidad y transparencia de la investigación científica sin importar la disciplina en la que se desenvuelva. Como parte de su misión de crear la infraestructura necesaria para alcanzar estos objetivos, desarrollaron el OSF, el cual es utilizado por una variedad de instituciones alrededor del mundo y posée soporte para una multitud de servicios (tales como Google Scholar, Dropbox, Zotero, o SSO) que permite que pueda ser integrado de manera continua y inobstructiva en el flujo de investigación. - -## ¿Como funcióna el Open Science Framework? - -Como fue anteriormente mencionado, el OSF funciona mediante una pagina web que mantenga un repositorio de "proyectos", tal como la pagina del OSF en si[1] o cualquiera de la multitud de universidades que alojan y mantienen sus propios repositorios. En estos repositorios, los usuarios crean proyectos en los cuales pueden alojar información y archivos, hacerlos tanto públicos como privados e invitar colaboradores para trabajar dentro de la plataforma. A su conveniencia, se pueden asignar tanto privilegios individuales para los usuarios como identificadores a los contenidos que son agregados al proyecto, y de esta forma mantenerlo y publicitarlo de una forma mas eficaz. El OSF también posee métricas a nivel de proyecto, que informan a los administradores de este de cuantas personas han visto o descargado los contenidos. - -Además, ya que es una plataforma que intenta abrir la posibilidad de que hayan practicas mas abiertas y colaborativas en las ciencias, permite la creación y el uso de complementos de terceros, principalmente para integrar con mayor facilidad servicios como Zotero o Dropbox en el manejo de citaciones y almacenamiento, respectivamente. Aunque el OSF tiene restricciones de almacenamiento para los archivos (individualmente no pueden pasar los 5GB), de esta manera se hace practicamente ilimitada. - -Algo que distingue al OSF de otros programas similares es que, con el proposito de fomentar la transparencia y la reproducibilidad, cada proyecto se puede "registrar", y de esta forma mantenerse de manera indefinida una versión con estampilla de tiempo del proyecto, que no puede ser editada ni borrada según la voluntad del creador. Además, a esta versión registrada del proyecto se le puede dar un identificador DOI o ARK, y cualquier contenido que sea alojado en sitios de terceros es copiado como parte del proceso de registración. - -## ¿Quienes utilizan el Open Science Framework? - -La comunidad de OSF es bastante amplia. Basta con ver los numerosos repositorios de instituciones universitarias que lo utilizan para hospedar archivos[4]. En sí la plataforma gano notoriedad gracias al Psychology Reproducibility Study, un meta-estudio en el cual colaboró la Universidad de Virginia con el COS para replicar 100 estudios notables de psicología y ver si podían recibir los mismos resultados. Todo el proceso de investigación fue compartido de manera abierta en el OSF[5], permitiendo a cualquiera revisar los resultados con comodidad. - -A pesar de que su principal audiencia son los investigadores y las instituciones en las que estos trabajan, tienen una serie de aplicaciones y herramientas gratis diseñadas para la interacción de sus usuarios con personas fuera del area. Estas son herramientas tales como OSF for Meetings[6], donde pueden subir posters y presentaciones de conferencias y reuniones y OSF Preprints[7], donde pueden compartir preprints con el proposito de recibir opiniones y exposición, y se le otorga a cada uno un identificador unico. - -Inclusive mas alla de las necesidades de investigadores profesionales y colaboraciones grandes, el OSF resulta ser una asombrosa herramienta de organización para cualquiera que necesita una plataforma en la cual revisar, alojar, analizar, y compartir archivos entre los colaboradores de un estudio abierto, con capacidades unicas en cuanto al control de versiones, identificadores, y transparencia de los datos de investigación se refiere. Cualquiera interesado en utilizar el OSF es libre de crear una cuenta gratis y utilizarlo, así que, si te interesa, porque no probarlo? - -[1]: https://osf.io "Open Science Framework" -[2]: https://cos.io "Center for Open Science" -[4]: https://osf.io/institutions?view_only= "OSF Institutions" -[5]: http://osf.io/ezum7 "Estimating the Reproducibility of Psychological Science" -[6]: https://osf.io/meetings "OSF for Meetings" -[7]: https://osf.io/preprints "OSF Preprints" diff --git a/content/blog/que-es-la-ciencia-abierta/index.md b/content/blog/que-es-la-ciencia-abierta/index.md deleted file mode 100644 index e7e1d6aaa..000000000 --- a/content/blog/que-es-la-ciencia-abierta/index.md +++ /dev/null @@ -1,184 +0,0 @@ ---- -title: "¿Qué es la ciencia abierta?" -slug: que-es-la-ciencia-abierta -date: 2020-01-06 -author: Yurely Camacho -tags: [datos] -categories: [ciencia abierta] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - -Si buscas la democratización del conocimiento, oportunidades de -intercambio y colaboración, mayor productividad científica, y mucho -más, la **Ciencia Abierta** es el camino. La producción del -conocimiento científico se verá revolucionado gracias a esta forma -de hacer ciencia. - - - -Los avances constantes del internet y las redes han hecho posible y facilitan -mucho más la búsqueda e intercambio de información en distintos ámbitos. Esto se -considera un factor importante para el desarrollo de la Ciencia Abierta. Para -mostrarte un concepto claro sobre este término, comencemos por citar algunas -definiciones que se encuentran en la web y libros sobre el tema. - -- La ciencia abierta es la práctica de la ciencia de tal manera que - otros puedan colaborar y contribuir, donde los datos de la - investigación, las notas de laboratorio y otros procesos de - investigación están disponibles gratuitamente, bajo términos que - permiten la reutilización, redistribución y reproducción de la - investigación, sus datos y métodos subyacentes - (FOSTER)[https://www.fosteropenscience.eu/foster-taxonomy/open-science-definition] - -- La OCDE (2016) indica que “ciencia abierta se refiere a los esfuerzos - para hacer que el proceso científico sea más abierto e inclusivo a - todos los actores relevantes, dentro y fuera de la comunidad - científica, como lo permite la digitalización”. - -- Según (The Royal Society, 2012) la ciencia abierta se define como - “datos abiertos (disponibles, inteligibles, accesibles y datos - utilizables) combinado con el acceso abierto a las publicaciones - científicas y la comunicación efectiva de sus contenidos” - -Podemos resaltar entonces, que la ciencia abierta es un movimiento, una manera -de ver y hacer ciencia, que busca crear una cultura donde la información de todo -el proceso de investigación científica, ya sean los datos, protocolos, cuadernos -de laboratorio, resultados obtenidos en las diferentes etapas de este proceso, -sean gratuitos y de libre acceso. De esta manera, todas las personas -involucradas en el proceso de investigación, ya sean los propios científicos, -instituciones de investigación y financiamiento, y público en general, pueden -contribuir y colaborar con el esfuerzo de investigación. Con esto se garantiza -que el trabajo científico sea abierto e inclusivo, donde el investigador se -percate que poner a libre disposición sus trabajos le garantizan, entre otras -cosas, el aumento del impacto y difusión de sus investigaciones. - -La ciencia abierta es una forma de producir conocimiento científico -promoviendo la comunicación y acceso efectivo del contenido de las -investigaciones científicas en todas las áreas (instrumentos de -trabajo, resultados intermedios y finales) mediante la digitalización -y las bondades del internet. - -El acceso al contenido de algunas publicaciones científicas hasta hace -pocos años se realizaba, en la mayoría de ocasiones, por medio de -revistas donde mayormente había que pagar para obtener los papers y -resultaban muy pocos los documentos gratuitos. Estas publicaciones -solo reflejan el procedimiento y los resultados obtenidos, con el -movimiento de la ciencia abierta. Esta forma de hacer ciencia -tradicional se combina con nuevas y novedosas herramientas digitales -con el fin de poner a libre disposición no sólo las publicaciones -finales, sino también los datos de la investigación, el software, notas -de laboratorio o los cuadernos de trabajo, evaluaciones por pares, entre -otros. - -Este enfoque busca que las distintas etapas del proceso de -investigación esté abierta a la revisión, crítica, participación y -colaboración, aportes para mejoras, reproducción y reutilización para -todos los involucrados, creando nuevas formas de acceder al -conocimiento científico. - -La ciencia abierta es un enfoque compuesto por distintas disciplinas -relacionadas. Según el proyecto -[*FOSTER*](https://www.fosteropenscience.eu/) sobre ciencia abierta -incluye 8 elementos: - -- **Open notebooks (Cuadernos abiertos)** -- **Datos abiertos** -- **Revisión abierta** -- **Open access (Acceso abierto)** -- **Sotfware libre de código abierto** -- **Redes sociales académicas** -- **Ciencia ciudadana** -- **Recursos educativos abiertos** - -Todos estos aspectos afectan de una u otra forma el ciclo completo de -la investigación. En el blog [*NeoScientia*](https://neoscientia.com/ciencia-abierta/) mencionan -algunos de estos componentes como grados de apertura de la ciencia, -estos son: **Open Research**, **Open Access**, **Open Notebook** y -**CrowdScience**. Otros autores las denominan como iniciativas que -incluye la ciencia abierta. Distintas formas de clasificarlos, pero -todos con el mismo fin, la disponibilidad gratuita de todos los -recursos de investigaciones científicas. - -Puedes visualizar en la siguiente figura la taxonomía sobre la ciencia -abierta. - -![Taxonomía sobre la ciencia abierta](componentes.png) - -A continuación mencionamos algunos beneficios de la práctica de la ciencia abierta: - -- **Para el investigador**: - - * Ofrece mayor impacto y difusión de sus trabajos, a la vez que ganan - reconocimiento y fuentes para trabajos futuros. - * Brinda distintas maneras de publicar los artículos. - * No pierdes la autoría o méritos al publicar de manera abierta. - * Puedes ajustar el derecho al uso de la información que publicas, - protegiendo el contenido en torno a licencias **Creative Commons** o - **Science Commons** - * Cuando interactúas con otros investigadores sobre trabajos en temas - similares, puedes aprender de forma más rápida y eficiente; evitando - que trabajos parecidos sean duplicados. - -- **Para las empresas de financiamiento (públicas o privadas)**: - - * Practicando la ciencia abierta, estas empresas y los estadistas se - convencerán que los procesos de investigación son más reconocidos y - de mayor calidad. - - - **Para los usuarios y público en general**: - - * En este enfoque la producción de conocimiento es eficiente, - democrática y permite atender mejor a las demandas - sociales. - * Como usuario tienes posibilidades para contribuir e intervenir en - cualquier proceso de conocimiento abierto. - * Puedes encontrar las respuestas que buscas mediante la - democratización del conocimiento. - -El aumento actual en la práctica de la ciencia abierta a despertado -iniciativas en personas e instituciones de varios países, desde hace -pocos años. Creando emprendimientos, comunidades y proyectos sobre -ciencia abierta. A continuación mencionamos algunos: - -[**FOSTER**](https://www.fosteropenscience.eu/) - -[**Open Knowledge Foundation**](https://okfn.org/) - -[**ODSL (Open Data Science Latam)**](https://www.odsla.org/) - -[**Datalat**](https://www.datalat.org/) - -[**Open Science Comunity Leiden**](https://www.universiteitleiden.nl/open-science-community-leiden) - -[**Open Knowledge Foundation**](https://okfn.org/) - -[**Amelica**](http://amelica.org/) - -[**Association of European Research Libraries LIBER**](https://libereurope.eu/) - -[**MonuMAI**](https://*monumai.ugr.es/proyecto) - -En resumen, la ciencia abierta busca cumplir con los requerimientos -actuales y futuros en lo que se refiere al acceso, reproducción, -publicación y colaboración en investigaciones de cualquier disciplina. -La ciencia abierta es un movimiento que ha revolucionado la forma de -ver y hacer ciencia, y en nuestra opinión es el futuro. - -### Referencias - -* Anglada, Lluís; Abadal, Ernest (2018). “¿Qué es la ciencia abierta?”. Anuario ThinkEPI, v. 12, pp. 292-298. - -* [Curso de Open Science para investigadores del CSIC](https://digital.csic.es/bitstream/10261/171854/1/Curso_Open_science_2018_DIGITALCSIC.pdf) - -* [Portal de FOSTER](https://www.fosteropenscience.eu/) - -* [Blog NeoScientia](https://neoscientia.com/ciencia-abierta/) - -* [Blog Cientópólis](https://www.cientopolis.org/ciencia-abierta/) diff --git a/content/blog/que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias/index.md b/content/blog/que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias/index.md deleted file mode 100644 index 84bafbaf7..000000000 --- a/content/blog/que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias/index.md +++ /dev/null @@ -1,301 +0,0 @@ ---- -title: "¿Qué hemos aprendido, gracias a la ciencia abierta, del manejo de pandemias?" -slug: que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias -date: 2020-05-27 -author: Yurely Camacho -tags: [pandemias, covid19] -categories: [ciencia abierta, investigación abierta] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Al transcurrir los años se han presentado pandemias que han azotado y -puesto en alerta al mundo. Por tal motivo, la manera como las personas, -instituciones y gobiernos lo han manejado resulta de suma importancia ya -sea para prevenir errores cometidos, tomar medidas similares o -reinventarse acciones en el tema. Justo es aquí donde entra en juego la -ciencia abierta. Tal vez te preguntarás ¿Cuál es el papel de la ciencia -abierta en todo esto? Pues las distintas disciplinas que abarca, como el -acceso y los datos abiertos, han permitido producir conocimiento -científico para combatir estas pandemias, por ejemplo, para realizar un -diagnóstico temprano, en la gestión de la producción de vacunas, o para -predecir niveles de propagación de las enfermedades y generar soluciones -tecnológicas. - - - -En este artículo te presentamos algunas iniciativas de ciencia abierta -que han permitido reducir y controlar el impacto de estas enfermedades, -la COVID-19, el Zika, la gripe, el dengue, el SARS (Síndrome -respiratorio agudo grave) y el MERS (Síndrome respiratorio de Oriente -Medio), dejando aprendizajes y avances en este ámbito. - -## ¿Por qué la Ciencia Abierta? - -En la actual pandemia de la COVID-19 el acceso a información, la -difusión de datos y el uso de código abierto, aceleraron las -investigaciones haciendo posible que en pocas semanas se obtuvieran -avances significativos, en comparación con aquellos probablemente -obtenidos si la información no estuviera abierta. El mejor ejemplo está -en el proceso de secuenciación de su genoma, que se logró en solo 11 -días publicándose abiertamente, permitiendo conocer sobre formas de -transmisión y posibles métodos de detección. Se encuentran disponibles -decenas de portales de investigación, revistas y otras herramientas de -acceso abierto con información sobre la COVID-19 y su causante, el virus -SARS-COV2. Te presentamos algunos en el apartado de referencias. - -Algunas de esas investigaciones sobre el coronavirus se publicaron de -manera abierta antes de tener la revisión por pares, para acelerar los -tiempos de difusión del conocimiento. Este tipo de prácticas ya había -sido implementada durante las pandemias de SARS en 2003, de gripe AH1N1 -en 2009 y el Zika en la década de los 50, pero la evolución de las -Tecnologías de Información y Comunicación (TIC) en estos años ha -permitido que se implementen con mayor fuerza. De igual forma, la -pandemia del Zika estuvo influenciada por el acceso abierto, aunque en -menor medida que la COVID-19. Se publicaron en abierto resultados de -investigaciones, por ejemplo, la reseñada en [Proceedings of the -National Academy of -Sciences](https://www.eurekalert.org/pub_releases/2019-01/potn-anz010919.php), -[este -artículo](https://www.elsevier.es/es-revista-revista-colombiana-anestesiologia-341-articulo-zika-una-pandemia-progreso-un-S0120334716300235 -y otro [publicado en -Elsevier](https://www.elsevier.es/es-revista-revista-colombiana-anestesiologia-341-articulo-virus-zika-se-expande-su-S0120334716000216). - -Como todavía no hay cura para la fiebre del Zika, el desarrollo de -vacunas y la terapia contra el virus es relevante. Sin embargo, en un -[artículo del -2016](https://blogs.iadb.org/conocimiento-abierto/es/fortaleciendo-la-respuesta-ante-el-zika-mediante-la-colaboracion-abierta/) -sobre colaboración abierta en respuesta al Zika, se expone la falta de -un sistema eficaz para compartir datos e información y hace referencia a -una convocatoria para investigadores publicada por la Organización -Mundial de la Salud (OMS) en 2015. Actualmente, más de 30 -[organizaciones](https://blog.wellcome.ac.uk/2016/02/10/sharing-data-during-zika-and-other-global-health-emergencies/) -han ratificado la declaración de consenso de la OMS para compartir datos -del zika. - -Para minimizar la falta de información, El [Banco Interamericano de -Desarrollo (BID)](https://www.iadb.org/es), el [Governance -Lab](http://www.thegovlab.org) y asociados gubernamentales de algunos -países de América del Sur colaboraron para llevar a cabo conferencias -bajo el nombre de [Smarter -Crowdsourcing](https://zika.smartercrowdsourcing.org/) (Colaboración -abierta inteligente) buscando especialistas para impulsar una respuesta -colaborativa ante la crisis del Zika. - -Los datos juegan un rol importante en el tratamiento de las pandemias, y -su procesamiento es fundamental para mantenernos informados. El -desarrollo de tableros de monitoreo de casos de COVID-19, mapas con -datos en tiempo real, informes dinámicos y otras visualizaciones nos han -permitido conocer sobre la propagación del virus. Asimismo con datos de -buena calidad, la ciencia de datos puede ser una poderosa herramienta -para realizar predicciones sobre la evolución de la enfermedad COVID-19 -o incluso para buscar un posible tratamiento. La [Universidad de -Zaragoza diseña un mapa que predice los nuevos contagios por -coronavirus](https://www.heraldo.es/noticias/aragon/zaragoza/2020/02/28/la-universidad-de-zaragoza-disena-un-mapa-que-predice-los-nuevos-contagios-por-coronavirus-1361341.html). -Asimismo, la compañía de biotecnología *AbCellera* está empleando un -[modelo de Machine -learning](https://www.abcellera.com/news/2020-03-abcellera-and-lilly-codevelopment) -para desarrollar terapias basadas en anticuerpos de pacientes que se han -recuperado de la enfermedad. - -Modelos predictivos de este tipo también se emplearon en la pandemia del -Zika. Uno de ellos desarrollado por el Consejo Nacional de -Investigaciones Científicas y Técnicas -[CONICET](https://www.conicet.gov.ar/) en Argentina junto con Ecuador y -Colombia en 2019. La investigación incluyó la captura de mosquitos -adultos y su análisis genético con la finalidad de aplicar dichos -modelos para conocer probabilidades de brotes en áreas particulares y -así evaluar posibles acciones preventivas. De igual forma, estos modelos -estuvieron presentes en la pandemia de gripe AH1N1, donde un estudio de -investigadores de la Escuela Médica de Harvard determinaron que el uso -de la Wikipedia y así el empleo de big data, son capaces de predecir con -precisión la llegada de los brotes de gripe en EEUU -(http://www.ploscompbiol.org/article/info%3Adoi%2F10.1371%2Fjournal.pcbi.1003581). -Puedes consultar información abierta sobre la influenza y las pandemias -de gripe, como la gripe aviar y la AH1N1 -[aquí](https://espanol.cdc.gov/flu/pandemic-resources/index.htm) y -también sobre fuentes de información acerca de la gripe aviar en [este -enlace](https://www.researchgate.net/publication/331177707_Fuentes_de_Informacion_acerca_de_la_Gripe_Aviar). - -Los datos abiertos son tomados para desarrollar metodologías que hagan -más accesible la información a cualquier persona. De esta manera Google -y [UNICEF](https://www.unicef.org/es) trabajaron en el desarrollo de un -panel de control abierto al público sobre el zika, para analizar grandes -cantidades de datos, así como para visualizar y predecir brotes -potenciales de enfermedades, puedes encontrar información en [este -enlace](https://googleblog.blogspot.com/2016/03/providing-support-to-combat-zika-in.html). - -Los avances tecnológicos y la influencia de las TIC han cerrado la -brecha de la desinformación, aunque en ocasiones su uso hace que se -divulgue información poco certera. En [este -artículo](https://www.scielo.sa.cr/scielo.php?script=sci_arttext&pid=S1409-14292009000100001) -se presenta la influencia de las TIC durante la pandemia de la gripe. -Donde algunas iniciativas fueron llevar a cabo cursos virtuales y -conferencias durante la pandemia, fue una iniciativa desarrollada por la -Organización Panamericana de Salud usando el programa *Elluminate* que -en la actualidad se comercializa bajo el nombre de [Blackboard -Collaborate](https://www.blackboard.com/teaching-learning/collaboration-web-conferencing/blackboard-collaborate). -En la actual pandemia de COVID-19 se ha hecho inevitable el amplio uso -de estas tecnologías que permiten el teletrabajo y la investigación -colaborativa empleando herramientas como Git, redes sociales como -Whatsapp, han ayudado a mantenernos comunicados y trabajando. - -Otro aspecto importante es la investigación colaborativa, por ejemplo, -en proyectos de código abierto o repositorios de datos. En la pandemia -de gripe AH1N1 en 2009 se creó un repositorio en la plataforma -colaborativa GitHub acerca de la [gripe AH1N1 en -Londres](https://github.com/JDureau/H1N1-London-2009). Otros repositorios -en esta plataforma referentes a información y proyectos sobre pandemias -son: [Repositorio de datos sobre los brotes del -zika](https://github.com/BuzzFeedNews/zika-data#additional-resources) y -en https://github.com/cdcepi/zika, el proyecto en GitHub de la app -Española [Open -Coronavirus](https://github.com/open-coronavirus/open-coronavirus/blob/master/README.es.md), -que busca tener cuarentenas selectivas en lugar de masivas en España. - -Frente al COVID-19 se han desarrollado proyectos de código abierto,por -ejemplo, el proyecto [*Ushahidi*](https://www.ushahidi.com/), que -proporciona, entre otras cosas, mapas de infectados y lugares donde -pueden suministrarse alimentos. Otro iniciativa es [eCALLER -EPIDEMIAS](https://ingenia.es/actualidad/conocimiento/lanzamos-ecaller-epidemias-software-libre-para-hacer-frente-a-covid-19/) -que cuenta con un despliegue de aplicaciones para el diagnóstico y -monitorización. Otra iniciativa han sido *hackatones* que reúnen a las -personas para usar sus habilidades y ayudar a combatir los problemas con -la pandemia desarrollando proyectos de tecnología. Uno de ellos, el -Hack Quarantine desarrollado, el Debian -biohackatone en 2020 y -[CodeTheCurve](https://en.unesco.org/news/codethecurve-youth-innovators-hacking-their-way-surmount-covid-19-challenges). -Algunas instituciones tecnológicas han creado fondos para financiar -proyectos de código abierto en combate al COVID-19 como el de -[Mozila](https://blog.mozilla.org/blog/2020/03/31/moss-launches-covid-19-solutions-fund/). - -Las pandemias del SARS en 2003 y el MERS en 2012, fueron causadas por -tipos distintos de coronavirus. Las investigaciones realizadas en la -pandemia del SARS influyen ahora en relación al nuevo tipo de -coronavirus SARS COV-2 causante de la enfermedad COVID-19, puedes -consultar [este -artículo](https://www.intramed.net/contenidover.asp?contenidoid=95673) -para más información. Algunos trabajos en acceso abierto puedes -consultarlos -[aquí](https://academica-e.unavarra.es/bitstream/handle/2454/9567/Hao%20Niu.pdf?sequence=1&isAllowed=y) -y en [este -enlace](https://www.scielosp.org/article/ssm/content/raw/?resource_ssm_path=/media/assets/rpsp/v14n1/16645.pdf). -Asimismo, se realizaron comparaciones de como [el coronavirus SARS-COV2 -supera los casos del SARS de 2003 para Enero -2020](https://gacetamedica.com/investigacion/todo-lo-que-se-sabe-del-nuevo-coronavirus-2019-ncov-fx2404160/) -y otras investigaciones relacionadas y comparando los 3 tipos de -coronavirus causantes de estas pandemias (SARS, MERS y COVID-19), puedes -consultar información -[aquí](https://gacetamedica.com/investigacion/que-paso-con-los-otros-brotes-de-coronavirus/). - -Las investigaciones iniciadas sobre los coronavirus del SARS y el MERS -sirvieron para conocer sobre estos virus y que los científicos e -investigadores se dieran una idea de lo que sería el nuevo coronavirus -SARS Cov-2. El conocimiento y los datos abiertos -relacionados a las anteriores pandemias, permiten que se hagan -investigaciones como la de [este -artículo](https://www.lavanguardia.com/ciencia/20200227/473812035831/coronaviris-covid19-letal-gripe-sars-mers.html) -donde comparan la letalidad del COVID-19, el SARS, MERS y la gripe. - -El Dengue ha sido otra pandemia para la cual se han llevado a cabo -proyectos como un [Documento de trabajo sobre datos abiertos del -dengue](https://idatosabiertos.org/wp-content/uploads/2015/10/7.Dengue-Pane-Ojeda-Valdez.pdf) -por parte de la Iniciativa Latinoamericana por los Datos Abiertos y el -Open Data que presentan mapas de riesgo y de incidencia dinámicos para -18 países de la región de las Américas de la OMS. También está -["DengueNet"](http://ghdx.healthdata.org/record/who-denguenet], el -sistema central de gestión de datos de la OMS para la vigilancia -epidemiológica y virológica mundial del dengue y la fiebre hemorrágica -del dengue. Puedes visitar [en este -enlace](http://www.bvs.hn/php/level.php?lang=es&component=59&item=2) -otros sitios de acceso abierto a información sobre el dengue. - -Cabe resaltar que la era tecnológica, los avances y los nuevos usos de -las TIC afectan y mejoran la forma en la que las personas acceden a la -información sobre salud. Esto ha sido fundamental para la ciencia -abierta y podemos observarlo si comparamos las iniciativas actuales -frente al COVID-19 con las surgidas frente a otras pandemias. - -## Lo que sabemos hasta ahora - -De todas las iniciativas de ciencia abierta que se han desarrollado en -torno a las pandemias, hemos aprendido a divulgar datos e información, -mantenernos actualizados y reconocer información veraz, como la -proporcionada por la OMS, a trabajar de forma colaborativa con personas -de distintos lugares en el mundo, tomar conciencia de nuestro papel -protagónico en el cumplimiento de medidas sanitarias, a hacer uso de -herramientas digitales para mantenernos informados y publicar -información importante, a tomar decisiones personales y colectivas en -base a datos abiertos y herramientas de acceso abierto, en fin, poner en -práctica y a disposición nuestras capacidades para generar proyectos que -creen soluciones y todos se beneficien de ellas. Asimismo formar parte -como usuarios o beneficiarios de esos proyectos y hacer que la práctica -de la ciencia abierta sea cada vez más adaptada en la cotidianidad de -las personas. También nos han permitido reconocer los avances -tecnológicos para la investigación, eliminar las barreras entre -investigadores y los ciudadanos de todo el mundo para que, con ayuda de los -datos e información disponible, podamos comparar las acciones que se han -llevado a cabo y reconocer que la ciencia abierta tiene un rol -importante en el ámbito de la salud. Finalmente, debemos decir que las -pandemias han hecho que los gobiernos conozcan y actúen de manera rápida -y eficiente ante cualquier pandemia y esto ha sido posible, con el -transcurrir de los años, gracias a las buenas prácticas de ciencia -abierta. - -### Referencias - -- [Coronavirus: Recursos y conocimiento abierto para colaborar en la - respuesta a la - pandemia](https://blogs.iadb.org/conocimiento-abierto/es/coronavirus-recursos-y-conocimiento-abierto-para-colaborar-en-la-respuesta-a-la-pandemia/). - -- [Fortaleciendo la respuesta ante el Zika mediante la colaboración - abierta](https://blogs.iadb.org/conocimiento-abierto/es/fortaleciendo-la-respuesta-ante-el-zika-mediante-la-colaboracion-abierta/). - -**Algunas plataformas de acceso abierto sobre el COVID-19 y el SARS-COV2:** - -- [Literatura mundial sobre la enfermedad COVID-19 de la - OMS](https://search.bvsalud.org/global-literature-on-novel-coronavirus-2019-ncov/) - -- [Canal de noticias de la OMS](https://www.who.int/es) - -- [Statista en Español](https://es.statista.com/temas/5901/el-coronavirus-de-wuhan/) - -- [Datos del Banco Mundial](https://datos.bancomundial.org/) - -- [Center for Control and Prevention of - Disease](https://espanol.cdc.gov/flu/index.htm) - -- [EBSCO Medical](https://covid-19.ebscomedical.com/research) - -- [Repositorio de Investigación de - Elsevier](https://coronavirus.1science.com/search). En particular este - repositorio contiene artículos sobre COVID-19, *SARS* y *MERS*, las - dos últimas fueron pandemias desarrolladas en la primera década del - siglo XXI. - -- [Centro de Información de Coronavirus de - Elsevier](https://www.elsevier.com/connect/coronavirus-information-center) - -- [Centro de Recursos sobre el Coronavirus de The Lancet](https://www.thelancet.com/coronavirus) - -- [Página de Investigación de Coronavirus y Enfermedades Infecciosas de la SSRN](https://www.ssrn.com/index.cfm/en/coronavirus/) - -- [Nature Research](https://www.nature.com/collections/hajgidghjb?utm_source=sn&utm_medium=referral&utm_content=null&utm_campaign=BSLB_1_CA01_GL_BSLB_AWA_CA01_GL_LSGR_PubH_Coronovirus_LandingPage) - -- [Taylor & Francis](https://taylorandfrancis.com/coronavirus/) - -- [New England Journal of Medicine](https://www.nejm.org/coronavirus) - -- La Universidad de Chile ofrece una web donde guarda enlaces a sitios - de acceso abierto sobre información e investigaciones acerca del - COVID-19. Visítala en [este - enlace](https://bibliotecas.uv.cl/recursos-acceso-abierto). diff --git a/content/blog/que-son-las-mentorias-y-como-potencian-los-proyectos-de-ciencia-abierta/index.md b/content/blog/que-son-las-mentorias-y-como-potencian-los-proyectos-de-ciencia-abierta/index.md deleted file mode 100644 index 7c0ab4a2f..000000000 --- a/content/blog/que-son-las-mentorias-y-como-potencian-los-proyectos-de-ciencia-abierta/index.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -title: "¿Qué son las mentorías y cómo potencian los proyectos de ciencia abierta?" -slug: que-son-las-mentorias-y-como-potencian-los-proyectos-de-ciencia-abierta -date: 2020-02-14 -author: Yurely Camacho -tags: [proyectos] -categories: [organización, mentorías] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -La competitividad y los deseos de superación a nivel personal, profesional y -laboral impulsan los deseos individuales por aprender continuamente para afianzar -nuestros conocimientos, aptitudes y habilidades. En muchos casos, el aprendizaje demanda la adquisición o fortalecimiento de capacidades y destrezas, para las cuales el proceso de mentoría -nos brinda una buena oportunidad para lograrlo. En el presente artículo -proporcionamos una definición de mentoría, te daremos un paseo por -algunos programas actuales de mentoría y al final reflexionamos sobre -las bondades de este proceso en proyectos de ciencia abierta. - - - -El término **mentor** proviene de la novela “La Odisea”, escrita por el -poeta griego Homero. Mentor era un amigo de confianza de Odiseo y lo -ayudó a aconsejar a su hijo Telémaco. De allí, se conoce como mentor la -persona que enseña, aconseja, guía, apoyar y ayuda en el desarrollo y -crecimiento de otra persona invirtiendo tiempo y conocimientos para -ello. - -Aunque la palabra *Mentoría* no se encuentra en el Diccionario de la -Real Academia Española, hoy por hoy se utiliza para definir el proceso de aprendizaje -mediante el cual una persona con mayor experiencia (*mentor*) transmite -sus conocimientos, experiencias, información y técnicas a otra -(*aprendiz*) con la finalidad de desarrollar o afianzar -en él, destrezas para el logro de los objetivos propuestos ya sea a -nivel académico, profesional o personal. - -La mentoría también puede utilizarse como una estrategia de aprendizaje -que consiste en brindar consejo y un ejemplo constructivo a los -participantes con el fin de ayudarles a alcanzar su potencial -[*MENTOR*](https://www.mentoring.org/). Se espera en un largo plazo que -las personas que participan en las mentorías puedan poner en práctica -las habilidades y conocimientos que adquirieron en su proceso de -aprendizaje en aspectos de su vida personal, profesional y laboral. - -Es importante mencionar que aunque haya programas establecidos que conduzcan el proceso de la mentoría, en realidad, ninguna mentoría debería ser igual a otra: los intereses particulares e -intercambios interpersonales definen cada proceso de guía y -acompañamiento, donde la confianza y aceptación son aspectos -fundamentales. - -Un buen mentor debe ser una persona que sirva de guía al alumno -prestándole la ayuda adecuada, disponiendo de tiempo de dedicación, -contando con conocimientos suficientes sobre los desafíos que los -aprendices enfrentan, debe tener alta capacidad de comunicar esa -experiencia y la predisposición para hacerlo, así como un interés en -contribuir al desarrollo del participante. - -Las mentorías pueden ser pagas o gratuitas, presenciales u online. A -este último tipo se le conoce como *e-mentoría, telementoría o mentoría -online*, y se plantea como respuesta a las limitaciones de espacio y -tiempo que pueden presentarse en las mentorías presenciales. La mentoría online, se basa en -la implementación de las Tecnologías de comunicación e información -(TIC's) y la comunicación mediada por ordenador (CMO) como el uso de -e-mail, sistemas de conferencia por ordenador, redes sociales como -WhatsApp para llevar a cabo las mentorías. Este tipo de mentoría se -benefician de conservar un registro de la interacción con su mentor. - -Existen figuras públicas que alcanzaron el éxito con el acompañamiento -de un mentor, por ejemplo, el CEO de Facebook, [Mark Zuckerberg](https://es.wikipedia.org/wiki/Mark_Zuckerberg) tuvo como -mentor a [Steve Jobs](https://es.wikipedia.org/wiki/Steve_Jobs), ex CEO de Apple y el cofundador de Microsoft, [Bill -Gates](https://es.wikipedia.org/wiki/Bill_Gates) tuvo como mentor a El CEO de Berkshire Hathaway, [Warren Buffett](https://es.wikipedia.org/wiki/Warren_Buffett), otras personalidades en [este -enlace](https://sebastianpendino.com/ayuda-mentor-ejemplos/). - -## ¿Cómo ayudan las mentorías a los proyectos de ciencia abierta? - -Veamos algunos argumentos de cómo las mentorías pueden -ayudarte si desarrollas (o así lo deseas) proyectos de ciencia abierta. - -Como se dijo en nuestro artículo, la ciencia abierta (enlace al artículo -ciencia_abierta) está compuesta por varias disciplinas, entre ellas: el -acceso abierto, datos abiertos, código abierto, investigación abierta y -reproducible, ciencia ciudadana, ciencia de datos, entre otros. El -"hacer" ciencia abierta se está practicando cada vez más, de ahí la -importancia de encontrar un mentor para ayudarte a -desarrollar y potenciar buenas prácticas, para aprender o especializarte en -el manejo de algunas herramientas que necesitarás para desenvolverte en -este apasionante mundo de la ciencia abierta. - -Con la ayuda de un mentor -y un plan estratégico puedes garantizar, en buena medida, un logro de -tus objetivos, cerrando la brecha entre las aplicaciones teóricas y -prácticas de todos los componentes de esta forma de hacer ciencia. El -objetivo principal de las mentorías en ciencia abierta es educar a los -científicos sobre las bondades de hacer abierta la ciencia que -practican. - -Sin embargo, debes tomar en cuenta que el éxito de tu proyecto depende -exclusivamente de tí como investigador aunque la ayuda de un mentor, sin -duda, aumenta la probabilidad de éxito. - -Debido a la rigurosidad en el planteamiento y desarrollo de procesos de -investigación, se hace cada vez más necesario la ayuda y acompañamiento -de investigadores con conocimientos afianzados y que se encuentren en la -disposición de ayudar a otros investigadores. En ocasiones puedes sentir -que tu trabajo en el proyecto no fluye, que cada vez son más los -inconvenientes que se te presentan y que solo con leer libros y consultando -la web, no sientes el avance. En estas situaciones te sería de gran -ayuda contar con un mentor. - -Un mentor en proyectos de ciencia abierta -debe ser un embajador de la práctica, la formación y la educación de la -Ciencia Abierta en proyectos y comunidades. De acuerdo con el enfoque de -ciencia abierta que estés trabajando o quieras comenzar a manejar puedes -encontrar una gran variedad de perfiles de los posibles mentores. - -Si participas en una mentoría en investigación abierta, por ejemplo, el mentor -contribuye a tu desarrollo técnico en cuanto a métodos, instrucciones, -pensamiento creativo, requisitos académicos, habilidades de -comunicación, gestión y apertura de los datos y divulgación de los -resultados. Un tema interesante que puedes tratar con tu mentor es la -preparación para el mercado laboral, él puede darte sugerencias sobre -ello, permitiéndote establecer contactos con personas que se desarrollen -en el mismo campo de investigación y aportándote una nueva perspectiva del panorama de todo lo -que puedes lograr en la disciplina en la cual te desempeñes. Lo mismo ocurre si -participas en mentorías sobre cualquier otro componente de la ciencia -abierta, por ejemplo, mentorías sobre "cómo abrir -los datos", plataformas de control de versiones e investigación -reproducible, gestión de datos, código abierto, ciencia de datos. - -Puedes encontrar distintos programas y personas que brindan mentorías, -muchas de esas son pagas y tienen un plan de trabajo establecido. A -continuación te presentamos algunas plataformas e iniciativas de programas de -mentorías: - -- [MENTOR-Sociedad Nacional de Mentoría](https://www.mentoring.org/) -- [Centro Nacional de mentoría](https://www.nwrel.org/mentoring/) -- [Acamica](https://www.acamica.com/) -- [Red de Mentores UANL](http://innovacion.uanl.mx/mentoria/) -- [Red de Mentores de Madrid](https://www.madrimasd.org/emprendedores/red-mentores-madrid) -- [WINN Women in the news Networs](http://winnlatam.com/mentorias/) -- [Programa de mentorías de la Universidad Complutense de Madrid](https://www.ucm.es/mentorias) -- [Programa de mentorías de la Universidad de la Frontera](http://mentorias.ufro.cl/) -- [Open Life Science](https://openlifesci.org) -- [Neoscientia](https://neoscientia.com/mentoring/) -- [Encontrar mentores en ciencia de datos](https://mentorcruise.com/) - -Y en openScienceLabs te brindamos un programa de mentorías sobre algunos -temas de ciencia abierta que puedes consutar en enlace. - -### Referencias - -- [MENTOR-Sociedad Nacional de Mentoría](https://www.mentoring.org/) -- [Neoscientia](https://neoscientia.com/mentoring/) -- [El mentoring como herramienta de motivación y retención del talento](http://pdfs.wke.es/2/2/7/6/pd0000012276.pdf) -- [Mentoría en educación superior, la experiencia en un programa extracurricular](http://www.scielo.org.mx/pdf/redie/v20n4/1607-4041-redie-20-04-86.pdf) diff --git a/content/blog/que-son-los-datos-abiertos/index.md b/content/blog/que-son-los-datos-abiertos/index.md deleted file mode 100644 index 003488360..000000000 --- a/content/blog/que-son-los-datos-abiertos/index.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: "¿Qué son los datos abiertos?" -slug: que-son-los-datos-abiertos -date: 2020-01-18 -author: Rainer Palm -tags: [datos] -categories: [ciencia abierta, datos abiertos, investigación abierta] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -El manejo de los datos es un aspecto muy importante a considerar en los proyectos de ciencia abierta. Con respecto al almacenamiento y uso de los datos, hay un número nada despreciable de movimientos e iniciativas en boga que buscan un mayor grado de transparencia y distribución de la información en todo tipo de ámbitos. Principalmente en la esfera pública (en temas referidos a políticas gubernamentales, uso del presupuesto de los ministerios, etc.), son iniciativas que buscan hacer libres las investigaciones, técnicas y datos utilizados para justificar la información y politicas dadas por estas instituciones. Movimientos tales como el Partido Pirata prometen que, cuando estos datos estén disponibles, no solamente se ejecutarán las políticas de una forma más eficiente sino que se podrá garantizar la veracidad de la investigación permitiendo generar una fuerte confianza en ésta. - - - -Por esto mismo, el tema de los datos abiertos es tan popular en comunidades de ciencia actualmente. Dado que la posibilidad de contar con datos abiertos es ofrecida por tecnologías computacionales, el internet, e instrumentos de grabación ubícuos, en realidad es una simple extensión del dogma científico proponer que todos compartan sus métodos en un formato reproducible, legible tanto por humanos como por computadoras, y por lo tanto ayudar en cuanto la replicabilidad de sus investigaciones. Pero, ¿qué son datos abiertos? y ¿Qué exactamente queremos que sea parte del bien común? - -## Que son los datos? - -Cuando nos referimos a datos, por lo general hablamos de un conjunto de materiales crudos que usamos en investigaciones, estudios y demás para derivar conocimientos de ellos. Ya sean resultados de encuestas, medidas de laboratorio, o grabaciones e imágenes del campo de estudio, se trata de la 'entrada' que recibe el proceso investigativo para su realización. En otras palabras, un 'dato' es una unidad de información. - -Durante el proceso investigativo los datos pueden ser analizados, estudiados, visualizados, coleccionados, medidos, etc. Para alcanzar un nivel aceptable de transparencia, estos pasos deben ser también anotados y convertidos en datos en si mismos. De esta forma los métodos utilizados pueden ser verificados y reproducidos por cualquiera con acceso a las herramientas adecuadas. Sin acceso, por lo menos escrito o grabado, al proceso mediante los cuales se obtuvieron los datos, no se puede confiar en estos y por lo tanto prácticamente carecen de significado. - -## Que son datos abiertos? - -En la actualidad, una inmensa cantidad de datos son recolectados y procesados diariamente de forma casi automática como consecuencia del funcionamiento de empresas, organizaciones e individuos. Aunque estos datos en su mayoría pertenecen a entes privados y, por lo tanto, son puestos a disponibilidad de apenas una cantidad selecta de personas, su 'minado' y posterior uso ya ayudan muchísimo a la eficiencia y control del trabajo. Entonces, ¿que pasaría si esta enorme base de datos estuvieraa disposición del público para su libre uso? - -Eso es lo que significa que algo tenga datos 'abiertos'. Según el [Open Data Handbook](https://opendatahandbook.org/guide/es/what-is-open-data/), los datos abiertos son aquellos que pueden ser vistos, utilizados, reutilizados, y redistribuidos libremente por cualquier persona, y que se encuentran sujetos, cuando mucho, al requerimiento de atribución y de compartirse de la misma manera en que aparecen. De esta forma, 'abierto' puede aplicarse a información acerca de cualquier sujeto, ya sea en áreas como finanzas, ciencia, cultura, negocios, producción o cultura; siempre y cuando ésta esté sujeta a una licencia abierta para libre uso y beneficio al público. Por lo tanto, 'abierto' puede aplicarse también a información en una variedad de formatos, ya sean pedazos de texto enriquecido, imágenes, videos y hojas de cálculo entre otras. - -Lo más importante es que los datos, para que sean 'abiertos', no deben ser simplemente liberados, sino deben también estar disponibles en formatos y lenguajes que puedan ser recibidos y procesados de forma significativa por una computadora. También deben estar sujetos a una licencia 'abierta', es decir, que mínimo permita su uso, modificación, y reproducción universales (sin restricción en cuanto a quiénes o cuántas personas lo pueden ver), y que según sea apropiado, permita también uso comercial, uso sin referencia alguna a los creadores originales, o modificación de la licencia en sí. - -## Porque datos abiertos? - -El principal beneficio que proporciona tener datos abiertos en proyectos locales es la interoperabilidad, o la capacidad de diversos sistemas y organizaciones de trabajar en conjunto, usando los mismos datos sin restricciones o dificultades, inclusive sin siquiera organizarse entre sí. Quizá ya hayas disfrutado de esto, a la hora de consultar o revisar repositorios en Github, por ejemplo. De esta forma, todos pueden aprovechar al máximo los datos de todos, haciendo el trabajo más rápido y eficiente. Por esta misma razón se estima que los datos abiertos pueden aportar mucho a la economía, ya que en temas de finanzas harían mucho mas fácil tomar decisiones y, por ejemplo, estudios de mercado se podrían realizar de manera más sencilla. - -La transparencia es también una de las principales razones por las cuales se exige datos abiertos, sobre todo en el ámbito gubernamental. Las instituciones públicas recogen una gran cantidad de datos al año, que cuentan como 'públicos'. Estos se podrián liberar mediante una política de Estado y así cualquiera podría, en teoría, revisar en función de sus intereses particulares y saber, por ejemplo, en que se gastan los impuestos o mediante cuál proceso se hacen leyes. Ya existen varios ejemplos de esto siendo realizado en un grado mas reducido, en proyectos como el [Where does my money go?](https://app.wheredoesmymoneygo.org/) de Inglaterra, donde se muestra aproximadamente cuanto dínero es gastado en las distintas funciones de gobierno. Con un mayor grado de transparencia se promete que la corrupción se hará más difícil y habrá mayor participación de los ciudadanos en los procesos políticos y administrativos del Estado. - -También en el ámbito de las ciencias es importante considerar cuestiones de transparencia y reproductibilidad. Siendo los datos abiertos prácticamente la única forma en la que pueden replicarse los análisis computacionales, y siendo estos ahora muy comunes en todo tipo de investigaciones, el problema de la disponibilidad de los datos se hace integral para el cumplimiento del criterio de ciencia. - -Sín duda los datos abiertos representan uno de los movimientos y tendencias mas interesantes e importantes dentro de la comunidad científica. Es imperativo para el progreso de la ciencia cambiar el paradigma de los lineamientos generales en cuanto a la publicación de la investigación y los hallazgos se refiere. Mas aún en una era donde la casi instantanea y amplia distribución de todo tipo de información posibilita la creación de redes colaborativas mas eficientes y grandes, investigaciones y analísis que no sacrifican reproducibilidad o documentación según se van volviendo mas complejos. Los datos abiertos son el primer paso a el establecimiento de una ciencia abierta, transparente y retroalimenticia, acelerando aún mas el proceso investigativo a la vez que se establecen practicas etícas y mas libertades, tanto para trabajadores en el area como aficionados o interesados. diff --git a/content/blog/que-son-los-laboratorios-sociales-y-como-pueden-ayudar-los-equipos-de-investigacion/index.md b/content/blog/que-son-los-laboratorios-sociales-y-como-pueden-ayudar-los-equipos-de-investigacion/index.md deleted file mode 100644 index a7fba9290..000000000 --- a/content/blog/que-son-los-laboratorios-sociales-y-como-pueden-ayudar-los-equipos-de-investigacion/index.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "¿Qué son los laboratorios sociales y cómo pueden ayudar a los equipos de investigación?" -slug: que-son-los-laboratorios-sociales-y-como-pueden-ayudar-los-equipos-de-investigacion -date: 2020-02-07 -author: Rainer Palm -tags: [laboratorios sociales, comunidad, ciencia ciudadana] -categories: [ciencia abierta] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Recientemente se ha vuelto popular la creación de espacios tales como MediaLabs y otras formas de laboratorios sociales. Estas organizaciones de innovación sugieren el uso del modelo abierto del laboratorio, donde se hacen disponibles tanto utensilios como instrumentos (ya sean de trabajo o de medición), como un entorno en el cual se puede experimentar con este material, y donde se ponen en contacto personas que, quizás, nunca hayan estado relacionadas con el mundo académico o emprendedor de ninguna forma, permitiéndoles *cocrear* investigaciones y productos de forma independiente. - - - -La experiencia que ofrecen estos lugares es tan , que muchos espacios variados (principalmente museos de ciencia y de tecnología) han empezado a ofrecer este mismo servicio, con un enfoque especializado en la realización de ciencia con metodologías experimentales. Ya sea como parte de un plan educativo o simplemente como un negocio prestado a individuos interesados, estos laboratorios sociales trasladan las ideas de la cultura DIY a la esfera de la ciencia ciudadana, otorgando los medios para que las personas aprendan a hacer ciencia con su practica, enseñandoles a solucionar problemas concretos de su comunidad con investigaciones empíricas. De esta forma, ayudan a distribuir el conocimiento científico de una forma mas didáctica y inmediatamente útil, muy distinta a como es comunmente recibido en escuelas y libros. - -Estos sitios no solamente ofrecen un lugar donde trabajar, sino también una comunidad que reune una gran variedad de actores: organizaciones sin fines de lucro, gobiernos, empresas sociales, y por supuesto, principalmente, ciudadanos comunes. La confluencia de estos entes se debe a que el laboratorio social es un lugar primariamente diseñado para la creación y experimentación de nuevas ideas, un lugar donde cualquiera puede probar, proponer, inventar, y encontrar nuevas ideas o hipótesis. Esto obliga a los laboratorios sociales ser espacios que sobrevivan al constante cambio, a la reconfiguración de sus herramientas según las necesidades de los usuarios, ser espacios flexibles y abiertos donde se pueden encontrar soluciones rapidas y conclusiones certeras sín importar el reto al cual se este afrontando. - -A pesar de su novedad, es un modelo que promete, mezclando aspectos de resolución de conflictos, estudios innovativos, aprendizaje didáctico e organización espontanea en un mix que podría tener un impacto bastante significativo en los modos de trabajo en donde se desenvuelven tanto ciudadanos como emprendedores y científicos. Por supuesto, hay un número de problemas con la manera en la que existen actualmente, como el riesgo de que sus usuarios se vuelvan parte del precariado, volviendo estos espacios un lugar de trabajo extraoficial, fuera del alcance de normativas laborales y derechos que les otorgaria un empleo regular. - -## ¿Que laboratorios sociales existen actualmente? - -La institución que inmediatamente viene a la mente cuando pensamos en modelos experimentales de laboratorio es el MIT Media Lab, una comunidad de investigación que activamente promueve "una cultura unica y antidisciplinaria que fomenta la mezcla no convencional de areas de estudio supuestamente dispares"\[1\]. Apoyado por una multitud de organizaciones en industrias y negocios variados, su principal misión es, mediante este arreglo en el que estudiantes de distintas esferas de la ciencia trabajan juntos, crear "tecnologías disruptivas que ocurren en las franjas, liderando areas como computación vestible, interfaces tangibles ... desde enfoques digitales al tratamiento de enfermedades neurologicas, hasta tecnologías avanzadas de imagen que pueden 'ver alrededor de una esquina'.". - -Dentro de esta comunidad, existe una multitud de programas conjuntos en los que sus integrantes trabajan con colaboradores del MIT. Cualquiera que desee ver los resultados de esta bomba de experimentación y distintas perspectivas solamente necesita ir a su canal de YouTube\[2\], donde estan alojados tanto conferencias y charlas como presentaciones cortas (menos de 5 minutos) de proyectos particulares, hechos por los investigadores. Es facil apreciar como su uso de tecnícas y herramientas desarrolladas en el sitio llevan a resultados un tanto interesantes y prometedores, como impresoras 3D que integran procesos biologícos en la fabricación de objetos\[3\]. Sín duda un modelo interesante a pesar de su obvia restricción en cuanto al personal que trabaja ahí. - -A pesar de que esta organización en particular solamente abarca la comunidad particular de los estudiantes del MIT, existén otros proyectos con un grado de accesibilidad mucho mayor, tal como el Medialab Prado\[4\] de Madríd, España. Este proyecto se trata de un laboratorio verdaderamente ciudadano, en el que cualquiera puede realizar propuestas y trabajar junto a otras personas en los proyectos que deseen. Su visión es de un laboratorio que sustente comunidades de aprendizaje y de práctica conformadas por personas de todo tipo de trasfondos, experimentando con metodologías y modos de trabajo en el proceso, transformandolos conforme se desarollan proyectos 'culturalmente libres'. - -Para este proposito, se hace un espacio completamente abierto al público, donde se acogen numerosos grupos de trabajo involucrados en el prototipado de una múltitud de proyectos. Mediante una plataforma online y numerosas fases de producción y debate, se genera "un contexto de intercambio de conocimientos y habilidades en torno a un problema colectivo"\[5\], y para solucionar estos problemas, se promueve la utilización de herramientas libres y código abierto. Periodícamente Medialab Prado publica información acerca de proyectos para los cuales se requieren propuestas, y despues en los talleres en que se desarollen estas propuestas se puede tanto ser promotor del proyecto como trabajar directamente como un colaborador. Aparte de ser un espacio donde pueden colaborar las personas, también se suelen alojar conferencias y actividades relacionadas dentro de el. - -Alrededor del mundo existen un multitud de similares espacios cuyo objetivo es integrar al ciudadano común en el proceso científico, plantenadose como una especie de transformacion tanto de la forma en la que se distribuye el conocimiento y se capacitan las personas, como del proceso de innovación y colaboración, con un enfoque social. Iniciativas tales como el SociaLab, que comenzó en Colombia\[6\], la Honey Bee Network\[7\], o el Climate CoLab\[8\] permiten a cualquier persona que disponga de tan solo un poco de curiosidad y algo de tiempo trabajar en proyectos científicos a gran escala, en cuestiones de traducción, diseño, mentoría, y por supuesto, analísis, investigación, y experimentación. - -\[1\]: "The MIT Media Lab at a Glance" -\[2\]: "MIT Media Lab" -\[3\]: "3D printing with living organisms" -\[4\]: "Medialab Prado" -\[5\]: "Medialab Prado - Qué es" diff --git a/content/blog/r-nube-de-palabras/index.md b/content/blog/r-nube-de-palabras/index.md deleted file mode 100644 index ecf619d7d..000000000 --- a/content/blog/r-nube-de-palabras/index.md +++ /dev/null @@ -1,185 +0,0 @@ ---- -title: "Crea una nube de palabras en R a partir de un documento de texto" -slug: r-nube-de-palabras -date: 2022-03-01 -author: Ever Vino -tags: [nube de palabras, tm] -categories: [ciencia abierta, código abierto, R, ciencia de datos, minería de datos] -aliases: ["/blog/0061-r-nube-palabras/crea-una-nube-de-palabras-en-r-partir-de-un-documento-de-texto/"] -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - -# Crea tu nube de palabras en R a partir de un documento de texto - - - -Una nube de palabras o wordcloud nos sirve para visualizar la frecuencia de palabras dentro de un texto. -En este tutorial, usaremos el artículo de [inteligencia artificial](https://es.wikipedia.org/wiki/Inteligencia_artificial) de Wikipedia para construir nuestra nube de palabras usando las bibliotecas `tm` y `wordcloud`. - - - -## Instalación de pre-requisitos -Para un mejor manejo de los paquetes, aquí vamos a utilizar la biblioteca `pacman`, esta nos permitirá hacer una instalación y activación de las bibliotecas de manera rápida. Recuerde instalar **Rtools** y la versión más reciente de **R** si está usando **Windows**. - - -```R -# install.packages("pacman") # Si no tiene instalada la Biblioteca Pacman ejecutar esta línea de código -library("pacman") -``` - -Bibliotecas adicionales requeridas, instaladas y abiertas con `pacman`. - - -```R -p_load("tm") # Biblioteca para realizar el preprocesado del texto, -p_load("tidyverse") # Biblioteca con funciones para manipular datos. -p_load("wordcloud") # Biblioteca para graficar nuestra nube de palabras. -p_load("RColorBrewer") # Biblioteca para seleccionar una paleta de colores de nuestra nube de palabras. -``` - -## Importación del texto - -Para este ejemplo, descargamos nuestro artículo de formato texto de un repositorio, guardamos la dirección web en `articulo_IA` y lo descargamos usando la función `read_file()`. También puede usar los directorios locales para importar un texto de su preferencia. Si desea descargar el archivo que usamos en este ejemplo puede hacer hacerlo ejecutando `download.file("https://gist.github.com/EverVino/7bdbbe7ebdff5987970036f52f0e384f/raw/3a1997b6f9e3471555a941f8812ada0cef84977d/gistfile1.txt", paste(getwd(),"/texto.txt", sep=""))` en la línea de comando de R, esto descargará el archivo y lo guardara en la carpeta de trabajo de R con el nombre de **texto.txt**. - -_Para saber la carpeta de trabajo puede ejecutar `getwd()`. puede cambiar la carpeta de trabajo con la función `setwd("/nuevo_directorio_trabajo/")`._ - -Luego de importar el texto, vamos a convertirlo en un objeto tipo `Source`, esto facilitará la minería del texto y su posterior modificación. - - -```R -articulo_IA <- "https://gist.github.com/EverVino/7bdbbe7ebdff5987970036f52f0e384f/raw/3a1997b6f9e3471555a941f8812ada0cef84977d/gistfile1.txt" -texto <- read_file(articulo_IA) -``` - -* `read_file(dir)`: Función de la biblioteca `tidyverse` que nos permite importar archivos de texto. El resultado de la función es un vector de un sólo elemento. `dir` es la **direción local** o **url** con el nombre del archivo de formato **txt** a importar. - - -```R -texto <- VCorpus(VectorSource(texto), - readerControl = list(reader = readPlain, language = "es")) -``` - -* `VCorpus (x, readerControl(y))`: Donde `x` es un objeto del tipo `Source`, se recomienda que sea un objeto del tipo `VectorSource`. Para `readerControl(y)` `y` es una lista de parámetros para leer `x`. - -* `VectorSource(vector)`: Convierte una lista o vector a un objeto tipo VectorSource. - -## Preprocesado de texto -Una vez importado el texto, tenemos que eliminar la palabras que actúan como conectores, separadores de palabras , de oraciones, y números que no aportarán al análisis del texto, para ello usamos la función `tm_map()` que nos permite aplicar funciones al texto del `Corpus`. - - -```R -texto <- tm_map(texto, tolower) -texto <- texto %>% - tm_map(removePunctuation) %>% - tm_map(removeNumbers) %>% - tm_map(removeWords, stopwords("spanish")) -texto <- tm_map(texto, removeWords, c("puede", "ser", "pues", "si", "aún", "cómo")) -texto <- tm_map(texto, stripWhitespace) -``` - -* `tm_map(text, funcion_de_transformacion, parametros_de_funcion)`: Transforma el contenido de texto de un objeto `Corpus` o `VCorpus`, aplicando las funciones de transformación de texto. - -* `tolower`: Función de transformación de texto, usado para convertir todas la mayúsculas a minúsculas. - -* `removeNumber`: Función para eliminar los números del texto. - -+ `removeWord`: Función para remover palabras, - -* `stopword("lang")`: Lista de palabras conectoras en el lenguaje lang, es argumento de la función `removeWord`. - -* `stripWhitespace`: Función para remover los espacios blancos de un texto. - -Nótese que usamos ambas notaciones para transformar el texto del `Corpus`, la notación normal `tm_map(x, FUN)` y también la notación de la biblioteca de `tydiverse` `pipeoperator` `>%>`, que toma como argumento inicial el resultado de la anterior función. - -_Si quiere observar los cambios del texto puede ejecutar en la consola `writeLines(as.character(texto[[1]]))`, esto imprimirá el resultado en la consola._ - -## Construyendo la tabla de frecuencia - - -```R -texto <- tm_map(texto, PlainTextDocument) -``` - -* `PlainTextDocument`: Convierte texto a un objeto tipo PlainTextDocument. Para el ejemplo, convierte un `VCorpus` a `PlainTextDocument` el cuál contiene metadatos y nombres de las filas, haciendo factible la conversión a un matriz. - - -```R -tabla_frecuencia <- DocumentTermMatrix(texto) -``` - -* `DocumentTermMatrix(texto)`: Convierte texto a un objeto tipo term-document matrix. Es un objeto que va a contener la frecuencia de palabras. - - -```R -tabla_frecuencia <- cbind(palabras = tabla_frecuencia$dimnames$Terms, - frecuencia = tabla_frecuencia$v) -``` - -Extraemos los datos que nos interesan del objeto `tabla_frecuencia` y los juntamos con `cbind()`. - -_Ejecutando en la consola `View(tabla_frecuencia)` notamos que es un objeto, para acceder a sus valores usamos el símbolo `$` dicho de otra manera: para acceder a las `palabras` usamos `tabla_frecuencia$dimnames$Terms` y para su correspondientes frecuencia en el texto `tabla_frecuencia$v`._ - - -```R -# Convertimos los valores enlazados con cbind a un objeto dataframe. -tabla_frecuencia<-as.data.frame(tabla_frecuencia) -# Forzamos a que la columna de frecuencia contenga valores numéricos. -tabla_frecuencia$frecuencia<-as.numeric(tabla_frecuencia$frecuencia) -# Ordenamos muestra tabla de frecuencias de acuerdo a sus valores numéricos. -tabla_frecuencia<-tabla_frecuencia[order(tabla_frecuencia$frecuencia, decreasing=TRUE),] -``` - -_Con estos últimos ajustes ya tenemos nuestra tabla de frecuencias para graficarla._ -_Puede verificar los resultados ejecutando en la consola `head(tabla_frecuencia)`_ - -## Graficando nuestra nube de palabras -Una vez obtenida nuestra tabla de frecuencia sólo es necesario aplicar la función `wordcloud()`. - - -```R -wordcloud(words = tabla_frecuencia$palabras, - freq = tabla_frecuencia$frecuencia, - min.freq = 5, - max.words = 100, - random.order = FALSE, - colors = brewer.pal(8,"Paired")) -``` - - - -![png](output_23_0.png) - - - -* `wordcloud(word, freq, min.freq, max.words, random.order, color)`: Función para graficar la frecuencia de palabras, el tamaño de la palabra graficada será proporcional a la frecuencia de la misma. Esta función grafica las palabras en `word` con sus respectivas frecuencias `freq`, sólo usará las palabras que como mínimo tenga una frecuencia mínima `min.freq`, la cantidad de palabras en graficadas es igual a `maxwords`, las posiciones podrán ser aleatorias o no, dependiendo del valor de `random.order`, los colores estan dados en forma de lista en `colors`. -* `brewer.pal(n, "paleta")`: Devuelve `n` valores de la `paleta`. Para la función `brewer.pal()` puede usar las paletas `"Dark2"`, `"Set1"`, `"Blues"` entre otros. - -_Cada vez que ejecute la función le mostrará diferentes resultados, para evitarlo si así se desea, puede fijar un estado inicial para generar números aleatorios que utiliza la función wordcloud. Use: `set.seed(1234)` para este propósito (puede alterar el valor del argumento numeral para diferentes resultados)._ - -## Guardando nuestra nube de palabras -Usamos la función `png()` para guardar la gráfica que se genera usando wordcloud. También puede usar otras funciones como `jpeg`, `svg` y otros. -Nótese que usamos la función `png()` y `dev.off()` antes y despues de la función generadora de la grafica `wordcloud()` -```r -png("nube.png", width = 800,height = 800, res = 100) - wordcloud(...) -dev.off() -``` - -* `png("nombre.png", with, height, res) ... dev.off()`: Guarda el gráfico generado en formato `png`, dentro del directorio actual de trabajo. Lo guarda con el nombre `"nombre.png"` con el ancho y alto en pixeles de `with` y `height` respectivamente; y con la resolución `res` en ppi. Con `dev.off()` concluimos la obtención de datos de `png()`. - -_Otra biblioteca muy utilizada para generar una nube de palabras es `wordcloud2`, esta posee muchos más parámetros para modificar la apariencia de la nube, pero teniendo en cuenta que R está optimizado para realizar tratamiento de datos y no tanto para dibujar palabras, es recomendable usar otras opciones online o programas de diseño gráfico, si queremos mejores resultados. Y usar R para la obtención de la tabla de frecuencia de las palabras._ -_Nota: Existen palabras que pueden derivar de una misma palabra y expresan el mismo significado, como ser nube, nubes, nubarrón, que estan diferenciadas aquí en este ejemplo, estos requieren la aplicación adicional de una función que contemple estas variaciones linguisticas, lamentablemente a la fecha no hay una función equivalente para el español para R. Sin embargo si realiza el análisis de palabras en inglés puede usar `tm_map(Corpus_en_ingles, stemDocument, language="english")`._ - -Finalmente antes de concluir cerramos las bibliotecas abiertas con `pacman`. La ventaja de hacer esto se ve cuando manejamos diferentes bibliotecas que tienen funciones con el mismo nombre, al cerrar las bibliotecas con conflictos, nos evitamos de especificar en el código a que biblioteca de R nos referimos. - - -```R -p_unload(all) -``` - -## Referencias -- [Wikipedia-Inteligencia Artificial](https://es.wikipedia.org/wiki/Inteligencia_artificial) -- [Documentacion de R](https://www.rdocumentation.org) diff --git a/content/blog/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/index.md b/content/blog/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/index.md deleted file mode 100644 index 9c4032f98..000000000 --- a/content/blog/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/index.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: "10 razones para usar Python en tu proximo proyecto de investigación" -slug: razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion -date: 2020-01-22 -author: Rainer Palm -tags: [bibliotecas, herramientas, código] -categories: [ciencia abierta, investigación abierta, ciencia de datos, Python] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -¿Estás interesado en integrar un poco de programación en tu rutina cotidiana?, ¿Necesitas aprovechar de la versatilidad y eficiencia que te otorga manejar con fluidez codigo?, ¿O simplemente quieres aprovechar de la utilidad de poder realizar análisis computacional?. Sea cual sea la razón, te podrías estar preguntando por donde empezar. Habiendo tantos lenguajes de programación disponibles, con una cantidad prácticamente infinita de usos, puede serte difícil decidir con cuál empezar a aprender o cuál aportará más a tu trabajo. - - - -Probablemente hayas escuchado de [Python](http://python.org) en algún momento, debido a que es un lenguaje con mucha difusión, que goza de una gran comunidad y patrocinio de grandes compañías (principalmente [Facebook](http://facebook.com), [Google](http://google.com), [Amazon](http://amazon.com) y [Capital One](https://www.capitalone.com/)). Se trata de un lenguaje interpretativo (no requiere ser compilado) y de alto nivel, lo cual lo hace perfecto para principiantes y cualquier tipo de persona que quiera entrar en el mundo de la programación. Si aún no te hemos convencido, aqui te damos mas excusas para aprender a usar Python en tu próóximo proyecto de investigación! - -## Lenguaje estándar para ciencia reproducible - -No importa cual sea la rama en la que te desenvuelvas, Python es una de las principales herramientas en la creación de investigaciones reproducible. Siendo un lenguaje que se presta muy bien a la creación de 'scripts' pequeños y modulares, ademas de ser bastante ligero y poseer su propio manejador de paquetes (pip), hace que la creación de un entorno virtual para investigación colaborativa y reproducible sea sencilla e indolora. Dejar disponible cóódigo libre usado en tu investigación hará mucho para garantizar su reproducibilidad, sobre todo si utilizas un programa de control de versiones como git, y esto no es algo que puedas hacer usando programas pre-compilados de código cerrado. - -##Gran cantidad de recursos y apoyo disponibles - -Siendo Python un lenguaje que cuenta con una gran comunidad internacional, hay un sinfín de libros y guías dispuestas a ayudarte en tu ruta de aprendizaje, en todo tipo de plataformas. Si tienes algún problema o duda, es cuestión de buscar o preguntar por algun sitio de consulta (como [StackOverflow](http://stackoverflow.com)), y si lo que quieres es aprender a escribir código, hay un sinfín de posibilidades a tu alcance, desde cursos directos en sitios como [Codeacademy](https://www.codecademy.com/), hasta libros como [Python Crash Course](http://www.nostarch.com/pythoncrashcourse/) o [Learn Python 3 the Hard Way](https://learnpythonthehardway.org/python3/). Además, su uso común en ambientes académicos hace sencillo encontrar con quien colaborar. - -## Librerías dedicadas a análisis científico - -Hay una multitud de librerías de Python que reciben mantenimiento y apoyo regular por parte de desarrolladores y usuarios, y que son utilizadas muy comúnmente en ámbitos no solo de estadística o ciencia de datos, sino también en experimentos, dependiendo de la circunstancias. Librerías como [matplotlib](https://matplotlib.org/), [Pandas](https://pandas.pydata.org/), [SciKit learn](https://scikit-learn.org) son usadas regularmente en una variedad de análisis, ya que proporcionan herramientas para manipulación y interpretación de datos de alto nivel en una gran cantidad de formatos, cuyos resultados pueden ser luego fácilmente mostrados de una forma visual e intuitiva sin sacrificar reproducibilidad. - -## Interpretado y sencillo de aprender - -Ya que Python es un lenguaje de alto nivel (más parecido a nuestros 'lenguajes naturales', abstrayendo mucha de la lógica interna de la computadora), está diseñado específicamente para que el código escrito en este sea fácil de leer y entender, con uso significativo de espacios en blanco y constructos del lenguaje; se hace mucho mas intuitivo para aquellos que no esten acostumbrados a leer y escribir código. Además, que sea interpretado significa que no te tienes que preocupar por compiladores y demás tecnicismos. - -## Automatización de tareas manuales y tediosas - -Sin escribir mucho código, Python permite que muchas tareas de manejo e interpretación de datos o archivos (tales como comparación de dos tablas de datos, conversión de tipos de archivos, etcetera) se puedan automatizar de una forma rápida y sencilla. Sin mencionar que hay una cantidad enorme de apoyo para todo tipo de formatos de imágenes, películas, música, texto, etcetera. De hecho, este es el foco del libro [Automate the Boring Stuff with Python](https://automatetheboringstuff.com/) un libro de acceso abierto para la lectura desde su sitio web. - -## Creación de tu propio entorno de trabajo - -Con la continua creación de scripts y uso de librerías adaptadas a tu flujo y area de trabajo, eventualmente puedes automatizar y hacer mas eficiente gran parte de tu investigación, teniendo un conjunto de herramientas de código abierto y acceso libre a tu disposición, para que las puedas modificar y mejorar como desees. Si aprendes a integrar elementos de interfaz gráfica (GUI) en tu código, te sera aún mas fácil integrar de forma fluida scripts de Python en tus proyectos de investigación colaborativa, haciéndolos accesibles y sencillos de usar. - -## Visualización y demostración de análisis - -Existen una gran cantidad de opciones en relación a librerías de Python usadas muy comúnmente en escritura de artículos de análisis computacional. Ya sea el anteriormente mencionado Matplotlib, librerías que enlazan R a Python, o 'cuadernos' como los de Jupyter. Existe una variedad de herramientas que permiten a cualquiera no solamente ver gráficos sino también fácilmente entender como fueron generados y experimentar con las variables y modelos usados. - -## Multiplataforma y soporte en varias IDEs - -Python, al ser un lenguaje abierto, es inherentemente multiplataforma. Pero lo mas importante es la gran cantidad de entornos de desarrollo integrado (IDEs, por sus siglas en inglés) que soportan nativamente, sin necesidad de plugins, la sintaxis de Python, haciendo posible el uso de completación de código y el aprovechamiento de otras capacidades de la IDE que estés utilizando (como integración con git, programación visual y otras añadidas mediante plugins). - -## Scripting con librerías de multiples lenguajes de programación - -Debido a la facilidad y rapidez de escribir muchos scripts pequeños en Python, se han creado distintas utilidades que se apoyan a su vez en código anteriormente escrito con otros lenguajes (tales como C++) para interactuar con controladores de hardware, leer archivos con datos crudos, ejecutar operaciones que son mas eficientes a bajo nivel, etc. En pocas palabras, puedes usar a Python como si fuese una especie de "gestor" de una multitud de programas ya hechos, dándote aún mas flexibilidad sin complicar demasiado las cosas. - -## Computación interactiva - -Python posee un terminal interactivo que te permite ejecutar y evaluar comandos de una forma directa, y 'recordar' comandos previamente utilizados al instante, además de importar librerías sin necesidad de correr archivos con código previamente escrito (en formato .py), definir variables, correr y grabar funciones, etcetera. Ciertas herramientas, como Jupyter, permiten integrar la shell dentro de una interfaz web, lo cual facilita a cualquiera a cualquier usuario interactuar con tus modelos y funciones libremente. diff --git a/content/blog/si-pensado-en-como-automatizar-la-construccion-de-citas-en-tu-proyecto-te-contamos-como-hacerlo-posible/index.md b/content/blog/si-pensado-en-como-automatizar-la-construccion-de-citas-en-tu-proyecto-te-contamos-como-hacerlo-posible/index.md deleted file mode 100644 index bb6e33746..000000000 --- a/content/blog/si-pensado-en-como-automatizar-la-construccion-de-citas-en-tu-proyecto-te-contamos-como-hacerlo-posible/index.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "Si has pensado en cómo automatizar la construcción de citas en tu proyecto, te contamos cómo hacerlo posible." -slug: si-pensado-en-como-automatizar-la-construccion-de-citas-en-tu-proyecto-te-contamos-como-hacerlo-posible -date: 2020-05-16 -author: Rainer Palm -tags: [proyectos, citas, referencias, zotero, metadatos] -categories: [ciencia abierta] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -En el proceso de escritura de un artículo científico, o documentación de un proyecto, siempre se busca optimizar el uso del tiempo dedicado a la transcripción y elaboración de los documentos y presentaciones del trabajo, así como en tareas como la elaboración de citas y referencias para artículos entre otros. Aunque el uso de herramientas de procesamiento de texto facilita bastante la tarea de compartir y escribir el trabajo, aun así se suele tener que configurar manualmente cosas tales como indices, código insertado dentro del texto, formulas matemáticas… y citas. Esto se complica un poco más pues, dependiendo de la forma en la que estés publicando tu artículo, todas estas tareas pueden tener formatos muy distintos. - - - -En el caso de las citas y referencias, existe una variedad nada despreciable de estándares dependiendo, entre otras cosas de si se deben colocar al final de la página, al final del documento o después del texto citado y, además, en que formato escogido para presentarlas, en que orden se deben introducir cada uno de sus elementos, entre otros. Esto se puede tornar bastante tedioso, en especial si tienes un gran numero de citas y referencias que colocar, si provienen de una variedad de formatos y lugares diferentes, si la información es incompleta, por ejemplo en año o nombres completos de autores, si cuentan o no con metadatos adecuados, entre otros. Simplemente esta tarea de buscar, ordenar y insertar estos datos puede tomar bastante tiempo si no se utilizan las herramientas o programas adecuados. - -¿Nunca te has preguntado si podrías simplemente añadir las citas en cuanto las ves en un sitio o en un documento? O, simplemente, ¿si podrías automatizar la búsqueda de metadatos por Internet de alguna forma, saltando de largo todo este tedioso procedimiento? A pesar de que existen varias alternativas, una de las aplicaciones más llamativas en cuanto a la organización de fuentes de investigación se refiere, es Zotero. Esta aplicación es un completo manejador de referencias que se conecta directamente con tu navegador, mediante una extensión, para descargar archivos y organizarlos de forma automática y directa, al tiempo que se integra también con tu editor de texto preferido. Zotero además permite organizar citas, referencias, fuentes y archivos, pues tiene la capacidad de guardar información extraída desde sitios web, capturando tanto el origen de los datos como su año, autor, DOI, entre otros. - -## ¿Como funciona Zotero? - -Zotero es una aplicación disponible tanto para teléfono como para tu ordenador, que se conecta a tu navegador mediante una extensión disponible para instalar desde su página web. Sin importar cuál navegador utilices (ya sea, Firefox, Chrome, o Safari), o mediante un marcador (Zotero Bookmarklet) que guarda elementos en Zotero en cuanto lo cargas. Actúa como un organizador y manejador de archivos y otros elementos como libros, artículos, reportes, manuscritos, sonidos guardados, casos, entre otros, y está principalmente orientado a guardar y citar referencias bibliográficas. Por ello, presta especial atención al almacenamiento de metadatos referentes a éstos, permitiendo su clasificación en conjuntos que llama «colecciones», para organizarlos según tema, proyecto o cualquier otro criterio que establezcas, permitiéndote etiquetarlos, añadir notas o sub-ítems, entre otros. - -La conexión de Zotero al navegador, te permite añadir cualquier archivo que estés visualizando directamente a tu colección. Al hacer click en la extensión de Zotero, te permitirá guardar el sitio web, archivo o documento que estés viendo en el momento. Si se trata de una imagen, sonido o video, el botón derecho del ratón te permitirá integrarlo inmediatamente en tu colección de Zotero como un elemento. Además, existen traductores diseñados para extraer los metadatos de sitios web particulares, en especial aquellos de uso popular y aquellos relacionados con la investigación científica, incluyendo catálogos de librerías, bases de datos, sitios de noticias y catálogos de tiendas, entre otros. - -## ¿Como se utiliza Zotero? - -Zotero requiere ser instalado en tu ordenador antes de poder ser utilizado. Es software multiplataforma y de código abierto, así que funcionará en tu sistema operativo sin problema alguno. Después de esto, ya está listo para usar. Si deseas integrarlo a tu navegador, necesitarás instalar la extensión adecuada, para disfrutar de las funcionalidades adicionales. La interfaz funciona como un organizador de archivos cualquiera, con un árbol de carpetas a tu izquierda (las colecciones), los ítems dentro de estas colecciones a tu izquierda, y los metadatos de estos ítems a tu derecha. - -Añadir nuevos ítems es muy sencillo: simplemente se crea una nueva colección, con el botón derecho del ratón en la sección de la derecha, y en esta colección puedes añadir ítems de distintos tipo mediante un botón ubicado en la zona central de la barra superior. Al seleccionar ítems dentro de la colección, puedes empezar a llenar metadatos en la sección derecha. Cuando agregas archivos de tipo .pdf a Zotero, este intentará automáticamente buscar los metadatos correspondientes mediante Internet, y si añades artículos a Zotero mediante la varita mágica (con su identificador DOI, ISBN o similar), este automáticamente lo clasificará y buscará título, autores, año de publicación y demás datos e información relevantes sobre el documento. - -Utilizar Zotero es una cuestión muy sencilla, no requiere de practica y cualquier duda que tengas respecto a las particularidades de su funcionamiento se pueden resolver mediante una busqueda en el manual de éste. Sin duda se trata de una herramienta muy útil que te ayudara a acelerar tu trabajo de muchas maneras, ya sea simplemente para organizar tu material de estudio o para hacer citaciones en tus artículos mediante complementos que conecten con Zotero para tu procesador de texto favorito. diff --git a/content/blog/si-ya-usas-codigo-abierto-te-contamos-como-puedes-sacarle-mayor-provecho-tu-documentacion-para-tus-articulos-y-publicaciones/index.md b/content/blog/si-ya-usas-codigo-abierto-te-contamos-como-puedes-sacarle-mayor-provecho-tu-documentacion-para-tus-articulos-y-publicaciones/index.md deleted file mode 100644 index 9c65033bf..000000000 --- a/content/blog/si-ya-usas-codigo-abierto-te-contamos-como-puedes-sacarle-mayor-provecho-tu-documentacion-para-tus-articulos-y-publicaciones/index.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: "Si ya usas código abierto, te contamos cómo puedes sacarle mayor provecho a tu documentación (para tus artículos y publicaciones)" -slug: si-ya-usas-codigo-abierto-te-contamos-como-puedes-sacarle-mayor-provecho-tu-documentacion-para-tus-articulos-y-publicaciones -date: 2020-02-17 -author: Rainer Palm -tags: [documentación, código, proyectos, artículos] -categories: [ciencia abierta, código abierto, desarrollo de software] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Con mucha frecuencia, los proyectos de código abierto suelen prestar poca atención al tema de documentación. De hecho, es tan común que la encuesta [Open Source Survey](https://opensourcesurvey.org/2017/) (realizada por Github, involucrando tanto académicos, como a trabajadores en la industria de computación, como colaboradores independientes) reportó que al menos 93% de los encuestados, creían que la documentación incompleta o sin actualizar era uno de los problemas más agravantes dentro de la esfera del software libre. En la misma encuesta, 60% de los participantes admitían también contribuir a la documentación de sus proyectos con muy poca frecuencia. - - - -Independientemente del tipo de proyecto en el que participes o de su objetivo, la documentación es un factor muy importante a la hora de crear proyectos accesibles e inclusivos, en el sentido que facilita en gran medida tanto su utilización como la colaboración entre personas que no estén activamente involucradas en su desarrollo. Establecer de forma clara términos de uso del código, manuales o guías permite a tus usuarios ser autosuficientes y dar sugerencias mucho más útiles y profundas, además de que puede ser el factor clave para que alguien se vuelva un colaborador o que termine ignorando tu proyecto. Tal como dice [Write The Docs | Why Write Docs?](http://www.writethedocs.org/guide/writing/beginners-guide-to-docs/#why-write-docs): - -- Si la gente no sabe que tu proyecto existe, no lo usarán. -- Si la gente no sabe como instalar tu código, no lo usarán. -- Si la gente no puede entender como usar tu código, no lo usarán. - -Fuera de cuestiones de colaboración o facilidad de lectura, es obvio también que el código se hace progresivamente más difícil de entender y recordar conforme el proyecto avanza y se hace más extenso, por lo que la documentación se vuelve una herramienta de supervivencia, especialmente si no pretendes trabajar en el código con frecuencia. Algo que puede ocurrirte con más frecuencia de la que esperas, es estar en la situación donde quieres continuar un proyecto de hace meses, pero no entiendes absolutamente nada de lo que hace el código. - -Por estas razones (¡y muchas otras!) la documentación de tu trabajo es imperativa. Sin embargo, es común que durante el proceso de documentación, utilicemos destrezas que no suelen aprenderse en trabajos relacionados con software, por lo que los lineamientos que se deben seguir para llevar a cabo una buena documentación pueden no estar muy claros. Entonces, ¿qué es lo que hace una buena documentación de código abierto? - -## Accesibilidad - -A la hora de escribir tu documentación, tienes que tener en cuenta que la van a leer tanto usuarios como desarrolladores, y que por lo general van a querer acceder a la información de la forma más rápida y completa posible. El uso de hipervínculos y tablas de contenidos ayuda bastante, permitiéndote reutilizar otras documentaciones abiertas, a la vez que puedes mantener la información ordenada y concisa, ayudando a los usuarios encontrar los términos o datos que necesitan de la forma más rápida y sencilla posible. Por esta razón, también es recomendado poner ciertos datos que van a buscar la mayoría de los interesados en un primer momento, tales como: la licencia que utilices, la meta del proyecto, ejemplos de uso, lista de tareas por realizar, etc. - -## Comunicación con tus usuarios - -Puede sonar obvio, pero la documentación, al final del día, está pensada para que la lean tus usuarios. Si está dentro de la posibilidad, es bastante beneficioso agregar canales por los cuales puedan consultar y hasta contribuir otros desarrolladores: pull requests, tus cuentas en redes sociales, acceso al rastreamiento de problemas, FAQs, entre otros. Para este fin puedes usar ciertas convenciones como el archivo CONTRIBUTING.md, el cual especifica normas de conducta, como se prefiere que se comuniquen los usuarios, y las responsabilidades de los administradores del repositorio. - -También podemos añadir que contribuir a la documentación de cualquier repositorio es una forma fácil y relativamente sencilla de apoyar un proyecto, sin involucrarse demasiado. Este es uno de los ámbitos donde cualquiera puede aportar perspectivas relevantes, sin importar demasiado su trasfondo o habilidades particulares. - -## Guías concisas y ejemplos sencillos - -Sín importar el tipo de programa que estés desarrollando, facilitará bastante su uso si das algunos ejemplos de cómo se utiliza en un contexto cotidiano, con una guía paso a paso o una pequeña sección en su manual específicamente para principiantes, con algunos comandos y funciones cruciales para el uso más básico de tu código. Te puede resultar útil el empleo de capturas de pantallas, incluir configuración de texto inteligente (con bloques de código, resaltamiento de sintaxis, etcétera), acompañados de párrafos de texto concisos, escritos con lenguaje simple y sin entrar mucho en terminología específica. - -Siempre recomendamos que si necesitas ayuda en cuanto a cómo escribir documentación, ¡solo hace falta revisar lo que ya han escrito otros! Ya sea para aprender ciertos modos de escritura que son comunes dentro de esta práctica, para aprender de los errores que cometen los demás, o simplemente para situarte en el lugar de alguien que esté chequeando tu código por primera vez. Leer lo que han escrito los demás con el enfoque de aprender es una buena estrategia. Prácticamente, todas las distribuciones de Linux incluyen el comando `man` que te permite ver información sobre varios comandos de bash, y muchos repositorios de Github tienen por lo menos un archivo `README.md`, visto en cuanto entras a su página, cuyo objetivo es mostrar el principal propósito y uso del proyecto. Es solo cuestión de revisar un poco para encontrar una enorme variedad de ejemplos. - -## Referencias - -- [Open Source Survey](https://opensourcesurvey.org/2017/) - -- [Write The Docs | Why Write Docs](http://www.writethedocs.org/guide/writing/beginners-guide-to-docs/#why-write-docs) diff --git a/content/blog/te-contamos-sobre-la-comunidad-ropensci/index.md b/content/blog/te-contamos-sobre-la-comunidad-ropensci/index.md deleted file mode 100644 index 7e3f342fa..000000000 --- a/content/blog/te-contamos-sobre-la-comunidad-ropensci/index.md +++ /dev/null @@ -1,192 +0,0 @@ ---- -title: "Te contamos sobre la comunidad rOpenSci" -slug: te-contamos-sobre-la-comunidad-ropensci -date: 2020-08-18 -author: Yurely Camacho -tags: [comunidad, ropensci, paquetes, revisión] -categories: [ciencia abierta, R] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Para compartir, almacenar y divulgar de una manera fácil los datos y -resultados de las investigaciones, los científicos deben contar con -paquetes que lo garanticen. De esta manera, las investigaciones serán -compatibles con formatos estandarizados y se logrará, progresivamente, el -avance de la ciencia bajo el enfoque de ciencia abierta. - - - -Una de las comunidades de promoción y desarrollo de software de código -abierto que proporciona estas ventajas para los investigadores es -[rOpenSci](https://ropensci.org/). A lo largo de este post conoceremos -lo que hace la comunidad, cómo puedes formar parte y estar en armonía -con ella, el proceso de revisión y más. - -## ¿Qué es rOpenSci? - -rOpenSci es una iniciativa sin fines de lucro fundada en 2011 por -[Karthik Ram](https://karthik.io/), [Scott -Chamberlain](https://ropensci.org/author/scott-chamberlain/) y [Carl -Boettiger](https://www.carlboettiger.info/) con la finalidad de -promover, enseñar y hacer crecer las mejores prácticas en el desarrollo, -uso y revisión por pares de software para el lenguaje R. Todo esto con -el objeto de fomentar el uso de la ciencia abierta en las -investigaciones. - -rOpenSci es un proyecto patrocinado fiscalmente por -[NumFOCUS](https://numfocus.org) una organización que apoya y promueve la -computación científica, innovadora y de código abierto. Consulta el siguiente -post de su blog con la presentación del proyecto: [Cómo rOpenSci utiliza Code -Review para promover la ciencia -reproducible](https://numfocus.org/blog/how-ropensci-uses-code-review-to-promote-reproducible-science). - -rOpenSci, gracias a su mecanismo de revisión por pares y el constante -trabajo de los desarrolladores de la comunidad, ha logrado más de 200 -[paquetes disponibles](https://ropensci.org/packages/), alrededor de 500 -contribuyentes de código y más de 500 citas en investigaciones, formando -un imponente sistema de software abierto para el desarrollo y la revisión por pares -(https://ropensci.org/pdfs/2018-08-15_rpharma_ropensci_butland.pdf). -Desde estos enlaces puedes conocer tanto el [equipo principal](https://ropensci.org/about/#team), como el de becarios -de investigación, alumnos y -[colaboradores](https://ropensci.org/about/#collaborators) del proyecto. - -La comunidad de rOpenSci acepta [donaciones](https://ropensci.org/donate/) de -individuos, instituciones y corporaciones que apoyen sus actividades. Si -deseas hacer una donación al proyecto, [accede a este -formulario](https://numfocus.salsalabs.org/donate-to-ropensci/index.html). - -### Acerca de los [Paquetes de rOpenSci](https://ropensci.org/packages/) - -Un paquete rOpenSci es una herramienta de software de R que está siendo -o ha sido examinado cuidadosamente (mediante un proceso de revisión por -pares), y que ha sido aportado por el personal y miembros de la comunidad. - -Con los paquetes de rOpenSci puedes, entre otras cosas, recopilar y acceder a -datos desde varias fuentes y de varios tipos, analizarlos de manera interactiva -y realizar visualizaciones de estos. Además, puedes incluir una narrativa en el proceso que -permita generar un documento para presentaciones finales, en formatos como Word, -Markdown, PDF o LaTeX, que luego puedes compartir. - -#### Explora los tutoriales, videotutoriales y casos de uso de los paquetes - -rOpenSci ofrece una documentación diversa, incluyendo -[tutoriales](https://ropensci.org/tutorials/) y -[videotutoriales](https://vimeo.com/ropensci) que muestran un recorrido -detallado acerca de lo que puedes hacer con sus paquetes. Asimismo, presenta -[casos de Uso](https://ropensci.org/usecases/) con ejemplos de su manejo en -situaciones reales. -### Infórmate brevemente sobre la revisión por pares de software en rOpenSci - -#### ¿Cómo enviar un paquete a rOpenSci?, y ¿cómo es el proceso de revisión? - -La comunidad en general puede enviar un paquete para que sea revisado y, -los revisores de la comunidad deben garantizar el cumplimiento de -ciertos requerimientos internos y un nivel de calidad consistente para -que los paquetes sean aceptados. Para lograrlo llevan a cabo un proceso -de revisión por pares caracterizado por ser transparente, constructivo y -abierto. - -El proceso es un trabajo voluntario donde intervienen: los *editores* -que gestionan el flujo de entrada de los paquetes y garantizan su -progreso; los *autores* que desarrollan, presentan y realizan mejoras en -su paquete; y los *revisores* (dos por presentación de un paquete) que -examinan el código del software y la experiencia del usuario. Dicho -proceso se lleva a cabo en el [repositorio de GitHub de Revisión de -Software](https://github.com/ropensci/software-review/), allí notarás -que se trata de una conversación continua hasta la aceptación del -paquete, donde el autor recibe recomendaciones. - -Si tu colaboración es aceptada, seguirás recibiendo el apoyo de la -comunidad en lo referente a temas de mantenimiento y a las -actualizaciones de R. Sin embargo, conservarás la propiedad y el control -de tu paquete. La comunidad te ofrece promocionarlo en su [página -web](https://ropensci.org/), blog y redes sociales. Cabe destacar, que -si tienes un documento de desarrollo este puede ser enviado, luego de la -revisión, a la Journal of Open-Source Software -[(JOSS)](https://joss.theoj.org/) para su publicación. - -La comunidad cuenta con un [libro guía](https://devguide.ropensci.org/) -que recopila todos los aspectos importantes para el desarrollo, -mantenimiento y revisión de los paquetes de rOpenSci, que incluye una -guía para los editores, autores y revisores, las políticas de la -comunidad, las buenas prácticas para el mantenimiento de los paquetes y -otros tópicos de interés. No puedes dejar de leerlo. - -**Si deseas enviar un paquete, lo primero que debes hacer** es darle un -vistazo a la [Guía para -autores](https://devguide.ropensci.org/authors-guide.html) antes de -abrir un número de envío en el [repositorio de revisión de -software](https://github.com/ropensci/software-review/). - -#### Únete como revisor de paquetes - -Si deseas ser revisor, puedes proponerte a través de [este -formulario](https://ropensci.org/onboarding/) con información de -contacto y áreas de especialización, pero te recomendamos que antes leas la [guía para -revisores](https://devguide.ropensci.org/reviewerguide.html) donde se -detalla el proceso a seguir. - -### Lo que debes hacer para estar en sintonía con la comunidad - -Para unirte y estar al día con la -[comunidad](https://ropensci.org/community/), además de hacerlo enviando -un paquete, siendo editor o revisor, puedes: - -- Seguir el proyecto en sus redes sociales, en Twitter como - [@rOpenSci](https://twitter.com/ropensci) y promoverlo en - las tuyas. - -- Acceder y explorar el [**rOpenSci blog**](https://ropensci.org/blog/) - para conocer los paquetes, aprender a utilizarlos o contribuir a su - mejora, conocer las mejores prácticas en desarrollo y revisión de - software, eventos y otros post de la comunidad. - -- Suscribirte a [**rOpenSci News**](https://news.ropensci.org/) el - *boletín informativo de rOpenSci*, y recibir actualizaciones semestrales - de las actividades de la comunidad en tu correo. - -- Asistir a las llamadas de la comunidad [**rOpenSci community - calls**](https://ropensci.org/commcalls/). Son llamadas trimestrales - para aprender más sobre los desarrollos de rOpenSci y nuevos - proyectos. Son gratuitas y abiertas, las llamadas anteriores se - encuentran grabadas y disponibles en línea. Si tienes alguna idea para - un tema de la llamada comunitaria puedes plasmarlo en el [depósito - público de ideas](https://github.com/ropensci-org/community-calls). - -- Plantear y responder preguntas en el [**foro de - discusión**](https://discuss.ropensci.org/), en - [**Stackoverflow**](https://stackoverflow.com/questions/tagged/ropensci) con la etiqueta #ropensci - o en Twitter. - -- Conocer los eventos próximos en la página oficial - (https://ropensci.org/events/). - -- Visitar [otros recursos](https://ropensci.org/resources/) que te - ofrece rOpenSci como charlas y publicaciones sobre la comunidad, la - ciencia abierta y la revisión por pares de software de código abierto, - de las cuales puedes descargar las presentaciones o ver en línea. - -La comunidad rOpenSci está abierta a tu participación y a la de -cualquier persona. Si usas el lenguaje R, unirte a ella es una buena -oportunidad. Puedes darle un vistazo a nuestro post sobre [pyOpenSci: un -promotor de la ciencia abierta](https://opensciencelabs.org/blog/pyopensci-un-promotor-de-la-ciencia-abierta/) si tu -lenguaje de programación es Python; y tus aspiraciones son las de -desarrollar un paquete, ser editor, revisor, o seguir a esta comunidad. - -#### Referencias - -- [rOpenSci](https://ropensci.org) - -- [Mejor ciencia con rOpenSci](https://maelle.github.io/latinr/slides.html#1) - -- [rOpenSci: permitiendo la investigación abierta y reproducible](https://ropensci.org/pdfs/2018-08-15_rpharma_ropensci_butland.pdf) diff --git a/content/blog/te-ensenamos-lugares-para-aprender-los-fundamentos-de-la-ciencia-abierta/index.md b/content/blog/te-ensenamos-lugares-para-aprender-los-fundamentos-de-la-ciencia-abierta/index.md deleted file mode 100644 index 97d04ea2e..000000000 --- a/content/blog/te-ensenamos-lugares-para-aprender-los-fundamentos-de-la-ciencia-abierta/index.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: "Te enseñamos 4 lugares para aprender los fundamentos de la ciencia abierta" -slug: te-ensenamos-lugares-para-aprender-los-fundamentos-de-la-ciencia-abierta -date: 2020-06-22 -author: Rainer Palm -tags: [datos, manual] -categories: [ciencia abierta] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -¿Qué es realmente la ciencia abierta? A pesar de que parece una idea simple, su implementación puede concurrir en todo tipo de preguntas y problemas posteriores sin una definición clara de los permisos de uso sobre resultados o metodologías, concedidos tanto a los investigadores como a los lectores y posteriores usuarios de la investigación, y de qué es lo que se busca lograr con este tipo de práctica de investigación. - - - -La ciencia abierta plantea cuestiones en el ámbito legal e institucional, por lo que deben declararse previamente de manera formal las normas de publicación o de uso, tanto de los datos utilizados como del artículo o conclusiones resultantes. Es por esto que tanto los miembros del equipo de investigación como las instituciones que financian y publican estas deben tener una idea clara de cuáles són los fundamentos en los cuales se basa la ciencia abierta y a qué principios se han de ajustar. - -Para este propósito existe una variedad de recursos en linea a través de los cuales se pueden aprender los fundamentos de las prácticas de la ciencia abierta. Mucha de esta información ya está lo suficientemente abreviada y resumida, de manera tal que cualquiera, aún sin experiencia previa en el tema pueda fácilmente entenderlo sin mucho problema en poco tiempo, exigiendo sólo el querer hacerlo. Entonces, ¿cuáles son exactamente estos sitios desde los que las personas se pueden educar acerca de los principios de la ciencia abierta? - -## Manual de Capacitación de Ciencia Abierta[1] - -En el febrero de 2018, 14 autores en la Biblioteca Nacional Alemana de Ciencia y Tecnología se reunieron y trabajaron juntos con el propósito de crear un manual gratuito y abierto, mediante el cual se buscaría capacitar y educar a las personas acerca de las prácticas y principios de la ciencia abierta, publicado por GitBook en internet y libre para el uso de cualquiera. El resultado fue el manual de capacitación anteriormente mencionado, el cual se produjo como resultado de un proyecto financiado por la Unión Europea llamado FOSTER Plus, cuyo propósito principal era convertir la ciencia abierta en un estándar dentro de la comunidad científica. - -A pesar de que en este manual se habla también de las filosofias y teorias de las cuales surgieron los movimientos de conocimiento abierto, el foco está principalmente en la formas y métodos con las cuales se realiza la ciencia abierta. Por lo tanto, el manual también actúa como una herramienta para educar a aquellos que deseen difundir y enseñar pautas acerca de las herramientas disponibles para la realización de papers de acceso abierto, investigación reproducible, y políticas de ciencia abierta, entre otros. - -## Open Definition[2] - -La Open Definition, tal como su nombre se indica, trata simplemente de dar una definición clara y a fondo de lo que significa que un conocimiento sea "abierto". Es un documento que fue creado por la Open Knowledge Foundation, el cual está escrito principalmente con la creación de licencias de acceso libre de datos, métodos, publicaciones y demás. Esta definición de libre se deriva y es sinónima con aquella usada en el mundo del software, particularmente de la Open Source Definition. A pesar de que trata de ser un documento legal, es bastante conciso, corto y fácil de entender. - -Por lo tanto, se trata de un documento bastante importante a la hora de crear y analizar licencias de acceso abierto y los permisos y privilegios que éstas conceden tanto a los investigadores como a los lectores o usuarios de la investigación. Aclara temas de los cuales no se suele hablar mucho, tales como la necesidad de que los archivos utilizados estén en formatos que no posean restricción algunas, que se permita también la distribución del trabajo tanto junto como separado de sus componentes constituyentes, entre otros. - -## Open Science Knowledge Base[3] - -Esta lista se trata de un recopilatorio de recursos y enlaces a literatura, cursos, videos, y demás donde se explican en detalle una multitud de temas relacionados con la ciencia abierta. Funciona como una lista desde la cual todos los interesados en el tema pueden indagar más a fondo si lo consideran necesario, con enlaces a artículos donde se explica la investigación reproducible, la replicabilidad, el conocimiento abierto, de manera breve y corta o extensa y detallada, tal como el usuario lo desee. A la vez, actúa como un curso donde se da un programa educativo para que cualquiera pueda aprender de ciencia abierta desde 0, desde responder preguntas tales como '¿cuales són los problemas que abarca la ciencia abierta?' hasta enseñar lugares donde puedes realizar preguntas como ésta y buscar recursos adicionales, como por ejemplo, acerca de cómo enseñar ciencia abierta. - -## Open Data Handbook[4] - -También realizado por la Open Knowledge Foundation, éste es un proyecto que actua como una introducción a la apertura de datos, principalmente en cuanto al estatus legal y social de estos se refiere, y cuáles técnicas son adecuadas para la distribución o uso de datos que han sido liberados para el público. Se explica tanto el propósito de esforzarse en utilizar tecnologías contemporáneas para publicar datos de forma abierta, cuáles requisitos se deben cumplir en términos de disponibilidad, interoperabilidad y permisos de redistribución, para que un conjunto de datos se considere abierto, como las herramientas, métodos y servicios se pueden utilizar para liberar datos al público. - -En el sitio del Open Data Handbook también se pueden encontrar recursos[5] creados por la comunidad, todos relacionados a temas de datos abiertos (privacidad, políticas, estándares, derecho a la información, etc), donde se han compartido artículos y portales relacionados al tema, algunos también preparados con principantes en mente. - -[1]: https://book.fosteropenscience.eu/es/ "Manual de Capacitación de Ciencia Abierta" -[2]: https://opendefinition.org/od/2.1/en/ "Open Definition" -[3]: https://how-to-open.science/change/educate/literature/ "Open Science Knowledge Base" -[4]: http://opendatahandbook.org/guide/es/ "Open Data Handbook" -[5]: https://opendatahandbook.org/resources/ "Open Data Handbook | Resources" diff --git a/content/blog/te-hablamos-de-cinco-repositorios-con-datos-abiertos-sobre-paises/index.md b/content/blog/te-hablamos-de-cinco-repositorios-con-datos-abiertos-sobre-paises/index.md deleted file mode 100644 index 241d0e2a4..000000000 --- a/content/blog/te-hablamos-de-cinco-repositorios-con-datos-abiertos-sobre-paises/index.md +++ /dev/null @@ -1,197 +0,0 @@ ---- -title: "Te hablamos de cinco repositorios con datos abiertos sobre países" -slug: te-hablamos-de-cinco-repositorios-con-datos-abiertos-sobre-paises -date: 2020-01-29 -author: Yurely Camacho -tags: [datos, repositorios, acceso] -categories: [ciencia abierta, datos abiertos, acceso abierto] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - -Si estás interesado en practicar la ciencia abierta o simplemente -quieres o necesitas conocer más acerca del tema, resulta de suma -importancia que descubras sobre los **datos abiertos**. Es decir, datos -que sean accesibles a cualquier persona con la finalidad que sean -**reutilizados y redistribuidos** y no tengan grandes exigencias de -permisos específicos para su descarga y procesamiento, los cuales te -servirán para llevar a cabo cualquier proyecto que tengas en mente o -culminar alguno. Sin embargo, la finalidad de este post no es hablarte -específicamente sobre los datos abiertos, sino sobre algunos repositorios -de datos abiertos. A pesar de esto, una pequeña introducción no está -de más para entrar en confianza sobre el tema. Puedes visitar nuestro -artículo sobre Datos abiertos [aquí](https://opensciencelabs.org/blog/que-son-los-datos-abiertos/). - - - -Los repositorios de datos abiertos son almacenes de datos que tienen la -finalidad de promover un entorno de libre acceso al compartirlos entre -personas, permitiendo la creación de diferentes enfoques respecto a los -datos manejados, obteniendo soluciones innovadoras e incentivando la -redistribución y reproducibilidad en las investigaciones. En cualquier -caso, en todos los países se necesitan datos de buena calidad que -permitan identificar medidas públicas y privadas eficaces, realizar -comparaciones y evaluar cambios en el tiempo con respecto a otros -países, afianzar metas sociales, supervisar avances, entre otras cosas. - -En la web puedes encontrar gran cantidad de repositorios y portales de datos -abiertos que te dan acceso a la descarga y visualización de conjuntos de datos -en diferentes formatos, los cuales también pueden utilizarse para dar solución a -tareas académicas, hacer pruebas, probar herramientas de manejo de datos, entre -otras situaciones afines. - -A continuación te contamos acerca de cinco repositorios de datos abiertos sobre -algunos países, sin orden en particular: - -### 1. [**Portal de Datos de Europa**](https://www.europeandataportal.eu/es/homepage) - -Ofrece una recopilación de datos y -[**metadatos**](https://es.wikipedia.org/wiki/Metadatos) referidos a -contenidos publicados por entidades de la administración pública que se -encuentran disponibles en portales de acceso público de los distintos -países de Europa. De la misma manera, ofrece información sobre el -proceso de suministro de datos y los beneficios de reutilizarlos. El -portal está traducido en varios idiomas y cuenta aproximadamente con -976547 conjuntos de datos. - -Uno de sus objetivos principales es promover la accesibilidad de los -datos abiertos y su valorización, desde su publicación hasta la -reutilización. El portal cuenta con varias secciones: *Búsqueda de -conjuntos de datos*, *Proporcionar datos*, *Utilizar datos* y *Formación -y biblioteca* donde básicamente encontrarás, entre otras cosas, -buscadores de conjuntos de datos por categorías, por relevancia, fecha -de creación, modificación y por ubicación, formación y módulos de -aprendizaje sobre los datos abiertos, los beneficios que trae su -utilización y referencias a otras iniciativas importantes en el área, -también información para inclusión de datos desde otros portales. Es de -gran ayuda si requieres conjuntos de datos sobre los distintos países de -Europa, donde puedes realizar comparaciones a través del tiempo y entre -distintos países, por ejemplo. - -### 2. [**Datos de libre acceso del Banco Mundial**](https://datos.bancomundial.org/) - -El *Grupo de gestión de datos sobre el desarrollo* del Banco Mundial -promueve una iniciativa de acceso abierto y gratuito a datos sobre el -desarrollo en el mundo, encargado de mantener conjuntos de datos -sectoriales, macroeconómicos y financieros a los cuales se puede acceder -por país o por indicador. Este grupo se encarga de coordinar el trabajo -estadístico, preparar estudios sobre pobreza, documentos de -investigación y otros trabajos sectoriales y económicos, como -estrategias de atención a países. La información proporcionada por este -repositorio proviene, en su mayoría, de los sistemas estadísticos de los -países miembros y por tal motivo, la calidad de los datos depende de la -eficiencia y calidad de dichos sistemas. - -Como usuario de los datos del Banco Mundial, puedes copiar, distribuir, -adaptar, exhibir o incluir los datos con fines comerciales o no, sin -costo adicional y sujeto a ciertas restricciones como: reconocer la -autoría de los datos, no reproducir los logotipos o marcas registradas -del Banco Mundial, no puedes afirmar que el Banco Mundial aprueba el uso -que hagas de los datos, entre otras restricciones mínimas. - -Dale un vistazo al [*Catálogo de -Datos*](https://datacatalog.worldbank.org/) y al [*Banco de -Datos*](https://databank.bancomundial.org/home.aspx) del Banco Mundial -que te servirá para complementar información. - -### 3. [Portal de Datos Abiertos: Números para el desarrollo](https://code.iadb.org/es) del Banco Interamericano de desarrollo - -Permite explorar, visualizar y descargar datos sobre indicadores -socioeconómicos de América Latina y el Caribe. Los datos disponibles -provienen de investigaciones y otras fuentes utilizadas por el Banco. En -este portal puedes encontrar datos sobre distintos temas: educación, -mercados laborales, integración global, pobreza, sexo y agricultura, -entre otros. - -El portal está dirigido a investigadores, estudiantes, responsables -gubernamentales, analistas y otros que trabajen en temas de desarrollo y -políticas públicas. Permite analizar más de 1000 indicadores de -desarrollo de los países de América Latina (la dolarización, la deuda -pública interna, salario mínimo y Cobertura por pensiones y seguro -social, entre otros), seleccionar datos sobre los países en específico y por -indicador. - -Puedes descargar los datos en formato '.xls' y '.csv' para compartir o -reutilizarlos en tus proyectos. Asimismo, el portal te brinda formas de -explorar los datos de los países a través de visualizaciones animadas e -interactivas. - -### 4. [Observatorio de la Complejidad Económica (OEC)](https://observatoriodenoticias.redue-alcue.org/el-observatorio-de-la-complejidad-economica-oec/) - -El observatorio proporciona información confiable y clasificada según -estándares reconocidos sobre aspectos comerciales y productivos de los -países de todo el mundo. Posee una serie de menús: *Países*, -*Productos*, *Visualizaciones*, *Clasificación* y *Publicaciones*, que -garantizan el manejo eficiente y facilidad en el análisis de dichos -datos. - -En estos menús encontrarás descripciones con el contenido económico de -los países que necesites, puedes acceder a la información contenida -sobre los 200 productos más comercializados a nivel internacional, -explorar los datos de forma gráfica, construyendo y filtrando la -información de interés. También observarás un listado de los productos y -los países clasificados de acuerdo a la complejidad económica, -encontrarás artículos, notas y documentos referentes al avance del sitio -en la explicación de la complejidad económica de los países. Puedes -realizar búsquedas por periodicidad y profundidad, por año, categorías, -países y realizar comparaciones entre ellos. Asimismo, los datos, -visualizaciones y publicaciones se encuentran disponibles para su -descarga y envío. - -### 5.[Iniciativa de datos abiertos del gobierno de España](https://datos.gob.es/es/catalogo) - -Esta iniciativa lleva el nombre de *Aporta* y se desarrolló con el fin -de promocionar la apertura de la información pública y desarrollo de -servicios avanzados basados en datos en el Gobierno de España. Cuenta, -entre otros productos, con la plataforma **datos.gob.es** que sirve como -punto de encuentro entre todos los actores del entorno de datos abiertos -en España: usuarios, ciudadanos o profesionales que demandan datos y/o -quieren conocer novedades, aplicaciones o servicios relacionados con -ellos. También organismos públicos que proporcionan y utilizan datos y -que quieren estar al tanto de novedades del sector. Y demás personas que -requieren fuentes de datos para crear productos y servicios que quieren -dar a conocer. - -La plataforma tiene una sección de **Catálogo de datos** donde muestra -los conjuntos de datos disponibles (alrededor de 25.822 a la fecha) y -permite realizar búsquedas por categoría, formato, publicador, nivel de -administración, frecuencia de actualización y etiqueta. Este repositorio -sirve tanto de punto de localización como de entrada a nuevos datos -disponibles. Es una buena alternativa si quieres conocer o necesitas -información sobre el desarrollo del Gobierno en España. - -En **Open Science Labs** pensamos que cada país debe contar con un -repositorio de datos abiertos, donde se encuentre información referente -al desempeño del país en todos los ámbitos (social, económico, -educativo, tecnológico, entre otros). Asimismo, apostamos a que se -divulgue en cada país la cultura de los datos abiertos y aún más allá, -la práctica de la ciencia abierta. Las estadísticas y datos de todos los -países deben estar a disposición de cualquier ciudadano y/o institución, -siempre y cuando el acceso y manejo de ellos se haga de manera -responsable. - -[**El Barómetro de Datos -Abiertos**](https://opendatabarometer.org/?_year=2017&indicator=ODB) es -una medida global del grado en que los gobiernos están publicando y -utilizando datos abiertos con el propósito de rendir cuentas, innovar y -lograr un impacto social con beneficios a los ciudadanos. - -Los repositorios de datos abiertos que te mostramos son algunos de los -muchos que están disponibles y te pueden ser de gran ayuda. En los -siguientes enlaces encontrarás referencias a otros repositorios. - -- [*Biblioteca Universitaria Huelva*](https://guiasbuh.uhu.es/c.php?g=498100&p=3907565) -- [*Biblioteca Universidad de Extremadura*](https://biblioguias.unex.es/c.php?g=572093&p=3944864) -- [*Portal de Datos Abiertos de la Unión Europea*](http://data.europa.eu/euodp/es/data/) -- [*Gapminder*](https://www.gapminder.org/data/) -- [*Portal de Datos Abiertos de Esri España*](http://opendata.esri.es/) -- [*FAIRsharing*](https://fairsharing.org/databases/) -- [*Odisea*](http://odisea.ciepi.org/) -- [*OpenDOAR*](https://v2.sherpa.ac.uk/opendoar/) diff --git a/content/blog/te-hablamos-de-las-licencias-mas-utilizadas-en-proyectos-de-ciencia-abierta/index.md b/content/blog/te-hablamos-de-las-licencias-mas-utilizadas-en-proyectos-de-ciencia-abierta/index.md deleted file mode 100644 index 4a52fd056..000000000 --- a/content/blog/te-hablamos-de-las-licencias-mas-utilizadas-en-proyectos-de-ciencia-abierta/index.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "Te hablamos de las licencias mas utilizadas en proyectos de ciencia abierta" -slug: te-hablamos-de-las-licencias-mas-utilizadas-en-proyectos-de-ciencia-abierta -date: 2020-05-06 -author: Rainer Palm -tags: [licencia, proyectos, free software] -categories: [ciencia abierta] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -¿Cómo proteger tus proyectos, tu código y tu labor si dejas que cualquiera con acceso a Internet la acceda y utilice tal como desee? En GitHub están alojados millones de proyectos cuyo código es reutilizado de cualquier manera y en proyectos de cualquier tipo, sin que el programador pueda controlarlo. ¿Cómo podría un desarrollador promedio resguardarse de un posible abuso, para tomar medidas de seguridad, o para evitar que otro se beneficie de su labor sin saberlo? Es aquí donde, en el desarrollo de software, entran las licencias de software, y es aquí donde, por múltiples razones (transparencia, reproductibilidad, libertad de acceso, mayor eficacia durante el desarrollo, entre otras), nos interesan sobre todo aquellas licencias de código abierto, ya que hacen posible el desarrollo de muchas prácticas de la ciencia abierta. - - - -Establecer una licencia para los productos de tu investigación, permite hacer saber a otras personas qué es lo que pueden (o no) hacer con tu trabajo, y divulgar las pautas bajo las cuales se puede interactuar con la investigación y el equipo que la desarrolla. Por lo tanto, es imperativo para cualquier institución o individuo que sea parte de una comunidad de ciencia abierta, conocer a fondo las licencias más apropiadas y utilizadas por más personas, y cuáles son sus restricciones y aplicación según qué tipo de proyectos beneficien más, las comunidades que apoyan a estas licencias entre otros aspectos muy importantes sobre el licenciamiento de proyectos de ciencia abierta, además de tener en mente cómo se va a usar la investigación realizada en el futuro, ya sea si ésta se va a usar para fines lucrativos o si se espera que los demás utilicen licencias similares al reproducirla, modificarla y/o utilizarla en el futuro. - -¿Qué tipos de licencias existen? - -En el mundo del software libre, por lo general, se entiende que toda licencia abierta permite tanto el libre acceso y uso del software, como su distribución y modificación. En términos mas detallados, las licencias de software libre, en términos generales, establecen la condición de que los desarrollos se adecúen a los diez criterios establecidos por la Open Source Definition (o similares, como aquellos que propone la Free Software Foundation). Estos criterios protegen tanto el derecho de los usuarios de modificar, ya sea mediante parches o modificación directa del código desarrollado, y redistribuir el software, como el del autor de proteger la integridad de su labor. Por supuesto, una licencia puede exigir restricciones adicionales de parte del usuario, como en el caso de una licencia copyleft, que requiere que los proyectos derivados utilicen la misma licencia que el trabajo original, contrastado con las licencias "permisivas", que no tienen este requerimiento. - -Cuales son las licencias mas utilizadas? - -En proyectos de ciencia abierta y en muchos otros espacios, las artes, el desarrollo de software, la divulgación de noticias y información, así como prácticamente cualquier ámbito que utilice el derecho de autor, existe un movimiento que agrupa un conjunto de licencias que van ganando progresivamente adeptos. Con una comunidad activa, sin duda porque también involucra directamente políticas y proyectos relacionados con el apoyo y promulgación de la ciencia abierta, es la licencia Creative Commons. A pesar de que esta inicialmente se aplicaba en la esfera de las artes, desde el 2005 esta organización se empezó a involucrar en proyectos científicos, mediante el programa Science Commons. - -Estas licencias permite a quien las utilice, escoger entre cuatro "condiciones de licencia". Las modalidades de licencias Creative Commons dependen de: si se debe siempre acreditar al creador original (CC BY), si siempre se debe usar la misma licencia al redistribuir y modificar el trabajo (CC BY-SA), si es únicamente para uso sin fines de lucro (CC BY-NC), o si no se permiten trabajos derivativos (CC BY-ND). Utilizar una licencia CC BY es una opción para la publicación de investigaciones científicas financiadas por el público, para las cuales se espera que sea libremente reutilizable y accesible para cualquiera, o forme parte del programa de libre acceso de algunos gobiernos, como el del Reino Unido. - -Una de las licencias en las cuales probablemente estén publicados programas que, directa o indirectamente, utilizas a diario es la licencia GNU GPL v3.0. Esta es un tipo de licencia copyleft que "garantiza tu libertad para compartir y cambiar todas las versiones de un programa-para asegurarse que sigue siendo software libre para todos los usuarios". Esto lo hace ideal para mantener la integridad de tu software sin necesidad de hacerlo propietario. Esta es usada en una variedad de programas, tales como GIMP, WordPress, Audacity, el kernel de Linux, entre otros. Diametralmente opuesta a ésta es la licencia BSD, la cual apunta a imponer un mínimo de restricciones en el uso y redistribución del software, siendo minimalista y concisa en su aplicación. Por supuesto, esta es usada en las distribuciones BSD de Linux, ya que forman parte de la misma organización. - -La licencia que en el 2015 era la mas utilizada en Github, es la licencia MIT, cuyo nombre está tomado de la institución donde se creó. Principalmente se caracteriza por ser una licencia permisiva y compatible con bastantes otras licencias. A pesar de ser una licencia de software libre, permite a los desarrolladores re-licenciar sus programas para que sean propietarios si estos son publicados bajo la licencia MIT, aunque por supuesto, también se podrían reintegrar en una licencia como la GPL con igual facilidad. Si has usado alguna distribución de Linux, ya has utilizado un programa publicado bajo la licencia MIT: el sistema de ventanas X. Publicado también bajo la misma licencia esta node.js, un framework de dashboards de los cuales se derivaron muchos mas. - -Finalmente, queremos recordarte que la decisión de escoger una licencia depende de cuales restricciones sean absolutamente necesarias para tu proyecto, y intentar permitir la mayor cantidad de libertades sin sacrificar la integridad y metas de tu trabajo. De la licencia utilizada pueden surgir problemas legales o de seguridad, por lo que es importante revisar con calma cual es la mejor opción y tener claro junto a todos los miembros del equipo bajo que términos se esta trabajando. diff --git a/content/blog/te-hablamos-del-uso-de-dashboards-para-visualizacion-de-datos-de-tu-proximo-proyecto/index.md b/content/blog/te-hablamos-del-uso-de-dashboards-para-visualizacion-de-datos-de-tu-proximo-proyecto/index.md deleted file mode 100644 index 0763238e0..000000000 --- a/content/blog/te-hablamos-del-uso-de-dashboards-para-visualizacion-de-datos-de-tu-proximo-proyecto/index.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "Te hablamos del uso de dashboards para visualización de datos de tu próximo proyecto" -slug: te-hablamos-del-uso-de-dashboards-para-visualizacion-de-datos-de-tu-proximo-proyecto -date: 2020-03-11 -author: Rainer Palm -tags: [visualización de datos, proyectos, datos, código, dashboard, framework] -categories: [ciencia abierta] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Muchas veces ocurre que, a pesar de que te has tomado el tiempo para analizar y modelar un problema, escribir código, depurarlo y asegurarte de que todo funcione bien, necesitas simplificar y compartimentar los datos y la salida de tu programa para que puedas presentar tu trabajo y que este sea entendido, usualmente mediante un informe y/o una visualización de lo realizado. Las herramientas comúnmente usadas para este propósito tienen varias dificultades: suelen ser estáticas (tal como las diapositivas o los informes escritos), ser diseñadas en mente solo para gente con conocimiento técnico, o permitir solo el uso de ciertos lenguajes de programación o librerías. - - - -Aquí es donde entran en juego los dashboards. Estas son herramientas de manejo de información que se vinculan entre sí a través de APIs, servicios, librerías y código de una manera dinámica por 'debajo' de la interfaces de usuarios, es decir, mostrando los resultados de esta interacción en una interfaz web o aplicación móvil, a través de gráficos y visualizaciones que al instante presentan los llamados indicadores de rendimiento (Key Performance Indicators KPI por sus siglas en inglés), o cualquier otro tipo de indicadores, acerca de un negocio, proceso, departamento, sitio web, o servidor. Prácticamente cualquier cosa que necesite ser monitorizada de forma constante puede utilizar los dashboards. Debido a su naturaleza como frontend, son completamente personalizables para cualquier propósito al que los quieras aplicar, sólo hace falta crear los scripts necesarios para hacerlo. - -¿Por qué utilizar un dashboard? - -La principal razón de su popularidad radica en que ofrecen una plataforma central de monitoreo, y a través de ella se puede observar minuto a minuto el rendimiento de cualquier cosa. El backend (comúnmente alojado en un servidor de forma separada de la interfaz del usuario), recibirá también los datos de entrada y se encarga de realizar el análisis en tiempo real. El backend también transmite los resultados a la aplicación web o móvil, lo que constituye de cara al usuario el dashboard como tal, permitiendo a los usuarios conocer el estado actual del servicio de forma instantánea. Un dashboard requiere, por lo tanto, de una red por debajo que grabe, maneje y suba los datos para el análisis que se mostrará en el dashboard. El dashboard permite no solamente la realización del análisis sino también su modificación, ya sea para verlo de maneras distintas o con más detalle, para ajustar los periodos de recolección de datos, o quizás para explorar las predicciones realizadas por el backend. - -El dashboard, por lo tanto, intenta responder preguntas acerca de tu negocio o servicio al instante, mediante análisis rápido y presentación de la información en un sitio web. Se construye a partir de aquellas preguntas que se realizan con bastante frecuencia en el manejo de un servicio, tales como: ¿Estará el servidor funcionando? ¿Cuáles son las principales entradas de dinero? ¿Cuál contenido es el que suelen revisar nuestros usuarios con más frecuencia? ¿Cuánto contenido/trabajo se ha realizado en una semana?, entre otras. Para responderlas, se centra en presentar de forma clara datos operacionales, con tablas, gráficos de líneas o barras, medidores, en un diseño sencillo que utiliza elementos y símbolos comunes e intuitivos. - -Frameworks y librerias diseñadas para dashboards - -Un framework es una plataforma reutilizable útil en el desarrollo de aplicaciones de software de forma que sirve de soporte como base para el desarrollo de nuevas aplicaciones. El framework que ha ganado mayor difusión recientemente, quizás debido a que se construyó a partir de otros que han habido antes (tales como React.js, Plotly.js, o Flask), es Dash, un framework de Python principalmente diseñado para crear aplicaciones web orientadas a la visualización de datos. La idea general esta en vincular una interfaz gráfica alrededor de tu código Python de una forma rápida y sencilla, renderizando esta en un navegador web apoyándose en Javascript y HTML, sin necesitar que el usuario utilice estos lenguajes. Cuenta con paquetes en pip, y una galería de ejemplos, además de ser completamente código abierto y usar la licencia MIT. La popularidad de Dash también se debe a que el código escrito para este framework es bastante compacto (aquí hay una aplicación que muestra una variedad de gráficas en 43 líneas), y tiene bastante capacidad de personalización estética para quién lo desee, mediante CSS. - -Por supuesto, hay también bastantes otras opciones. Está Shiny, que es un paquete de R que permite la creación de aplicaciones web directamente desde R, ya sea alojándolas directamente en un sitio web o integrándolas en documentos R Markdown, que también soporta el uso de temas CSS y Javascript. Shiny también tiene una comunidad bastante dedicada y activa. También esta Cube.js, un framework de código abierto diseñado desde abajo para análisis inteligente accesible instantáneamente desde un sitio web. O JDash, o Mozaïk.Todo es cuestión de utilizar el que mas se acerque a tus necesidades. - -Los dashboards son una herramienta bastante poderosa. Con un proceso automatizado de subida y recolecta de datos por debajo, y un diseño funcional, sencillo y bien pensado, pueden volverse un instrumento muy importante para presentar tu proyecto y/o desarrollarlo en grupo, y en áreas de marketing, o negocios son prácticamente indispensables. Si tienes dificultades con cuestiones de coordinación de equipos, monitoreo de proyectos o manejo de finanzas, ¿por qué no probarlos? -\[1\]: https://dash.plot.ly/ "Dash" -\[2\]: https://dash-gallery.plotly.host/Portal/ "Dash App Gallery" -\[3\]: https://gist.github.com/chriddyp/3d2454905d8f01886d651f207e2419f0 "Hello World Dash app" -\[4\]: https://shiny.rstudio.com/ "R Shiny" -\[5\]: https://shiny.rstudio.com/gallery/#user-showcase "R Shine | User Showcase" -\[6\]: https://cube.dev/ "Cube.js" -\[7\]: http://jdash.io/ "JDash" -\[8\]: http://mozaik.rocks/ "Mozaïk" diff --git a/content/blog/te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta/index.md b/content/blog/te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta/index.md deleted file mode 100644 index fc32a3d31..000000000 --- a/content/blog/te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta/index.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -title: "Te mostramos cinco librerías en Python para tu próximo proyecto de ciencia abierta" -slug: te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta -date: 2020-06-09 -author: Anavelyz Perez -tags: [datos, visualización de datos, pandas, scipy, matplotlib, seaborn, bokeh] -categories: [ciencia abierta, código abierto, Python] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Un proyecto de ciencia abierta, así como cualquier otro, requiere de una -evaluación previa para determinar lo que se necesita hacer y cómo debe llevarse -a cabo. En el caso de ciencia abierta, debemos tener en cuenta que, por su -alcance e impacto en la comunidad científica y sociedad en general, es vital -estudiar las herramientas que se utilizarán porque de ellas depende la obtención -de resultados óptimos, visualmente atractivos y lo suficientemente informativos. - - - -Antes de continuar, recordemos del artículo [¿Qué es la ciencia abierta?](https://opensciencelabs.org/blog/que-es-la-ciencia-abierta/), -que la ciencia abierta es un movimiento, una manera de ver y hacer ciencia, que -busca crear una cultura donde la información de todo el proceso de investigación -científica, ya sean los datos, protocolos, cuadernos de laboratorio, resultados -obtenidos en las diferentes etapas de este proceso, sean gratuitos y de libre -acceso. De esta manera, todas las personas involucradas en el proceso de -investigación, ya sean los propios científicos, instituciones de investigación y -financiamiento, y público en general, pueden contribuir y colaborar con el -esfuerzo de investigación. Con esto se garantiza que el trabajo científico sea -abierto e inclusivo, donde el investigador se dé cuenta que poner a libre -disposición sus trabajos le garantizan, entre otras cosas, el aumento del -impacto y difusión de sus investigaciones. - -Allí también se menciona que la ciencia abierta es una forma de producir -conocimiento científico, promoviendo la comunicación y acceso efectivo del -contenido de las investigaciones científicas en todas las áreas (instrumentos de -trabajo, resultados intermedios y finales) mediante la digitalización y las -bondades del internet. - -Cuando elaboramos un proyecto bajo la modalidad de ciencia abierta, por -lo general analizamos, describimos y descubrimos información que está -contenida en datos, lo cual se hace aplicando métodos estadísticos u -otros similares. Estos se pueden complementar con una o varias -visualizaciones o gráficos que permitirán, tanto a los analistas como a -los lectores, tener una visión más general de lo que las medidas -numéricas o palabras describen. Además, una visualización logra -presentar resultados estéticamente más atractivos y captar la atención -en puntos donde se requiera un mayor enfoque. - -Para tener esto último un poco más claro, representémoslo en un ejemplo. -Supongamos que estamos estudiando las enfermedades en un período de -tiempo dado y en una región específica, y tenemos la información que -corresponde a la edad, sexo y la enfermedad que presentan los pacientes -atendidos en los centros hospitalarios de ese período. - -Entonces podemos considerar la estadística descriptiva como una de las -técnicas ideales, en este caso se calcularían estadísticos como la media -para la edad, la proporción para el sexo y el tipo de enfermedad. A su -vez, podemos hacer cruces de información a través de tablas de -contingencia y a partir de estas elaborar gráficos que complementarán -esta información. Estos gráficos mostrarán, de forma sintetizada, lo que -los datos revelan y resultará más fácil hacer comparaciones. Además los -colores y las áreas de las figuras trazadas captarán la atención de lo -que verdaderamente se requiere para la toma de decisiones. Todo ello es -una clara y simple noción de lo que una visualización puede ayudar. - -A continuación veamos cinco bibliotecas o librerías de Python que puedes -implementar en tu proyecto de ciencia abierta: - -- pandas: Es una biblioteca que permite realizar tareas de manejo y - análisis de datos de forma rápida y eficiente. Se complementa con la - biblioteca de visualización Matplotlib. Puedes consultar más - información en https://pandas.pydata.org/. - - SciPy: Es uno de los paquetes centrales que componen la pila de SciPy. - Proporciona muchas rutinas numéricas eficientes y fáciles de usar, - como las rutinas de integración numérica, interpolación, optimización, - álgebra lineal y estadística. Esta descripción se encuentra disponible - en https://www.scipy.org/scipylib/index.html. - -- Matplotlib: es una de las primeras y más populares bibliotecas de - visualización de Python. En su [página web](https://matplotlib.org/) podemos - encontrar una corta descripción de ella: Matplotlib es una - biblioteca muy completa para crear visualizaciones estáticas, animadas e - interactivas en Python. Con esta biblioteca se pueden generar gráficos de - barras, histogramas, espectros de potencia, stemplots, scatterplots, gráficos - de error, gráficos circulares y muchos otros. - - Es uno de los métodos más simples para las representaciones básicas, está - diseñada con la filosofía de que deberías generar un gráfico simple con pocas - líneas de código, o simplemente una. Además, se complementa muy bien con otras - bibliotecas de análisis de datos, tal es el caso mencionado líneas arriba con - *pandas*. - -- Seaborn: es una biblioteca de visualización basada en Matplotlib, permite - hacer gráficos estadísticos visualmente atractivos, posee estilos - predeterminados y paletas de colores que están diseñados para obtener - resultados más estéticos y modernos. Podemos obtener gráficos de barras, - histogramas, circulares, gráficos de error, entre otros. - - Podemos encontrar más información de esta biblioteca en su [página - web](https://seaborn.pydata.org/). - -- Bokeh: Es una biblioteca de visualización que permite crear tanto - gráficos sencillos como especializados, dashboards y gráficos - orientados a la web. Los resultados de las visualizaciones constan de - elegancia y son estéticamente atractivos, los gráficos son muy - versátiles. Es posible consultar más información acerca de esta -biblioteca en su [página -web](https://docs.bokeh.org/en/latest/index.html). - -Todas estas bibliotecas son de código abierto y cuentan con un soporte en la -web, existen foros y varios canales de información sobre ellas. No son las -únicas que puedes incluir en tu proyecto, hay muchas opciones más, te invitamos -a que explores y pruebes estas herramientas. - -En nuestro artículo [**Herramientas de visualización en -Python**](https://opensciencelabs.org/blog/herramientas-de-visualizacion-en-python/) -puedes encontrar otras bibliotecas o librerías que te pueden interesar. diff --git a/content/blog/tres-proyectos-de-ciencia-ciudadana-que-te-sorprenderan/index.md b/content/blog/tres-proyectos-de-ciencia-ciudadana-que-te-sorprenderan/index.md deleted file mode 100644 index b1881d814..000000000 --- a/content/blog/tres-proyectos-de-ciencia-ciudadana-que-te-sorprenderan/index.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: "Tres proyectos de ciencia ciudadana que te sorprenderán" -slug: tres-proyectos-de-ciencia-ciudadana-que-te-sorprenderan -date: 2020-02-12 -author: Rainer Palm -tags: [comunidad, proyectos, basura, ciencia ciudadana] -categories: [ciencia abierta] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -Alguna vez has querido saber como es realmente participar en una investigación científica, sin necesariamente tener el entrenamiento o la educación del area? Descubrir nuevas especies, identíficar cuerpos celestes, quizás simplemente hacer trabajo de campo en las fronteras de tu propia ciudad, catalogando los animales y plantas que coexisten en tu habitat local. Mediante proyectos y aplicaciones de ciencia ciudadana, esto es una posibilidad, y ya hay una diversidad de personas cotidianas que la han aprovechado, indirectamente volviendose científicos. - - - -Alrededor del mundo, una multitud de gobiernos y instituciones ya estan resolviendo problemas concretos utilizando ciencia ciudadana. Ya sea por que consideran mucho más eficiente aprovechar el amplio alcance que les otorga, porque lo consideran necesario para lograr conseguir una comunicación mas directa entre los científicos y el entorno el cual estudian, porque piensan que el vinculo entre los científicos y la gente común debe ser mas estrecha, o porque requieren de la información que pueden obtener de reportes y observaciones hechos durante el dia a dia de los ciudadanos, simplemente ven ahí un potencial muy importante y explotable, y es de esperar que el foco de estos proyectos se este ampliando cada vez mas y mas, desde problemas particulares de biodiversidad o reporte de deslaves, hasta temas de políticas públicas y decisiones legales. - -Pensando nada más en el momento actual en el que vivimos, vemos que hay muchas oportunidades para participar en estos proyectos inclusive en lugares del mundo donde no son muy comunes. Sólo hace falta tiempo libre y una conexión a internet para empezar a transcribir documentos de la libreria del congreso estadounidense[1], identificar animales en Australia[2] o ayudar a monitorearlos en la India[3]. Todo esto sin ni siquiera ir a recolectar datos en el campo como tal, lo cual pone otro gran montón de posibilidades sobre la mesa, las cuales definitivamente solo hemos empezado a explorar. - -¿Tienes curiosidad por cual es el verdadero potencial de esta practica? Si quieres saborear una pequeña muestra, solamente tienes que revisar los siguientes proyectos que presentamos a continuación. - -## Butterfly Conservation - -Butterfly Conservation[4] es una ONG que trabaja con la protección de la vida salvaje basada en el Reino Unido que, tal como su nombre lo indica, se dedica a realizar investigaciones y proyectos que apuntan hacia la conservación y restauración del habitat de mariposas y polillas, buscando tanto proteger especies locales en peligro como apoyar y promover esfuerzos internacionales de preservación. En su pagina comparten recursos tanto para aprender a identificar especies individuales, como para ciertas prácticas de permacultura (siembra de ciertas plantas en especifico, creación de un habitat reproductivo, etc.), que otorgan a las mariposas y polillas un refugio dentro de tu jardín. Como organización, tienen una multitud de proyectos de conservación dedicados a la creación de mejores prácticas de agricultura y pastizales económicos, pero repletos de polinizadores y flores silvestres. - -Sus investigaciones también utilizan prácticas de ciencia ciudadana. Permiten a cualquier persona que esté interesada, trabajar como voluntario/a tanto en sus oficinas como en el campo, en tareas de ayuda a organización de eventos y manejo de reservas naturales, entre otros. También están abiertos a que cualquiera que tenga la posibilidad, les apoye mediante monitoreo de especies dentro de jardines y espacios urbanos. Cualquiera que viva junto a o cerca de una variedad de mariposas o polillas dentro del Reino Unido puede hacer un registro de su observación y así contribuir a una multitud de proyectos dentro de la organización, ya sean de contar o identificar especies o investigar el estado y salud del ambiente en el que conviven. - -## Científicos de la Basura - -Científicos de la Basura[5] es un programa de ciencia ciudadana de Chile integrado y fundado por investigadores de la Universidad Católica del Norte, cuya principal misión es educar a los escolares respecto a la ciencia y al ambiente en el que viven, fomentando un respeto por el manejo de la basura e involucrándolos en actividades que induce al trabajo de campo mediante su realización, generando información científica que a su vez ayuda a diseñar estrategias para que se resuelvan problemas particulares respecto a la acumulación de basura, tanto en espacios urbanos como naturales. Junto a estas actividades, también han desarollado muchas guías metodológicas para muestreos y encuestas en diferentes áreas, de manera que cualquiera que desee puede realizar estas investigaciones de forma independiente, así como guías para que profesores de primaria puedan introducir estos temas de contaminación ambiental en un curriculum escolar. - -Hasta ahora han realizado una número importante de investigaciones en instituciones educativas distribuidas a lo largo de Chile. Hay desde investigaciones realizadas por clubes escolares con metodologías estandarizadas, como en 2009, donde el Club Explora del Colegio Los Carrera estudió el impacto que tienen los humanos en la región de Coquimbo, principalmente en los humedales y en el borde costero. O en 2014, cuando se realizó el proyecto "Investigando la basura aprendemos ciencia", que abarcó muestreos y talleres realizados por los profesores y sus alumnos en una variedad de escuelas. - -## Moon Zoo - -Moon Zoo\[6\] fue un proyecto lanzado en Mayo 2010, alojado en la plataforma Zooniverse, donde usuarios registrados podían identificar, clasificar y medir formas y relieves en la superficie de la Luna, cerca del sitio de aterrizaje de la misión Apolo 17. De esta forma, catalogaban ciertas características geomorfológicas a lo largo de la superficie lunar, como cráteres frescos y relieves lineares, identificándolas entre millones de imágenes tomadas por el satélite Lunar Reconnaissance Orbiter (LRO) de la NASA. Todo ello desde un portal en el que analizaron, inclusive, las herramientas e interfaces utilizadas por los usuarios para el ingreso de los datos, seleccionándolas y diseñándolas para la encuesta. En este proyecto se prestó especial atención a los métodos de agrupación de información y de filtración de datos, para evitar marcaciones problemáticas, generando verificaciones por expertos. - -Entre algunas de las observaciones realizadas al proyecto, se indicaron ciertos errores metodólogicos y otros más relativos al entrenamiento previo de los usuarios que vacíen información, y el proceso de filtrado de datos; sin embargo, los beneficios que les dio este acercamiento inusual al problema definitivamente se hicieron notar. Entre estos beneficios destacan: la clasificar distribuida de grandes cantidades de datos mediante observación y analísis independiente asignado a voluntariados de Internet, lo cual permitió que este proceso se realizara de una forma mucho mas rápida sin sacrificar necesariamente la calidad de la investigación. - -Como puedes ver, ya hay muchos investigadores que consideran útil y hasta necesaria la participación de los ciudadanos en sus estudios, y no como sujetos en encuestas o entrevistas sino como colaboradores. Inclusive si no te convencen mucho los proyectos de las lista, solamente hace falta buscar en internet para conseguir docenas de ejemplos mas, en todo tipo de lugares alrededor del mundo. Muchos presentan metodologías interesantes o inusuales y por lo tanto vistas interesantes al proceso científico, y definitivamente se merecen tu atención. - -\[6\]: https://moonzoo.org/ "Moon Zoo"2 - -[1]: https://crowd.loc.gov/ "By The People" -[2]: https://volunteer.ala.org.au/wildlife-spotter "DigiVol - Wildlife Spotter" -[3]: https://www.bioatlasindia.org/bai-websites "Biodiversity Atlas - India" -[4]: https://butterfly-conservation.org/ "Butterfly Conservation" -[5]: http://www.cientificosdelabasura.cl "Científicos de la Basura" diff --git a/content/blog/ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion/index.md b/content/blog/ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion/index.md deleted file mode 100644 index f40065147..000000000 --- a/content/blog/ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion/index.md +++ /dev/null @@ -1,145 +0,0 @@ ---- -title: "¿Ya has probado los Cuadernos de Jupyter? Te explicamos qué son y cómo te ayudarán en tu próxima investigación." -slug: ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion -date: 2020-01-13 -author: Rainer Palm -tags: [jupyter, cuaderno] -categories: [ciencia abierta, código abierto, programación, IDE] - -draft: false -usePageBundles: true -thumbnail: "/header.png" -featureImage: "/header.png" ---- - - - - - - - -¿Quieres cambiar tus artículos a un formato más intuitivo, legible y -fácil de editar? Si tu respuesta es sí, puedes hacerlo con los [Jupyter -Notebook](https://jupyter.org), una aplicación web que permite -incorporar código y texto a los documentos de una forma sencilla y -fluida; facilitando que otras personas colaboren en tu investigación. -Utilizar estos elementos permitirá ver la descripción y resultados de tu -analísis de una forma más gráfica y en tiempo real, algo especialmente -útil para garantizar la reproducibilidad de tus resultados. - - - -El uso de Jupyter Notebook es bastante común en las comunidades -científicas actuales: por ejemplo, la creación de la foto de un agujero -negro utilizó un cuaderno de Jupyter cuyo código está en [este -repositorio de GitHub](https://github.com/achael/eht-imaging). Así como -este, existe una gran variedad de ejemplos de uso de cuadernos de -Jupyter en todo tipo de áreas, los cuales usualmente están disponibles -en un repositorio público de [GitHub](https://github.com). Veamos a -continuación, con más profundidad, de qué se trata esta aplicación. - -## ¿Qué es Jupyter? - -Jupyter se refiere a la organización de código abierto sin fines de -lucro llamada **Project Jupyter**, que es la principal organización que -desarolla una multitud de proyectos, entornos de ejecución -principalmente en [Julia](https://julialang.org), -[Python](https://www.python.org) y [R](https://www.r-project.org), de -allí se construye su nombre. El principal propósito de Jupyter es -“apoyar la ciencia de datos interactiva y la computación científica en -todos los lenguajes de programación” -[(Jupyter)](https://jupyter.org/about). De hecho, todos sus proyectos -son desarrollados de forma abierta en GitHub bajo la licencia modificada -de [BSD](https://whatis.techtarget.com/definition/BSD-licenses). El -proyecto promete mantener disponible tanto el software como su código, -para su uso libre. - -Sin duda, la característica más popular de Jupyter Notebook, es ser una -aplicación web que permite editar y compartir documentos (llamados -"cuadernos de jupyter") que contienen trozos de código, visualizaciones, -ecuaciones, entre otras, todas interactivas y ejecutadas en tiempo real. -La integración de los elementos *rich media* en documentos intuitivos y -sencillos de editar, la ha convertido en una herramienta muy popular en -la elaboración de artículos, análisis e investigaciones científicas. - -Además de Notebook, el proyecto Jupyter ofrece un entorno de desarrollo -llamado [JupyterLab](https://jupyterlab.readthedocs.io), que posee una -interfaz simple, personalizable y capacidades modulares para que puedas -añadir nuevos componentes o plugins según lo consideres necesario. -Jupyter Notebook y Jupyter-lab tienen una interfaz muy parecida, sin -embargo, este último ofrece más funcionalidades. - -## ¿Qué es un cuaderno de Jupyter? - -Un cuaderno de Jupyter es simplemente un archivo *.ipynb* generado por -la aplicación web, que contiene una multitud de ‘celdas’ con código, -texto Markdown (en formato [LaTeX](https://www.latex-project.org)), o -metadatos (*raw*). Al ser interpretadas por Jupyter, estas celdas -terminan teniendo una apariencia muy similar a la de un documento de -texto, y tras ejecutar las celdas que contienen código, se muestra la -salida en otra celda. Es muy común el uso de bibliotecas como -[matplotlib](https://matplotlib.org) para mostrar gráficos (dentro de -las celdas de código), pero gracias a su versatilidad, puede ser -utilizado también para mostrar videos o imágenes que cambien o se -actualizen a lo largo del tiempo, para mostrar enlaces a archivos -locales o instalar *kernels* de otros lenguajes, lo cual amplía sus -posibilidades. - -## ¿Cómo uso Jupyter? - -Si deseas hacer tu propio cuaderno de Jupyter y experimentar un poco, -solamente tienes que ir al [sitio web](https://jupyter.org/try), donde -encontrarás varias opciones para probar Jupyter con varios lenguajes de -programación desde una interfaz web, sin tener que instalar nada. Dentro -de esta página, puedes acceder a enlaces de entornos virtuales -prefabricados dentro del sitio como [MyBinder](https://mybinder.org). -Mybinder es un sitio en el cual podrás crear un entorno virtual a partir -de un repositorio de github, con el que podrás interactuar y -experimentar con tus cuadernos de Jupyter. - -Si deseas utilizar Jupyter desde tu computadora, basta con instalarlo -utilizando *pip* o *conda*. Sin embargo, la popular distribución -[Anaconda](https://www.anaconda.com) incluye los paquetes necesarios -para utilizar Jupyter, y es la opción recomendada por el propio Project -Jupyter. Simplemente tendrás que dirigirte al [enlace de -descarga](https://www.anaconda.com/distribution/) para instalarla. -Después de esto, podrás ejecutar Jupyter Notebook desde la terminal, y -acceder a la interfaz web desde la URL http://localhost:8888 (por -defecto). - -## ¿Quién usa Jupyter? - -Jupyter es un proyecto apoyado abiertamente por empresas como Google (de -hecho, puedes hacer cuadernos de Jupyter en el propio Google Drive, -utilizando Google Colab), Microsoft e IBM. Además de una gran cantidad -de universidades alrededor del mundo. No es extraño, que en el propio -GitHub se encuentren alrededor de 5 millones de cuadernos de Jupyter -(según un análisis que utiliza también un cuaderno para mostrar sus -resultados! [(nbestimate)](https://github.com/parente/nbestimate), y que -abarquen áreas desde la ciencia de datos, estadística o economía, hasta -las ciencias sociales o psicología. También existe una gran cantidad de -listas curadas [(A gallery of interesting Jupyter -Notebooks)](https://github.com/jupyter/jupyter/wiki/A-gallery-of-interesting-Jupyter-Notebooks) -con ejemplos de aplicaciones reales de Jupyter. - -Jupyter es, sin duda, una de las iniciativas de ciencia abierta más -prometedoras que hay. Cuenta con una popularidad inmensa incluso fuera -de su área de enfoque, y una accesibilidad bastante impresionante que -permite a científicos, de todo tipo de trasfondos, aprovechar de sus -capacidades rich media en cuestión de segundos. Y para aquellos que -deseen entrar un poco más profundo en el tema, existe una gran cantidad -de recursos y documentación de apoyo dedicado a Jupyter [(Jupyter -Guide)](https://github.com/jupyter-guide/jupyter-guide) que hace de tu -aprendizaje algo bastante sencillo e indoloro. Llevar tus -investigaciones a otro nivel es cuestión de comenzar a aprender, ¡nada -más! - -### Referencias - -- [Jupyter](https://jupyter.org/about) - -- [nbestimate](https://github.com/parente/nbestimate) - -- [A gallery of interesting Jupyter Notebooks](https://github.com/jupyter/jupyter/wiki/A-gallery-of-interesting-Jupyter-Notebooks) - -- [Jupyter Guide](https://github.com/jupyter-guide/jupyter-guide) \ No newline at end of file diff --git a/content/calendar.html b/content/calendar.html deleted file mode 100644 index d49c50065..000000000 --- a/content/calendar.html +++ /dev/null @@ -1,22 +0,0 @@ -+++ -title = "Open Science Labs Public Google Calendar" -description = "Open Science Labs, sharing knowledge" -date = "2019-02-28" -aliases = ["calendar"] -author = "OSL Team" -sidebar = false -singlecolumn = true -+++ - - - - - - - - - - - diff --git a/content/discord.html b/content/discord.html deleted file mode 100644 index 0a32e1676..000000000 --- a/content/discord.html +++ /dev/null @@ -1,22 +0,0 @@ -+++ -title = "Discord" -description = "Open Science Labs, sharing knowledge" -date = "2019-02-28" -aliases = ["discord"] -author = "OSL Team" -sidebar = false -singlecolumn = true -+++ - - - - - - - - - - - diff --git a/content/facebook.html b/content/facebook.html deleted file mode 100644 index b6dfab6b6..000000000 --- a/content/facebook.html +++ /dev/null @@ -1,22 +0,0 @@ -+++ -title = "Open Science Labs Facebook" -description = "Open Science Labs, sharing knowledge" -date = "2019-02-28" -aliases = ["facebook"] -author = "OSL Team" -sidebar = false -singlecolumn = true -+++ - - - - - - - - - - - diff --git a/content/faq/index-en.md b/content/faq/index-en.md deleted file mode 100644 index 93b50fd0b..000000000 --- a/content/faq/index-en.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -showdate: false -showreadtime: false -draft: true -aliases: ["/en/faq/"] ---- - - -## What is Open Science Labs (OSL)? - -Open science labs is a community that aims to gather people from all -parts of the world (specially from latin america countries) and create an -open space for teaching, learning and sharing topics around open science -and computational tools. - -## What activities do you perform? - -We create and contribute to the OpenSource community focused on Open -Science, creating articles about Open Science tools, DevOps Projects, -Data Science and Open Hardware. We also have information exchange spaces -through Discord and we develop Mentoring and specific training -processes, favoring the acquisition of new skills in those who contact -us. - - -## Who are the members of Open Science Labs? - -In the community there are several curious people with different -professions and who perform various activities and collaborate on a -voluntary basis. Some of the professions of those who are part of Open -Science Labs are: technical skills in electricity, environmental -engineering, fullStack developers, political science and computer -engineering, all located in different parts of Latin America. - - -## How can I contribute to the community? - -* You can fill out the form below so that we can contact you and - coordinate a video call to set up activities, [click - here](https://github.com/OpenScienceLabs/request-forms/issues/new/choose?fbclid=IwAR3pDhR5soLQJrgKTUzmT9I1ty8rEyMTtn8LarkDzdDqkUadQc_ugwX5IsE) - -* Or you can also request that your contribution as an article or source - code be shared on the community's social media or repository, - through Discord. Once your contribution is incorporated, it will be - Open Source with a license type [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) and your name - will be added to the list of contributors to Open Science Labs. - - -## Do you offer mentoring? - -Yes, to become an OSL mentee just fill out this -[form]https://github.com/OpenScienceLabs/request-forms/issues/new/choose?fbclid=IwAR3pDhR5soLQJrgKTUzmT9I1ty8rEyMTtn8LarkDzdDqkUadQc_ugwX5IsE) -and we will notify you as soon as possible if we have a mentor -available. You can also be a tutor or mentor by filling out this other -form -[here](https://github.com/OpenScienceLabs/request-forms/issues/new/choose?fbclid=IwAR3pDhR5soLQJrgKTUzmT9I1ty8rEyMTtn8LarkDzdDqkUadQc_ugwX5IsE). - - -## What specific activities are you currently doing? - -At Open Science Labs we are working on: - -* Implementation and maintenance of our website. -* DevOps mentoring. -* Tool guides for R and other frequently used tools in Open Science. -* Creation of articles on emerging technologies and Open Science. -* Management of social media. - -## Are you paying them anything? - -No, the community is maintained thanks to the volunteers who give their -free time to the community. However, we are planning to get support to -sustain our work. - -## I have some suggestions. How do I contact OSL? - -You can do it through Discord. There is almost always an administrator -who can answer you. [Discord Group](https://opensciencelabs.org/discord) - -## Who manages OSL? - -We have a Steering Council, which meets weekly to set activities and -goals for the community. - - -## What type of license does Open Science Labs have? - -Everything we share is under the [CC BY-SA 4.0 -License](https://creativecommons.org/licenses/by-sa/4.0/), meaning that -you can share, redistribute or transform the material as long as: proper -credit is given to the author and that if you transform them they must -be distributed under the same license. For more details about the -license you can visit the Creative Commons website -[Attribution-ShareAlike 4.0 -Internacional](https://creativecommons.org/licenses/by-sa/4.0/). - -## What is your motivation for contributing to the Open Source community? - -We believe that education and technology should be as accessible as -possible for everyone. And to achieve this, Open Science Labs is a good -place! diff --git a/content/faq/index.md b/content/faq/index.md deleted file mode 100644 index ba0dff4ec..000000000 --- a/content/faq/index.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -showdate: false -showreadtime: false -aliases: ["/es/faq"] ---- - - -### ¿Qué es Open Science Labs (OSL)? -Open Science Labs es una comunidad que tiene como objetivo unir a personas de todas partes del mundo, especialmente de países latinoamericanos y crear un espacio abierto para enseñar, aprender y compartir temas relacionados con la ciencia abierta y las herramientas computacionales. - -### ¿Qué actividades realizan? -Creamos y contribuimos a la comunidad OpenSource enfocada en Ciencia Abierta, creando artículos sobre herramientas para la Ciencia Abierta, Proyectos en DevOps, Ciencia de Datos y Open Hardware. También disponemos de espacios de intercambio de información a través de Discord y desarrollamos procesos de Mentorías y capacitaciones específicas, favoreciendo la adquisición de nuevas destrezas en quienes nos contactan. - -### ¿Quiénes componen Open Science Labs? -En la comunidad están varias personas curiosas con diferentes profesiones y que realizan diversas actividades y que colaboran de forma voluntaria. Algunas de las profesiones de quienes conforman Open Science Labs son: destrezas técnicas en electricidad, ingeniería ambiental, fullStack developers, ciencias políticas e ingeniería informática ubicadas todas en diferentes partes de Latinoamérica. - -### ¿Cómo puedo aportar a la comunidad? -* Puedes llenar el formulario para que nosotros te podamos contactar y coordinar una videollamada para establecer actividades. [click aquí](https://github.com/OpenScienceLabs/request-forms/issues/new/choose?fbclid=IwAR3pDhR5soLQJrgKTUzmT9I1ty8rEyMTtn8LarkDzdDqkUadQc_ugwX5IsE) -* O también puedes solicitar que tu aporte como artículo o código fuente se comparta en las redes sociales de la comunidad o el repositorio, a través de Discord. Una vez que tu aporte sea incorporado este será de Código Abierto con licencia tipo [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) y se agregará tu nombre a la lista de quienes contribuyen con Open Science Labs. - -### ¿Ofrecen mentorías? -Sí, para hacerte un mentorado de OSL solo llena este [formulario](https://github.com/OpenScienceLabs/request-forms/issues/new/choose?fbclid=IwAR3pDhR5soLQJrgKTUzmT9I1ty8rEyMTtn8LarkDzdDqkUadQc_ugwX5IsE) y te avisaremos a la brevedad notificándote si tenemos un tutor disponible. -También puedes ser tutor o mentor, para lo cual llena este otro formulario de [aquí](https://github.com/OpenScienceLabs/request-forms/issues/new/choose?fbclid=IwAR3pDhR5soLQJrgKTUzmT9I1ty8rEyMTtn8LarkDzdDqkUadQc_ugwX5IsE). - -### ¿Qué actividades específicas están haciendo actualmente? -En Open Science Labs estamos trabajando en: -* Puesta en marcha y mantenimiento de nuestra página web. -* Mentorías en DevOps. -* Guias de herramientas para R y otras herramientas de uso frecuente en Ciencia Abierta. -* Creación de artículos sobre tecnologías emergentes y Ciencia Abierta. -* Manejo de redes sociales. - -### ¿Les están pagando algo? -No, la comunidad se mantiene gracias al voluntariado que aporta su tiempo libre a la comunidad. Aunque está entre nuestros planes conseguir apoyos para el sostenimiento de nuestra labor. - -### Tengo algunas sugerencias. ¿Cómo me contacto con OSL? -Puedes hacerlo a través de Discord, casi siempre está un administrador que puede responderte. [Discord Group](https://opensciencelabs.org/discord) - -### ¿Quiénes dirigen OSL? -Tenemos una Junta directiva(Steering Council), la cual se reúne semanalmete para fijar actividades y metas para la comunidad. - -### ¿Qué tipo de licencia tiene OpenScienceLabs? -Todo lo que compartimos está bajo la [Licencia CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/), es decir que puedes compartir, redistribuir o transformar el material siempre que: se dé el crédito apropiado al autor y que si los transformas se debe distribuir bajo la misma licencia. Para más detalles sobre la licencia puedes visitar la página web de Creative Commons [Attribution-ShareAlike 4.0 Internacional](https://creativecommons.org/licenses/by-sa/4.0/). - - -### ¿Cuál es su motivación para aportar a la comunidad Open Source? -Creemos que la educación y la tecnología deberían ser lo más accesible posible para todos. Y para lograrlo ¡OpenScienceLabs es un buen lugar! diff --git a/content/guidelines/_index.md b/content/guidelines/_index.md deleted file mode 100644 index 7eaeea9f2..000000000 --- a/content/guidelines/_index.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -aliases: ["/toc/", "/guidelines/toc/", "/guidelines/list/"] ---- -# The Open Science Labs Guideline is a collection of documents about how to get started in specific areas. - -## Articles - -In this section, there are the guideline about how to write the blog posts for Open Science Labs. -OSL Blogs can be accessed at: [https://opensciencelabs.org/blog/](https://opensciencelabs.org/blog/). - - - - - -## Diversity, Equity and Inclusion (DEI) - -Open Science Labs (OSL) is a community that offers an open space to share, -learn and teach topics related to Open Science and Computational Technologies -to people from Latin America or any part of the world. - -DEI is a very important aspect of our community and we really care about that. - -In this section we can find our initial DEI declaration. - - - -## DevOps - -In this section, we have the documentation about all our infrastucture -(work in progress), and our goal is to have the necessary information -for anyone who wants to help us in the DevOps tasks. - -### Discord - - - -## Fund Raiser - -In the section, we are gathering all the information and investigation results -about grants, institutes, fiscal sponsors, etc that can help us to decide -the fund raising activities and help other communities as well. - -Documents in Spanish: - - - - -## Mentoring - -In this section, there are documents about Open Science Labs Mentoring program. -The mentoring could be running as a community mentoring, where someone from the community -for the mentoring program and Open Science Labs tries to find one mentor inside our -community, using discord, or using the social media, in order to reach someone outside. - -Another way that the mentoring can happen is inside the internship program. - -Documents in Spanish: - - - -Documents in English: - - - -## Marketing - -In this section, we have some materials researched that maybe could be useful for -other communities or for OSL in the future. - - - - -## Roadmap - -If you are interested in the Open Science Labs next steps, -please check our [Roadmap](/roadmap/). - - -## Governance - -For more information about our project governance, please -check [governance document](/governance/). - - diff --git a/content/guidelines/articles/guide.en.md b/content/guidelines/articles/guide.en.md deleted file mode 100644 index 4117018c1..000000000 --- a/content/guidelines/articles/guide.en.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: "Editorial Guidelines for Article Creation" -date: 2019-04-08 -author: Mariangela Petrizzo -draft: true -usePageBundles: false -featured: true ---- - -## General Introduction - -The purpose of this guide is to accompany the first steps of OSL collaborators in the elaboration of their posts to be published in our blog. - -In reading this guide you will find a simplified basis of the different elements that should be taken into account in the writing of this material. - -## Basic characteristics of the posts - -- Although translated materials from other languages, correctly referenced, will be admitted, in general the articles must be unpublished. This will improve the positioning of the portal as a reference. Important: Do not address similar topics to previous articles in the blog. -- In the articles we address general topics of open science, open source software used in open science projects, team management, collaborative science, and use of applications, libraries and other specific tools, among others. -- The expected length of posts is up to 900 words. A minimum desirable length is 750 words. -- Each post should be accompanied by a header image or featured image. In recent articles, images have been obtained from some of these sites: - - - - - - -- Additionally, depending on the length of the article, there may be internal images that serve as visual support for the ideas presented. -- Use Google Trends to locate reference words for article content. -- Titles must comply with the following characteristics: be short, be linked to the content of the article and invite to read it. -- Emoticons can be added in the titles without abusing them. -- Up to three internal subtitles can be used to separate the sections of the article if necessary. The subtitles have the H2 heading size. -- It is important to include references to the articles we provide from our portal. -- It is also very important to include internal links in the articles. Links to previous articles in the portal, as well as links to the pages of the projects, applications, and tools that are reviewed in it among others. -- Attention to tags, always include them without making them too simple or imprecise. -- The images used must have "Alt" content specified and authorship at the bottom of the image. - -## About tone and inclusive language - -- The articles are written in a close, simple, direct, clear and precise tone. -- We are not interested in showing wisdom but in sharing knowledge! -- We want to encourage more people to engage in collaborative and open science practices. The tone should be fresh, even in tasks that are a bit more complex to explain, the idea is to encourage those who read us to continue with open science practices. -- We practice inclusive language. Therefore, we seek the generic use of words that do not indicate any sex or gender in a preferential way: people, participants, who, among others. -- In the case of having to use a word that denotes sex and gender, we also indicate references to other genders and sexes: /a/e. This applies to both singular and plural. -- In general, both tone and speech should be respectful and clear. Words that, for cultural reasons, may be misunderstood in other cultures should be avoided. -- At OSL we are very respectful of other cultures, religious practices, political preferences, sports and, in general, we never address in our articles our personal preferences in any area that may be controversial and uncomfortable to those who read us. This is key to making this space a safe place where passion and interest in open science brings us together and encourages collaboration. -- Although articles may refer to personal experiences, it is always important to keep the focus of the writing on proposing a solution to a need for information or knowledge on the topics addressed. - -## Workflow - -- Each contributor establishes the pace of work that he/she will contribute to the portal and selects the topics and order in which they will be taken on, as well as the dates when they will be available for review. -- Each collaborator has an initial support from 1 to 3 weeks for wordpress management and first steps with the editing flow, as agreed by the OSL Board. -- Contributor writes the article from his/her account in the portal. -- Once the article is finished, along with the suggested images, it remains in draft form waiting for the person assigned to the revision to make a basic review of spelling, clarity and coherence. -- The person who reviews the article for publication is the one who must schedule its publication in the portal. -- The articles must have between 5 and 8 keywords that will be placed in the LABELS section of the article. -- Likewise, each article must have the category to which it belongs. -- Unless otherwise indicated or previously agreed, no contributor should edit other contributors' writings. -- Our contributors are encouraged to replicate their publications in our portal, through their personal social networks, as long as reference is made to OSL's social networks for their promotion. - -## Proposed topics - -- Guides for installing frequently used applications, libraries or libraries in open science and similar practices. Suggested titles: Learn how to install XX in a few minutes, We show you how to install XX on your PC quickly. -- Tips to help solve specific problems. Suggested titles: 5 tips you need to know to improve XX performance, 3 keys to keep an eye on for your next open science project. -- Articles for the general public with information on aspects related to open science, collaborative labs, citizen science, among others. -- Translations of interesting and relevant articles for the OSL portal (previous consultation with the editorial team). -- Reviews of articles, books, videos, podcasts related to open science and similar topics. diff --git a/content/guidelines/articles/guide.md b/content/guidelines/articles/guide.md deleted file mode 100644 index 646e1cfcf..000000000 --- a/content/guidelines/articles/guide.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: "Guía Editorial para creación de Artículos" -date: 2019-04-08 -author: Mariangela Petrizzo -draft: false -usePageBundles: false -featured: true ---- - -## Introducción General - -El propósito de esta guía es acompañar los primeros pasos de colaboradoras y colaboradores de OSL en la elaboración de sus posts para ser publicados en nuestro blog. - -En la lectura de esta guía se encuentra una base simplificada de los distintos elementos que se deben tener en cuenta en la escritura de este material. - -## Características básicas de los posts - -- Aunque se admitirán eventualmente materiales traducidos de otros idiomas, correctamente referenciados, en general los artículos deberán ser inéditos. Esto permitirá mejorar el posicionamiento del portal como referencia. Importante: No abordar temas similares a artículos anteriores en el blog. -- En los artículos abordamos temas generales de ciencia abierta, software de fuentes abiertas que se utiliza en proyectos de ciencia abierta, gestión de equipos de trabajo, ciencia colaborativa, y uso de aplicaciones, bibliotecas y otras herramientas específicas, entre otros. -- La extensión esperada de los posts es de hasta 900 palabras. Una extensión mínima deseable es de 750 palabras. -- Cada post debe ir acompañado de una imagen de cabecera o imagen destacada. En los artículos recientes, las imágenes han sido obtenidas de algunos de estos sitios: - - - - - - -- Adicionalmente, según la extensión del artículo, pueden haber imágenes internas que sirvan de soporte visual a las ideas planteadas. -- Utilizar Google Trends para localizar palabras de referencia para contenidos de artículos -- Los títulos deben cumplir con las siguientes características: ser cortos, estar vinculados con el contenido del artículo e invitar a su lectura. -- En los títulos se pueden agregar emoticones sin abusar de ellos. -- Pueden utilizarse hasta tres subtítulos internos para separar las secciones del artículo en caso de ser necesario. Los subtítulos llevan el tamaño de encabezado H2 -- Es importante incluir referencias a los artículos que facilitamos desde nuestro portal. -- Asimismo, es muy importante incluir enlaces internos en los artículos. Enlaces tanto a artículos previos en el portal, como enlaces a las páginas de los proyectos, aplicaciones, y herramientas que se reseñan en él entre otros. -- Atención a las etiquetas, siempre incluirlas sin hacerlas muy simples o poco precisas. -- Las imágenes utilizadas deben tener contenido “Alt” especificado y autoría al pie de la imagen. - -## Sobre el tono y el lenguaje inclusivo - -- Los artículos se escriben con un tono cercano, simple, directo, claro y preciso -- ¡No nos interesa mostrar sabiduría sino compartir conocimiento! -- Queremos animar a más personas a que realicen prácticas colaborativas y de ciencia abierta. El tono debe ser fresco, incluso en tareas algo más complejas de explicar, la idea es animar a quienes nos leen a que continúen con las prácticas de ciencia abierta. -- Practicamos lenguaje inclusivo. Por ello buscamos el uso genérico de las palabras que no indican ningún sexo ni ningún género de forma preferente: personas, participantes, quienes, entre otras. -- En caso de deber utilizar alguna palabra que denote sexo y género, indicar también las referencias a otros géneros y sexos: /a/e. Esto se aplica tanto al singular como al plural. -- En general, tanto el tono como el discurso debe ser respetuoso y claro. Se evitarán palabras que, por razones culturales puedan ser malinterpretadas en otras culturas. -- En OSL somos muy respetuosos/as/es de otras culturas, prácticas religiosas, preferencias políticas, deportivas y, en general, nunca abordamos en los artículos nuestras preferencias personales en cualquier ámbito que pueda resultar controversial y resultar incómodo a quienes nos leen. Esto es clave para hacer de este espacio un lugar seguro en el que la pasión e interés por la ciencia abierta, nos reúna y anime a colaborar. - Aunque en los artículos puede hacerse referencia a experiencias personales, siempre es importante mantener el foco de los escritos en la propuesta de una solución a una necesidad de información o conocimiento sobre los temas abordados. - -## Flujo de trabajo - -- Cada colaborador/a/e establece el ritmo de trabajo que aportará al portal y selecciona los temas y orden en que serán asumidos, así como las fechas en que estarán disponibles para su revisión. -- Cada colaborador/a/e cuenta con un acompañamiento inicial entre 1 hasta 3 semanas para manejo del wordpress y primeros pasos con el flujo de edición, según lo acordado el Board de OSL. -- Colaborador/a/e elabora el artículo desde su cuenta en el portal. -- Una vez terminada la escritura del artículo, junto con las imágenes sugeridas, éste permanece en borrador a la espera de que quien esté asignado/a/e a la revisión, le haga una revisión básica de ortografía, claridad y coherencia. -- Quien revisa el escrito para su publicación es quien debe programar su publicación en el portal. -- Los artículos deben contar con entre 5 y 8 palabras clave que serán colocadas en la sección ETIQUETAS del escrito. -- Igualmente, cada escrito debe contar con la categoría a la cual pertenece. -- Salvo indicación o acuerdo previo, ningún colaborador/a/e debe editar escritos de otros colaboradores/as. -- Se anima a nuestros/as/es colaboradores/as a que repliquen sus publicaciones en nuestro portal, a través de sus redes sociales personales, siempre que se haga referencia a las redes sociales de OSL para su promoción. - -## Temas propuestos - -- Guías para instalación de aplicaciones, bibliotecas o librerías de uso frecuente en ciencia abierta y prácticas similares. Títulos sugeridos: Aprende a instalar XX en unos pocos minutos, Te mostramos cómo instalar XX en tu PC rápidamente. -- Trucos que ayudan a resolver problemas específicos. Títulos sugeridos: 5 tips que necesitas saber para mejorar el rendimiento de XX, 3 claves que no debes perder de vista en tu próximo proyecto de ciencia abierta. -- Artículos para público general con divulgación de aspectos relativos a ciencia abierta, laboratorios colaborativos, ciencia ciudadana entre otros. -- Traducciones de artículos interesantes y relevantes para la temática del portal de OSL (previa consulta con equipo editorial). -- Reseñas sobre artículos, libros, videos, podcasts referidos al ámbito de ciencia abierta y similares. diff --git a/content/guidelines/coc-mentoring/coc-mentoring.en.md b/content/guidelines/coc-mentoring/coc-mentoring.en.md deleted file mode 100644 index 65203f43d..000000000 --- a/content/guidelines/coc-mentoring/coc-mentoring.en.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: "Guía Editorial para creación de Artículos" -date: 2019-04-08 -author: Mariangela Petrizzo -draft: true -usePageBundles: false ---- - - -# Mentoring Code of Conduct - -By accessing or using the OSL mentoring services, and thereby becoming a part of this community, you are agreeing to abide by our Code of Conduct. - -Participants agree not to engage in any tortious or criminal activity and if you do engage in such activity, you understand that you are fully responsible to the fullest extent of the law and that you will retain your own legal counsel at your own expense, pay and all necessary fines and other costs and agree to hold OSL harmless. OSL is further indemnified for any actions that you take outside the scope of your contract and mentorship. - -Participation is voluntary and participants shall fully indemnify, hold harmless and defend (collectively “indemnify” and “indemnification”) OSL and its staff or members from and against all claims, demands, actions, suits, damages, liabilities, losses, settlements, judgments, costs and expenses (including but not limited to reasonable attorney’s fees and costs), whether or not involving a third party claim, which arise out of or relate to (1) any breach of any representation or warranty of OSL contained in this Agreement, (2) any breach or violation of any covenant or other obligation or duty of OSL under this Agreement or under applicable law, (3) (4) (5)] [other enumerated categories of claims and losses], in each case whether or not caused by the negligence of OSL or any other Indemnified Party and whether or not the relevant Claim has merit. - -### Mentors and Mentees - -As a participant in the mentoring community, you agree to: - - * Treat others within the mentoring community with respect. - * Put an honest effort and commit sufficient time towards each mentoring relationship established. - * Not promote goods or services from sources in which you have a financial or personal interest. - * Not accept fees or commissions. - * Represent oneself honestly without fake identities or aliases. - * Recognize the diversity of the OSL community and respect the variety of cultural norms, beliefs, practices, and values it contains. - -#### Mentors - -As a mentor within the community, you agree to: - - * Not use any ideas, products or materials that a mentee has, or may develop, to further your own business or financial interests. - * Maintain the confidentiality of all ideas, products or materials that have been entrusted to you by your mentee. - * Encourage your mentee to maintain the highest ethical standards in their works. - * Maintain a high standard of personal and professional conduct with your mentee. Demonstrates empathy without making the mentee feel uncomfortable. - * Always communicate in a truthful manner. - * Support the goals of your mentee and help him/her set achievable goals. - * Avoid the intent or appearance of unethical or compromising practice in relationships, actions and communications. - * Refer your mentee to the mentoring program administrator for issues or questions for which you feel unqualified. - * Don’t hesitate to ask questions if you find any part of the guidelines unclear or confusing. - * Both the mentor and the mentee have great responsibility to maintain and respect the confidentiality of all the information imparted during the mentoring relationship as they may hear sensitive and personal information. However, if such information is dangerous or illegal, an appropriate approach for the mentor is to encourage the mentee to take appropriate action themselves. - -#### Mentees - -As a mentee within our community, you agree to: - - * Put effort and energy into getting matched with a mentor. - * Create relevant, specific, detailed, and clear mentoring relationship. - * Maintain the confidentiality of your mentoring relationship. - * Build proactively your mentoring relationship. - * Communicate regularly and openly with your mentor. - * Honor your commitment to your mentor and to your learning process. - * Complete any tasks agreed upon between your mentor and yourself. - * Hold all sensitive information provided through your mentoring relationship in strict confidence. diff --git a/content/guidelines/coc-mentoring/coc-mentoring.md b/content/guidelines/coc-mentoring/coc-mentoring.md deleted file mode 100644 index 5e26e0da0..000000000 --- a/content/guidelines/coc-mentoring/coc-mentoring.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: "Código de conducta de las mentorías" -date: 2019-04-08 -author: Mariangela Petrizzo -draft: false -usePageBundles: false -tags: ["mentoria", "coc"] ---- - - - -# Código de conducta de las mentorías - -Al acceder o utilizar los servicios de tutoría de OSL, y por lo tanto formar parte de esta comunidad, usted está de acuerdo en cumplir con nuestro Código de Conducta. - -Los participantes se comprometen a no participar en ninguna actividad torticera o criminal y si usted se involucra en dicha actividad, usted entiende que es totalmente responsable en la medida de la ley y que va a contratar a su propio abogado a su propio costo, pagar y todas las multas necesarias y otros costos y se compromete a mantener OSL inofensivo. Además, OSL queda indemnizada por cualquier acción que usted realice fuera del ámbito de su contrato y tutoría. - -La participación es voluntaria y los participantes deberán indemnizar, eximir de responsabilidad y defender (colectivamente "indemnizar" e "indemnización") a la OSL y a su personal o miembros de y contra todas las reclamaciones, demandas, acciones, juicios, daños, responsabilidades, pérdidas, acuerdos, juicios, costes y gastos (incluyendo pero no limitado a los honorarios y costes razonables de los abogados), ya sea o no la participación de una reclamación de terceros, que surgen de o se relacionan con (1) cualquier incumplimiento de cualquier representación o garantía de OSL contenida en este Acuerdo, (2) cualquier incumplimiento o violación de cualquier pacto u otra obligación o deber de OSL bajo este Acuerdo o bajo la ley aplicable, (3) (4) (5)] [otras categorías enumeradas de las reclamaciones y las pérdidas], en cada caso, sea o no causada por la negligencia de OSL o cualquier otra parte indemnizada y si la reclamación correspondiente tiene mérito. - -## Mentores y alumnos - -Como participante en la comunidad de mentores, usted se compromete a: - - * Tratar a los demás dentro de la comunidad de mentores con respeto. - * Hacer un esfuerzo honesto y dedicar el tiempo suficiente a cada relación de mentoring que se establezca. - * No promover bienes o servicios de fuentes en las que tenga un interés financiero o personal. - * No aceptar honorarios o comisiones. - * Representarse honestamente sin identidades falsas o alias. - * Reconocer la diversidad de la comunidad OSL y respetar la variedad de normas culturales, creencias, prácticas y valores que contiene. - -### Mentores - -Como mentor dentro de la comunidad, te comprometes a - - * No utilizar ninguna idea, producto o material que un alumno tenga, o pueda desarrollar, para promover su propio negocio o intereses financieros. - * Mantener la confidencialidad de todas las ideas, productos o materiales que le hayan sido confiados por su alumno. - * Animar a sus alumnos a mantener los más altos estándares éticos en sus trabajos. - * Mantenga un alto nivel de conducta personal y profesional con su alumno. Demuestra empatía sin hacer que el alumno se sienta incómodo. - * Comunica siempre de forma veraz. - * Apoya los objetivos de tu alumno y ayúdale a establecer metas alcanzables. - * Evita la intención o la apariencia de prácticas poco éticas o comprometedoras en las relaciones, acciones y comunicaciones. - * Remita a su pupilo al administrador del programa de tutoría en el caso de cuestiones o preguntas para las que no se sienta capacitado. - * No dude en hacer preguntas si encuentra alguna parte de las directrices poco clara o confusa. - * Tanto el mentor como el alumno tienen la gran responsabilidad de mantener y respetar la confidencialidad de toda la información impartida durante la relación de mentoría, ya que pueden escuchar información sensible y personal. Sin embargo, si dicha información es peligrosa o ilegal, un enfoque apropiado para el mentor es animar al alumno a tomar las medidas adecuadas por sí mismo. - -### Tutoreados - -Como alumno de nuestra comunidad, usted se compromete a - - * Poner esfuerzo y energía en conseguir un mentor. - * Crear una relación de tutoría relevante, específica, detallada y clara. - * Mantener la confidencialidad de su relación de tutoría. - * Construir proactivamente su relación de mentoría. - * Comunicarse regular y abiertamente con su mentor. - * Cumplir el compromiso con su mentor y con su proceso de aprendizaje. - * Completar cualquier tarea acordada entre su mentor y usted. - * Mantener toda la información sensible proporcionada a través de su relación de tutoría en estricta confidencialidad. diff --git a/content/guidelines/community-management/guide-pt.md b/content/guidelines/community-management/guide-pt.md deleted file mode 100644 index 36f9ad033..000000000 --- a/content/guidelines/community-management/guide-pt.md +++ /dev/null @@ -1,18 +0,0 @@ ---- - -draft: true - ---- - - - diff --git a/content/guidelines/dei/guide.en.md b/content/guidelines/dei/guide.en.md deleted file mode 100644 index e059cd9a5..000000000 --- a/content/guidelines/dei/guide.en.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: "Statement on Diversity, Equity and Inclusion" -date: 2019-04-08 -author: Mariangela Petrizzo -draft: true -usePageBundles: false -featured: true -tags: ["DEI"] ---- - -## OSL Description: -Open Science Labs (OSL) is a community that offers an open space to share, learn and teach topics related to Open Science and Computational Technologies to the public in Latin America, but not restricted to it. - -### OSL Mission: -Create an open collaborative space for organic learning among all members of the community. -Diversity, Equity and Inclusion is one of the community's core values. - -### OSL Results: -Creation of local groups for knowledge dissemination. -Acculturation of collaborative and open work practices. -Activities for knowledge dissemination (blog, videos). - -## OSL DEI Statement: - -OSL recognizes that the **pedagogical processes associated with the development of new skills and abilities** are long term and are the result of the investment of time, the acceptance of diversity in equitable and fair conditions, perseverance and, above all, the cumulative impact of decisions framed by our purpose as an organization. Therefore, OSL sets its goals to achieve measurable progress in advancing DEI in four aspects: - -1. *Capabilities*: We will help the community of people with an interest in mastering open technologies and applying them in science, to develop the necessary capabilities to achieve this by generating diversity, equity and inclusion that is observable in their work and interaction spaces. -2. *DEI with meaning*: We will assume our actions and work as an organization with a positive and intentional focus on DEI among those who make up OSL in their different roles as collaborators, volunteers and Steering Council members. -3. *Diverse Open Science*: As a result of developing our current and future initiatives, we will achieve a more diverse community of people interested in technology in the field of open science. -4. *COC and DEI working together*: We will establish a Code of Conduct (COC) to ensure the establishment of positive practices towards the respect of all people and their considerations in terms of intellectual, academic and personal honesty in the development of our activities. - -Based on this, our community considers the following parameters with respect to the DEI: - -* **Diversity:** Our community is open to multiple demographics, social, political, identities, perspectives and backgrounds. - -* **Equity:** Those who make up our community, as well as its different groups and work teams, have access to all the opportunities and activities that we carry out as we organize them explicitly seeking to eliminate the barriers that have historically prevented the participation of minority or excluded groups. - -* **Inclusion:** Everyone in our community experiences a sense of belonging, high levels of commitment to the activities in which they participate, and shared and mutually expressed respect. diff --git a/content/guidelines/dei/guide.md b/content/guidelines/dei/guide.md deleted file mode 100644 index 4d2ebd2b8..000000000 --- a/content/guidelines/dei/guide.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: "Declaración de Diversidad, Equidad e Inclusión" -date: 2019-04-08 -author: Mariangela Petrizzo -draft: false -usePageBundles: false -featured: true -tags: ["DEI"] ---- - -## Descripción de OSL : -Open Science Labs (OSL) es una comunidad que ofrece un espacio abierto para compartir, aprender y enseñar temas relacionados de Ciencia Abierta y Tecnologías Computacionales al público de Latinoamérica, pero no restringido a ello. - -### Misión de OSL: -Crear un espacio abierto colaborativo para el aprendizaje orgánico entre todos de la comunidad. -La Diversidad Equidad e Inclusión es uno de los ejes de la comunidad. - -### Resultados de OSL: -Creación de grupos locales para difusión de conocimiento. -Aculturamiento de prácticas de trabajo colaborativo y abierto. -Actividades para difusión de conocimiento (blog, videos) - -## Declaración DEI de OSL: - -OSL reconoce que los **procesos pedagógicos asociados al desarrollo de nuevas habilidades y destrezas** son de largo aliento y son el resultado de la inversión de tiempo, la aceptación de la diversidad en condiciones equitativas y justas, la constancia y, sobre todo, el impacto acumulativo de decisiones enmarcadas en nuestro propósito como organización. Por ello, OSL establece sus objetivos para lograr un progreso medible en el avance de la DEI en cuatro aspectos: - -1. *Capacidades*: Ayudaremos a la comunidad de personas con interés en dominar las tecnologías abiertas y aplicarlas en la ciencia, a desarrollar las capacidades necesarias para lograrlo generando diversidad, equidad e inclusión que sea observable en sus espacios de trabajo e interacción. -2. *DEI con sentido*: Asumiremos nuestras acciones y quehacer como organización con un enfoque positivo e intencional de DEI entre quienes integran OSL en sus distintos roles de colaborador, voluntario e integrante de la Junta Directiva. -3. *Ciencia Abierta diversa*: Como resultado de desarrollar nuestras iniciativas actuales y futuras, conseguiremos una comunidad más diversa de personas interesadas por la tecnología en el ámbito de la ciencia abierta. -4. *COC y DEI en trabajo conjunto*: Estableceremos un Código de Conducta (COC) para garantizar el establecimiento de prácticas positivas hacia el respeto de todas las personas y sus consideraciones en términos de honestidad intelectual, académica y personal en el desarrollo de nuestras actividades. - -En función de ésto, nuestra comunidad considera los siguientes parámetros con respecto a la DEI: - -* **Diversidad:** Nuestra comunidad está abierta a múltiples características demográficas, sociales, políticas, identidades, perspectivas y orígenes. -* **Equidad:** Quienes integran nuestra comunidad, así como sus distintos grupos y equipos de trabajo tienen acceso a todas las oportunidades y actividades que realizamos en función que las organizamos buscando, de forma explícita, eliminar las barreras que han impedido históricamente la participación de grupos minoritarios o excluidos. -* **Inclusión:** Todas las personas que componen nuestra comunidad experimentan un sentimiento de pertenencia, altos niveles de compromiso con las actividades en las que participan y respeto compartido y mutuamente expresado. diff --git a/content/guidelines/devops/aws-en.md b/content/guidelines/devops/aws-en.md deleted file mode 100644 index eac05f77f..000000000 --- a/content/guidelines/devops/aws-en.md +++ /dev/null @@ -1,25 +0,0 @@ ---- - -draft: true - ---- - - - - -The OSL **AWS** server uses a bitnami instance. - -## HTTPS - -In order to configure **HTTPS** follow instructions from -[here](https://docs.bitnami.com/aws/how-to/generate-install-lets-encrypt-ssl/). diff --git a/content/guidelines/devops/discord.es.md b/content/guidelines/devops/discord.es.md deleted file mode 100644 index 3488bab7e..000000000 --- a/content/guidelines/devops/discord.es.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -draft: true ---- - - - - - -Discord es nuestra principal herramienta de comunicación con la -comunidad. El enlace directo a nuestro discord es -[http://discord.opensciencelabs.org](http://discord.opensciencelabs.org). - -## Convenciones - -Cada canal tiene un nombre único con un prefijo, según la categoría. Por -ejemplo, un canal dentro de la categoría Python comienza con el prefijo -`py-`. - -Algunos nombres de categorías son largos y a veces es difícil encontrar -un prefijo para eso. Pero, es importante que el prefijo tenga alguna -relación con la categoría. - -## Configuración - -Por determinar - -## Bots - -Utilizamos bots para ayudar a mantener nuestro servidor. - - -### MEE6 - -Para la clasificación estamos utilizando **MEE6**. No tenemos ninguna -actividad ni ninguna recompensa utilizando la puntuación de la -clasificación, pero tal vez en el futuro podamos utilizarla. - - -### Dyno - -**Dyno bot** se utiliza para tareas de mantenimiento, tales como: - - -- Mensaje de bienvenida -- Prohibir usuarios -- Bloquear usuarios -- etc - - -### YAGPDB.xyz - -El bot **YAGPDB.xyz** se utiliza para la suscripción en categorías. - -Para más información de cómo utilizarlo, consulte el siguiente tutorial: - -https://docs.yagpdb.xyz/tools-and-utilities/self-assignable-roles - -Cuando tengas el grupo y los roles configurados en **YAGPDB.xyz**, el -siguiente paso es crear un mensaje personalizado en **discord**, en el -canal que quieras tener este mecanismo de suscripción. - -1. En el mensaje, añade un título, una descripción general y los - emoticones y sus significados - (https://unicode.org/emoji/charts/full-emoji-list.html). - -2. Obtén el ID del mensaje (necesitas activar el modo de desarrollo). - -3. Ejecuta el siguiente comando `!yagpdb-rolemenu create (group name) -m - (message id) -nodm`, donde `(group name)` y `(message id)` son - marcadores de posición y deben ser reemplazados por los valores - correctos. - -**Nota**: Una alternativa a **yagpdb** sería -[**carl-bot**](https://top.gg/bot/235148962103951360). Pero por ahora, -**yagpdb.xyz** parece funcionar correctamente según nuestras -necesidades. - -## Desarrollo - -Tenemos un canal interno para discusiones sobre discord: -`#collab-devops-discord`. - -Además, hay un servidor de discord para desarrollo donde podemos probar -bots, nuevas configuraciones o nuevas características. - -Si quieres unirte a ese servidor, necesitas pedirlo en el canal -`#collab-devops-discord`. diff --git a/content/guidelines/fund-raiser/guide-es.md b/content/guidelines/fund-raiser/guide-es.md deleted file mode 100644 index 6518c333b..000000000 --- a/content/guidelines/fund-raiser/guide-es.md +++ /dev/null @@ -1,230 +0,0 @@ ---- -title: "Guía para Recaudación de Fondos" -date: 2019-04-08 -author: Yurely Camacho -draft: false -usePageBundles: false - ---- - - - - - -# Guía para Recaudación de Fondos - -## Patrocinadores fiscales - -Un patrocinador fiscal es una organización sin ánimo de lucro que -comparte su estatus 501(c)(3) con proyectos sin ánimo de lucro -cualificados. Con este estatus compartido, el proyecto no necesita -constituirse como 501(c)(3), lo que significa, entre otras cosas, que -tampoco tiene que presentar sus propios impuestos. - -### [Community Initiatives](https://communityin.org/) - -#### ¿Qué es Community Initiatives? - -Es un patrocinador fiscal dedicado cuyo único propósito es proporcionar -la mejor infraestructura para los líderes de las organizaciones sin -ánimo de lucro. Trabajan en varios temas y en diversas áreas -geográficas, también varían en cuanto a personal y presupuesto. - -#### [¿Cómo unirse a Community Initiatives?](https://communityin.org/apply/apply/) - -Para solicitar el patrocinio fiscal de Community Initiatives, los -posibles proyectos deben enviar un [formulario de -consulta](https://communityin.org/apply/new-business-inquiry-form/), si -parece que encajamos bien, el Vicepresidente de Servicios al Cliente nos -guiará a través del [proceso de -solicitud](https://communityin.org/apply/). - -#### [¿Qué contiene el formulario de consulta?](https://communityin.org/apply/new-business-inquiry-form/) - -Allí se solicita información sobre: datos personales del solicitante, -nombre, sitio web, misión del proyecto y las áreas que lo comprenden, el -presupuesto previsto del proyecto para el próximo año, desde cuándo -opera la organización sus programas, si trabajan actualmente con un -patrocinador fiscal o si han trabajado alguna vez con uno de ellos, si -se cuenta con un comité de consulta o supervisión. También piden una -aproximación de la cantidad de personas atendidas anualmente, si la -organización está dirigida por voluntarios, empleados, contratistas -independientes o una combinación de ellos y la forma en cómo se llegó a -conocer Community Initiatives. - -#### [¿Cómo es el proceso de solicitud?](https://communityin.org/apply/) - -1. Luego de enviar el formulario de consulta el Vicepresidente de -Servicios al Cliente de Community Initiatives se pondrá en contacto con -nosotros para realizar una llamada telefónica de presentación. En esta -conversación conocerán nuestro proyecto y determinarán si podemos -aplicar. - -2. Si al terminar la llamada telefónica deciden que podemos solicitar el -patrocinio fiscal, debemos presentar una solicitud y la documentación de -apoyo para completar el proceso. - -Las solicitudes completas incluyen los siguientes documentos requeridos: - -- Carta de presentación solicitando el patrocinio fiscal. - -- Formulario de solicitud de cuatro páginas. - -- Presupuesto del primer año (se requiere la plantilla de Community - Initiatives). - -- Plan de recaudación de fondos a tres años. - -- Biografía y curriculum vitae del Director Ejecutivo. - -- Biografías de los miembros del Comité Asesor. - -- Material adicional del programa (opcional). - -Las solicitudes se aceptan trimestralmente. Los plazos de solicitud -trimestral para este año: - -- 7 de enero - -- 8 de abril - -- 17 de junio - -- 23 de septiembre - -3. Posteriormente el personal de Community Initiatives programará una - reunión para comprender mejor las necesidades operativas del proyecto - y realizar una evaluación de riesgos de las actividades propuestas. - Será de 45 o 90 minutos de acuerdo al tipo o modelo de solicitud - considerada (A o C). - -4. La [Junta directiva de Community -Initiatives](https://communityin.org/meet-us/board-of-directors/) debe -aprobar la solicitud antes de que el proyecto se incorpore a su amplia -red. El estado de la solicitud erá notificado en el plazo de una semana -tras la revisión de la junta. - -5. Si aceptan la solicitud, se celebrará una reunión de orientación para -ayudarnos a sacar el máximo provecho de la asociación con Community -Initiatives; allí seleccionan una fecha de inicio que nos convenga. Si -el proyecto es aprobado, se debe realizar la inscripción en cualquier -momento en el plazo de un año desde la aceptación del proyecto. Los -proyectos seleccionados deben comenzar su labor en el plazo de un año a -partir de la aprobación de la junta directiva. - - -#### [¿Qué servicios nos brinda Community Initiatives?](https://communityin.org/services/) - -Community Initiatives proporciona una administración completa en las -áreas más intensivas en tiempo y experiencia de la gestión sin ánimo de -lucro, desde recursos humanos, administración de nóminas, preparación y -presentación de impuestos, gestión financiera y más. Con Community -Initiatives el 90% de nuestros ingresos quedarían en el personal y los -programas. - -Específicamente los servicios que ofrece son: - -- Manejo de **beneficios, nóminas y recursos humanos** entre ellos un -manual de personal actualizado, sistemas de contratación establecidos, -plan para la asistencia sanitaria de los empleados y otras prestaciones, -administración de las nóminas de los empleados y contratistas y expertos -de guardia para gestionar los problemas de recursos humanos. - -- **Administración del empleo**, cartas de oferta de trabajo y -autorizaciones de visado para empleados, ajustes salariales, ascensos, -cambios de título, aclaración de la FLSA, permisos de ausencia, etc. -Revisión de causas de despido, acuerdos de pago final, entrevistas de -salida, despidos, reducciones salariales, etc. Procesamiento de cheques, -W-9s, 1099s y mantenimiento de la información I-9. - - - *Administración de beneficios*: planes de salud y bienestar de los -empleados, administración de planes de jubilación a través de nuestro -401(k), administración de cuentas de gastos flexibles y administración -de COBRA - - - *Gestión de riesgos y cumplimiento*: mantenimiento de los -registros y la documentación del personal, cumplimiento normativo -(ERISA, FLSA, EEO y otras normativas federales y estatales), gestión de -riesgos de RR.HH. para la compensación de los trabajadores y el seguro -de desempleo, formación relacionada con el cumplimiento para los -directores y gerentes de proyectos (EEO, acoso sexual, etc.), plantillas -de contratistas independientes y su cumplimiento. - - - *Políticas de RRHH y relaciones con los empleados*: entrenamiento -para la gestión del rendimiento, manual del empleado completo, -asesoramiento en materia de relaciones con los empleados, resolución de -conflictos, gestión y administración de reclamaciones y mediación. - -- **Gestión financiera**: cuentas por pagar, cobros en efectivo, estados -financieros mensuales, informes y análisis financieros, gestión del -presupuesto y de la tesorería, auditoría anual independiente e informes -de cumplimiento y asesoramiento financiero. - -- **Preparación y cumplimiento de impuestos**: declaraciones fiscales e -informativas federales, estatales y locales; recepción de donaciones y -subvenciones deducibles de impuestos, acuse de recibo de donaciones -superiores a 250 dólares, como exige el IRS; remisión y presentación de -impuestos sobre la nómina, licencias comerciales estatales y locales. - -- **Apoyo a las subvenciones**: colaboración en el desarrollo de -solicitudes, revisión de borradores de propuestas, seguimiento financiero -de los fondos de la subvención, control del cumplimiento de las -subvenciones, seguimiento y apoyo a los informes de las subvenciones. - -- **Gestión de riesgos y seguros**: Community Initiatives ofrece la -siguiente protección a todos sus proyectos patrocinados fiscalmente: -Indemnización laboral Responsabilidad civil general Responsabilidad -civil general Propiedad comercial Automóviles propios y alquilados -Accidente Responsabilidad civil por prácticas laborales Responsabilidad -civil por delitos y robos de empleados - -- **Asesoramiento jurídico**. Community Initiatives ofrece acceso a -expertos legales en las siguientes áreas: marca comercial, propiedad -intelectual, demandas por discriminación, propiedad inmobiliaria, empleo -y discriminación, prórrogas del visado H-1 B, impuesto sobre la renta de -las empresas no relacionadas y acuerdos de asociación. Cuando el -proyecto requiera un apoyo legal altamente especializado o intensivo, -Community Initiatives cuenta con un experto legal a un precio reducido. - -- **Coaching**: los proyectos de Community Initiatives cuentan con un -profundo banco de especialistas en organizaciones no lucrativas junto -con [expertos en -consultoría](https://communityin.org/meet-us/team/consulting-experts/) -para ayudar, entre otros, con temas relacionados con el marketing y las -comunicaciones, la consultoría estratégica, la recaudación de fondos, la -participación de la junta directiva y los voluntarios y otras cosas más. - -- **Gestión de donaciones y crowdfunding**: Cuando llegan las -donaciones, Community Initiatives se asegura de que cada contribución de -250 dólares o más reciba una carta de reconocimiento del donante que -cumpla con los requisitos fiscales. Se asocia con -[FundRazr](https://fundrazr.com/) una plataforma de recaudación de -fondos online de vanguardia. A través de este acuerdo de colaboración, -los proyectos de Community Initiatives tienen acceso gratuito a una -plataforma de donaciones personalizable con las siguientes -características: crowdfunding, baja tasa de tramitación, investigación -de donantes, informes de donaciones, sitio de donaciones de marca blanca -(por una tarifa nominal), a través de la asociación con -[WeDidIt](https://teamallegiance.com/wedidit/), se obtiene la -financiación rápidamente. - -#### [¿Cuáles son las tasas de cobro de Community Initiatives?](https://communityin.org/apply/fees-minimums/) - -- **Cuotas de patrocinio**: Community Initiatives cobra el 10% de los - ingresos brutos. Debido a la complejidad de los requisitos de - información, cobra un 15% para los fondos gubernamentales. - -- **Recaudación de fondos mínima**: aunque sirven a un número de - proyectos con presupuestos anuales millonarios, todos los proyectos de - la red deben cumplir con un requisito mínimo de **recaudación de fondos - anual de 24.000 dólares.** diff --git a/content/guidelines/governance/governance-es.md b/content/guidelines/governance/governance-es.md deleted file mode 100644 index 7bf31ecf0..000000000 --- a/content/guidelines/governance/governance-es.md +++ /dev/null @@ -1,159 +0,0 @@ ---- -title: "Gobernanza del proyecto Open Science Labs" -date: 2019-09-14 -author: Ivan Ogasawara -draft: true -usePageBundles: false -tags: ["gobernanza"] -aliases: ["/governance/","/guidelines/governance/governance/gobernanza"] ---- - -Los objetivos de este documento incluyen la formalización de la gobernanza del proyecto Open Science Labs (OSL). Tanto en las situaciones comunes como en las infrecuentes, perfilar el procedimiento de toma de decisiones y las interacciones entre los distintos miembros de la comunidad, incluyendo la relación entre el trabajo que puede ser apoyado por organizaciones con o sin ánimo de lucro y el desarrollo colaborativo de código abierto. - -## Resumen - -OSL es un proyecto de propiedad y gestión comunitaria. En la medida de lo posible, las decisiones sobre la dirección del proyecto se toman por consenso de la comunidad (pero hay que tener en cuenta que "consenso" aquí tiene un significado un tanto técnico que puede no coincidir con las expectativas de todo el mundo — ver más abajo). Algunos miembros de la comunidad contribuyen adicionalmente sirviendo en OSL (Eunice Rodas, Ever Vino, Ivan Ogasawara, Luis Casas), son responsables de facilitar el establecimiento del consenso de la comunidad, de administrar los recursos del proyecto, y — en casos extremos — de tomar las decisiones del proyecto si el proceso normal basado en la comunidad se rompe. - -Por lo general, cada uno es responsable de áreas o tareas específicas y, si hay algo que debe ser decidido por el grupo, esta persona trae este tema a una de nuestras reuniones de colaboradores y podemos discutirlo y decidirlo juntos. El principal criterio que tenemos y que debe respetarse es que el contenido debe estar relacionado con un tema "abierto" (no se permiten tecnologías privadas, por ejemplo), y el acceso a esa información también debe ser abierto (tampoco se permiten referencias a contenido privado). Por lo tanto, tratamos de tener un espacio abierto para que todo el mundo aporte sus ideas y tener también el espacio para poner en práctica esa idea, el consejo directivo primer objetivo principal es ayudar a los contribuyentes a compartir sus ideas antes de ponerlo en práctica. - -## El proyecto - -Open Science Labs (OSL) es una comunidad que pretende unir a personas de todas partes del mundo, especialmente de países de América Latina y crear un espacio abierto para enseñar, aprender y compartir temas en torno a la ciencia abierta y las herramientas computacionales abiertas. - -OSL también motiva iniciativas sobre el idioma inglés porque aumenta las posibilidades de colaboración en proyectos abiertos en todo el mundo. - -El software desarrollado por las iniciativas OSL se libera bajo alguna licencia aprobada por la OSI (como BSD, Apache 2.0 o MIT), se construye abiertamente y se aloja en repositorios públicos de GitHub bajo la organización OpenScienceLabs. - -El Proyecto es conducido por un equipo distribuido de contribuyentes, que son individuos que han colaborado con código, documentación, diseño gráfico u otro tipo de trabajo al Proyecto. Cualquiera puede ser un Contribuyente. Los colaboradores pueden estar afiliados a cualquier entidad legal o a ninguna. Los colaboradores participan en el proyecto enviando, revisando y discutiendo las solicitudes de extracción y los problemas en GitHub y participando en las discusiones abiertas y públicas del proyecto en GitHub, discord, entre otros canales. La base de la participación en el proyecto es la apertura y la transparencia. - -La Comunidad del Proyecto está formada por todos los Colaboradores y Usuarios del Proyecto. Los colaboradores trabajan en nombre de la Comunidad del Proyecto y son responsables ante ella, y nos esforzamos por mantener la barrera entre los colaboradores y los usuarios lo más baja posible. - -Con el fin de mejorar la transparencia y un mejor flujo de trabajo fiscal, OSL está buscando actualmente un patrocinador fiscal para ayudar a nuestro proyecto a crecer. - -## Gobernanza - -Esta sección describe el modelo de gobernanza y liderazgo del Proyecto. - -Los principios de la gobernanza del Proyecto son - - Apertura y transparencia - Contribución activa - Neutralidad institucional - Diversidad, equidad e inclusión - Educación - -### Toma de decisiones por consenso de la comunidad - -En general, todas las decisiones del proyecto se tomarán por consenso de todos los colaboradores interesados. El objetivo principal de este enfoque es garantizar que las personas más afectadas e implicadas en un cambio determinado puedan aportar sus conocimientos con la confianza de que sus voces serán escuchadas, ya que la revisión reflexiva de una amplia comunidad es el mejor mecanismo que conocemos para crear software de alta calidad. - -El mecanismo que utilizamos para lograr este objetivo puede resultar desconocido para aquellos que no tienen experiencia con las normas culturales en torno al desarrollo de software libre/de código abierto. Ofrecemos un resumen aquí, y recomendamos encarecidamente que todos los colaboradores lean además el capítulo 4: Infraestructura social y política del clásico de Karl Fogel Producing Open Source Software, y en particular la sección sobre Democracia basada en el consenso, para una discusión más detallada. - -En este contexto, el consenso NO requiere - -* que esperemos a solicitar la opinión de todos sobre cada cambio, -* que se celebre una votación sobre algo, o -* que todo el mundo esté contento o de acuerdo con cada decisión. - -Para nosotros, consenso significa que confiamos a todos el derecho a vetar cualquier cambio si lo consideran necesario. Aunque esto pueda parecer una receta para la obstrucción y el descrédito, no es lo que ocurre. Por el contrario, descubrimos que la mayoría de la gente se toma en serio esta responsabilidad y sólo invoca su veto cuando juzga que se está ignorando un problema grave y que su veto es necesario para proteger el proyecto. Y en la práctica, resulta que esos vetos casi nunca se invocan formalmente, porque su mera posibilidad garantiza que los colaboradores estén motivados desde el principio para encontrar alguna solución con la que todo el mundo pueda vivir, — cumpliendo así nuestro objetivo de garantizar que se tengan en cuenta todas las perspectivas interesadas. - -¿Cómo sabemos cuándo se ha alcanzado un consenso? En primer lugar, esto es bastante difícil, ya que el consenso se define por la ausencia de vetos, lo que nos obliga a demostrar de alguna manera una negativa. En la práctica, utilizamos una combinación de nuestro mejor juicio (por ejemplo, una simple y no controvertida corrección de errores publicada en GitHub y revisada por un desarrollador del núcleo es probablemente buena) y los mejores esfuerzos (por ejemplo, todos los cambios sustantivos de la API deben ser publicados en un tema de github o una discusión en discordia con el fin de dar a la comunidad en general la oportunidad de detectar cualquier problema y sugerir mejoras; asumimos que cualquier persona que se preocupe lo suficiente por OSL para invocar su derecho de veto debe estar en los repositorios de github OSL o discordia). OSL, es un grupo pequeño, y busca una comunicación rápida y transparente, por lo que los canales comunes de comunicación son los issues de github y los canales de discord. Así, todas las personas involucradas pueden tener una comunicación rápida y transparente sobre cualquier problema específico y podemos reaccionar muy rápido. - -Si es necesario invocar un veto formal, el proceso debe consistir en: - -* una declaración inequívoca de que se invoca el veto, -* una explicación de por qué se invoca, y -* una descripción de las condiciones (si las hay) que convencerían a la persona que ejerce el veto de retirarlo. - -Si se vetan todas las propuestas para resolver alguna cuestión, entonces el estatus quo gana por defecto. - -En el peor de los casos, si un colaborador hace un uso realmente abusivo de su veto en detrimento del proyecto, puede ser expulsado del mismo por consenso del Consejo de Dirección (— véase más adelante). - -### Consejo Directivo - -El proyecto contará con un Consejo de Dirección formado por los colaboradores del proyecto que hayan realizado contribuciones sustanciales en calidad y cantidad, y que se mantengan durante al menos un año. La función general del Consejo es garantizar, con las aportaciones de la Comunidad, el bienestar a largo plazo del proyecto, tanto desde el punto de vista técnico como comunitario. - -Durante las actividades cotidianas del proyecto, los miembros del Consejo participan en todas las discusiones, la revisión del código y otras actividades del proyecto como compañeros con todos los demás colaboradores y la Comunidad. En estas actividades cotidianas, los miembros del Consejo no tienen ningún poder o privilegio especial por su pertenencia al Consejo. Sin embargo, se espera que, debido a la calidad y cantidad de sus contribuciones y a su conocimiento experto del software y los servicios del proyecto, los miembros del Consejo proporcionen una orientación útil, tanto técnica como en términos de dirección del proyecto, a los contribuyentes potencialmente menos experimentados. - -El Consejo de Dirección y sus miembros desempeñan un papel especial en determinadas situaciones. En particular, el Consejo puede, si es necesario: - -* Tomar decisiones sobre el alcance, la visión y la dirección general del proyecto. -* Tomar decisiones sobre colaboraciones estratégicas con otras organizaciones o individuos. -* Tomar decisiones sobre cuestiones técnicas específicas, características, errores y pull request. Son el principal mecanismo para guiar el proceso de revisión del código y fusionar los pull request. -* Tomar decisiones sobre los servicios que se ejecutan en el proyecto y gestionar esos servicios en beneficio del proyecto y la comunidad. -* Actualizar los documentos de política como éste. -* Tomar decisiones cuando la discusión regular de la comunidad no produce un consenso sobre un tema en un marco de tiempo razonable. - -Sin embargo, la principal responsabilidad del Consejo es facilitar el procedimiento ordinario de toma de decisiones de la comunidad descrito anteriormente. Si alguna vez tenemos que intervenir y anular formalmente a la comunidad por la salud del Proyecto, lo haremos, pero consideraremos que llegar a este punto indica un fallo en nuestro liderazgo. - -#### Toma de decisiones del Consejo - -Si es necesario que el Consejo Directivo tome una decisión formal, utilizará una forma del proceso de votación de la Fundación Apache. Se trata de una versión formalizada del consenso, en la que los votos +1 indican que se está de acuerdo, los votos -1 son vetos (y deben ir acompañados de una justificación, como en el caso anterior), y también se puede votar fraccionadamente (por ejemplo, -0,5, +0,5) si se desea expresar una opinión sin registrar un veto completo. Estos votos numéricos también se utilizan a menudo de manera informal como forma de obtener una idea general de los sentimientos de la gente sobre algún tema, y normalmente no deben tomarse como votos formales. Una votación formal sólo se produce si se declara explícitamente, y si esto ocurre, la votación debe mantenerse abierta durante el tiempo suficiente para dar a todos los miembros del Consejo interesados la oportunidad de responder, al menos una semana. - -En la práctica, prevemos que para la mayoría de las decisiones del Consejo Directivo (por ejemplo, la votación de nuevos miembros) será suficiente un proceso más informal. - -#### Miembros del Consejo - -La lista de los miembros actuales del Consejo Directivo se mantiene en la página Acerca de. - -Para poder formar parte del Consejo Directivo, una persona debe ser un colaborador del proyecto que haya realizado contribuciones sustanciales en calidad y cantidad, y que se mantengan durante al menos seis meses. Los miembros potenciales del Consejo son propuestos por los miembros existentes del Consejo, y se convierten en miembros tras el consenso de los miembros existentes del Consejo, y la confirmación de que el miembro potencial está interesado y dispuesto a servir en esa capacidad. El Consejo se formará inicialmente a partir del conjunto de promotores principales existentes que, a finales de 2015, han estado muy activos durante el último año. - -Al considerar a los posibles miembros, el Consejo examinará a los candidatos con una visión global de sus contribuciones. Esto incluirá, entre otras cosas, código, revisión de código, trabajo de infraestructura, participación en la lista de correo y en el chat, ayuda/construcción de la comunidad, educación y divulgación, trabajo de diseño, etc. Deliberadamente no establecemos métricas cuantitativas arbitrarias (como "100 commits en este repo") para evitar que se fomente un comportamiento que juegue a favor de las métricas y no del bienestar general del proyecto. Queremos fomentar la diversidad de orígenes, puntos de vista y talentos en nuestro equipo, por lo que explícitamente no definimos el código como la única métrica en la que se evaluará la pertenencia al consejo. - -Si un miembro del Consejo permanece inactivo en el proyecto durante un periodo de seis meses, se considerará su retirada del Consejo. Antes de la retirada, se contactará con el miembro inactivo para ver si tiene previsto volver a participar activamente. En caso de que no sea así, se le retirará inmediatamente tras una votación del Consejo. Si tienen previsto volver a participar activamente en breve, se les concederá un período de gracia de un mes. Si no se reincorporan a la participación activa dentro de ese período, serán destituidos por votación del Consejo sin más período de gracia. Todos los antiguos miembros del Consejo pueden volver a ser considerados como miembros en cualquier momento en el futuro, como cualquier otro colaborador del proyecto. Los miembros retirados del Consejo figurarán en la página web del proyecto, reconociendo el periodo en el que estuvieron activos en el Consejo. - -El Consejo se reserva el derecho de expulsar a los miembros actuales, si se considera que son activamente perjudiciales para el bienestar del proyecto, y los intentos de comunicación y resolución de conflictos han fracasado. Para ello es necesario el consenso de los miembros restantes. - -#### Conflicto de intereses - -Se espera que los miembros del Consejo trabajen en una amplia gama de empresas, universidades y organizaciones sin ánimo de lucro. Debido a esto, es posible que los Miembros tengan conflictos de intereses, entre los que se incluyen, pero no se limitan a: - -* Intereses financieros, como inversiones, empleo o trabajos de contratación, fuera del Proyecto que puedan influir en su trabajo en el mismo. -* Acceso a información de propiedad de su empleador que podría filtrarse en su trabajo con el Proyecto. - -Todos los miembros del Consejo deberán revelar al resto del Consejo cualquier conflicto de intereses que puedan tener. Los miembros que tengan un conflicto de intereses en una cuestión concreta podrán participar en los debates del Consejo sobre dicha cuestión, pero deberán abstenerse de votar sobre la misma. - -#### Comunicaciones privadas del Consejo - -En la medida de lo posible, las discusiones y actividades del Consejo serán públicas y se harán en colaboración y discusión con los Colaboradores del Proyecto y la Comunidad. El Consejo tendrá un canal privado en discord que se utilizará con moderación y sólo cuando un asunto específico requiera privacidad. Cuando se necesiten comunicaciones y decisiones privadas, el Consejo hará todo lo posible por resumirlas a la Comunidad tras eludir la información personal/privada/sensible que no debería publicarse en Internet. - -#### Subcomités - -El Consejo puede crear subcomités que se encarguen de dirigir y orientar aspectos específicos del proyecto. Al igual que el Consejo en su conjunto, los subcomités deben llevar a cabo sus actividades de manera abierta y pública, a menos que se pida específicamente privacidad. Las comunicaciones privadas de los subcomités deben realizarse en el canal principal privado del Consejo en discord, a menos que se solicite específicamente. - -## Socios institucionales y financiación - -El Consejo Directivo es el principal responsable del proyecto. Ninguna institución, individuo o entidad legal externa tiene la capacidad de poseer, controlar, usurpar o influenciar el proyecto más allá de su participación en el mismo como contribuyentes y miembros del Consejo. Sin embargo, dado que las instituciones pueden ser un importante mecanismo de financiación del proyecto, se debe reconocer formalmente la participación institucional en el mismo. Se trata de los Socios Institucionales. - -Un colaborador institucional es cualquier colaborador individual del proyecto que contribuye al mismo como parte de sus funciones oficiales en un socio institucional. Asimismo, un miembro del Consejo Institucional es cualquier miembro del Consejo Directivo del Proyecto que contribuye al proyecto como parte de sus funciones oficiales en un Socio Institucional. - -Las instituciones pueden convertirse en Socios Institucionales cuando comparten los mismos valores de Open Science Labs y están dispuestas a colaborar con el proyecto de cualquiera de estas maneras: - -- dar a conocer los laboratorios de ciencia abierta en su red social -- asignar uno o más colaboradores para ayudar a los proyectos de los Laboratorios de Ciencia Abierta u otros proyectos afiliados -- financiar las actividades de Open Science Labs -- ofrecer tutoría a los Colaboradores de Open Science Labs cuando contribuyan a sus proyectos (definidos por el Socio) -- ofrecer oportunidades de contratación a los Colaboradores de los Laboratorios de Ciencia Abierta que hayan contribuido a sus proyectos (definidos por el Socio) - -Si en algún momento un Socio Institucional existente no cumple con estos puntos mencionados anteriormente, entonces se inicia un periodo de gracia de seis meses. Si al final de este período de seis meses siguen sin tener ninguna contribución, entonces su Asociación Institucional caducará, y reanudarla requerirá pasar por el proceso normal para nuevas Asociaciones. - -La financiación adquirida por los Socios Institucionales para trabajar en El Proyecto se denomina Financiación Institucional. Sin embargo, ninguna financiación obtenida por un Socio Institucional puede anular el Consejo de Dirección. Si un Socio tiene financiación para realizar un trabajo de Ciencia Abierta y el Consejo decide no continuar con ese trabajo como proyecto, el Socio es libre de llevarlo a cabo por su cuenta. Sin embargo, en esta situación, esa parte del trabajo del socio no estará bajo el paraguas de los Laboratorios de Ciencia Abierta y no podrá utilizar las marcas del proyecto de una manera que sugiera una relación formal. - -Los beneficios de los socios institucionales son - -* Reconocimiento en los sitios web de Open Science Labs y en las charlas. -* Capacidad de influir en el proyecto a través de la participación de su miembro del Consejo. -* Miembros del Consejo invitados a las reuniones de desarrolladores de Open Science Labs. - -Una lista de los actuales Socios Institucionales se mantiene en la página Sobre Nosotros. - -## Historia del documento - -* [https://github.com/opensciencelabs/opensciencelabs.github.io](https://github.com/opensciencelabs/opensciencelabs.github.io) - -## Agradecimientos - -Partes sustanciales de este documento han sido adaptadas del documento de gobernanza y toma de decisiones del proyecto NumPy https://github.com/numpy/numpy/commits/main/doc/source/dev/governance/governance.rst. - -## Licencia - -CC BY-SA 4.0: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/content/guidelines/governance/governance.md b/content/guidelines/governance/governance.md deleted file mode 100644 index 03355ebeb..000000000 --- a/content/guidelines/governance/governance.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: "Open Science Labs Project Governance" -date: 2019-09-14 -author: Ivan Ogasawara -draft: false -usePageBundles: false -tags: ["governance"] -aliases: ["/governance/","/guidelines/governance/governance/"] ---- - - -The objectives of this document include formalizing the governance of the Open Science Labs (OSL) project. In both common and uncommon situations, outlining the decision-making procedure and the interactions between the various members of our community, including the relationship between work that may be supported by for-profit or nonprofit organizations and open source collaborative development. - -## Summary - -OSL is a community-owned and community-run project. To the maximum extent possible, decisions about project direction are made by community consensus (but note that "consensus" here has a somewhat technical meaning that might not match everyone's expectations -- see below). Some members of the community additionally contribute by serving on the OSL (Eunice Rodas, Ever Vino, Ivan Ogasawara, Luis Casas), where they are responsible for facilitating the establishment of community consensus, for stewarding project resources, and -- in extreme cases -- for making project decisions if the normal community-based process breaks down. - -Commonly, everyone is responsible for specific areas or tasks and, if there is anything that needs to be decided by the group, this person brings this topic to one of our contributor's meetings and we can discuss and decide that together. The main criteria we have that should be respected is that the content should be related to an "open" topic (private technologies are not allowed, for example), and the access to that information should also be open (references to private content is not allowed neither). So, we try to have an open space for everyone to bring their ideas and have also the space to implement that idea as well, the steering council first main goal is to help contributors to share their ideas before to put it in practice. - -## The project - -Open Science Labs (OSL) is a community that aims to join people from all parts of the world, specially from Latin America countries and create an open space for teaching, learning and sharing topics around open science and open computational tools. - -OSL also motivates initiatives about English language because it increases the possibilities of collaboration in open projects across the world. - -The software developed by OSL initiatives are released under some OSI approved license (such as BSD, Apache 2.0, or MIT), built openly and hosted on public GitHub repositories under the OpenScienceLabs organization. - -The Project is conducted by a distributed team of contributors, who are individuals that have collaborated with code, documentation, graphical design or other kind of work to the Project. Anyone can be a Contributor. Contributors can be affiliated with any legal entity or none. Contributors participate in the project by submitting, reviewing and discussing GitHub pull requests and issues and participating in open and public Project discussions on GitHub, discord, among other channels. The basis of project participation is openness and transparency. - -The Project Community consists of all Contributors and Users of the Project. Contributors work on behalf of and are responsible to the larger Project Community and we strive to keep the barrier between Contributors and Users as low as possible. - -In order to improve transparency and a better fiscal workflow, OSL is currently looking for a fiscal sponsor to help our project to grow. - -## Governance - -This section describes the governance and leadership model of The Project. - -The principles of Project governance are: - -* Openness & Transparency -* Active Contribution -* Institutional Neutrality -* Diversity, Equity and Inclusion -* Education - -### Consensus-based decision making by the community - -In general, all project decisions will be made by consensus of all interested Contributors. The primary goal of this approach is to ensure that the people who are most affected by and involved in any given change can contribute their knowledge in the confidence that their voices will be heard, because thoughtful review from a broad community is the best mechanism we know of for creating high-quality software. - -The mechanism we use to accomplish this goal may be unfamiliar for those who are not experienced with the cultural norms around free/open-source software development. We provide a summary here, and highly recommend that all Contributors additionally read Chapter 4: Social and Political Infrastructure of Karl Fogel's classic Producing Open Source Software, and in particular the section on Consensus-based Democracy, for a more detailed discussion. - -In this context, consensus does NOT require: - -* that we wait to solicit everybody's opinion on every change, -* that we ever hold a vote on anything, or -* that everybody is happy or agrees with every decision. - -For us, what consensus means is that we entrust everyone with the right to veto any change if they feel it necessary. While this may sound like a recipe for obstruction and pain, this is not what happens. Instead, we find that most people take this responsibility seriously, and only invoke their veto when they judge that a serious problem is being ignored, and that their veto is necessary to protect the project. And in practice, it turns out that such vetoes are almost never formally invoked, because their mere possibility ensures that Contributors are motivated from the start to find some solution that everyone can live with -- thus accomplishing our goal of ensuring that all interested perspectives are taken into account. - -How do we know when consensus has been achieved? First of all, this is rather difficult since consensus is defined by the absence of vetos, which requires us to somehow prove a negative. In practice, we use a combination of our best judgement (e.g., a simple and uncontroversial bug fix posted on GitHub and reviewed by a core developer is probably fine) and best efforts (e.g., all substantive API changes must be posted to a github issue or a discussion on discord in order to give the broader community a chance to catch any problems and suggest improvements; we assume that anyone who cares enough about OSL to invoke their veto right should be on the github OSL repositories or discord). OSL, is a small group, and aims for quick and transparent communication, so the common channels for communication are the github issues and the discord channels. So, all people involved can have a quick and transparent communication about any specific problem and we can react very quick. - -If one does need to invoke a formal veto, then the process should consist of: - -* an unambiguous statement that a veto is being invoked, -* an explanation of why it is being invoked, and -* a description of what conditions (if any) would convince the vetoer to withdraw their veto. - -If all proposals for resolving some issue are vetoed, then the status quo wins by default. - -In the worst case, if a Contributor is genuinely misusing their veto obstructively to the detriment of the project, then they can be ejected from the project by consensus of the Steering Council -- see below. - -### Steering Council - -The Project will have a Steering Council that consists of Project Contributors who have produced contributions that are substantial in quality and quantity, and sustained over at least one year. The overall role of the Council is to ensure, with input from the Community, the long-term well-being of the project, both technically and as a community. - -During the everyday project activities, council members participate in all discussions, code review and other project activities as peers with all other Contributors and the Community. In these everyday activities, Council Members do not have any special power or privilege through their membership on the Council. However, it is expected that because of the quality and quantity of their contributions and their expert knowledge of the Project Software and Services that Council Members will provide useful guidance, both technical and in terms of project direction, to potentially less experienced contributors. - -The Steering Council and its Members play a special role in certain situations. In particular, the Council may, if necessary: - -* Make decisions about the overall scope, vision and direction of the project. -* Make decisions about strategic collaborations with other organizations or individuals. -* Make decisions about specific technical issues, features, bugs and pull requests. They are the primary mechanism of guiding the code review process and merging pull requests. -* Make decisions about the Services that are run by The Project and manage those Services for the benefit of the Project and Community. -* Update policy documents such as this one. -* Make decisions when regular community discussion doesn’t produce consensus on an issue in a reasonable time frame. - -However, the Council's primary responsibility is to facilitate the ordinary community-based decision making procedure described above. If we ever have to step in and formally override the community for the health of the Project, then we will do so, but we will consider reaching this point to indicate a failure in our leadership. - -#### Council decision making - -If it becomes necessary for the Steering Council to produce a formal decision, then they will use a form of the Apache Foundation voting process. This is a formalized version of consensus, in which +1 votes indicate agreement, -1 votes are vetoes (and must be accompanied with a rationale, as above), and one can also vote fractionally (e.g. -0.5, +0.5) if one wishes to express an opinion without registering a full veto. These numeric votes are also often used informally as a way of getting a general sense of people's feelings on some issue, and should not normally be taken as formal votes. A formal vote only occurs if explicitly declared, and if this does occur then the vote should be held open for long enough to give all interested Council Members a chance to respond -- at least one week. - -In practice, we anticipate that for most Steering Council decisions (e.g., voting in new members) a more informal process will suffice. - -#### Council membership - -A list of current Steering Council Members is maintained at the page About. - -To become eligible to join the Steering Council, an individual must be a Project Contributor who has produced contributions that are substantial in quality and quantity, and sustained over at least six month. Potential Council Members are nominated by existing Council members, and become members following consensus of the existing Council members, and confirmation that the potential Member is interested and willing to serve in that capacity. The Council will be initially formed from the set of existing Core Developers who, as of late 2015, have been significantly active over the last year. - -When considering potential Members, the Council will look at candidates with a comprehensive view of their contributions. This will include but is not limited to code, code review, infrastructure work, mailing list and chat participation, community help/building, education and outreach, design work, etc. We are deliberately not setting arbitrary quantitative metrics (like “100 commits in this repo”) to avoid encouraging behavior that plays to the metrics rather than the project’s overall well-being. We want to encourage a diverse array of backgrounds, viewpoints and talents in our team, which is why we explicitly do not define code as the sole metric on which council membership will be evaluated. - -If a Council member becomes inactive in the project for a period of six month, they will be considered for removal from the Council. Before removal, inactive Member will be approached to see if they plan on returning to active participation. If not they will be removed immediately upon a Council vote. If they plan on returning to active participation soon, they will be given a grace period of one month. If they don’t return to active participation within that time period they will be removed by vote of the Council without further grace period. All former Council members can be considered for membership again at any time in the future, like any other Project Contributor. Retired Council members will be listed on the project website, acknowledging the period during which they were active in the Council. - -The Council reserves the right to eject current Members, if they are deemed to be actively harmful to the project’s well-being, and attempts at communication and conflict resolution have failed. This requires the consensus of the remaining Members. - -#### Conflict of interest - -It is expected that the Council Members will be employed at a wide range of companies, universities and non-profit organizations. Because of this, it is possible that Members will have conflict of interests, such ones include, but are not limited to: - -* Financial interests, such as investments, employment or contracting work, outside of The Project that may influence their work on The Project. -* Access to proprietary information of their employer that could potentially leak into their work with the Project. - -All members of the Council shall disclose to the rest of the Council any conflict of interest they may have. Members with a conflict of interest in a particular issue may participate in Council discussions on that issue, but must recuse themselves from voting on the issue. - -#### Private communications of the Council - -To the maximum extent possible, Council discussions and activities will be public and done in collaboration and discussion with the Project Contributors and Community. The Council will have a private channel on discord that will be used sparingly and only when a specific matter requires privacy. When private communications and decisions are needed, the Council will do its best to summarize those to the Community after eliding personal/private/sensitive information that should not be posted to the public internet. - -#### Subcommittees - -The Council can create subcommittees that provide leadership and guidance for specific aspects of the project. Like the Council as a whole, subcommittees should conduct their business in an open and public manner unless privacy is specifically called for. Private subcommittee communications should happen on the main private discord channel of the Council unless specifically called for. - -## Institutional Partners and Funding - -The Steering Council are the primary leadership for the project. No outside institution, individual or legal entity has the ability to own, control, usurp or influence the project other than by participating in the Project as Contributors and Council Members. However, because institutions can be an important funding mechanism for the project, it is important to formally acknowledge institutional participation in the project. These are Institutional Partners. - -An Institutional Contributor is any individual Project Contributor who contributes to the project as part of their official duties at an Institutional Partner. Likewise, an Institutional Council Member is any Project Steering Council Member who contributes to the project as part of their official duties at an Institutional Partner. - -Institutions become eligible to become an Institutional Partner when they share same values of Open Science Labs and are available to collaborate to the project in any of these ways: - -- publicizing open science labs in their social network -- allocate one or more contributors to help Open Science Labs projects or other affiliated projects -- funding Open Science Labs activities -- offering mentoring for Open Science Labs Contributors when contributing to their projects (defined by the Partner). -- offering opportunties for contracting Open Science Labs Conbributors who have contributed to their projects (defined by the Partner) - -If at some point an existing Institutional Partner doesn't accomplish with these points mentioned above, then six month grace period begins. If at the end of this six months period they continue not to have any contribution, then their Institutional Partnership will lapse, and resuming it will require going through the normal process for new Partnerships. - -Funding acquired by Institutional Partners to work on The Project is called Institutional Funding. However, no funding obtained by an Institutional Partner can override the Steering Council. If a Partner has funding to do Open Science work and the Council decides to not pursue that work as a project, the Partner is free to pursue it on their own. However in this situation, that part of the Partner’s work will not be under the Open Science Labs umbrella and cannot use the Project trademarks in a way that suggests a formal relationship. - -Institutional Partner benefits are: - -* Acknowledgement on the Open Science Labs websites and in talks. -* Ability to influence the project through the participation of their Council Member. -* Council Members invited to Open Science Labs Developer Meetings. - -A list of current Institutional Partners is maintained at the page About Us. - -## Document history - -* [https://github.com/opensciencelabs/opensciencelabs.github.io](https://github.com/opensciencelabs/opensciencelabs.github.io) - -## Acknowledgements - -Substantial portions of this document were adapted from the NumPy project governance and decision-making document https://github.com/numpy/numpy/commits/main/doc/source/dev/governance/governance.rst. - -## License - -CC BY-SA 4.0: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/content/guidelines/mentoring/guide.en.md b/content/guidelines/mentoring/guide.en.md deleted file mode 100644 index b224b4aff..000000000 --- a/content/guidelines/mentoring/guide.en.md +++ /dev/null @@ -1,145 +0,0 @@ ---- - -draft: true - ---- - - - - -## What is mentoring? - -Mentoring is a technique or process in which an experienced practitioner (mentor) guides people (mentees) to achieve their goal and personal objectives through time - limited. A mentor is not necessarily to be a person who teaches, trains or coaches, it also supports, encourages their mentees and is open to ask and listen to. It is about helping each other to expand and grow so that everyone learns. - -Also, an effective mentoring provides opportunities to share talents, skills, experiences and expertise afforded through regular training and on-going coaching and feedback, not only for mentees but also for mentors. - -The mentors don't have direct responsibility for the mentees’ work performance. They´ only give advice and they motivate to enhance the mentees’ professional development. - - -## Types of mentoring - -According to [The university of Auckland](auckland-mentoring-guide-final) suggests two types of mentoring relationships: - -1. Informal mentoring, when somebody with more experience than others helps spontaneously and without explicitly asking for mentoring. Partnerships are initiated between individuals. - -1. Formal mentoring, there is an official ask for or offer of mentoring relationships. Mentors and mentees follow a structured mentoring program, make agreements about its nature and establish goals between them. - - -## Skills and experience required to be a mentor - -According to [Manchester Metropolitan University (MMU)](mmu-mentoring-guidlines), it exists at least ten requirements to be a mentor: - -1. Self awareness: it is related to having your own personal goals, career, and knowing your own strengths. - -2. Organisational know-how: it means an individual knowledge that mentors have, it provides an advantage over others in the same field, it is about to know how things work. - -3. Credibility in Determining Goals and Building Capacity: It is important for mentors to have personal and professional credibility in their area and being a member of relevant organizations - -4. Accessibility: successful mentors should be able to commit sufficient time to their mentees. Further, mentors should talk regularly to establish a level of comfort in the relationship around the easy topics, then when a challenge or a concern arises, it is much easier for both to have a useful discussion - -5. Communication skills or listening actively, (taking into consideration interests, body language, attention, and giving advice) help to ascertain their mentees motivation and needs. - -6. Ability to empower: mentors have the ability to create a working environment where mentees feel secure to contribute in different ways. - -7. A desire to help others develop: mentors should understand how mentees learn and acquire experience from mentoring, either formally or informally way. - -8. Inventiveness: mentors should be open minds of doing new and different things in mentoring, in order to help mentees gain broader perspectives of their experiences. - -9. Empathy: the ability to sense mentees emotions, or what might be thinking or feeling - -10. Understanding: mentors can observe their mentees how they learn and provide them constructive feedback. - -Some other extra skills are: - -Encouraging and inspiring: mentors have the ability to comment on mentees accomplishments. They believe in the mentees capacity to grow personally and professionally. In addition, they respond to their frustrations and challenges. It is important that mentors share their personal vision or those of other leaders, such as their experiences, mistakes and successes in achieving their goals [The Center for Health Leadership & Practice (CHLP)](umich-mentoring-guide). - - -## The mentoring process / stages - -The process of mentoring is an activity that has a beginning and ending, [MMU](mmu-mentoring-guidlines) lists three stages: - -1. Initial;(building the relationship): explain goals of this mentoring. Time to involve (schedule for communication). Discuss backgrounds, experiences, interests and expectations. Establish the rules (format of the meeting). -2. Mentor sessions; planning mentoring sessions (review experiences, when and how long, goals, progress advance). Mentors should tell about themselves, their skills, their organization, experience, and challenges they are facing. Besides, they can exchange information and help their mentees to set and refocus their goals periodically. Finally, they must work towards the goals (long and challenging part of the mentoring process), through discussing, sharing material, trying other learning materials, and development activities. Mentors create opportunities for mentees to gain experience, introduce them to other colleagues. -Evaluate the progress of this relationship mentor-mentees (adjustments, results, benefits). -1. Moving on; identify when the relationship mentors-mentees will end such as when objectives conclude, challenges, and progress towards goals. Help mentees to identify next steps, self-reflection. Explore other types of support for their needs. Also, there are other reasons for ending the mentoring relationship, for example, the program is coming to a close or the relationship isn’t working successfully and both parties wish to move on. - -## Setting goals and expectations - -According to [Harvard University](harvard-mentoring-guide) suggests that both mentors and mentees establish their objectives, expectations and actively collaborate to have effective mentoring. Here there some steps to consider: - -1. Commitment between mentees and mentors before to start a mentoring relationship because it requires time and effort from both. -1. Self-knowledge, mentees start by determining specific objectives and what is the most relevant and appropriate for them in the mentoring relationship. Once they clarify their goals, now they can consider how this relationship might bring to achieve their goals. -1. Matching: Mentees are ready to consider potential mentors to support them, based on their expectations regarding the qualities and attributes of mentors. -1. Establishing the mentoring relationship. Mentors and mentees should define guidelines and agreements early in mentoring. -1. Planning will keep the mentoring partnership on track and focused on main objectives. Mentors and Mentees should work together to develop action steps for each objective, and how to make it effective. A successful mentoring depends on relationship investment of energy and the commitment to the experience. -1. The end of a mentoring is as much a part of the process as the preceding steps. It is important to understand that it does not mean the end of the relationship. In this process, it can be an excellent opportunity to have a similar discussion about the experience as a whole or celebrate accomplishments. Moreover, former Mentees and Mentors are excellent resources to include on the network. As with any network connection, mentees need to make a point of staying in touch and participate in communities. - -## Mentoring and ethics - -The mentors need to continuously examine and reflect on their ethical values and how they may influence decisions in their mentoring practice. In the following, there are some professional characteristics that contribute to having effective mentoring: -1. The mentors and mentees need to be well aware of their institution’s code of conduct for mentoring. At the same time, they should read professional codes of ethics to have a healthy mentoring relationship and accept that before mentoring starts. -1. The mentors need to continuously explore and reflect on their own ethical values and how they may influence decisions in their mentoring practice. -1. The development of normative guidelines, between mentors and mentees are a powerful tool for reflecting together on values and boundaries, and to promote ethical thinking. -1. In most professions, a set of values determine the ethical professional conduct and become a part of the professional identity. -1. The mentors need to take responsibility for the power they hold and never use it abusively over others more vulnerable. It should be an open and clear reporting structure for any misuse of power. -1. The mentees can identify with mentors who have values, attitudes, and experiences that the mentees holds or aspires to have. - -In addition, [The Actuaries w Without Borders](actuaries-mentoring-guidelines) describes some personal characteristics in mentoring: - -1. Mentors; ask open and supportive questions and provide constructive feedback. -2. Mentors; maintain a friendly tone and be positive. -3. Mentors; encourage developmente opportunities for mentees. -4. Mentors; help mentees solve their own problem, rather than how to do it. -5. Mentors; give positive reinforcement. -6. Mentors; have to be accessible for helping mentees. -7. Mentees; be prepared. -8. Mentees; take responsability for mistakes. -9. Mentees; thank your mentor. -10. Mentors and mentees; Value the mentoring partner as a person -11. Mentors and mentees; Developing mutual trust and respect. -12. Mentors and mentees;Listen actively both to what is being said and how it is being said. - - -## Mentoring Best Practices - -Mentoring involves the relationship between mentors and mentees. Good mentors are enthusiastic people, enjoying the role they play in helping others achieve their goals [(CHLP)](umich-mentoring-guide). There are some different roles that Mentors may be required to take: - -1. Networking; mentors help mentees to find people and resources that go beyond their experience. -1. Counselling; mentors encourage, inspire and challenge mentees to achieve their goals. Also, They act as a confidant, helping mentees to clarify real issues and seeing the general view. -1. Facilitating; mentors share your experiences, advice, emphasizing how your experience could be different from their experiences. -1. Coaching; mentors build their mentees confidence through supportive feedback. -1. Enjoying the process of mentoring; mentors should be spontaneous just to send an encouraging word or piece of new information. -1. Avoid controlling the mentoring relationship. - - -## OpenScienceLabs Mentoring workflow - -TBD - -## Mentoring Code of Conduct (MCOC) - -As an organization we joined the [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg)](code_of_conduct.md) -. However, we have decided to complement it with a section dedicated to the mentoring process. For more information on our Mentoring Code of Conduct, please review that section in our [Code of Conduct](mentoring-guideline/docs/COC.md). - - -[umich-mentoring-guide]: https://www.rackham.umich.edu/downloads/more-mentoring-guide-for-mentors.pdf - -[mmu-mentoring-guidlines]: https://www.mmu.ac.uk/media/mmuacuk/content/documents/human-resources/a-z/guidance-procedures-and-handbooks/Mentoring_Guidlines.pdf - -[albany-mentoring-best-practices]: https://www.albany.edu/academics/mentoring.best.practices.chapter3.shtml - -[auckland-mentoring-guide-final]: https://cdn.auckland.ac.nz/assets/auckland/business/current-students/PDFs/mentoring-guide-final.pdf - -[harvard-mentoring-guide]: https://cdn2.sph.harvard.edu/wp-content/uploads/sites/31/2015/10/Mentoring_Guide.pdf - -[actuaries-mentoring-guidelines]: https://www.actuaries.org/AWB/Projects/Global_Mentorship/Guidelines%20for%20Mentors%20and%20Mentees.pdf diff --git a/content/guidelines/mentoring/guide.md b/content/guidelines/mentoring/guide.md deleted file mode 100644 index 3d66bcbbc..000000000 --- a/content/guidelines/mentoring/guide.md +++ /dev/null @@ -1,275 +0,0 @@ ---- -title: "Guía de Mentorías" -date: 2019-04-08 -author: Ingrid Bianka Garcia -draft: false -usePageBundles: false -tags: ["mentorías"] ---- - - - - - -## ¿Qué es la una mentoría? - -La mentoría es una técnica o proceso en el que una persona con experiencia -(mentor/a) guía a otras personas (aprendices o mentorados/as) para lograr su -meta y objetivos personales en un espacio de tiempo limitado. Quien ejerce la -mentoría no necesariamente es quien enseña, entrena o impulsa, sino también -apoya, alienta a sus aprendices y conservando apertura a preguntas y a escuchar. -Se trata de ayudarse mutuamente a expandirse y crecer para que todas las -personas aprendan. - -Además, una mentoría efectiva brinda oportunidades para compartir talentos, -habilidades, experiencias y conocimientos obtenidos a través de la capacitación -regular, el entrenamiento y la retroalimentación continuos, no sólo para -aprendices sino también para mentores/as. - -Quienes ofrecen la mentoría no tienen responsabilidad directa por el desempeño -laboral de los/las aprendices. Solo ofrecen consejos y motivan para potenciar el -desarrollo profesional de éstos. - -## Tipos de mentoría - -[La universidad de Auckland][auckland-mentoring-guide-final] sugiere dos tipos -de relaciones de mentoría: - -1. Mentoría informal, cuando alguien con más experiencia que otras personas - ayuda de forma espontánea y sin pedir hacerlo de forma explícita. Los - vínculos se inician entre individuos de forma directa. - -1. Mentoría formal, hay una solicitud u oferta oficial de relaciones de - mentoría. Mentores/as y aprendices siguen un programa de mentoría - estructurado, haciendo acuerdos sobre su naturaleza y estableciendo metas - entre ellos/as. - -## Habilidades y experiencia requeridas para ser mentor/a - -Según la [Universidad Metropolitana de Manchester -(MMU)][mmu-mentoring-guidlines], existen al menos diez requisitos para ser -mentor/a: - -1. Autoconciencia: se relaciona con tener objetivos personales propios, carrera - y conocer las propias fortalezas. - -2. Saber hacer organizacional: significa un conocimiento individual que tienen - los/as mentores/as, y que proporciona una ventaja sobre otros en el mismo - campo, se trata de saber cómo funcionan las cosas. - -3. Credibilidad en la determinación de objetivos y desarrollo de capacidades: es - importante que los/as mentores/as tengan credibilidad personal y profesional - en su área y que sean miembros de organizaciones relevantes. - -4. Accesibilidad: El éxito de la mentoría depende del tiempo dedicado a los/as - aprendices. Además, los/as mentores/as deben hablar regularmente para - establecer un nivel de comodidad en la relación en torno a los temas fáciles, - luego, cuando surge un desafío o una inquietud, es mucho más fácil para tener - una discusión útil. - -5. Las habilidades de comunicación o escucha activa (teniendo en cuenta los - intereses, el lenguaje corporal, la atención y dar consejos) ayudan a - determinar las motivaciones y necesidades de sus mentorados. - -6. Capacidad para empoderar: los/as mentores/as tienen la capacidad de crear un - entorno de trabajo en el que los/as aprendices se tengan seguridad para - contribuir de diferentes maneras. - -7. Un deseo de ayudar a otros a formarse: los/as mentores/as deben comprender - cómo los/as aprendices obtienen experiencia a partir de la mentoría, ya sea - de manera formal o informal. - -8. Inventiva: los/as mentores/as deben tener la mente abierta para hacer cosas - nuevas y diferentes en la mentoría, para ayudar a los/as aprendices a obtener - perspectivas más amplias de sus experiencias. - -9. Empatía: la capacidad de sentir las emociones de los/as aprendices, o lo que - podría estar pensando o sintiendo. - -10. Comprensión: los/las mentores/as pueden observar a sus aprendices cómo - aprenden y brindarles comentarios constructivos. - -Algunas otras habilidades adicionales son: - -Alentar e inspirar: los/as mentores/as tienen la capacidad de comentar sobre los -logros de los/as aprendices. Creen en la capacidad de éstos para crecer personal -y profesionalmente. Además, responden a sus frustraciones y desafíos. Es -importante que los/as mentores/as compartan su visión personal o la de otros -líderes, como sus experiencias, errores y éxitos en el logro de sus objetivos -[The Center for Health Leadership & Practice (CHLP)][umich-mentoring-guide]. - -## El proceso de mentoría / etapas - -El proceso de mentoría es una actividad que tiene un principio y un final. En -este sentido, el [MMU][mmu-mentoring-guidlines] enumera tres etapas: - -1. Inicial; (construyendo la relación): en la cual se explican los objetivos de - la mentoría. Tiempo para relacionarse (calendario para la comunicación). Se - sugiere discutir antecedentes, experiencias, intereses y expectativas. - Establecer las reglas (como por ejemplo, el formato de la reunión). -1. Sesiones de mentoría; planificación de sesiones de mentoría (revisión de - experiencias, cuándo y cuánto tiempo, metas, avance de avances). Quienes - conducen la mentoría deben hablar sobre sí mismos/as, sus habilidades, su - organización, experiencia y los desafíos que enfrentan. Además, pueden - intercambiar información y ayudar a sus aprendices a establecer y reenfocar - sus objetivos periódicamente. Finalmente, deben trabajar hacia las metas - (parte larga y desafiante del proceso de mentoría), mediante discusiones, - compartiéndoles material, probando otros contenidos de aprendizaje y - actividades de desarrollo. Los/as mentores/as crean oportunidades para que - los/as aprendices adquieran experiencia, es un buen momento para presentarlos - a otros/as colegas. -1. Evaluar el progreso de esta relación mentor/a-aprendices (ajustes, - resultados, beneficios). -1. Avanzar; identificar cuándo terminará la relación mentores/as-aprendices, - como cuando concluyen los objetivos, los desafíos y el progreso hacia las - metas. Ayude a los/as aprendices a identificar y próximos pasos, fomente la - autorreflexión. Explore otros tipos de apoyo para cubrir sus necesidades. - Además, es importante considerar que hay otras razones para terminar la - relación de mentoría, por ejemplo, el programa puede estar llegando a su fin - o la relación no está funcionando correctamente y ambas partes desean seguir - de forma separada. - -## Establecer metas y expectativas - -La [Harvard University][harvard-mentoring-guide] sugiere que tanto mentores/as -como aprendices establezcan sus objetivos, expectativas y colaboren activamente -para tener una mentoría efectiva. Aquí hay algunos pasos a considerar: - -1. Compromiso establecido entre aprendices y mentores/as antes de iniciar una - relación de mentoría porque requiere tiempo y esfuerzo de ambos. -1. Autoconocimiento, los/as aprendices comienzan determinando objetivos - específicos y lo que es más relevante y apropiado para ellos en la relación - de mentoring. Una vez que aclaren sus objetivos, ahora pueden considerar cómo - esta relación podría contribuir a lograr sus objetivos. -1. Vinculación: los/as aprendices están listos/as para considerar mentores/as - potenciales para que los apoyen, en función de sus expectativas con respecto - a las cualidades y atributos de los/as mentores. -1. Establecimiento de la relación de mentoría. Los/as mentores y los/as - aprendices deben definir pautas y acuerdos al principio de la mentoría. -1. La planificación mantendrá la asociación de mentoría encaminada y enfocada en - los objetivos principales. Los mentores y los/as aprendices deben trabajar en - conjunto para establecer pasos de acción para cada objetivo y cómo hacerlos - efectivos. Una mentoría exitosa depende de la inversión de energía en la - relación y el compromiso con la experiencia. -1. El final de una mentoría es una parte tan importante del proceso como los - pasos previos. Es importante entender que no significa el final de la - relación. En este proceso, puede ser una excelente oportunidad para tener una - discusión similar sobre la experiencia en su conjunto o celebrar los logros. - Además, los/as antiguos/as aprendices y mentores/as son excelentes recursos - para incluir en la red. Al igual que con cualquier conexión de red, los/as - aprendices deben asegurarse de mantenerse en contacto y participar en las - comunidades derivadas de las mentorías. - -## Ética y mentoría - -Los/as mentores necesitan examinar y reflexionar continuamente sobre sus valores -éticos y cómo pueden influir en las decisiones en su práctica de mentoría. A -continuación, se presentan algunas características profesionales que contribuyen -a tener una mentoría efectiva: - -1. Los/as mentores/as y aprendices deben conocer bien el código de conducta de - su institución para la mentoría. Al mismo tiempo, deben leer los códigos de - ética profesional para tener una relación de mentoría saludable y aceptar eso - antes de que comience la mentoría. -1. El desarrollo de pautas normativas, entre mentores/as y aprendices, es una - herramienta poderosa para reflexionar en conjunto sobre valores y límites, y - para promover el pensamiento ético. -1. En la mayoría de las profesiones, un conjunto de valores determina la - conducta profesional ética y se convierte en parte de la identidad - profesional. -1. Los/as mentores/as deben asumir la responsabilidad del poder que ostentan y - nunca utilizarlo de forma abusiva sobre otros más vulnerables. Debe haber una - estructura de denuncia abierta y clara para cualquier abuso de poder. -1. Los/as aprendices pueden identificarse con mentores/as que tienen valores, - actitudes y experiencias que ellos tienen o aspiran a tener. - -Además, [The Actuaries w Without Borders][actuaries-mentoring-guidelines] -describe algunas características personales en la mentoría: - -1. Mentores/as; hacer preguntas abiertas y de apoyo y proporcionar comentarios - constructivos. -2. Mentores/as; mantener un tono amistoso y sea positivo. -3. Mentores/as; fomentar las oportunidades de desarrollo para los/as aprendices. -4. Mentores/as; ayudar a los aprendices a resolver su propio problema, en lugar - de cómo hacerlo. -5. Mentores/as; dar un refuerzo positivo. -6. Mentores/as; ser accesibles para ayudar a los/as aprendices. -7. Aprendices; estar preparado/a. -8. Aprendices; asumir la responsabilidad de los errores. -9. Aprendices; agradecer a su mentor/a. -10. Mentores/as y aprendices; Valorar al/la socio/a mentor/a como persona -11. Mentores/as y aprendices; Desarrollar la confianza y el respeto mutuos. -12. Mentores/as y aprendices; Escuchar activamente tanto lo que se dice como - cómo se dice. - -## Mejores prácticas de mentoría - -La mentoría implica la relación entre mentores/as y aprendices. Los/as buenos/as -mentores/as son personas entusiastas que disfrutan el papel que desempeñan para -ayudar a otros a lograr sus objetivos [(CHLP)][umich-mentoring-guide]. Hay -algunos roles diferentes que los/as mentores/as pueden estar obligados a tomar: - -1. Trabajo en red; los/as mentores/as ayudan a los/as aprendices a encontrar - personas y recursos que van más allá de su experiencia. -1. Asesoramiento; los/as mentores/as alientan, inspiran y desafían a los/as - aprendices a lograr sus objetivos. Además, actúan como confidentes, ayudando - a los/as aprendices a aclarar problemas reales y viendo el panorama general. -1. Facilitar; los/as mentores/as comparten sus experiencias, consejos, - enfatizando cómo su experiencia podría ser diferente de sus experiencias. -1. Entrenamiento; los/as mentores/as construyen la confianza de sus aprendices a - través de comentarios de apoyo. -1. Disfrutando del proceso de la mentoría; los/as mentores/as deben ser - espontáneos solo para enviar una palabra de aliento o una nueva información. -1. Evitar controlar la relación de mentoría. -1. Se recomienda que sea el/la aprendiz quien se asegure fijar la siguiente - fecha de reunión en coordinación con el/la mentor/a. - -## Comenzando a ser mentorado en OpenScienceLabs - -- Quien aspire a contar con una mentoría deberá solicitar la mentoría en nuestro - [GitHub](https://opensciencelabs.org/mentoring/mentors/), luego hacer click en - **"Solicitar mentoría"**, y llenar el formulario correspondiente, detallando - el área de mentoría, la disponibilidad de tiempo (incluir la zona horaria) y - objetivos que se quiere lograr después de terminada la mentoría. -- Con base en el formulario, OpenScienceLabs buscará mentores/as dentro la - comunidad, en un plazo no mayor a una semana se le mostrará las opciones al/la - aspirante a aprendiz. -- Una vez se haya coordinado con el/la mentor/a y el/la aprendiz se organizará - una primer encuentro que en lo posible tendrá la participación de una persona - del Steering Council de OpenScienceLabs. A partir de esa primera reunión el/la - aprendiz y el/la mentora coordinarán sus siguientes sesiones para la mentoría. -- Una vez finalizada la mentoría ambos, mentor/a y aprendiz llenarán un - formulario para indicar si la mentoría alcanzó sus objetivos, cuáles fueron - las dificultades y/o razones de conclusión de la mentoría. - -## Código de conducta de mentores (MCOC) - -Como organización, nos unimos al -[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg)](code_of_conduct.md) -No obstante, hemos decidido complementarlo con un apartado dedicado al proceso -de mentoring. Para obtener más información sobre nuestro Código de conducta de -mentores, revise esa sección en nuestro -[Código de conducta](mentoring-guideline/docs/COC.md). - -[guia-mentoring-umich]: - https://www.rackham.umich.edu/downloads/more-mentoring-guide-for-mentors.pdf -[mmu-mentoring-guidlines]: - https://www.mmu.ac.uk/media/mmuacuk/content/documents/human-resources/a-z/guidance-procedures-and-handbooks/Mentoring_Guidlines.pdf -[mejores prácticas de tutoría de Albany]: - https://www.albany.edu/academics/mentoring.best.practices.chapter3.shtml -[auckland-mentoring-guide-final]: - https://cdn.auckland.ac.nz/assets/auckland/business/current-students/PDFs/mentoring-guide-final.pdf -[Guía de tutoría de Harvard]: - https://cdn2.sph.harvard.edu/wp-content/uploads/sites/31/2015/10/Mentoring_Guide.pdf -[actuaries-mentoring-guidelines]: - https://www.actuaries.org/AWB/Projects/Global_Mentorship/Guidelines%20for%20Mentors%20and%20Mentees.pdf diff --git a/content/guidelines/mkt/opencollective-es.md b/content/guidelines/mkt/opencollective-es.md deleted file mode 100644 index 8303f42b2..000000000 --- a/content/guidelines/mkt/opencollective-es.md +++ /dev/null @@ -1,18 +0,0 @@ ---- - -draft: true - ---- - - - diff --git a/content/guidelines/roadmap/roadmap-es.md b/content/guidelines/roadmap/roadmap-es.md deleted file mode 100644 index 3b88b1763..000000000 --- a/content/guidelines/roadmap/roadmap-es.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: "Open Science Labs Roadmap" -date: 2019-09-14 -author: Ivan Ogasawara -draft: true -usePageBundles: false -tags: ["mentorías"] -aliases: ["/roadmap/"] ---- - - -Esta es una versión inicial de la hoja de ruta(roadmap) de Open Science Labs. - -Los temas que aún no se han tenido en cuenta en este documento pero que deberían añadirse en un futuro próximo son: - -* Compromiso de la comunidad -* Infraestructura -* Medios sociales - -En este documento, nos centramos en nuestras tres áreas principales actuales: eventos, pasantía y asociación. - - -## Eventos - -Open Science Labs motiva a cualquier persona y grupo de la comunidad a -organizar eventos sobre ciencia y tecnologías abiertas. - -Por ciencia y tecnologías abiertas nos referimos a cualquier tema sobre -ciencia o tecnología cuyo uso no esté restringido por licencias o -acuerdos. Ejemplos de temas que se aceptan: - -* Código abierto -* Datos abiertos -* Acceso abierto -* Ciencia abierta -* Bibliotecas con licencia de la Iniciativa de Código Abierto (OSI por sus siglas en inglés) -* Lenguajes de programación de código abierto -* Ciencia utilizando software de código abierto -* DevOps utilizando tecnologías de código abierto -* Cualquier área de la ciencia (si el contenido no está restringido por un muro de pago) - -Esta lista es solo un ejemplo de los temas aceptados, pero no se limita -a eso. Algunos ejemplos de temas que NO SE ACEPTAN: - -* Proyectos privados y restringidos -* Tecnología propietaria -* Un debate sobre un artículo que no sea de acceso abierto -* Un sistema operativo propietario -* Un lenguaje de programación propietario - - -Ahora, hay dos eventos que ocurren periódicamente: - -* PyCafé -* Seminarios web de DevOps - -**Planes:** - -Para estos eventos, se necesita un plan para llegar a más personas y aumentar el compromiso. - -Otras reuniones que se están considerando y que necesitan un mayor -compromiso de la comunidad para hacerlas posibles incluyen: - -* Reuniones de C++ -* Reuniones de compiladores -* Reuniones de R - -Por último, pero no menos importante, cuando OSL tenga todas estas -piezas funcionando comenzaremos a planificar una **Conferencia Anual** -que debería cubrir temas sobre ciencia y tecnologías abiertas. - - -## Pasantía - -La pasantía es una gran oportunidad para involucrar a más personas en el -proyecto, así como para ofrecer oportunidades a la comunidad de -practicar y aprender de personas experimentadas de todo el mundo. - -Los pasantes contribuyen principalmente a los proyectos asociados (Open -Science Labs Partnership), por lo que trabajarán en proyectos de código -abierto y recibirán la tutoría de otros colaboradores experimentados. - -Con este programa, pretendemos que sean contratados para estos proyectos -en un futuro próximo (dependiendo de su progreso). - -Los pasantes también trabajan en tareas internas para ayudar a Open -Science Labs a crecer, como: publicación en el blog, revisión de -solicitudes de extracción (pull request-PR), documentación, tareas de -organización, etc. - - -**Planes:** - -Por ahora, el número de pasantes que el proyecto puede permitirse es muy -pequeño, pero para esta fase, sería genial tener alrededor de 10 -pasantes para contribuir a todos los proyectos de código abierto de las -asociaciones y a las tareas internas de Open Science Labs. - -Además, sería genial participar en el Google Summer of Code. - - -## Asociaciones - -El programa de asociación nos ayuda a conectar con otros proyectos y -grupos de trabajo para expandir nuestra red y experiencias. - -Además, es un buen enfoque para ayudar a los proyectos a tener más -visibilidad y contribuciones de la comunidad. - -En la asociación, necesitamos a alguien del lado de los asociados que -asesore a los pasantes que contribuirán a sus proyectos. - -El escenario deseado para el programa de asociación es que el pasante -que contribuye a un proyecto sea contratado por ellos, pero no es un -requisito. - -**Planes:** - -El programa de asociación necesita conectarse a más proyectos y, para -esta fase, sería genial aumentar el número de asociados a 20 (actualmente -son 5). diff --git a/content/guidelines/roadmap/roadmap.md b/content/guidelines/roadmap/roadmap.md deleted file mode 100644 index 2fcad9a6c..000000000 --- a/content/guidelines/roadmap/roadmap.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -title: "Open Science Labs Roadmap" -date: 2019-09-14 -author: Ivan Ogasawara -draft: false -usePageBundles: false -tags: ["mentorías"] -aliases: ["/roadmap/"] ---- - - -This is an initial version of Open Science Labs Roadmap. - -Topics that were not considered yet on this document but should be added here in the near future are: - -* Community Engagement -* Infrastructure -* Social media - -In this document, we are focusing on our three current main areas: events, internship and partnership. - - -## Events - -Open Science Labs motivate anyone and any group from the community to organize events about open science and technologies. - -For open science and technologies we mean any topic about science or technology that its usage is not restricted by license or agreements. Examples of topics that is accepted: - -* Open Source -* Open Data -* Open Access -* Open Science -* Open Source Initiative (OSI) licensed libraries -* Open Source programming languages -* Science using open source software -* DevOps using open source technologies -* Any area of science (if the content is not restricted by a pay wall) - -This list is just an example of topics accepted, but it is not limited to that. Some examples of topics that is NOT ACCEPTED: - -* Private and restricted projects -* Proprietary technology -* A non open access paper discussion -* A proprietary operation system -* A proprietary programming language - - -Now, there are two events that is happening periodically: - -* PyCafé -* DevOps webinars - -**Plans:** - -For these events, a plan is needed to reach to reach out more people and increase the engagement. - -Other meetings that are being considered and that need a greater commitment from the community to make them possible include: - -* C++ meetings -* Compilers meetings -* R meetings - -Last but not least, when OSL has all these pieces working we will start to plan an **Annual Conference** that should cover topics about open science and technologies. - - -## Internship - -The internship is a great opportunity to involve more people in the project, as well as to provide opportunities for the community to practice and learn from experienced people from around the world. - -Interns contribute mainly to affiliated projects (Open Science Labs Partnership), so they will work on open source projects and receives mentoring from other experienced contributors. - -With this program, we aim to have them hired for these projects in the near future (depending on their progress). - -Interns also work on internal tasks to help Open Science Labs to grow, such as: blog post, PR review, documentation, organization tasks, etc. - - -**Plans:** - -For now, the number of interns that the project can afford is very small, but for this phase, it would be great to have around 10 interns in order to contribute to all the partnerships open source projects and to the Open Science Labs internal tasks. - -Also, it would be great to participate to Google Summer of Code as well. - - -## Partnerships - -Partnership program helps us to connect to other projects and work groups in order to expand our network and experiences. - -Also, it is a good approach to help the projects to have more visibility and contributions from the community. - -In the partnership, we need someone from the partners side that will mentoring the interns that will contribute to their projects. - -The desired scenario for the partnership program is when the intern that is contributing to a project is contracted by them, but it is not a requirement. - -**Plans:** - -The partnership program needs to connect to more projects and, for this phase, it would be great to increase the number of partner to 20 (currently it is 5). diff --git a/content/guidelines/videos/guide-es.md b/content/guidelines/videos/guide-es.md deleted file mode 100644 index f5ca5f402..000000000 --- a/content/guidelines/videos/guide-es.md +++ /dev/null @@ -1,18 +0,0 @@ ---- - -draft: true - ---- - - - diff --git a/content/linkedin.html b/content/linkedin.html deleted file mode 100644 index 23c0caf17..000000000 --- a/content/linkedin.html +++ /dev/null @@ -1,22 +0,0 @@ -+++ -title = "Open Science Labs LinkedIn" -description = "Open Science Labs, sharing knowledge" -date = "2019-02-28" -aliases = ["youtube"] -author = "OSL Team" -sidebar = false -singlecolumn = true -+++ - - - - - - - - - - - diff --git a/content/partners/index-es.html b/content/partners/index-es.html deleted file mode 100644 index 075ccafff..000000000 --- a/content/partners/index-es.html +++ /dev/null @@ -1,172 +0,0 @@ ---- -singlecolumn: true -sidebar: false -showauthor: false -showdate: false -showreadtime: false -draft: false -aliases: ["/partners/"] ---- - - - Open Science Labs Partners - - - - - - - - - - - - - - - - OSL es una comunidad de código abierto a la que todos pueden unirse, consulta - nuestro - - GitHub - para que seas parte y puedas resolver issues. - -

Asociados

- -
-
- - - -
-
-

AlertaDengue

-

InfoDengue es un sistema de alerta temprana para - todos los estados de Brasil, el sistema se basa en el análisis - continuo - de los datos híbridos generados a través de la investigación de los - datos climáticos y epidemiológicos y la extracción de información - social.

-

- -

-
-
-
-
-
- - - -
-
-

EpiGraphHub

-

Centro de datos de salud & ecosistema de análisis - de datos para una respuesta rápida a los brotes epidémicos.

-

- - - -

-
-
-
- -
-
- - - -
-
-

ArxLang

-

- El compilador Arx pretende ofrecer tipos de datos de - arrow como tipos de datos nativos. -

-

- -

-
-
-
- -
-
- - - -
-
-

pyOpenSci

-

- pyOpenSci promueve la investigación abierta y - reproducible mediante la revisión por pares de paquetes científicos de - Python. -

-

- - - - - -

-
-
-
- -
-
- - - -
-
-

- Un paquete de Python para estructuras de datos y algoritmos. -

-

-

-
-
-
- -
-
- - - -
-
-

- Institute for Globally Distributed Open Research and Education - (IGDORE) es un instituto de investigación independiente dedicado a - mejorar la calidad de la ciencia, la educación científica y la calidad - de vida de los científicos, los estudiantes y sus familias. -

-

-

-
-
- - diff --git a/content/partners/index.html b/content/partners/index.html deleted file mode 100644 index 7b92e4258..000000000 --- a/content/partners/index.html +++ /dev/null @@ -1,163 +0,0 @@ ---- -singlecolumn: true -sidebar: false -showauthor: false -showdate: false -showreadtime: false -draft: false -aliases: ["/es/partners/"] ---- - - - Open Science Labs Partners - - - - - - - - - - - - - - - - OSL is a Open-Source community and everyone can join, check our - - GitHub - to be apart of the issues. - -

Partners

- -
-
- - - -
-
-

AlertaDengue

-

InfoDengue is an early-warning system to all states - of Brazil, the system is based on the continuous analysis of hybrid - data generated through the research of climate and epidemiological - data and social scraping.

-

- -

-
-
-
-
-
- - - -
-
-

EpiGraphHub

-

Health Data Hub & Data Analysis Ecosystem for - Rapid Epidemic Outbreak Response.

-

- - - -

-
-
-
- -
-
- - - -
-
-

ArxLang

-

- Arx compiler aims to provide arrow datatypes as - native datatypes.

-

- -

-
-
-
- -
-
- - - -
-
-

pyOpenSci

-

pyOpenSci promotes open and reproducible research - through peer-review of scientific Python packages.

-

- - - - - -

-
-
-
- -
-
- - - -
-
-

A Python package for data structures and - algorithms.

-

-

-
-
-
- -
-
- - - -
-
-

- Institute for Globally Distributed Open Research and Education - (IGDORE) is an independent research institute dedicated to improving - the quality of science, science education, and quality of life for - scientists, students and their families. -

-

-

-
-
- - diff --git a/content/programs/internship/index.md b/content/programs/internship/index.md deleted file mode 100644 index d21fa3acb..000000000 --- a/content/programs/internship/index.md +++ /dev/null @@ -1,89 +0,0 @@ -+++ -title = "OSL Internship Program" -description = "Internship Program about" -date = "2023-08-24" -aliases = ["internship"] -author = "OSL Team" -sidebar = false -singlecolumn = true -+++ - -# Open Science Labs Internship Program - -The Open Science Labs Internship Program aims to promote the engagement of a -wider audience in the realm of open-source software development. - -## Program Features - -Each intern will be paired with a mentor who is an active member of the -community. The mentor will provide guidance to the intern in achieving the -specific goals of the internship. The internship will involve a series of -activities and contributions to open-source projects. The internship is expected -to have a minimum duration of 2 months and a maximum of six months. - -[The Graph Network](https://thegraphnetwork.org), legally represented by -[ASCRES](https://site.ascres.org/site/), is our Fiscal Sponsor and will be in -charge of all the necessary paperwork. - -Currently, we are aiming students from Bolivian Universities, but we will open -for other countries soon. - -## Stages of the Internship Program - -### Call for Applications and Selection - -Once the projects for the internship program are defined, a call for -applications will be announced for interested candidates (duration: 2 weeks). - -The selection process, overseen by project mentors and maintainers, will last -for 1 week. - -Upon completion of the selection process, necessary formalities will be -conducted to finalize the onboarding. - -### Internship - -Throughout the internship, students will be required to submit monthly reports -detailing their activities. These reports will include a record of hours spent -and milestones achieved. - -### Completion of the Internship Program - -The internship will conclude upon fulfilling the stipulated hours, at which -point a certificate will be issued to acknowledge the successful completion of -the internship. The internship may also be terminated if the intern consistently -misses scheduled meetings or fails to meet agreed-upon activity milestones. - -## Requirements to Join the Internship Program - -Proficiency in English at least to an intermediate level. Basic knowledge -related to the project to which the intern intends to contribute. Agreement to -adhere to the established Codes of Conduct within the community. - -For any further inquiries, please contact our dedicated Internship Program team -at OSL. Together, we can shape the future of open science and open source -projects. - -## Projects available for the Internship Program - -Below is a list of projects currently available for the Internship Program: - -To apply for the internship program fill out the [form](https://github.com/OpenScienceLabs/request-forms/issues/new?&title=Internship+Apply+YOUR+NAME+HERE&labels=internship&template=en-internship.yaml) - -| Repository Name | Description | -| ---------------------------------- | ---------------------------------------------------- | -| conda-forge-warning | A panel that shows packages from conda-forge with no maintenance activities | -| pyreaddbc | A Python library for working with DBase database file. | -| ghreport | GitHub Report tool | -| satellite-weather-downloader | A system for downloading, transforming and analysing Copernicus weather data using Xarray. | -| scicookie | Cookiecutter template for a Python package. | -| makim | Make Improved | -| gh-check-pr-is-updated | This GitHub actions aims to check if the current PR's branch is updated on top of the upstream branch. | -| github-actions-self-hosted-runner | Dockerfile for the creation of a GitHub Actions runner image to be deployed dynamically. | -| containers-sugar | Simplify the usage of containers | -| github-actions-chatgpt-pr-reviewer | This GitHub actions uses OpenAI ChatGPT in order to review the changes presented in a PR and will recommend improvements. | -| semantic-release-pr-title-check | Checks for Angular commit message format in the Pull Request Title. | -| CrawlClima | This package contains the PEGATWEETS and PEGATEMPERATURA modules for automatically capturing tweets and weather data. | -| downloader-app | A shapefiles downloader.| -| fqlearn | A graphic solver tool to teach mass transfer and thermodynamics. | -| pydatastructs | PyDataStructs aims to be a Python package for various data structures and algorithms (including their parallel implementations). | diff --git a/content/programs/packaging-support/index.md b/content/programs/packaging-support/index.md deleted file mode 100644 index f4d2c9d7e..000000000 --- a/content/programs/packaging-support/index.md +++ /dev/null @@ -1,70 +0,0 @@ -+++ -title = "Packaging Support Program" -description = "Packaging Support Program" -date = "2023-08-27" -aliases = ["packaging-support"] -author = "OSL Team" -sidebar = false -singlecolumn = true -+++ - -# Open Science Labs (OSL) Packaging Support Program - -## Empowering Open Science Through Conda Packaging Excellence - -The OSL Packaging Support Program is designed to promote best practices in -software packaging within the open science community. Our initiative aims to -educate, facilitate, and inspire individuals to contribute to the -Conda/Conda-Forge ecosystem. - -### Plans Available - -#### 🌐 **Community Plan** - -Available to anyone affiliated through the Open Science Labs Affiliation -Program, our Community Plan offers: - -- **Educational Resources**: Learn the essentials of packaging with Conda to the - Conda-Forge channel. - -- **Community Involvement**: Get involved by helping package new software based - on community requests and maintain existing packages. - -- **Ecosystem Support**: Benefit from our ongoing contributions to tools and - platforms around the Conda/Conda-Forge ecosystem. - -#### 💎 **Premium Plan** - -Our Premium Plan is available to affiliated members and offers additional, -tailored services: - -- **Conda/Conda-Forge Training**: Gain deep insights into the Conda ecosystem, - with open materials made available to the community. - -- **Online Training**: Receive personalized, on-demand online training sessions - to cater to your specific needs. - -### Why Choose Our Packaging Support Program? - -- **Expert Guidance**: Leverage our expertise to navigate the complexities of - Conda and Conda-Forge packaging. - -- **Community Engagement**: Be part of a community of like-minded individuals - who share your commitment to open science. - -- **Enhanced Learning**: Our Premium Plan offers advanced training resources, - allowing you to dive deeper into Conda packaging. - -### How to Get Started - -1. **Join the OSL Affiliation Program**: To become eligible for the Community - Plan, you need to be an affiliated member. Not a member yet? [Join now](#). - -2. **Choose Your Plan**: Decide between the Community or Premium Plan based on - your specific needs. - -3. **Engage and Learn**: Access educational resources, community channels, or - personalized training based on the plan you choose. - -Join the OSL Packaging Support Program today and be at the forefront of Conda -packaging innovation! diff --git a/content/programs/partners/index.md b/content/programs/partners/index.md deleted file mode 100644 index 4fc3c384a..000000000 --- a/content/programs/partners/index.md +++ /dev/null @@ -1,80 +0,0 @@ -+++ -title = "Partners Program" -description = "Partners Program" -date = "2023-08-27" -aliases = ["partners"] -author = "OSL Team" -sidebar = false -singlecolumn = true -+++ - -# Open Science Labs (OSL) Partners Program - -## Forging Synergistic Partnerships in the Realm of Open Science and Open Source - -Join the esteemed ranks of our existing partners like EpiGraphHub, The Graph -Network, Alerta Dengue, PyOpenSci, ArxLang, PyDataStructs, and IGDORE. At Open -Science Labs, we believe in the strength of collaboration and mutual growth. Our -Partners Program aims to build a rich network among groups dedicated to open -science and open-source initiatives. - -### What We Offer - -#### 🎙️ **Webinars and Events** - -- **Webinars**: Join us in webinars on our platforms to talk about your projects - and plans. - -- **Conferences & Unconferences**: Collaborate with us and other partners to - organize impactful events, both structured and informal. - -#### 🤝 **Community and Infrastructure Access** - -- Gain unparalleled access to our dynamic community and infrastructure. - -#### 💡 **Internship Recommendations** - -- Utilize the talent from our community for internships through the Open Science - Labs Internship Program. - -#### 📦 **Packaging Support** - -- Add packages that you need to our community wishlist in the Packaging Support - Program. - -### Eligibility and Criteria - -- **Who Can Apply?**: Groups, communities, or projects that are related to open - science or open source. - -- **Code of Conduct**: Candidates must commit to our Code of Conduct to maintain - the integrity and focus of our combined missions. - -- **Social Media Collaboration**: Any assistance in amplifying our mutual - initiatives through social media is highly appreciated. - -### How to Join - -1. **Read Our Code of Conduct**: Familiarize yourself with our principles and - standards. - -2. **Apply**: Fill out our application form, detailing how your group aligns - with open science or open-source domains. - -3. **Engage**: Once approved, we will mutually announce our partnership and you - can start enjoying the myriad of benefits and collaborations that come with - it. - -### Why Become a Partner? - -- **Network Benefits**: Leverage the extensive network from all affiliated - groups. - -- **OSL Programs**: Benefit from other OSL Programs like Packaging Support, - Internship Program, etc. - -- **Enhanced Visibility**: Gain more exposure through our webinars, conferences, - and social media channels. - -Join us today to foster a collaborative environment and drive the future of open -science and open-source projects. diff --git a/content/search.md b/content/search.md deleted file mode 100644 index 65759a0b3..000000000 --- a/content/search.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -title = "Search" -searchPage = true -type = "search" -+++ \ No newline at end of file diff --git a/content/team/old_index.html b/content/team/old_index.html deleted file mode 100644 index 3b82cee46..000000000 --- a/content/team/old_index.html +++ /dev/null @@ -1,245 +0,0 @@ ---- -singlecolumn: true -sidebar: false -showauthor: false -showdate: false -showreadtime: false -draft: true ---- - - - -OSL is a Open-Source community and everyone can join, check our - -GitHub -to be apart of the issues. - -

How can you contribute?

- -To be contributing with the community you must know our -Guidelines, -there you will find the workflow of the running projects and how you -can apply to our team. - -

Steering Council

- -
-
- Ivan Ogasawara -
-

Ivan Ogasawara

- - Enthusiast of Compilers, Data Science and Open Science. - Experience with Python, C++, Javascript, DevOps and Packaging. - - Founder of Open Science Labs. - -

- - - -

- - - Support his work on community and open source projects via: - -
-
- Eunice Rodas -
-

Eunice Rodas

-

- I’m currently working on Beek.io as Data Engineer, I work create and - model, ETL, pipelines and Datawarehouse usuing Python, Pandas, Airflow - and GCP. I'm data passionate, I studied a postgraduate in Data Predict - and Analytics using Pandas, Tensorflow and R. -

-

- - - -

-
-
- Ever Vino -
-

Ever Vino

-

- Environmental Engineer with experience in Research, chemical analysis, - development of mathematical models for Bioprocesses, design of - wastewater treatment systems. -

-

- - - -

-
-
- Luis Gago Casas -
-

Luis Gago Casas

-

- CEO and Owner at AyPhu. -

-

- - - -

-
-
- - -

Interns

- -
-
- Luã Bida Vacaro -
-
Luã Bida Vacaro
-

- Software Developer and DevOps -

-

-

- - Support his work on community and open source projects via: - - -
- -
- Anavelyz Pérez -
-
Anavelyz Pérez
-

- Statistician, data analyst. Python and R learner. -

-

-

- -
-
- Yurely Camacho -
-
Yurely Camacho
-

- Statistician, data analyst. Python and R learner. -

-

-

- -
-
- - -

Steering Council Emeritus

- -
-
- Sandro Loch -
-
Sandro Loch
-

- Web developer with experience with Python, Docker, Conda and Django; - Also, he have contributed to opensource projects. -

-

-

- -
-
- Mariangela Petrizzo -
-
Mariangela Petrizzo
-

- Political scientist by formation, mayeutic by conviction. Looking for a - new ways for open knowledge survival in a world plenty of selfishness. -

-

-

- -
- -
- Ingrid Garcia -
-
Ingrid Garcia
-

- Research Coordinator at 60 Decibels. -

-

-

- -
-
- Fracisco Palm -
-
Francisco Palm
-

- Computation & Data Science Senior Researcher, Python & R Developer and - Software Architect. Special emphasis on hacker ethic as a learning - strategy, use of conceptual and mathematical models for decision-making, - geomatics and spatial analysis, all these areas focused on Distributed - Massive Empowerment. -

-

-

- -
- -
- - - - diff --git a/content/team/team-es.html b/content/team/team-es.html deleted file mode 100644 index 9f22d36ce..000000000 --- a/content/team/team-es.html +++ /dev/null @@ -1,269 +0,0 @@ ---- -singlecolumn: true -sidebar: false -showauthor: false -showdate: false -showreadtime: false -draft: true ---- - -OSL es una comunidad de código abierto a la que todos pueden unirse, consulta -nuestro - -GitHub -para que seas parte y puedas resolver Issues. - - -

¿Cómo puedes contribuir?

- -Para contribuir con la comunidad debes conocer nuestras -guías, allí -encontrarás el flujo de trabajo de los proyectos en marcha y cómo puedes aplicar -a nuestro equipo. - - -

Junta directiva

- -
-
- Ivan Ogasawara -
-
Ivan Ogasawara
-

- Entusiasta de los compiladores, la ciencia de datos y la ciencia - abierta. - Experiencia con Python, C++, Javascript, DevOps y Packaging. - - Fundador de Open Science Labs. -

-

- - - -

- - Apoya su trabajo en proyectos comunitarios y open source via: - -
-
-
- Eunice Rodas -
-
Eunice Rodas
-

- Actualmente trabaja en Beek.io como Ingeniero de Datos, trabaja en la - creación y modelado, ETL, pipelines y datawarehouse utilizando Python, - Pandas, Airflow y GCP. Es apasionada de los datos, estudió un postgrado - en Data Predict y Analítica utilizando Pandas, Tensorflow y R. -

-

-

-
-
-
- Ever Vino -
-
Ever Vino
-

- Ingeniero Ambiental con experiencia en Investigación, análisis químico, - desarrollo de modelos matemáticos para bioprocesos, diseño de sistemas - de tratamiento de aguas residuales. -

-

-

-
-
-
- Luis Gago Casas -
-
Luis Gago Casas
-

- CEO y propietario de AyPhu. -

-

-

-
-
- -
- Agustina Pesce Lopez -
-
Agustina Pesce Lopez
-

- I'm a Physicist and a PhD in Geophysics. All those years, I worked in applied geophysics - and studied subduction zones through geodynamical numerical modeling. - I'm also committed to contribute to open-source software projects to improve - science openness and reproducibility. -

-

-

-
-
- -
- -

Pasantes

- -
-
- Luã Bida Vacaro -
-
Luã Bida Vacaro
-

- Desarrollador de software y DevOps -

-

-

- - Apoya su trabajo en proyectos comunitarios y open source via: - -
-
- -
- Ariel Norberto Silvio Ramos -
-
Ariel Silvio Norberto Ramos
-

- Programador, Desarrollador, Profesor de Tecnología, Organizador, - Logística. -

-

-

-
-
- - -
- Anavelyz Pérez -
-
Anavelyz Perez
-

- Estadística, analista de datos. Aprendiz de Python y R. -

-

-

-
-
-
- Yurely Camacho -
-
Yurely Camacho
-

- Estadística, analista de datos. Aprendiz de Python y R. -

-

-

-
-
-
- -

Junta Directiva Emeritus

- -
-
- Sandro Loch -
-
Sandro Loch
-

- Desarrollador web con experiencia en Python, Docker, Conda y Django; - además, ha contribuido a proyectos de código abierto. -

-

-

-
-
-
- Mariangela Petrizzo -
-
Mariangela Petrizzo
-

- Politóloga por formación, mayéutica por convicción. Buscando una nuevos - caminos para la supervivencia del conocimiento abierto en un mundo lleno - de egoísmo. -

-

-

-
-
- -
- Ingrid Garcia -
-
Ingrid Garcia
-

- Coordinadora de investigación en 60 Decibels. -

-

-

-
-
- -
- Fracisco Palm -
-
Francisco Palm
-

- Investigador Senior de Computación y Ciencia de Datos, Desarrollador de - Python y R y Arquitecto de Software. Con especial énfasis en la ética - hacker como estrategia de aprendizaje, uso de modelos conceptuales y - matemáticos para la toma de decisiones, geomática y análisis espacial, - todas estas áreas enfocadas al Empoderamiento Masivo Distribuido. -

-

-

-
-
-
- - - diff --git a/content/twitter.html b/content/twitter.html deleted file mode 100644 index f4965d8d8..000000000 --- a/content/twitter.html +++ /dev/null @@ -1,22 +0,0 @@ -+++ -title = "Open Science Labs Twitter" -description = "Open Science Labs, sharing knowledge" -date = "2019-02-28" -aliases = ["twitter"] -author = "OSL Team" -sidebar = false -singlecolumn = true -+++ - - - - - - - - - - - diff --git a/content/youtube.html b/content/youtube.html deleted file mode 100644 index 29aeb2d81..000000000 --- a/content/youtube.html +++ /dev/null @@ -1,22 +0,0 @@ -+++ -title = "Open Science Labs Youtube" -description = "Open Science Labs, sharing knowledge" -date = "2019-02-28" -aliases = ["youtube"] -author = "OSL Team" -sidebar = false -singlecolumn = true -+++ - - - - - - - - - - - diff --git a/csv_folder/counting_cats.csv b/csv_folder/counting_cats.csv deleted file mode 100644 index 9e6f386a2..000000000 --- a/csv_folder/counting_cats.csv +++ /dev/null @@ -1,32 +0,0 @@ -cat,number -artificial intelligence,1 -bash,1 -citation,1 -citizen science,4 -communication,1 -código abierto,1 -dashboard,2 -data,2 -data science,2 -documentation,1 -ethereum,1 -git,3 -ide,2 -jupyter,1 -learning,1 -machine learning,1 -markdown,1 -mentoring,1 -nft,1 -open access,2 -open data,5 -open science,17 -open source,2 -packaging,2 -programming,1 -python,3 -r,5 -research,1 -science,1 -social labs,2 -web3,2 diff --git a/csv_folder/counting_tags.csv b/csv_folder/counting_tags.csv deleted file mode 100644 index 8fa3a541e..000000000 --- a/csv_folder/counting_tags.csv +++ /dev/null @@ -1,80 +0,0 @@ -tag,number -artificial intelligence,1 -automation,1 -base de dados,1 -bash,1 -bi,1 -blockchain,1 -carpentries,1 -ciencia abierta,1 -ciencia de datos,2 -citation,1 -citizen science,3 -columnas a filas,1 -communication,1 -community,1 -covid19,3 -crypto,2 -código abierto,1 -dashboard,2 -data,1 -data science,4 -datasets,1 -datos,1 -developer,1 -devops,2 -documentation,2 -dplyr,1 -env,1 -epigraphhub,1 -ethereum,1 -filas a columnas,1 -filtrar datos,2 -ggmap,1 -ggplot2,1 -ibis,1 -ide,2 -interfaz,1 -interfaz de r,1 -lattice,1 -learning,1 -license,1 -machine learning,1 -maps,1 -mentoring,1 -merge,1 -mineria de texto,1 -nft,1 -nube de palabras,1 -open data,2 -open science,33 -open source,4 -packaging,2 -pandemic,1 -plotly,1 -posit,1 -programacion,1 -pyopensci,1 -python,5 -r,9 -recursos,2 -rmarkdown,1 -roadmap,1 -ropensci,1 -rstudio,3 -rstudio desktop,1 -rstudio server,1 -science,1 -shiny,1 -social labs,2 -spyder,1 -spyder online,1 -sql,2 -superset,1 -tidyr,1 -tidyverse,1 -versioning,4 -visualización,2 -visualization,4 -web3,2 -wordcloud,1 diff --git a/csv_folder/csv_links.csv b/csv_folder/csv_links.csv deleted file mode 100644 index f3c2740fe..000000000 --- a/csv_folder/csv_links.csv +++ /dev/null @@ -1,64 +0,0 @@ -path,slug,link,link_correcto -blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/index.md,plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo,[las herramientas que pueden utilizarse en el manejo de investigación reproducible](http://opensciencelabs.org/2020/03/09/como-aplicar-la-investigacion-reproducible-a-proyectos-de-codigo-abierto/),[las herramientas que pueden utilizarse en el manejo de investigación reproducible](http://opensciencelabs.org/2020/03/09/como-aplicar-la-investigacion-reproducible-a-proyectos-de-codigo-abierto/) -blog/plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo/index.md,plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo,[cuáles son los aspectos clave a tener en cuenta en el manejo de equipos de trabajo de ciencia abierta](http://opensciencelabs.org/2020/01/20/aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta/),[cuáles son los aspectos clave a tener en cuenta en el manejo de equipos de trabajo de ciencia abierta](http://opensciencelabs.org/2020/01/20/aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta/) -blog/como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto/index.md,como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto,"\[investigación reproducible\](enlace a artículo -investigacionreproducible)","\[investigación reproducible\](enlace a artículo -investigacionreproducible)" -blog/como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto/index.md,como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto,"\[Documentación de código -abierto\](enlace a artículo documentacioncodigoabierto)","\[Documentación de código -abierto\](enlace a artículo documentacioncodigoabierto)" -blog/como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto/index.md,como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto,"\[Ciencia reproducible, qué, por qué, cómo\](https://www.researchgate.net/publication 306389707_Ciencia_reproducible_que_por_que_como/link/57bd44d408aedf5f75eadf0a/download)","\[Ciencia reproducible, qué, por qué, cómo\](https://www.researchgate.net/publication 306389707_Ciencia_reproducible_que_por_que_como/link/57bd44d408aedf5f75eadf0a/download)" -blog/te-hablamos-de-cinco-repositorios-con-datos-abiertos-sobre-paises/index.md,te-hablamos-de-cinco-repositorios-con-datos-abiertos-sobre-paises,"\[aquí\](enlace a artículo de Rainer sobre datos -abiertos)","\[aquí\](enlace a artículo de Rainer sobre datos -abiertos)" -blog/como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones/index.md,como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones,\[DIGITAL.CSIC Ciencia Abierta\] (https://digital.csic.es/dc/accesoAbierto.jsp),\[DIGITAL.CSIC Ciencia Abierta\] (https://digital.csic.es/dc/accesoAbierto.jsp) -blog/como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones/index.md,como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones,"\[Universidad de Jaén\] -(https://libereurope.eu/wp-content/uploads/2017/09/OpenAccess5Principlesposter.jpg)","\[Universidad de Jaén\] -(https://libereurope.eu/wp-content/uploads/2017/09/OpenAccess5Principlesposter.jpg)" -blog/como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones/index.md,como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones,"\[Manifiesto de Ciencia Abierta y Colaborativa\] -(https://ocsdnet.org/wp-content/uploads/2015/04/Manifesto-Infographic-Spanish-1.pdf)","\[Manifiesto de Ciencia Abierta y Colaborativa\] -(https://ocsdnet.org/wp-content/uploads/2015/04/Manifesto-Infographic-Spanish-1.pdf)" -blog/dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile/index.md,dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile,[Ever Vino](https://opensciencelabs.github.io/articles/authors/ever-vino.html),[Ever Vino](https://opensciencelabs.github.io/articles/authors/ever-vino.html) -blog/cinco-tips-para-aumentar-tu-productividad-con-git/index.md,cinco-tips-para-aumentar-tu-productividad-con-git,[Git de 0 a 100 en diez sencillos pasos](https://opensciencelabs.org/blog/0002-GitCeroACien/git-de-en-diez-sencillos-pasos/),[Git de 0 a 100 en diez sencillos pasos](https://opensciencelabs.org/blog/0002-GitCeroACien/git-de-en-diez-sencillos-pasos/) -blog/cinco-cosas-que-no-debes-olvidar-al-trabajar-con-markdown/index.md,cinco-cosas-que-no-debes-olvidar-al-trabajar-con-markdown,\[**Jupyter Notebook**\](enlace al artículo que-es-jupyter),\[**Jupyter Notebook**\](enlace al artículo que-es-jupyter) -blog/reorganiza-tus-tablas-con-tidyr/index.md,reorganiza-tus-tablas-con-tidyr,[este artículo](https://opensciencelabs.org/blog/filtrar-datos-r/filtrar-datos-r/),[este artículo](https://opensciencelabs.org/blog/filtrar-datos-r/filtrar-datos-r/) -blog/la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones/index.md,la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones,\[Biblioteca de la Universidad de Extremadura\] (https://biblioguias.unex.es/c.php?g=572093&p=3944864),\[Biblioteca de la Universidad de Extremadura\] (https://biblioguias.unex.es/c.php?g=572093&p=3944864) -blog/la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones/index.md,la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones,\[Oficina de conocimiento abierto\] (http://oca.unc.edu.ar/2018/08/21/repositorios-de-datos-de-investigacion-y-de-ciencia-abierta/),\[Oficina de conocimiento abierto\] (http://oca.unc.edu.ar/2018/08/21/repositorios-de-datos-de-investigacion-y-de-ciencia-abierta/) -blog/la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones/index.md,la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones,\[Blog Neoscientia\] (https://neoscientia.com/ciencia-abierta/),\[Blog Neoscientia\] (https://neoscientia.com/ciencia-abierta/) -blog/te-contamos-sobre-la-comunidad-ropensci/index.md,te-contamos-sobre-la-comunidad-ropensci,"[pyOpenSci: un -promotor de la ciencia abierta](https://opensciencelabs.org/blog/0043-PyOpenSci/pyopensci-un-promotor-de-la-ciencia-abierta/)","[pyOpenSci: un -promotor de la ciencia abierta](https://opensciencelabs.org/blog/0043-PyOpenSci/pyopensci-un-promotor-de-la-ciencia-abierta/)" -blog/herramientas-de-visualizacion-en-python/index.md,herramientas-de-visualizacion-en-python,[10 razones para usar Python en tu proximo proyecto de investigación](http://opensciencelabs.org/blog/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/),[10 razones para usar Python en tu proximo proyecto de investigación](http://opensciencelabs.org/blog/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/) -blog/que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias/index.md,que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias,"\[este -artículo\](https://www.elsevier.es/es-revista-revista-colombiana-anestesiologia-341-articulo-zika-una-pandemia-progreso-un-S0120334716300235 -y otro [publicado en -Elsevier](https://www.elsevier.es/es-revista-revista-colombiana-anestesiologia-341-articulo-virus-zika-se-expande-su-S0120334716000216)","\[este -artículo\](https://www.elsevier.es/es-revista-revista-colombiana-anestesiologia-341-articulo-zika-una-pandemia-progreso-un-S0120334716300235 -y otro [publicado en -Elsevier](https://www.elsevier.es/es-revista-revista-colombiana-anestesiologia-341-articulo-virus-zika-se-expande-su-S0120334716000216)" -blog/que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias/index.md,que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias,"\[""DengueNet""\](http://ghdx.healthdata.org/record/who-denguenet\], el -sistema central de gestión de datos de la OMS para la vigilancia -epidemiológica y virológica mundial del dengue y la fiebre hemorrágica -del dengue. Puedes visitar [en este -enlace](http://www.bvs.hn/php/level.php?lang=es&component=59&item=2)","\[""DengueNet""\](http://ghdx.healthdata.org/record/who-denguenet\], el -sistema central de gestión de datos de la OMS para la vigilancia -epidemiológica y virológica mundial del dengue y la fiebre hemorrágica -del dengue. Puedes visitar [en este -enlace](http://www.bvs.hn/php/level.php?lang=es&component=59&item=2)" -blog/aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta/index.md,aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta,[5] (ya sean empresas o gobiernos),[5] (ya sean empresas o gobiernos) -blog/pyopensci-un-promotor-de-la-ciencia-abierta/index.md,pyopensci-un-promotor-de-la-ciencia-abierta,[Python](https://opensciencelabs.org/blog/0011-10razonesparausarpython/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/),[Python](https://opensciencelabs.org/blog/0011-10razonesparausarpython/razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion/) -blog/pyopensci-un-promotor-de-la-ciencia-abierta/index.md,pyopensci-un-promotor-de-la-ciencia-abierta,[documentación](https://opensciencelabs.org/blog/0031-documentacion_cienciaabierta/como-documentar-tu-proyecto-de-ciencia-abierta/),[documentación](https://opensciencelabs.org/blog/0031-documentacion_cienciaabierta/como-documentar-tu-proyecto-de-ciencia-abierta/) -blog/herramientas-de-visualizacion-en-r/index.md,herramientas-de-visualizacion-en-r,[¿Qué es el Lenguaje R y cómo puede ayudarte en tus proyectos?](https://opensciencelabs.org/blog/que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos/),[¿Qué es el Lenguaje R y cómo puede ayudarte en tus proyectos?](https://opensciencelabs.org/blog/que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos/) -blog/que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo/index.md,que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo,"[Investigación colaborativa con -Git](https://opensciencelabs.org/blog/0009-investigacion_colaborativa_con_git/investigacion-colaborativa-con-git/)","[Investigación colaborativa con -Git](https://opensciencelabs.org/blog/0009-investigacion_colaborativa_con_git/investigacion-colaborativa-con-git/)" -blog/que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo/index.md,que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo,[Git](https://opensciencelabs.org/blog/0002-GitCeroACien/git-de-en-diez-sencillos-pasos/),[Git](https://opensciencelabs.org/blog/0002-GitCeroACien/git-de-en-diez-sencillos-pasos/) -blog/te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta/index.md,te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta,[¿Qué es la ciencia abierta?](https://opensciencelabs.org/blog/que-es-la-ciencia-abierta/),[¿Qué es la ciencia abierta?](https://opensciencelabs.org/blog/que-es-la-ciencia-abierta/) -blog/te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta/index.md,te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta,"[**Herramientas de visualización en -Python**](https://opensciencelabs.org/blog/0037-visualizacion_python/herramientas-de-visualizacion-en-python/)","[**Herramientas de visualización en -Python**](https://opensciencelabs.org/blog/0037-visualizacion_python/herramientas-de-visualizacion-en-python/)" -blog/apache-superset/index.md,apache-superset,"[EpiGraphHub: -un proyecto de código abierto para el análisis de datos de -calidad](https://opensciencelabs.org/blog/epigraphhub-un-proyecto-de-c%C3%B3digo-abierto-para-el-analisis-de-datos-de-calidad/)","[EpiGraphHub: -un proyecto de código abierto para el análisis de datos de -calidad](https://opensciencelabs.org/blog/epigraphhub-un-proyecto-de-c%C3%B3digo-abierto-para-el-analisis-de-datos-de-calidad/)" diff --git a/csv_folder/csv_tags.csv b/csv_folder/csv_tags.csv deleted file mode 100644 index 9ec25a8c0..000000000 --- a/csv_folder/csv_tags.csv +++ /dev/null @@ -1,69 +0,0 @@ -slug,category,tags -cinco-cosas-que-no-debes-olvidar-al-trabajar-con-datos-abiertos,[open data],[open data] -investigacion-colaborativa-con-git,[git],[open science] -que-es-el-acceso-abierto-y-por-que-debes-tenerlo-en-cuenta-para-tus-investigaciones,[open access],[open science] -plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo,[communication],[communication] -ibis-framework,[python],"[python, sql, base de dados, ibis]" -como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto,[open science],[open science] -por-que-deberias-considerar-carpentries-como-una-referencia-para-aprender-ciencia-de-datos,[learning],"[data science, learning, carpentries, ciencia de datos]" -ciencia-abierta,[artificial intelligence],[artificial intelligence] -que-son-las-mentorias-y-como-potencian-los-proyectos-de-ciencia-abierta,[mentoring],[mentoring] -te-hablamos-de-cinco-repositorios-con-datos-abiertos-sobre-paises,[open data],[open science] -como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones,[open access],[open science] -visualiza-tus-datos-en-r-con-ggplot-y-gganimate,[r],"[r, visualization]" -que-es-la-ciencia-abierta,[open science],[open science] -dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile,[r],"[r, maps, visualization]" -cinco-tips-para-aumentar-tu-productividad-con-git,[git],[versioning] -primeros-pasos-con-rstudio,[ide],"[ide, r, rstudio, rstudio desktop, rstudio server, interfaz de r]" -filtrar-datos-r,[data science],"[open science, r, filtrar datos, dplyr, recursos, data science]" -como-instalar-y-comenzar-utilizar-tensorflow,[machine learning],[machine learning] -que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos,[r],"[open science, r, rstudio, posit, data science, ciencia de datos, rmarkdown]" -caracteristicas-y-tips-utiles-que-te-ayudaran-sacar-el-maximo-provecho-de-conda,[packaging],"[devops, packaging]" -razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion,[python],[open science] -cinco-cosas-que-no-debes-olvidar-al-trabajar-con-markdown,[markdown],[open science] -reorganiza-tus-tablas-con-tidyr,[data science],"[open science, r, filtrar datos, tidyr, data science, columnas a filas, filas a columnas]" -que-son-los-datos-abiertos,[open data],[open science] -te-hablamos-de-las-licencias-mas-utilizadas-en-proyectos-de-ciencia-abierta,[open science],"[open science, license]" -como-instalar-y-comenzar-utilizar-conda,[packaging],"[devops, packaging]" -la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones,[open science],"[open science, versioning]" -cuales-son-los-principios-de-la-investigacion-reproducible,[open science],[open science] -cinco-cosas-que-te-ayudaran-gestionar-mejor-los-datos-de-tus-proximos-proyectos,[data],[open science] -la-investigacion-abierta-podria-cambiar-el-futuro-de-la-investigacion-en-ciencias-puras-te-contamos-por-que,[open science],[open science] -si-pensado-en-como-automatizar-la-construccion-de-citas-en-tu-proyecto-te-contamos-como-hacerlo-posible,[citation],[citation] -los-laboratorios-sociales-y-el-manejo-del-covid-19,[social labs],"[social labs, covid19]" -algunos-proyectos-entretenidos-de-codigo-abierto,[open source],[open source] -crea-una-nube-de-palabras-en-r-partir-de-un-documento-de-texto,[r],"[r, rstudio, nube de palabras, wordcloud, mineria de texto]" -te-contamos-sobre-la-comunidad-ropensci,[open science],"[r, community, open science, ropensci]" -automatizacion-de-tareas-via-bash,[bash],"[bash, automation]" -todo-lo-que-debes-saber-sobre-la-investigacion-colaborativa,[research],[open science] -que-es-el-open-science-framework,[open science],[open science] -como-presentar-tu-codigo-como-un-articulo-cientifico,[science],[science] -algunos-proyectos-de-ciencia-e-inteligencia-ciudadana-para-atender-la-pandemia-del-covid-19,[citizen science],"[open science, citizen science, covid19]" -git-de-en-diez-sencillos-pasos,[git],[versioning] -que-son-los-laboratorios-sociales-y-como-pueden-ayudar-los-equipos-de-investigacion,[social labs],[social labs] -herramientas-de-visualizacion-en-python,[python],"[python, visualization]" -epigraphhub-un-proyecto-de-código-abierto-para-el-analisis-de-datos-de-calidad,[código abierto],"[epigraphhub, código abierto, visualización, datos, datasets]" -que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias,[open science],"[open science, pandemic]" -que-es-el-codigo-abierto-y-como-puede-ayudarte,[open source],[open source] -te-mostramos-algunos-repositorios-con-datos-sobre-el-covid-19,[open data],"[open science, covid19]" -aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta,[open science],[open science] -todas-las-posibilidades-que-te-ofrece-utilizar-figshare-en-tus-proyectos,[open science ],[open science] -que-es-ciencia-ciudadana,[citizen science],[citizen science] -ethereum-merge-is-coming-pero-que-significa,"[open science, web3, ethereum]","[crypto,ethereum,merge,web3]" -pyopensci-un-promotor-de-la-ciencia-abierta,[open science],"[open science, python, pyopensci, ciencia abierta, open source]" -ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion,[jupyter],[open science] -que-necesitas-para-desarrollar-en-la-web3,"[open science, web3]","[crypto,roadmap,env,developer,web3]" -te-hablamos-del-uso-de-dashboards-para-visualizacion-de-datos-de-tu-proximo-proyecto,[dashboard],[open science] -si-ya-usas-codigo-abierto-te-contamos-como-puedes-sacarle-mayor-provecho-tu-documentacion-para-tus-articulos-y-publicaciones,[documentation],"[open source, documentation]" -code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion,[programming],"[open science, programacion, recursos]" -herramientas-de-visualizacion-en-r,[r],"[r, visualization, lattice, ggplot2, tidyverse, ggmap, plotly, shiny]" -como-documentar-tu-proyecto-de-ciencia-abierta,[open science],"[open science, documentation]" -que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo,[data],"[versioning, data]" -la-importancia-de-la-integridad-en-los-datos-manejados-en-los-dashboards,[dashboard],[dashboard] -te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta,[open science],"[open science, python]" -apache-superset,[citizen science],"[visualización, dashboard, superset, bi, sql]" -dataverse-y-su-potencial-para-proyectos-de-ciencia-abierta,[open data],"[open science, open data]" -nft-mas-que-un-jpg,[nft],"[nft, blockchain]" -tres-proyectos-de-ciencia-ciudadana-que-te-sorprenderan,[citizen science],[citizen science] -te-ensenamos-lugares-para-aprender-los-fundamentos-de-la-ciencia-abierta,[open science],[open science] -primeros-pasos-con-spyder,[ide],"[ide, interfaz, python, spyder, spyder online]" diff --git a/csv_folder/new_cat_tags.csv b/csv_folder/new_cat_tags.csv deleted file mode 100644 index df772019a..000000000 --- a/csv_folder/new_cat_tags.csv +++ /dev/null @@ -1,151 +0,0 @@ -slug,category,tags -cinco-cosas-que-no-debes-olvidar-al-trabajar-con-datos-abiertos,"[open science/open data] -[ciencia abierta/datos abiertos]","[datos] -[data]" -investigacion-colaborativa-con-git,"[open science/open research, software development/version control] -[ciencia abierta/investigación abierta, desarrollo de software/control de versiones]","[git, branch] -[git, ramas]" -que-es-el-acceso-abierto-y-por-que-debes-tenerlo-en-cuenta-para-tus-investigaciones,"[open science, open access] -[ciencia abierta, acceso abierto]","[research, projects] -[investigación, proyectos]" -plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo,[organization/team management] [organización/gestión de equipos],"[communication, management] [comunicación, gestión]" -como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto,"[open science/open research, open source] [ciencia abierta/investigación abierta, código abierto]","[code, reproducibility, research] -[código, reproducibilidad, investigación] " -por-que-deberias-considerar-carpentries-como-una-referencia-para-aprender-ciencia-de-datos,"[data science] -[ciencia de datos]","[carpentries, data, projects, learning] -[carpentries, datos, proyectos, aprendizaje]" -ciencia-abierta,[data science/artificial intelligence] [ciencia de datos/inteligencia artificial],"[artificial intelligence, AI, IA] [inteligencia artificial, AI, IA]" -que-son-las-mentorias-y-como-potencian-los-proyectos-de-ciencia-abierta,"[organization/mentoring, open science] -[organización/mentorías]","[projects] -[proyectos]" -te-hablamos-de-cinco-repositorios-con-datos-abiertos-sobre-paises,"[open science/open data, open access] [ciencia abierta/datos abiertos, acceso abierto]","[data, repository, access] -[datos, repositorios, acceso]" -como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones,"[open science/open access] -[ciencia abierta/datos abiertos, acceso abierto]","[research, repository] -[investigación, repositorios]" -visualiza-tus-datos-en-r-con-ggplot-y-gganimate,"[open science/open source, programming languages/ R] [ciencia abierta/código abierto, lenguajes de programación/R]","[visualization, data, graph, ggplot, gganimate] [visualización,datos, gráfico, ggplot, gganimate]" -que-es-la-ciencia-abierta,"[open science] -[ciencia abierta]","[research, data] -[investigación, datos]" -dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile,[open science] [ciencia abierta],"[maps, data, visualization, shapefile, R][mapas, datos, visualización, shapefile, R]" -cinco-tips-para-aumentar-tu-productividad-con-git,"[software development/version control] -[desarrollo de software/control de versiones]","[git, branchs, commits, repository, changes] -[git, ramas, commits, repositorios, cambios]" -primeros-pasos-con-rstudio,"[open science/open source, programming languages/ r] - [ciencia abierta/código abierto, lenguajes de programación/r]","[rstudio, learning] -[rstudio, aprendizaje]" -filtrar-datos-r,"[data science, programming languages/r] -[ciencia de datos, lenguajes de programación/r]","[data, packages, tables, dplyr] -[datos, paquetes, tablas, dplyr]" -como-instalar-y-comenzar-utilizar-tensorflow,"[open science/open source, programming languages/ Python, Data science/ML][ciencia abierta/código abierto, lenguajes de programación/Python, ciencia de datos/ML]","[tensorflow, code,ML, Machine Learning][tensorflow,código,Aprendizaje automático, aprendizaje de máquina]" -que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos,"[data science/statistics, programming languages/r] -[ciencia de datos/estadística, lenguajes de programación/r]","[rstudio, rmarkdown, projects, learning] -[rstudio, rmarkdown, proyectos, aprendizaje]" -caracteristicas-y-tips-utiles-que-te-ayudaran-sacar-el-maximo-provecho-de-conda,"[open science/open source,software development/DevOps, packaging][ciencia abierta/código abierto, desarrollo de software/DevOps, empaquetado]","[conda, packaging, package, manager, environment][conda, empaquetado,paquete, gestor, entorno]" -razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion,"[open science/open research, data science, programming languages/python] -[ciencia abierta/investigación abierta, ciencia de datos, lenguajes de programación/python]","[library, tools, code] -[biblioteca, herramientas, código]" -cinco-cosas-que-no-debes-olvidar-al-trabajar-con-markdown,[programming/markdown][programación/markdown],"[markdown, md, text][markdown, md, texto]" -reorganiza-tus-tablas-con-tidyr,"[programming languages/r, data science] -[lenguajes de programación/r, ciencia de datos]","[tidyr, libraries, functions, tables, reorganize, data] -[tidyr, bibliotecas, funciones, tablas, reorganizar, datos]" -que-son-los-datos-abiertos,"[open science/open data] -[ciencia abierta/datos abiertos]","[data, research] -[datos, investigación]" -te-hablamos-de-las-licencias-mas-utilizadas-en-proyectos-de-ciencia-abierta,"[open science] -[ciencia abierta]","[license, projects, free software] -[licencia, proyectos, free software]" -como-instalar-y-comenzar-utilizar-conda,"[open science/open source,software development/DevOps, packaging][ciencia abierta/código abierto, desarrollo de software/DevOps, empaquetado]","[conda,packaging, package, manager, environment][conda, empaquetado,paquete, gestor, entorno]" -la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones,"[open science/open research, software development/version control] -[ciencia abierta/investigación abierta, desarrollo de software/control de versiones]","[versions, repositories] -[versiones, repositorios]" -cuales-son-los-principios-de-la-investigacion-reproducible,"[open science/open research] -[ciencia abierta/investigación abierta]","[research, reproducibility] -[investigación, reproducibilidad]" -cinco-cosas-que-te-ayudaran-gestionar-mejor-los-datos-de-tus-proximos-proyectos,"[data science/open research] -[ciencia de datos, investigación abierta]","[data, projects, management] -[datos, proyectos, gestión]" -la-investigacion-abierta-podria-cambiar-el-futuro-de-la-investigacion-en-ciencias-puras-te-contamos-por-que,[open science/open research][ciencia abierta/investigación abierta],"[research, open, science] -[investigación, abierta, ciencia]" -si-pensado-en-como-automatizar-la-construccion-de-citas-en-tu-proyecto-te-contamos-como-hacerlo-posible,"[open science -[ciencia abierta]","[projects, cites, references, zotero, metadata] -[proyectos, citas, referencias, zotero, metadatos]" -los-laboratorios-sociales-y-el-manejo-del-covid-19,[open science/citizen science][ciencia abierta/ciencia ciudadana],"[social labs, covid19] -[laboratorios sociales, covid19]" -algunos-proyectos-entretenidos-de-codigo-abierto,"[open science/open source] -[ciencia abierta/código abierto]","[code, projects] -[código, proyectos]" -crea-una-nube-de-palabras-en-r-partir-de-un-documento-de-texto,"[open science/open source, programming languages/R, data science/data mining] -[ciencia abierta/código abierto, lenguajes de programación/R, ciencia de datos/minería de datos]","[text mining, wordcloud, tm, R] -[minería de textos, nube de palabras, tm, R]" -te-contamos-sobre-la-comunidad-ropensci,"[open science, programming languages/r] -[ciencia abierta, lenguajes de programación/r]","[community, ropensci, packages, review] -[comunidad, ropensci, paquetes, revisión]" -automatizacion-de-tareas-via-bash,[software development/UI][desarrollo de software/interfaz de usuario],"[bash, automation][bash, automatización]" -todo-lo-que-debes-saber-sobre-la-investigacion-colaborativa,"[open science/ open research] -[ciencia abierta/ investigación abierta]","[collaborative, teams] -[colaborativa, equipos]" -que-es-el-open-science-framework,[open science/open research][ciencia abierta/investigación abierta],"[osf,open science framework, projects, framework][osf, framework de ciencia abierta, proyectos, framework]" -como-presentar-tu-codigo-como-un-articulo-cientifico,"[open science/open source] -[ciencia abierta/código abierto]","[articles, publication, code, tools] -[artículos, publicación, código, herramientas]" -algunos-proyectos-de-ciencia-e-inteligencia-ciudadana-para-atender-la-pandemia-del-covid-19,[open science/citizen science][ciencia abierta/ciencia ciudadana],"[covid19, projects, citizen][covid19, proyectos, ciudadana]" -git-de-en-diez-sencillos-pasos,"[software development/version control] -[desarrollo de software/control de versiones]","[git, repositories, commits, github] -[git, repositorios, commits, github]" -que-son-los-laboratorios-sociales-y-como-pueden-ayudar-los-equipos-de-investigacion,[open science/citizen science][ciencia abierta/ciencia ciudadana],"[social labs, community][laboratorios sociales, comunidad]" -herramientas-de-visualizacion-en-python,"[programming languages/python] -[programming languages/python]","[visualization, libraries, code, tools] -[visualización, bibliotecas, código, herramientas]" -epigraphhub-un-proyecto-de-código-abierto-para-el-analisis-de-datos-de-calidad,[open science/open source] [ciencia abierta/código abierto],"[epigraphhub, visualization, analysis, data, epidemiology][epigraphhub, visualización, análisis, datos, epidemiología]" -que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias,"[open science/open research] -[ciencia abierta/investigación abierta]","[pandemics, covid19] -[pandemias, covid19]" -que-es-el-codigo-abierto-y-como-puede-ayudarte,[open science/open source] [ciencia abierta/código abierto],"[code, software][código, software]" -te-mostramos-algunos-repositorios-con-datos-sobre-el-covid-19,"[open science/open data/open access] -[ciencia abierta, datos abiertos, acceso abierto]","[repositories, data, health] -[repositorios, datos, salud]" -aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta,[organization/team management][organización/gestión de equipos],"[science, research][ciencia, investigación]" -todas-las-posibilidades-que-te-ofrece-utilizar-figshare-en-tus-proyectos,"[open science/open access] -[ciencia abierta/acceso abierto]","[figshare, projects, research, patform] -[figshare, proyectos, investigación, plataforma]" -que-es-ciencia-ciudadana,[open science/citizen science][ciencia abierta/ciencia ciudadana],"[citizen, science, community, research][ciudadana, ciencia, comunidad, investigación]" -ethereum-merge-is-coming-pero-que-significa,"[tecnology] -[tecnología]","[ethereum, transactions, bitcoin] -[ethereum, transacciones, bitcoin]" -pyopensci-un-promotor-de-la-ciencia-abierta,"[open science/open peer review, open source, programming languages/Python][ciencia abierta/revisión abierta por pares, código abierto, lenguajes de programación/Python]","[pyopensci, package, scientific, review, Python][pyopensci, package, científico, revisión, Python]" -ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion,"[open science/open source, programmig/ide] -[ciencia abierta/código abierto, programación/ide]","[jupyter, notebook, interface, application] -[jupyter, cuaderno, interfz, aplicación]" -que-necesitas-para-desarrollar-en-la-web3,[software development/UI-UX][desarrollo de software/UI-UX],"[web3, crypto, developer][web3,cripto, desarrollador]" -te-hablamos-del-uso-de-dashboards-para-visualizacion-de-datos-de-tu-proximo-proyecto,"[open science] -[open science]","[visualization, projects, data, code, dashboard] -[visualización, proyectos, datos, código, dashboard]" -si-ya-usas-codigo-abierto-te-contamos-como-puedes-sacarle-mayor-provecho-tu-documentacion-para-tus-articulos-y-publicaciones,"[open science/open source, software development/documentation][ciencia abierta/código abierto, desarrollo de software/documentación]","[documentation, code, projects, articles] -[documentación, código, proyectos, artículos]" -code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion,"[programming, open science/open source] -[programación, ciencia abierta/código abierto]","[plataforma, abbey] -[platform, abbey]" -herramientas-de-visualizacion-en-r,"[open science/open source, programming languages/R][ciencia abierta/código abierto, lenguajes de programación/R]","[data, visualization, graph, lattice, ggplot2, tidyverse, ggmap, plotly, shiny][datos, visualización, gráfico, lattice. ggplot2, tidyverse, ggmap, plotly, shiny]" -como-documentar-tu-proyecto-de-ciencia-abierta,"[open science, software development/documentation] -[ciencia abierta, desarrollo de software/documentación]","[projects] -[proyectos]" -que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo,"[open science/open research, software development/version control][ciencia abierta/investigación abierta, desarrollo de software/control de versiones]","[dvc, data, versioning][dvc, datos, versionado]" -la-importancia-de-la-integridad-en-los-datos-manejados-en-los-dashboards,"[data science] -[ciencia de datos]","[data, dashboard, graphs, tools, code, tools, integrity] -[datos, dshboard, gráficos, herramientas, código, integridad]" -te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta,"[open science/open source, programming languages/Python][ciencia abierta/código abierto, lenguajes de programación/Python]","[data, visualization, graph, pandas, scipy, matplotlib, seaborn, bokeh][datos, visualización, gráfico, pandas, scipy, matplotlib, seaborn, bokeh]" -apache-superset,"[data science, programming languages/sql] -[ciencia de datos, lenguajes de programación, sql]","[apache superset, data, columns, explore] -[apache superset, datos, columnas, explorar]" -dataverse-y-su-potencial-para-proyectos-de-ciencia-abierta,"[open science/open data, open access][ciencia abierta/datos abiertos, acceso abierto]","[dataverse, data, dataset, repositories][dataverse, datos, conjunto de datos, repositorios]" -nft-mas-que-un-jpg,"[tecnology] -[tecnología]","[nft, money] -[nft, dinero]" -tres-proyectos-de-ciencia-ciudadana-que-te-sorprenderan,[open science/citizen science][ciencia abierta/ciencia ciudadana],"[science, community, projects, citizen][ciencia, comunidad, proyectos, ciudadana]" -te-ensenamos-lugares-para-aprender-los-fundamentos-de-la-ciencia-abierta,"[open science] -[ciencia abierta]","[data, research, manual] -[datos, investigación, manual]" -primeros-pasos-con-spyder,"[open science/open source, programming/IDE, programming languages/Python][ciencia abierta/código abierto, programación/IDE, lenguajes de programación/Python]","[spyder, code, py, variables][spyder, código, py, variables]" -ibis-framework,"[open science/open data, open access][ciencia abierta/datos abiertos, acceso abierto]","[ibis, dataframe, data, pandas] -[ibis, dataframe, datos, pandas]" \ No newline at end of file diff --git a/csv_folder/new_tags.csv b/csv_folder/new_tags.csv deleted file mode 100644 index 6e465b4c1..000000000 --- a/csv_folder/new_tags.csv +++ /dev/null @@ -1,69 +0,0 @@ -slug, new_tags -cinco-cosas-que-no-debes-olvidar-al-trabajar-con-datos-abiertos,"[datos, abiertos, manera, uso, 1, además, deben, sean, ejemplo, tenemos]" -investigacion-colaborativa-con-git,"[git, proyecto, investigación, información, colaborativa, expertos, crear, cambios, ramas, otros]" -que-es-el-acceso-abierto-y-por-que-debes-tenerlo-en-cuenta-para-tus-investigaciones,"[acceso, abierto, investigaciones, personas, investigación, información, proceso, cuenta, proyectos, otro]" -plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo,"[trabajo, equipos, equipo, conversaciones, manejo, forma, herramientas, tareas, aplicaciones, también]" -ibis-framework,"[tr, int64, object, float64, sql, ibis, dados, dataframe, tbody, com]" -como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto,"[código, investigación, reproducible, abierto, sobre, ciencia, reproducibilidad, investigaciones, bajo, software]" -por-que-deberias-considerar-carpentries-como-una-referencia-para-aprender-ciencia-de-datos,"[carpentry, datos, lecciones, software, carpentries, aprender, ciencia, proyecto, investigadores, the]" -ciencia-abierta,"[for, inteligencia, artificial, tales, crear, mediante, voces, red, otras, forma]" -que-son-las-mentorias-y-como-potencian-los-proyectos-de-ciencia-abierta,"[ciencia, abierta, mentor, mentorías, mentoría, sobre, proyectos, conocimientos, proceso, ayuda]" -te-hablamos-de-cinco-repositorios-con-datos-abiertos-sobre-paises,"[datos, abiertos, sobre, países, información, otros, portal, banco, repositorios, conjuntos]" -como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones,"[acceso, abierto, investigación, repositorios, investigaciones, manera, bajo, revistas, herramientas, ruta]" -visualiza-tus-datos-en-r-con-ggplot-y-gganimate,"[r, datos, ggplot2, gganimate, rstudio, usamos, animation, path, visualiza, autor]" -que-es-la-ciencia-abierta,"[ciencia, abierta, investigación, open, conocimiento, sobre, forma, datos, proceso, abierto]" -dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile,"[archivos, shapefile, archivo, formato, datos, tipo, mapas, r, bibliotecas, otros]" -cinco-tips-para-aumentar-tu-productividad-con-git,"[git, rama, trabajo, ramas, cambios, hacer, repositorio, master, alias, commits]" -primeros-pasos-con-rstudio,"[rstudio, r, paquetes, web, instalar, acceder, código, también, cuadrante, contiene]" -filtrar-datos-r,"[funciones, datos, dplyr, r, artículo, usar, biblioteca, paquetes, filtrar, tabla]" -como-instalar-y-comenzar-utilizar-tensorflow,"[tensorflow, pip, código, plataforma, docker, python, instalar, utilizar, ejecutar, google]" -que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos,"[r, lenguaje, datos, estadística, código, sobre, aprender, programación, proyectos, abierto]" -caracteristicas-y-tips-utiles-que-te-ayudaran-sacar-el-maximo-provecho-de-conda,"[conda, paquetes, entorno, entornos, ejecuta, comandos, virtuales, comando, ayuda, sobre]" -razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion,"[python, código, lenguaje, librerías, investigación, cantidad, programación, análisis, herramientas, creación]" -cinco-cosas-que-no-debes-olvidar-al-trabajar-con-markdown,"[markdown, texto, cualquier, formato, so, escribir, html, artículos, editores, ejemplo]" -reorganiza-tus-tablas-con-tidyr,"[artículo, tidyr, r, veremos, biblioteca, funciones, bolivia, documentación, reorganiza, tablas]" -que-son-los-datos-abiertos,"[datos, abiertos, uso, forma, también, ciencia, información, transparencia, investigaciones, proceso]" -te-hablamos-de-las-licencias-mas-utilizadas-en-proyectos-de-ciencia-abierta,"[licencia, licencias, software, proyectos, abierta, ciencia, cuales, libre, bajo, cc]" -como-instalar-y-comenzar-utilizar-conda,"[conda, anaconda, paquetes, miniconda, ventana, terminal, instalar, sistema, entornos, python]" -la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones,"[investigación, repositorios, versiones, control, abierta, investigaciones, información, personas, manera, ello]" -cuales-son-los-principios-de-la-investigacion-reproducible,"[investigación, reproducible, herramientas, datos, resultados, forma, principios, importante, entorno, otros]" -cinco-cosas-que-te-ayudaran-gestionar-mejor-los-datos-de-tus-proximos-proyectos,"[datos, investigación, gestión, sobre, proyectos, proyecto, tema, información, otras, operaciones]" -la-investigacion-abierta-podria-cambiar-el-futuro-de-la-investigacion-en-ciencias-puras-te-contamos-por-que,"[investigación, ciencias, resultados, abierta, puras, acceso, ciencia, datos, revistas, manera]" -si-pensado-en-como-automatizar-la-construccion-de-citas-en-tu-proyecto-te-contamos-como-hacerlo-posible,"[zotero, otros, mediante, citas, metadatos, referencias, texto, simplemente, añadir, navegador]" -los-laboratorios-sociales-y-el-manejo-del-covid-19,"[covid19, laboratorios, proyectos, medialab, sociales, pandemia, soluciones, proyecto, social, iniciativas]" -algunos-proyectos-entretenidos-de-codigo-abierto,"[algo, proyecto, open, código, ver, otros, proyectos, problemas, cada, crear]" -crea-una-nube-de-palabras-en-r-partir-de-un-documento-de-texto,"[palabras, nube, r, texto, wordcloud, artificialhttpseswikipediaorgwikiinteligenciaartificial, usando, bibliotecas, instalación, crea]" -te-contamos-sobre-la-comunidad-ropensci,"[ropensci, comunidad, revisión, paquetes, paquete, software, proceso, ciencia, pares, desarrollo]" -automatizacion-de-tareas-via-bash,"[bash, comandos, ficheros, comando, directorio, nombre, directorios, shell, home, cd]" -todo-lo-que-debes-saber-sobre-la-investigacion-colaborativa,"[investigación, colaborativa, cada, importante, personas, trabajo, equipo, confianza, manera, comunicación]" -que-es-el-open-science-framework,"[osf, science, open, proyecto, framework, investigación, usuarios, manera, archivos, for]" -como-presentar-tu-codigo-como-un-articulo-cientifico,"[código, investigación, forma, software, datos, desarrollo, problemas, tiempo, herramientas, manera]" -algunos-proyectos-de-ciencia-e-inteligencia-ciudadana-para-atender-la-pandemia-del-covid-19,"[información, covid19, personas, ciudadana, sobre, plataforma, ciencia, proyecto, inteligencia, enfermedad]" -git-de-en-diez-sencillos-pasos,"[repositorio, git, página, github, podrás, pasos, cuenta, simplemente, commit, archivos]" -que-son-los-laboratorios-sociales-y-como-pueden-ayudar-los-equipos-de-investigacion,"[proyectos, sociales, espacios, personas, laboratorios, laboratorio, trabajo, forma, ciencia, comunidad]" -herramientas-de-visualizacion-en-python,"[visualización, python, bibliotecas, gráficos, biblioteca, lenguaje, código, herramientas, pocas, líneas]" -epigraphhub-un-proyecto-de-código-abierto-para-el-analisis-de-datos-de-calidad,"[datos, epigraphhub, análisis, 2022, proyecto, gráficos, código, abierto, plataforma, bases]" -que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias,"[información, sobre, datos, covid19, abierta, pandemias, abierto, pandemia, ciencia, gripe]" -que-es-el-codigo-abierto-y-como-puede-ayudarte,"[código, abierto, software, serie, sistema, varios, decir, cualquier, proyectos, manera]" -te-mostramos-algunos-repositorios-con-datos-sobre-el-covid-19,"[virus, artículos, repositorios, sobre, covid19, personas, datos, número, salud, acceso]" -aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta,"[abierta, ciencia, open, investigación, proyectos, software, herramientas, science, equipos, uso]" -todas-las-posibilidades-que-te-ofrece-utilizar-figshare-en-tus-proyectos,"[figshare, acceso, datos, archivos, proyectos, investigación, plataforma, resultados, productos, hasta]" -que-es-ciencia-ciudadana,"[ciencia, ciudadana, forma, personas, datos, ciudadanos, científicos, proyectos, investigación, especie]" -ethereum-merge-is-coming-pero-que-significa,"[ethereum, proof, of, merge, work, red, transacciones, bitcoin, stake, the]" -pyopensci-un-promotor-de-la-ciencia-abierta,"[pyopensci, comunidad, proyecto, abierta, paquetes, python, revisión, ciencia, datos, open]" -ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion,"[jupyter, código, cuadernos, web, uso, notebook, cuaderno, aplicación, muy, interfaz]" -que-necesitas-para-desarrollar-en-la-web3,"[web3, br, frontend, necesitas, contratos, vez, interactuar, desarrollo, billetera, blockchain]" -te-hablamos-del-uso-de-dashboards-para-visualizacion-de-datos-de-tu-proximo-proyecto,"[web, datos, también, código, forma, dashboard, dashboards, análisis, bastante, framework]" -si-ya-usas-codigo-abierto-te-contamos-como-puedes-sacarle-mayor-provecho-tu-documentacion-para-tus-articulos-y-publicaciones,"[documentación, código, proyecto, uso, usuarios, hace, frecuencia, también, forma, write]" -code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion,"[problemas, programación, code, plataforma, abbey, problema, código, mejorar, vez, respuesta]" -herramientas-de-visualizacion-en-r,"[gráficos, r, datos, paquete, visualización, funciones, motor, información, estadístico, gráfico]" -como-documentar-tu-proyecto-de-ciencia-abierta,"[proyecto, documentación, datos, ciencia, abierta, información, documentar, proceso, tiempo, sobre]" -que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo,"[datos, control, modelos, versiones, dvc, conjuntos, cambios, proyecto, herramientas, machine]" -la-importancia-de-la-integridad-en-los-datos-manejados-en-los-dashboards,"[datos, dashboards, integridad, información, gráficos, artículo, través, herramientas, código, manera]" -te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta,"[gráficos, ciencia, información, biblioteca, abierta, visualización, resultados, proyecto, hacer, datos]" -apache-superset,"[datos, superset, apache, gráfico, dashboard, crear, sql, columnas, base, explorar]" -dataverse-y-su-potencial-para-proyectos-de-ciencia-abierta,"[dataverse, datos, forma, trabajo, abierta, también, conjuntos, dataversos, uso, archivos]" -nft-mas-que-un-jpg,"[nft, dinero, tecnología, arte, artista, burbuja, hace, propiedad, imagen, nfts]" -tres-proyectos-de-ciencia-ciudadana-que-te-sorprenderan,"[proyectos, ciencia, científicos, ciudadana, especies, datos, investigaciones, basura, campo, mediante]" -te-ensenamos-lugares-para-aprender-los-fundamentos-de-la-ciencia-abierta,"[ciencia, abierta, open, datos, abierto, investigación, cuales, manual, también, uso]" -primeros-pasos-con-spyder,"[spyder, archivo, código, clic, barra, python, entorno, editor, variables, menú]" diff --git a/i18n/ca.toml b/i18n/ca.toml deleted file mode 100644 index c4cd53d7f..000000000 --- a/i18n/ca.toml +++ /dev/null @@ -1,72 +0,0 @@ -[read_more] -other = "Llegiu més" - -[copyright] -other = "Drets d'autor" - -[all_rights] -other = "Tots els drets reservats" - -[share_on] -other = "Compartiu a" - -[featured_posts] -other = "Entrades destacades" - -[recent_posts] -other = "Entrades recents" - -[404_title] -other = "Perdut" - -[could_not_find] -other = "No podem trobar la pàgina que cerqueu" - -[go_back] -other = "Vés enrere" - -[translations] -other = "Traduccions" - -[categories] -other = "Categories" - -[tags] -other = "Etiquetes" - -[series] -other = "Sèries" - -[all_categories] -other = "Totes les categories" - -[all_tags] -other = "Totes les etiquetes" - -[all_series] -other = "Totes les sèries" - -[overview] -other = "Resum" - -[reading_time] -other = "{{ .ReadingTime }} min lectura" - -[series_posts] -other = "Publicacions d'aquesta sèrie" - -# search -[quick_links] - other = "Resultats" -[no_matches] - other = "No s'han trobat resultats" -[search_field_placeholder] - other = "Cerca la base de coneixements" -[blog_search_field_placeholder] - other = "Cerca..." -[search_results_label] - other = "Resultats de la cerca" -[short_search_query] - other = "La consulta és massa curta" -[type_to_search] - other = "Escriu per cercar" diff --git a/i18n/de.toml b/i18n/de.toml deleted file mode 100644 index f9fbe58a3..000000000 --- a/i18n/de.toml +++ /dev/null @@ -1,72 +0,0 @@ -[read_more] -other = "Weiterlesen" - -[copyright] -other = "Copyright" - -[all_rights] -other = "All Rights Reserved" - -[share_on] -other = "Teilen" - -[featured_posts] -other = "Empfohlene Artikel" - -[recent_posts] -other = "Neueste Artikel" - -[404_title] -other = "Verloren" - -[could_not_find] -other = "Die gesuchte Seite konnte nicht gefunden werden" - -[go_back] -other = "Zurück" - -[translations] -other = "Übersetzungen" - -[categories] -other = "Kategorien" - -[tags] -other = "Tags" - -[series] -other = "Serien" - -[all_categories] -other = "Alle Kategorien" - -[all_tags] -other = "Alle Tags" - -[all_series] -other = "Alle Serien" - -[overview] -other = "Inhalt" - -[reading_time] -other = "{{ .ReadingTime }} min lesen" - -[series_posts] -other = "Beiträge in dieser Serie" - -# search -[quick_links] - other = "Ergebnisse" -[no_matches] - other = "Keine Ergebnisse gefunden" -[search_field_placeholder] - other = "Wissensdatenbank durchsuchen" -[blog_search_field_placeholder] - other = "Suchen..." -[search_results_label] - other = "Suchergebnisse" -[short_search_query] - other = "Abfrage ist zu kurz" -[type_to_search] - other = "Zum Suchen eingeben" diff --git a/i18n/en.toml b/i18n/en.toml deleted file mode 100644 index a70d80696..000000000 --- a/i18n/en.toml +++ /dev/null @@ -1,72 +0,0 @@ -[read_more] -other = "Read More" - -[copyright] -other = "Copyright" - -[all_rights] -other = "All Rights Reserved" - -[share_on] -other = "Share on" - -[featured_posts] -other = "Featured Posts" - -[recent_posts] -other = "Recent Posts" - -[404_title] -other = "Lost" - -[could_not_find] -other = "We couldn't find the page you're looking for" - -[go_back] -other = "Go Back" - -[translations] -other = "Translations" - -[categories] -other = "Categories" - -[tags] -other = "Tags" - -[series] -other = "Series" - -[all_categories] -other = "All Categories" - -[all_tags] -other = "All Tags" - -[all_series] -other = "All Series" - -[overview] -other = "Overview" - -[reading_time] -other = "{{ .ReadingTime }} min read" - -[series_posts] -other = "Posts in this series" - -# search -[quick_links] - other = "Results" -[no_matches] - other = "No results found" -[search_field_placeholder] - other = "Search the knowledge base" -[blog_search_field_placeholder] - other = "Search..." -[search_results_label] - other = "Search Results" -[short_search_query] - other = "Query is too short" -[type_to_search] - other = "Type to search" diff --git a/i18n/es.toml b/i18n/es.toml deleted file mode 100644 index 3d181809e..000000000 --- a/i18n/es.toml +++ /dev/null @@ -1,72 +0,0 @@ -[read_more] -other = "Leer más" - -[copyright] -other = "Copyright" - -[all_rights] -other = "Todos los Derechos Reservados" - -[share_on] -other = "Compartir en" - -[featured_posts] -other = "Posts destacados" - -[recent_posts] -other = "Posts recientes" - -[404_title] -other = "No encontrado" - -[could_not_find] -other = "No se pudo encontrar la página buscada" - -[go_back] -other = "Volver" - -[translations] -other = "Traducciones" - -[categories] -other = "Categorías" - -[tags] -other = "Tags" - -[series] -other = "Series" - -[all_categories] -other = "Todas las Categories" - -[all_tags] -other = "Todos los Tags" - -[all_series] -other = "Todas las Series" - -[overview] -other = "Contenido" - -[reading_time] -other = "{{ .ReadingTime }} min read" - -[series_posts] -other = "Publicaciones en esta serie" - -# search -[quick_links] - other = "Resultados" -[no_matches] - other = "No se encontraron resultados" -[search_field_placeholder] - other = "Buscar en la base de conocimiento" -[blog_search_field_placeholder] - other = "Buscar..." -[search_results_label] - other = "Resultados de búsqueda" -[short_search_query] - other = "La consulta es demasiado corta" -[type_to_search] - other = "Escriba para buscar" diff --git a/i18n/fr.toml b/i18n/fr.toml deleted file mode 100644 index 2eb184127..000000000 --- a/i18n/fr.toml +++ /dev/null @@ -1,72 +0,0 @@ -[read_more] -other = "Lire la suite…" - -[copyright] -other = "Copyright" - -[all_rights] -other = "Tous droits réservés" - -[share_on] -other = "Partager sur" - -[featured_posts] -other = "Billets en vedette" - -[recent_posts] -other = "Billets récents" - -[404_title] -other = "Perdu" - -[could_not_find] -other = "Nous ne trouvons pas la page que vous recherchez" - -[go_back] -other = "Revenir en arrière…" - -[translations] -other = "Traductions" - -[categories] -other = "Catégories" - -[tags] -other = "Tags" - -[series] -other = "Séries" - -[all_categories] -other = "Toutes les catégories" - -[all_tags] -other = "Tous les tags" - -[all_series] -other = "Toutes les séries" - -[overview] -other = "Sommaire" - -[reading_time] -other = "{{ .ReadingTime }} mins de lecture" - -[series_posts] -other = "Articles dans cette série" - -# search -[quick_links] - other = "Résultats" -[no_matches] - other = "Aucun résultat trouvé" -[search_field_placeholder] - other = "Rechercher dans la base de connaissances" -[blog_search_field_placeholder] - other = "Rechercher..." -[search_results_label] - other = "Résultats de la recherche" -[short_search_query] - other = "La requête est trop courte" -[type_to_search] - other = "Tapez pour rechercher" diff --git a/i18n/ja.toml b/i18n/ja.toml deleted file mode 100644 index cacb29378..000000000 --- a/i18n/ja.toml +++ /dev/null @@ -1,72 +0,0 @@ -[read_more] -other = "続きを読む" - -[copyright] -other = "Copyright" - -[all_rights] -other = "All Rights Reserved" - -[share_on] -other = "共有する" - -[featured_posts] -other = "おすすめの投稿" - -[recent_posts] -other = "最近の投稿" - -[404_title] -other = "存在しません" - -[could_not_find] -other = "お探しのページを見つけることができませんでした" - -[go_back] -other = "戻る" - -[translations] -other = "翻訳" - -[categories] -other = "カテゴリ" - -[tags] -other = "タグ" - -[series] -other = "シリーズ" - -[all_categories] -other = "全てのカテゴリ" - -[all_tags] -other = "全てのタグ" - -[all_series] -other = "全てのシリーズ" - -[overview] -other = "概要" - -[reading_time] -other = "{{ .ReadingTime }} 分で読了" - -[series_posts] -other = "このシリーズの投稿" - -# search -[quick_links] - other = "結果" -[no_matches] - other = "結果が存在しません" -[search_field_placeholder] - other = "ナレッジベース内を検索" -[blog_search_field_placeholder] - other = "検索..." -[search_results_label] - other = "検索結果" -[short_search_query] - other = "検索文字列が短すぎます" -[type_to_search] - other = "入力して検索" diff --git a/i18n/no.toml b/i18n/no.toml deleted file mode 100644 index 52c5733c2..000000000 --- a/i18n/no.toml +++ /dev/null @@ -1,72 +0,0 @@ -[read_more] -other = "Les mer" - -[copyright] -other = "Opphavsrett" - -[all_rights] -other = "Alle rettigheter forbeholdt" - -[share_on] -other = "Del på" - -[featured_posts] -other = "Utvalgte innlegg" - -[recent_posts] -other = "Nye innlegg" - -[404_title] -other = "Tapt" - -[could_not_find] -other = "Vi kunne ikke finne det du ser etter" - -[go_back] -other = "Gå Tilbake" - -[translations] -other = "Oversettelser" - -[categories] -other = "Kategori" - -[tags] -other = "Stikkord" - -[series] -other = "Serier" - -[all_categories] -other = "Alle Kategorier" - -[all_tags] -other = "Alle stikkord" - -[all_series] -other = "Alle Serier" - -[overview] -other = "Oversikt" - -[reading_time] -other = "{{ .ReadingTime }} min lesing" - -[series_posts] -other = "Flere innlegg i denne serien" - -# search -[quick_links] - other = "Resultater" -[no_matches] - other = "Ingen resultater funnet" -[search_field_placeholder] - other = "Søk i kunnskapsbasen" -[blog_search_field_placeholder] - other = "Søk..." -[search_results_label] - other = "Søkeresultater" -[short_search_query] - other = "Søket er for kort" -[type_to_search] - other = "Skriv for å søke" diff --git a/i18n/pt.toml b/i18n/pt.toml deleted file mode 100644 index e2d8411c4..000000000 --- a/i18n/pt.toml +++ /dev/null @@ -1,72 +0,0 @@ -[read_more] -other = "Ler Mais" - -[copyright] -other = "Copyright" - -[all_rights] -other = "Todos os Direitos Reservados" - -[share_on] -other = "Partilhar" - -[featured_posts] -other = "Principais Artigos" - -[recent_posts] -other = "Artigos Mais Recentes" - -[404_title] -other = "Ooops" - -[could_not_find] -other = "Não foi possível encontrar esta página" - -[go_back] -other = "Voltar" - -[translations] -other = "Traduções" - -[categories] -other = "Categorias" - -[tags] -other = "Etiquetas" - -[series] -other = "Séries" - -[all_categories] -other = "Todas as Categorias" - -[all_tags] -other = "Todas as Etiquetas" - -[all_series] -other = "Todas as Séries" - -[overview] -other = "Overview" - -[reading_time] -other = "{{ .ReadingTime }} min read" - -[series_posts] -other = "Postagens nesta série" - -# search -[quick_links] - other = "Resultados" -[no_matches] - other = "Nenhum resultado encontrado" -[search_field_placeholder] - other = "Pesquisar a base de conhecimento" -[blog_search_field_placeholder] - other = "Pesquisar..." -[search_results_label] - other = "Resultados da pesquisa" -[short_search_query] - other = "A consulta é muito curta" -[type_to_search] - other = "Digite para pesquisar" diff --git a/i18n/tr.toml b/i18n/tr.toml deleted file mode 100644 index bd5b5e28d..000000000 --- a/i18n/tr.toml +++ /dev/null @@ -1,72 +0,0 @@ -[read_more] -other = "Okumaya Devam Et" - -[copyright] -other = "Telif Hakkı" - -[all_rights] -other = "Tüm Hakları Saklıdır" - -[share_on] -other = "Paylaş:" - -[featured_posts] -other = "Seçkin Makaleler" - -[recent_posts] -other = "En Son Makaleler" - -[404_title] -other = "Kayıp" - -[could_not_find] -other = "Aradığınız sayfayı bulamadık" - -[go_back] -other = "Geri Git" - -[translations] -other = "Çeviriler" - -[categories] -other = "Kategoriler" - -[tags] -other = "Etiketler" - -[series] -other = "Seriler" - -[all_categories] -other = "Tüm Kategoriler" - -[all_tags] -other = "Tüm Etiketler" - -[all_series] -other = "Tüm Seriler" - -[overview] -other = "Overview" - -[reading_time] -other = "{{ .ReadingTime }} min read" - -[series_posts] -other = "Posts in this series" - -# search -[quick_links] - other = "Sonuçlar" -[no_matches] - other = "Sonuç bulunamadı" -[search_field_placeholder] - other = "Bilgi tabanında ara" -[blog_search_field_placeholder] - other = "Ara..." -[search_results_label] - other = "Arama Sonuçları" -[short_search_query] - other = "Sorgu çok kısa" -[type_to_search] - other = "Aramak için yazın" diff --git a/i18n/zh-CN.toml b/i18n/zh-CN.toml deleted file mode 100644 index b53c86d65..000000000 --- a/i18n/zh-CN.toml +++ /dev/null @@ -1,56 +0,0 @@ -[read_more] -other = "阅读更多" - -[copyright] -other = "Copyright" - -[all_rights] -other = "All Rights Reserved" - -[share_on] -other = "分享到" - -[featured_posts] -other = "精选文章" - -[recent_posts] -other = "最新文章" - -[404_title] -other = "页面不见了" - -[could_not_find] -other = "页面不存在或已被删除" - -[go_back] -other = "返回" - -[translations] -other = "翻译" - -[categories] -other = "分类" - -[tags] -other = "标签" - -[series] -other = "专栏" - -[all_categories] -other = "所有分类" - -[all_tags] -other = "所有标签" - -[all_series] -other = "所有专栏" - -[overview] -other = "文章目录" - -[reading_time] -other = "{{ .ReadingTime }} min read" - -[series_posts] -other = "Posts in this series" diff --git a/i18n/zh-TW.toml b/i18n/zh-TW.toml deleted file mode 100644 index efb0a422c..000000000 --- a/i18n/zh-TW.toml +++ /dev/null @@ -1,56 +0,0 @@ -[read_more] -other = "閱讀更多" - -[copyright] -other = "版權" - -[all_rights] -other = "版權所有" - -[share_on] -other = "分享到" - -[featured_posts] -other = "精選文章" - -[recent_posts] -other = "最新文章" - -[404_title] -other = "頁面不見了" - -[could_not_find] -other = "頁面不存在或已被删除" - -[go_back] -other = "返回" - -[translations] -other = "翻譯" - -[categories] -other = "分類" - -[tags] -other = "標籤" - -[series] -other = "專欄" - -[all_categories] -other = "所有分類" - -[all_tags] -other = "所有標籤" - -[all_series] -other = "所有專欄" - -[overview] -other = "文章目錄" - -[reading_time] -other = "{{ .ReadingTime }} min read" - -[series_posts] -other = "Posts in this series" diff --git a/i18n/zh.toml b/i18n/zh.toml deleted file mode 100644 index b53c86d65..000000000 --- a/i18n/zh.toml +++ /dev/null @@ -1,56 +0,0 @@ -[read_more] -other = "阅读更多" - -[copyright] -other = "Copyright" - -[all_rights] -other = "All Rights Reserved" - -[share_on] -other = "分享到" - -[featured_posts] -other = "精选文章" - -[recent_posts] -other = "最新文章" - -[404_title] -other = "页面不见了" - -[could_not_find] -other = "页面不存在或已被删除" - -[go_back] -other = "返回" - -[translations] -other = "翻译" - -[categories] -other = "分类" - -[tags] -other = "标签" - -[series] -other = "专栏" - -[all_categories] -other = "所有分类" - -[all_tags] -other = "所有标签" - -[all_series] -other = "所有专栏" - -[overview] -other = "文章目录" - -[reading_time] -other = "{{ .ReadingTime }} min read" - -[series_posts] -other = "Posts in this series" diff --git a/layouts/404.html b/layouts/404.html deleted file mode 100644 index b68fc4dcf..000000000 --- a/layouts/404.html +++ /dev/null @@ -1,8 +0,0 @@ -{{ define "main" }} -
-

{{ T "404_title" }}

-

{{ T "could_not_find" }}


-
{{ T "go_back" }}
-
-{{ end }} - diff --git a/layouts/_default/_markup/render-image.html b/layouts/_default/_markup/render-image.html deleted file mode 100644 index 2ddb29ab1..000000000 --- a/layouts/_default/_markup/render-image.html +++ /dev/null @@ -1,57 +0,0 @@ -{{- $file := .Destination -}} -{{- $imagesDir := .Page.Site.Params.imagesDir -}} -{{- $alt := .Text -}} -{{- $cap := .Title -}} -{{- $scratch := newScratch -}} -{{- $scratch.Set "classes" "image_figure" -}} - -{{/* Determine if page bundles are set. */}} -{{- $bundle := .Page.Site.Params.usePageBundles -}} -{{- if eq .Page.Params.usePageBundles false -}} - {{- $bundle = false -}} -{{- end -}} -{{- if eq .Page.Params.usePageBundles true -}} - {{- $bundle = true -}} -{{- end -}} - -{{/* Determine source of image and get attributes. */}} -{{- $image := "" -}} -{{- if strings.HasPrefix $file "http" -}} - {{- $scratch.Add "classes" " image_external" -}} - {{- $image = resources.GetRemote $file -}} - {{- with $image }} - {{- if eq $image.MediaType.MainType "image" -}} - {{- if eq $image.MediaType.SubType "svg" -}} - {{- $image = "" -}} - {{- $scratch.Add "classes" " image_svg" -}} - {{- else -}} - {{- $file = path.Join $imagesDir $image -}} - {{- $image = $image.Content | resources.FromString $file -}} - {{- end -}} - {{- else -}} - {{- $image = "" -}} - {{- end -}} - {{- end -}} -{{- else -}} - {{- $scratch.Add "classes" " image_internal" -}} - {{ $file = (path.Clean $file) }} - {{- if eq $bundle true -}} - {{ $image = .Page.Resources.GetMatch $file }} - {{- if and (not $image) .Page.File -}} - {{ $file = path.Join .Page.RelPermalink $file }} - {{ $image = resources.Get $file }} - {{- end -}} - {{- end -}} -{{- end -}} - -{{- partial "figure" ( - dict - "file" $file - "image" $image - "diskPath" $.Page.File.Dir - "webPath" $.Page.RelPermalink - "alt" $alt - "cap" $cap - "classes" ($scratch.Get "classes") - "bundle" $bundle -) -}} diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html deleted file mode 100644 index 76a3c47a1..000000000 --- a/layouts/_default/baseof.html +++ /dev/null @@ -1,44 +0,0 @@ -{{- $s := site.Params }} -{{- $p := .Params }} -{{- $codeBlockConfig := partial "func/getCodeBlockSettings" . }} - - - - - - - - - - - - {{- partial "head" . }} - {{- partial "hooks/head-end" . }} - - - - - {{- partial "header" . }} -
- {{- block "main" . }}{{ end }} -
- - {{- partialCached "icons" . }} - {{- partialCached "footer" . }} - {{- partialCached "scripts" . }} - {{- partialCached "hooks/body-end" . }} - - - diff --git a/layouts/_default/index.json b/layouts/_default/index.json deleted file mode 100644 index fdb9ebc9c..000000000 --- a/layouts/_default/index.json +++ /dev/null @@ -1,7 +0,0 @@ -{{- $.Scratch.Add "index" slice -}} -{{- range .Site.Pages -}} - {{- if ne .Type "search" -}} - {{- $.Scratch.Add "index" (dict "title" .Title "body" .Plain "link" .Permalink "section" .Section "tags" .Params.tags) -}} - {{- end -}} -{{- end -}} -{{- jsonify (uniq ($.Scratch.Get "index")) -}} \ No newline at end of file diff --git a/layouts/_default/list.html b/layouts/_default/list.html deleted file mode 100644 index 35a8ba81f..000000000 --- a/layouts/_default/list.html +++ /dev/null @@ -1,3 +0,0 @@ -{{ define "main" }} - {{- partial "archive" . }} -{{ end }} diff --git a/layouts/_default/rss.xml b/layouts/_default/rss.xml deleted file mode 100644 index 02cb455df..000000000 --- a/layouts/_default/rss.xml +++ /dev/null @@ -1,55 +0,0 @@ -{{- $pctx := . -}} -{{- if .IsHome -}}{{ $pctx = .Site }}{{- end -}} -{{- $pages := slice -}} -{{- if or $.IsHome $.IsSection -}} -{{- $pages = (where $pctx.RegularPages "Type" "in" site.Params.mainSections) -}} -{{- else -}} -{{- $pages = (where $pctx.Pages "Type" "in" site.Params.mainSections) -}} -{{- end -}} -{{- $limit := .Site.Config.Services.RSS.Limit -}} -{{- if ge $limit 1 -}} -{{- $pages = $pages | first $limit -}} -{{- end -}} -{{- printf "" | safeHTML }} - - - {{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }}{{ end }} - {{ .Permalink }} - Recent content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{.}} {{ end }}{{ end }}on {{ .Site.Title }} - Hugo -- gohugo.io{{ with .Site.LanguageCode }} - {{.}}{{end}}{{ with .Site.Author.email }} - {{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}}{{ with .Site.Author.email }} - {{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}}{{ with .Site.Copyright }} - {{.}}{{end}}{{ if not .Date.IsZero }} - {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}{{ end }} - {{- with .OutputFormats.Get "RSS" -}} - {{ printf "" .Permalink .MediaType | safeHTML }} - {{- end -}} - {{ range $pages }} - - {{ .Title }} - {{ .Permalink }} - {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} - {{ with .Site.Author.email }}{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}} - {{ .Permalink }} - - {{ if ne site.Params.rss_summary false }} - {{ if .Params.summary }} - {{ .Params.summary | html }} - {{ else if .Params.abstract }} - {{ .Params.abstract | html }} - {{ else if .Summary }} - {{ .Summary | html }} - {{ end }} - {{ if site.Params.rss_summary_read_more_link }} - {{ $trans := i18n "read_more" -}} - {{ printf "

%s

" .RelPermalink $trans | html }} - {{ end }} - {{ else }} - {{ .Content | html }} - {{ end }} -
-
- {{ end }} -
-
diff --git a/layouts/_default/single.html b/layouts/_default/single.html deleted file mode 100644 index b426863b8..000000000 --- a/layouts/_default/single.html +++ /dev/null @@ -1,71 +0,0 @@ -{{- define "main" }} -{{- $s := .Site.Params }} -{{- $p := .Params }} -{{- $scratch := newScratch }} -{{- if isset $p "image" }} - {{- $scratch.Set "image" $p.image }} -{{- else }} - {{ $scratch.Set "image" $s.fallBackOgImage }} -{{- end }} -{{- $image := $scratch.Get "image" }} -{{- $bg := absLangURL (path.Join "images" $image) }} -
-
- {{- $t := .Title }} -

{{ $t | markdownify }}

- {{- partial "post-meta" . }} - {{- with .Params.featureImage -}} -
- {{- partial "image" (dict "file" $p.featureImage "alt" $p.featureImageAlt "cap" $p.featureImageCap "type" "featured" "Page" $.Page) }} -
- {{- end -}} - {{ if $p.toc }} -
-

{{ T "overview" }}

- {{ .TableOfContents }} -
- {{ end }} -
- {{- .Content }} -
- - {{- $showRelatedInArticle := true }} - {{- if eq $s.showRelatedInArticle false }} - {{- $showRelatedInArticle = false }} - {{- else if eq $p.showRelatedInArticle false }} - {{- $showRelatedInArticle = false }} - {{- end }} - {{- if ne $showRelatedInArticle false }} - {{- partial "related" . }} - {{- end }} - - {{- $showComments := true }} - {{- if eq $s.comments false }} - {{- $showComments = false }} - {{- else if eq $p.comments false }} - {{- $showComments = false }} - {{- end }} - {{- if ne $showComments false }} - {{- partial "comments" . }} - {{- end }} - {{- partial "i18nlist" . }} - - - -
- {{- if ( ne $p.sidebar false ) }} - {{- partial "sidebar" . }} - {{ end }} -
-{{- end }} diff --git a/layouts/index.html b/layouts/index.html deleted file mode 100644 index f3387fae8..000000000 --- a/layouts/index.html +++ /dev/null @@ -1,165 +0,0 @@ -{{- define "main" }} -{{- $s := .Site.Params }} -{{- $p := .Params }} -{{- $scratch := newScratch }} -{{- if isset $p "image" }} -{{- $scratch.Set "image" $p.image }} -{{- else }} -{{ $scratch.Set "image" $s.fallBackOgImage }} -{{- end }} -{{- $image := $scratch.Get "image" }} -{{- $bg := absLangURL (path.Join "images" $image) }} - - - -
- -
- -
- -
- https://storyset.com/people -
- -
-

Open ScienceLabs,

-

- La comunidad abierta para la ciencia y tecnología. -

-

- Open Science Labs, es una comunidad amigable, colaborativa y - apasionada - por la ciencia y la tecnología, con el principal objetivo de promover - la Ciencia Abierta y el Código Abierto, proporcionando herramientas - y diseminando las mejores prácticas para que podamos aprender, crecer - y contribuir activamente en este emocionante campo. -

- ¡Ingresa a - nuestro discord! - -
-
-
- -
-
-
- -
- -
-

- ¡Superando desafíos científicos y tecnológicos juntos! -

- -

Creemos en la fortaleza de la colaboración y en la importancia de unir - fuerzas para abordar los desafíos científicos y tecnológicos que - enfrentamos en la actualidad. Sabemos que una comunidad diversa y - comprometida es clave para impulsar la investigación y encontrar - soluciones innovadoras a problemas globales y locales.

- -

- En Open Science Labs, encontrarás un ambiente acogedor en el que - podrás compartir tus conocimientos, aprender de otros miembros de la - comunidad y trabajar en proyectos conjuntos. Además, podrás encontrar - recursos, información y apoyo para que puedas - desarrollar tus habilidades en ciencia abierta y tecnología de código - abierto.

-
-
-
- -
-
-
- -
- -
-

- ¡Comunidad abierta a personas de todas las disciplinas y niveles de - experiencia! -

- -

Nuestra comunidad está abierta a personas de todas las disciplinas y - niveles de experiencia. No importa si eres un investigador, - estudiante, desarrollador, entusiasta o simplemente alguien curioso - por la ciencia y - la tecnología; en Open Science Labs, todos son bienvenidos.

-

Únete a nosotros y forma parte de esta emocionante aventura en la que - juntos exploraremos nuevos horizontes, fomentaremos la colaboración y - contribuiremos al avance del conocimiento científico y tecnológico de - manera abierta y transparente.

-
-
-
- -
-

Asociados

- -
-
- - AlertaDengue - -
-
- - EpiGraphHub - -
-
- - ArxLang - -
-
- - pyOpenSci - -
-
- - - -
-
- - - -
-
- -
-{{- end }} diff --git a/layouts/partials/analytics.html b/layouts/partials/analytics.html deleted file mode 100644 index 2adf4fe09..000000000 --- a/layouts/partials/analytics.html +++ /dev/null @@ -1,50 +0,0 @@ -{{- with .Site.Params.ga_analytics }} - - -{{- end -}} -{{- with .Site.Params.baidu_analytics }} - -{{- end }} - -{{- if (site.Params.plausible_analytics.enable) }} - -{{- end }} - - -{{- if (site.Params.matomo_analytics.enable) }} - - - - -{{- end }} diff --git a/layouts/partials/archive.html b/layouts/partials/archive.html deleted file mode 100644 index 9f0244944..000000000 --- a/layouts/partials/archive.html +++ /dev/null @@ -1,24 +0,0 @@ -{{ $pages := .Pages }} -{{ if .IsHome }} - {{ $pages = where site.RegularPages "Type" "in" site.Params.mainSections }} -{{ end }} - -{{ if eq site.Params.pinFeatured true }} - {{ $featured := default 8 site.Params.numberOfPinnedPosts }} - {{ $featuredPosts := first $featured (where $pages "Params.featured" true)}} - {{ $normalPosts := $pages | symdiff $featuredPosts }} - {{ $pages = $featuredPosts | append $normalPosts }} -{{ end }} -
-
-
    - {{- range (.Paginate $pages).Pages }} - {{ partial "excerpt" . }} - {{- end }} -
  • - {{- template "_internal/pagination.html" . }} -
  • -
-
- {{- partial "sidebar" . }} -
diff --git a/layouts/partials/comments.html b/layouts/partials/comments.html deleted file mode 100644 index eb1413516..000000000 --- a/layouts/partials/comments.html +++ /dev/null @@ -1,9 +0,0 @@ -
- {{ if .Site.DisqusShortname }} - {{ template "_internal/disqus.html" . }} - {{ end }} - {{ if .Site.Params.utterances }} - {{ template "partials/utterances.html" . }} - {{ end }} - -
diff --git a/layouts/partials/excerpt.html b/layouts/partials/excerpt.html deleted file mode 100644 index ba94336c9..000000000 --- a/layouts/partials/excerpt.html +++ /dev/null @@ -1,35 +0,0 @@ -
  • -
    -
    -

    - {{ .Title | markdownify }} -

    - {{ partial "post-meta" . }} -
    - {{- with .Params.thumbnail }} - -
  • diff --git a/layouts/partials/favicon.html b/layouts/partials/favicon.html deleted file mode 100644 index 98bc0aba0..000000000 --- a/layouts/partials/favicon.html +++ /dev/null @@ -1,7 +0,0 @@ -{{- $iconsDir := default "icons/" .Site.Params.iconsDir }} -{{- $appleTouch := absURL (printf "%s%s" $iconsDir "apple-touch-icon.png") }} -{{- $favicon := absURL (printf "%s%s" $iconsDir "favicon-32x32.png" ) }} -{{- $manifest := absURL (printf "%s%s" $iconsDir "site.webmanifest" ) }} - - - diff --git a/layouts/partials/figure.html b/layouts/partials/figure.html deleted file mode 100644 index e5b7afc0f..000000000 --- a/layouts/partials/figure.html +++ /dev/null @@ -1,75 +0,0 @@ -{{/* - If Hugo has been able to access the image, it's loaded at .image, and we have - access to additional attributes. - - If Hugo hasn't been able to access the image, it's loaded at .file, with only - its path available. - - We set the Hugo variables to strings to allow for logical operations and - replacements. -*/}} - -{{- $file := .file -}} -{{- $image := .image -}} -{{- $diskPath := .diskPath -}} -{{- $webPath := .webPath -}} -{{- $alt := .alt -}} -{{- $cap := .cap -}} -{{- $classes := .classes -}} -{{- $bundle := .bundle -}} - -{{- $fileWeb := .file -}} -{{- if eq $bundle true -}} - {{ $fileWeb = path.Join $webPath $file }} - {{ if in $classes "image_svg" }} - {{ if strings.HasPrefix $file "http" }} - {{ $fileWeb = $file }} - {{- end -}} - {{- end -}} -{{- end -}} - -
    - - - {{/* Generate alternate image format tags. */}} - {{- with $file -}} - {{ $name := replace $file (path.Ext $file) "" }} - {{ $ext := slice "avif" "webp" "jxl" }} - {{- range $ext -}} - {{ $item := printf "%s" . | printf "%s%s" "." | printf "%s%s" $name | printf "%s" }} - {{ $itemDisk := path.Join $diskPath $item }} - {{ $itemWeb := path.Join $webPath $item }} - {{- if fileExists $itemDisk -}} - - {{- end -}} - {{- end -}} - {{- end -}} - - {{/* Render image and attributes. */}} - {{ htmlEscape $alt }} - - {{/* Provide caption based on image title, if it is set. */}} - {{- with $cap -}} - {{- if not (eq $cap " ") -}} -
    {{ $cap | safeHTML }}
    - {{- end -}} - {{- end -}} - -
    -
    diff --git a/layouts/partials/follow.html b/layouts/partials/follow.html deleted file mode 100644 index 9e312ec56..000000000 --- a/layouts/partials/follow.html +++ /dev/null @@ -1,23 +0,0 @@ -{{- $base := absURL "" }} -{{- $items := .Site.Data.social }} -{{- $social := .Site.Menus.social }} -{{- with $social }} - {{- $items = . }} -{{- end }} - diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html deleted file mode 100644 index d67eedd29..000000000 --- a/layouts/partials/footer.html +++ /dev/null @@ -1,14 +0,0 @@ -{{- $s := .Site.Params }} -{{ $t := .Site.Title }} -{{- if or .Params.enableMathNotation $s.enableMathNotation }} - {{ partialCached "math" . }} -{{- end }} -{{- $iconsDir := default "icons/" .Site.Params.iconsDir }} -{{- $defaultFooterLogo := printf "%s%s" $iconsDir "apple-touch-icon.png"}} -
    - -
    diff --git a/layouts/partials/func/getCodeBlockSettings.html b/layouts/partials/func/getCodeBlockSettings.html deleted file mode 100644 index c4fef5840..000000000 --- a/layouts/partials/func/getCodeBlockSettings.html +++ /dev/null @@ -1,25 +0,0 @@ -{{ $s := site.Params }} -{{ $p := .Params }} -{{ $maxCodeLines := 100 }} -{{ with $s.codeMaxLines }} - {{ $maxCodeLines = . }} -{{ end }} -{{ with $p.codeMaxLines }} - {{ $maxCodeLines = . }} -{{ end }} - -{{ $codeLineNumbers := false }} -{{ with $s.codeLineNumbers }} - {{ $codeLineNumbers = . }} -{{ end }} -{{ with $p.codeLineNumbers }} - {{ $codeLineNumbers = . }} - {{ else }} - {{ if eq $p.codeLineNumbers false }} - {{ $codeLineNumbers = false }} - {{ end }} -{{ end }} - -{{ $config := (dict "max" $maxCodeLines "lines" $codeLineNumbers) }} - -{{ return $config }} diff --git a/layouts/partials/func/getJavascriptBundle.html b/layouts/partials/func/getJavascriptBundle.html deleted file mode 100644 index 2a06e2418..000000000 --- a/layouts/partials/func/getJavascriptBundle.html +++ /dev/null @@ -1,26 +0,0 @@ - -{{ $highlightPath := "js/highlight.js" }} -{{ $highlight := resources.Get $highlightPath | resources.ExecuteAsTemplate $highlightPath . }} - -{{ $variablesScriptPath := "js/variables.js" }} -{{ $variables := resources.Get $variablesScriptPath | resources.ExecuteAsTemplate (printf "%s/js/variables.js" .Lang) . }} - -{{ $functionsScriptPath := "js/functions.js" }} -{{ $functions := resources.Get $functionsScriptPath | resources.ExecuteAsTemplate $functionsScriptPath . }} - -{{ $codeScriptPath := "js/code.js" }} -{{ $code := resources.Get $codeScriptPath | resources.ExecuteAsTemplate $codeScriptPath . }} - -{{ $customScriptPath := "js/custom.js" }} -{{ if (fileExists "../../assets/js/custom.js") }} - {{ $customScriptPath := "../../assets/js/custom.js" }} -{{ end }} -{{ $custom := resources.Get $customScriptPath | resources.ExecuteAsTemplate $customScriptPath . }} - -{{ $mainScriptPath := "js/index.js" }} -{{ $main := resources.Get $mainScriptPath | resources.ExecuteAsTemplate $mainScriptPath . }} - -{{ $bundlePath := (printf "%s/js/bundle.js" .Lang ) }} -{{ $bundle := slice $highlight $variables $functions $code $main $custom | resources.Concat $bundlePath | resources.Fingerprint "sha512" }} - -{{ return $bundle }} \ No newline at end of file diff --git a/layouts/partials/func/getStylesBundle.html b/layouts/partials/func/getStylesBundle.html deleted file mode 100644 index e35c4a5d5..000000000 --- a/layouts/partials/func/getStylesBundle.html +++ /dev/null @@ -1,6 +0,0 @@ - -{{ $options := (dict "targetPath" "css/styles.css" "outputStyle" "compressed" "enableSourceMap" "true") }} -{{ $mainSassFile := "sass/main.sass" }} -{{ $styles := resources.Get $mainSassFile | resources.ExecuteAsTemplate $mainSassFile . | resources.ToCSS $options | resources.Fingerprint "sha512" }} - -{{ return $styles }} \ No newline at end of file diff --git a/layouts/partials/head.html b/layouts/partials/head.html deleted file mode 100644 index 507d2fa50..000000000 --- a/layouts/partials/head.html +++ /dev/null @@ -1,45 +0,0 @@ -{{- $params := site.Params }} -{{- $separator := default "|" $params.titleSeparator }} -{{- $title := "" }} -{{- if and .Title (ne (trim (lower .Site.Title) "") (trim (lower .Title) "")) }} - {{- if eq .Kind "taxonomy" }} - {{- $title = default .Title ( T (lower .Title) ) }} - {{- else }} - {{- $title = .Title }} - {{- end }} -{{- end }} -{{ with $title }}{{ . }} {{ $separator }} {{ end }}{{ .Site.Title }} - -{{- with $params.ga_verify }} - -{{- end }} - - -{{- if (ne hugo.Environment "development") }} - {{- partialCached "analytics" . }} -{{- end }} -{{- partial "opengraph" . }} -{{- partialCached "favicon" . }} - -{{ range .AlternativeOutputFormats -}} - {{ printf `` .Rel .MediaType.Type .Permalink $.Site.Title | safeHTML }} -{{ end -}} - - - -{{ $styles := partialCached "func/getStylesBundle" . }} - - - -{{ $bundle := partialCached "func/getJavascriptBundle" . }} - - - - - -{{- with $params.customCSS }} - {{- range . -}} - - {{- end }} -{{- end }} diff --git a/layouts/partials/header.html b/layouts/partials/header.html deleted file mode 100644 index 7ceaa56d6..000000000 --- a/layouts/partials/header.html +++ /dev/null @@ -1,36 +0,0 @@ -{{- $params := .Site.Params }} -{{- $centerLogo := $params.centerLogo }} -{{ $logo := $params.logo }} - diff --git a/layouts/partials/hooks/body-end.html b/layouts/partials/hooks/body-end.html deleted file mode 100644 index e69de29bb..000000000 diff --git a/layouts/partials/hooks/head-end.html b/layouts/partials/hooks/head-end.html deleted file mode 100644 index e69de29bb..000000000 diff --git a/layouts/partials/i18nlist.html b/layouts/partials/i18nlist.html deleted file mode 100644 index 301f53239..000000000 --- a/layouts/partials/i18nlist.html +++ /dev/null @@ -1,12 +0,0 @@ -{{ $translationsSize := len .Translations }} -{{ with .Translations }} -
    -

    {{ T "translations" }}:

    - -
    -{{ end }} diff --git a/layouts/partials/icons.html b/layouts/partials/icons.html deleted file mode 100644 index 15dd8e83e..000000000 --- a/layouts/partials/icons.html +++ /dev/null @@ -1,70 +0,0 @@ - diff --git a/layouts/partials/image.html b/layouts/partials/image.html deleted file mode 100644 index a5cae3e55..000000000 --- a/layouts/partials/image.html +++ /dev/null @@ -1,63 +0,0 @@ -{{- $file := .file -}} -{{- $imagesDir := .Page.Site.Params.imagesDir -}} -{{- $alt := .alt -}} -{{- if not $alt -}} - {{- $alt = .Text -}} -{{- end -}} -{{- $cap := .cap -}} -{{- $scratch := newScratch -}} -{{- $scratch.Set "classes" "image_figure" -}} - -{{/* Add classes for image type */}} -{{- $typeClass := "" -}} -{{- with .type -}} - {{- $typeClass = printf "%s" . | printf "%s%s" " image_" | printf "%s" -}} -{{- end -}} -{{- $scratch.Add "classes" $typeClass -}} - -{{/* Determine if page bundles are set. */}} -{{- $bundle := .Page.Site.Params.usePageBundles -}} -{{- if eq .Page.Params.usePageBundles false -}} - {{- $bundle = false -}} -{{- end -}} -{{- if eq .Page.Params.usePageBundles true -}} - {{- $bundle = true -}} -{{- end -}} - -{{/* Determine source of image and get attributes. */}} -{{- $image := "" -}} -{{- if strings.HasPrefix $file "http" -}} - {{- $scratch.Add "classes" " image_external" -}} - {{- $image = resources.GetRemote $file -}} - {{- with $image }} - {{- if eq $image.MediaType.MainType "image" -}} - {{- if eq $image.MediaType.SubType "svg" -}} - {{- $image = "" -}} - {{- $scratch.Add "classes" " image_svg" -}} - {{- else -}} - {{- $file = path.Join $imagesDir $image -}} - {{- $image = $image.Content | resources.FromString $file -}} - {{- end -}} - {{- else -}} - {{- $image = "" -}} - {{- end -}} - {{- end -}} -{{- else -}} - {{- $scratch.Add "classes" " image_internal" -}} - {{ $file = (path.Clean $file) }} - {{- if eq $bundle true -}} - {{ $image = .Resources.GetMatch $file }} - {{- end -}} -{{- end -}} - -{{- partial "figure" ( - dict - "file" $file - "image" $image - "diskPath" $.Page.File.Dir - "webPath" $.Page.RelPermalink - "alt" $alt - "cap" $cap - "classes" ($scratch.Get "classes") - "bundle" $bundle -) -}} diff --git a/layouts/partials/logo.html b/layouts/partials/logo.html deleted file mode 100644 index 730d90d0c..000000000 --- a/layouts/partials/logo.html +++ /dev/null @@ -1,16 +0,0 @@ -{{- $t := site.Title -}} - - {{- with .logo }} - - {{- else -}} - {{- $t -}} - {{- end }} - {{- if ne (strings.HasSuffix .class "center") true }} - - {{- end }} - diff --git a/layouts/partials/math.html b/layouts/partials/math.html deleted file mode 100644 index 999766e88..000000000 --- a/layouts/partials/math.html +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/layouts/partials/mode.html b/layouts/partials/mode.html deleted file mode 100644 index cd065082a..000000000 --- a/layouts/partials/mode.html +++ /dev/null @@ -1,4 +0,0 @@ - -
    - -
    diff --git a/layouts/partials/nav.html b/layouts/partials/nav.html deleted file mode 100644 index 6eb0158c4..000000000 --- a/layouts/partials/nav.html +++ /dev/null @@ -1,36 +0,0 @@ -{{- $menu := .menu }} -{{ $menuData := .context.Site.Data.menu }} -{{- $link := .context.Permalink }} -{{- $url := "" }} -{{- $name := "" }} -{{- $forwardSlash := "/" }} -{{- $children := false }} -{{- range $menu }} - {{- if eq $menu $menuData }} - {{- $children = .submenu }} - {{- $name = .name }} - {{- $url = absURL .link }} - {{- else }} - {{- $children = .Children }} - {{- $name = .Name }} - {{- $url = absLangURL .URL }} - {{- end }} - -{{- end }} \ No newline at end of file diff --git a/layouts/partials/opengraph.html b/layouts/partials/opengraph.html deleted file mode 100644 index cfc2aca29..000000000 --- a/layouts/partials/opengraph.html +++ /dev/null @@ -1,105 +0,0 @@ -{{- $summary := truncate 160 .Summary }} -{{- $s := .Site.Params }} -{{- $p := .Params }} - -{{- $relpath := "" -}} -{{- if or $s.usePageBundles $p.usePageBundles }} - {{- $relpath = .Page.RelPermalink -}} -{{- end }} - -{{ if eq $p.usePageBundles false }} - {{- $relpath = "" }} -{{ end }} - -{{- with $p.description }} - {{- $summary = truncate 160 . }} -{{- end }} -{{- if .IsHome }} - {{- $summary = $s.description }} - {{- with $p.description }} - {{- $summary = . }} - {{- end }} -{{- end }} -{{- $site := .Site.Title }} -{{- $title := .Title }} -{{- $permalink := .Permalink }} -{{- $logo := absURL $s.logo }} -{{- $author := $s.author }} -{{- with $p.author }} - {{ $author := . }} -{{- end }} -{{- $image := absURL $s.fallBackOgImage }} -{{- with $p.featureImage }} - {{- $fullpath := ( add $relpath . ) -}} - {{- $image = absURL $fullpath }} -{{- end }} -{{- with $p.thumbnail }} - {{- $fullpath := ( add $relpath . ) -}} - {{- $image = absURL $fullpath }} -{{- end }} -{{- with $p.shareImage }} - {{- $fullpath := ( add $relpath . ) -}} - {{- $image = absURL $fullpath }} -{{- end }} - -{{ range .Translations }} - -{{ end }} -{{- if .IsHome }} - -{{- else }} - -{{- end }} - - - - - - - - - -{{- $keywords := "" }} -{{- with $s.keywords }} - {{- $keywords = delimit $s.keywords "," }} -{{- end }} -{{- with $p.keywords }} - {{- $keywords = delimit . "," }} -{{- end }} -{{- with $keywords }} - -{{- end }} -{{- if eq .Section $s.blogDir -}} - {{- $date := ( .Date.Format "2006-02-01") -}} - {{- $date := (time .Date) }} - {{- $lastMod := (time .Lastmod) }} - -{{- end }} diff --git a/layouts/partials/pager.html b/layouts/partials/pager.html deleted file mode 100644 index 3095e70e8..000000000 --- a/layouts/partials/pager.html +++ /dev/null @@ -1,18 +0,0 @@ -{{- $pager := .Paginator }} -{{- if gt $pager.TotalPages 1 }} -
    - {{- with $pager.Prev }} - - {{- else }} - - {{- end }} - {{- range first 4 $pager.Pagers }} - {{ .PageNumber }} - {{- end }} - {{- if $pager.Next -}} - - {{- else -}} - - {{- end }} -
    -{{- end }} diff --git a/layouts/partials/post-meta.html b/layouts/partials/post-meta.html deleted file mode 100644 index 15adf0cc5..000000000 --- a/layouts/partials/post-meta.html +++ /dev/null @@ -1,44 +0,0 @@ -{{- $showShare := ne (.Param "showshare") false }} -{{- $showDate := ne (.Param "showdate") false }} -{{- $showReadTime := ne (.Param "showreadtime") false }} -{{- $showAuthor := ne (.Param "showauthor") false }} -{{- $showPostMeta := or ($showShare) ($showDate) ($showReadTime) (isset .Params "tags") }} -{{- $scratch := newScratch }} -{{- $scratch.Set "writeSeparator" false }} -{{- if $showPostMeta }} - -{{- end }} diff --git a/layouts/partials/related.html b/layouts/partials/related.html deleted file mode 100644 index 757bcb540..000000000 --- a/layouts/partials/related.html +++ /dev/null @@ -1,9 +0,0 @@ -{{ if isset .Params "series" }} -{{$related := where .Site.RegularPages ".Params.series" "eq" .Params.series }} -

    Posts in this Series

    - -{{ end }} diff --git a/layouts/partials/scripts.html b/layouts/partials/scripts.html deleted file mode 100644 index acedf23b7..000000000 --- a/layouts/partials/scripts.html +++ /dev/null @@ -1,8 +0,0 @@ -{{- $bundle := partialCached "func/getJavascriptBundle" . }} - -{{- partial "search/scripts" . }} -{{- with site.Params.customJS }} - {{- range . -}} - - {{- end }} -{{- end }} \ No newline at end of file diff --git a/layouts/partials/search/scripts.html b/layouts/partials/search/scripts.html deleted file mode 100644 index a93130a4b..000000000 --- a/layouts/partials/search/scripts.html +++ /dev/null @@ -1,12 +0,0 @@ -{{- $params := site.Params }} -{{- if $params.enableSearch }} - {{- $fusePath := "js/fuse.js" }} - {{- $fuse := resources.Get $fusePath | resources.ExecuteAsTemplate $fusePath . }} - - {{- $searchPath := "js/search.js" }} - {{- $search := resources.Get $searchPath | resources.ExecuteAsTemplate $searchPath . }} - - {{- $bundle2 := slice $fuse $search | resources.Concat "js/search.js" | resources.Minify | resources.Fingerprint "sha512" }} - - -{{ end }} \ No newline at end of file diff --git a/layouts/partials/search/widget.html b/layouts/partials/search/widget.html deleted file mode 100644 index fa5e09fe9..000000000 --- a/layouts/partials/search/widget.html +++ /dev/null @@ -1,22 +0,0 @@ -{{- $params := site.Params }} -{{- if site.Params.enableSearch }} - {{- $placeholder := T "search_field_placeholder" }} - {{- $section := $.Page.Section }} - {{- $simple := true }} - {{- if and (eq $section "support") (eq .CurrentSection .FirstSection) }} - {{- else }} - {{- $placeholder = "Buscar..." }} - {{- $simple = false }} - {{ end }} - -{{- end }} diff --git a/layouts/partials/share.html b/layouts/partials/share.html deleted file mode 100644 index 260663ce5..000000000 --- a/layouts/partials/share.html +++ /dev/null @@ -1,17 +0,0 @@ - {{- $s := T "share_on" }} -
    - {{ $s }}: - - - - {{ partial "sprite" (dict "icon" "linkedin") }} - - - {{ partial "sprite" (dict "icon" "copy") }} - -
    - \ No newline at end of file diff --git a/layouts/partials/sidebar.html b/layouts/partials/sidebar.html deleted file mode 100644 index 17b18b24f..000000000 --- a/layouts/partials/sidebar.html +++ /dev/null @@ -1,121 +0,0 @@ -{{ $s := site.Params }} - diff --git a/layouts/partials/sprite.html b/layouts/partials/sprite.html deleted file mode 100644 index 295634070..000000000 --- a/layouts/partials/sprite.html +++ /dev/null @@ -1,4 +0,0 @@ - - {{ .icon }} - - diff --git a/layouts/partials/top.html b/layouts/partials/top.html deleted file mode 100644 index c7825f79f..000000000 --- a/layouts/partials/top.html +++ /dev/null @@ -1,3 +0,0 @@ - - {{ partialCached "sprite" (dict "icon" "to-top") . }} - diff --git a/layouts/partials/utterances.html b/layouts/partials/utterances.html deleted file mode 100644 index 280c29123..000000000 --- a/layouts/partials/utterances.html +++ /dev/null @@ -1,9 +0,0 @@ -{{ if .Site.Params.utterancesRepo }} - - {{ end }} \ No newline at end of file diff --git a/layouts/search/single.html b/layouts/search/single.html deleted file mode 100644 index 5c78da70e..000000000 --- a/layouts/search/single.html +++ /dev/null @@ -1,5 +0,0 @@ -{{- define "main" }} -
    -
    -
    -{{- end }} \ No newline at end of file diff --git a/layouts/shortcodes/notice.html b/layouts/shortcodes/notice.html deleted file mode 100644 index 9ba5014df..000000000 --- a/layouts/shortcodes/notice.html +++ /dev/null @@ -1,5 +0,0 @@ -{{ $_hugo_config := `{ "version": 1 }` }} -
    -
    {{ .Get 1 }}
    - {{ .Inner }} -
    diff --git a/layouts/shortcodes/openstreetmap.html b/layouts/shortcodes/openstreetmap.html deleted file mode 100644 index 913671761..000000000 --- a/layouts/shortcodes/openstreetmap.html +++ /dev/null @@ -1,23 +0,0 @@ -{{ $mapName := .Get "mapName" }} - -{{ $mapWidth := .Get "mapWidth" | default "100%" }} -{{ $mapHeight := .Get "mapHeight" | default "600px" }} - -{{ $scaleControl := .Get "scaleControl" | default "true" }} -{{ $miniMap := .Get "miniMap" | default "false" }} -{{ $scrollWheelZoom := .Get "scrollWheelZoom" | default "true" }} -{{ $zoomControl := .Get "zoomControl" | default "true" }} -{{ $allowEdit := .Get "allowEdit" | default "false" }} -{{ $moreControl := .Get "moreControl" | default "true" }} -{{ $searchControl := .Get "searchControl" | default "true" }} -{{ $tilelayersControl := .Get "tilelayersControl" | default "null" }} -{{ $embedControl := .Get "embedControl" | default "null" }} -{{ $datalayersControl := .Get "datalayersControl" | default "true" }} -{{ $onLoadPanel := .Get "onLoadPanel" | default "none" }} -{{ $captionBar := .Get "captionBar" | default "false" }} - -{{ $scale := .Get "scale" }} -{{ $coordX := .Get "coordX" }} -{{ $coordY := .Get "coordY" }} - - diff --git a/layouts/shortcodes/video.html b/layouts/shortcodes/video.html deleted file mode 100644 index b87deccec..000000000 --- a/layouts/shortcodes/video.html +++ /dev/null @@ -1,8 +0,0 @@ -{{- $youtubeHost := "https://www.youtube.com/watch?v=" }} -{{- $url := .Get 0 }} -{{- if in $url $youtubeHost }} - {{- $url = strings.TrimPrefix $youtubeHost $url }} -{{- end }} -
    - -
    diff --git a/layouts/shortcodes/youtube.html b/layouts/shortcodes/youtube.html deleted file mode 100644 index b87deccec..000000000 --- a/layouts/shortcodes/youtube.html +++ /dev/null @@ -1,8 +0,0 @@ -{{- $youtubeHost := "https://www.youtube.com/watch?v=" }} -{{- $url := .Get 0 }} -{{- if in $url $youtubeHost }} - {{- $url = strings.TrimPrefix $youtubeHost $url }} -{{- end }} -
    - -
    diff --git a/layouts/team-template/baseof.html b/layouts/team-template/baseof.html deleted file mode 100644 index d37d8d6fd..000000000 --- a/layouts/team-template/baseof.html +++ /dev/null @@ -1,106 +0,0 @@ -{{- $s := site.Params }} -{{- $p := .Params }} -{{- $codeBlockConfig := partial "func/getCodeBlockSettings" . }} - - - - - - - - - - - - - {{- partial "head" . }} - {{- partial "hooks/head-end" . }} - - - - - {{- partial "header" . }} -
    -
    - -
    -
    - {{.Content}} - {{ $groups := .Params.teams }} - {{- range $group := $groups }} -

    {{ $group.name }}

    -
    - {{- range $member := $group.members }} - -
    - -
    -

    {{ $member.name }}

    - - - {{ partial "sprite" (dict "icon" "github") }} - - -

    - {{ $member.bio }} -

    - - {{- if isset $member "github_sponsor" }} - Support his work on community and open source projects via: - - - - {{- end }} -
    -
    - {{- end }} -
    - {{- end }} -
    - - -
    - - {{- partialCached "icons" . }} - {{- partialCached "footer" . }} - {{- partialCached "scripts" . }} - {{- partialCached "hooks/body-end" . }} - - - diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 000000000..82fb95a0f --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,155 @@ +site_name: Open Science Labs +site_url: https://opensciencelabs.org + +docs_dir: pages +site_dir: build + +extra: + enumerate: !!python/name:builtins.enumerate + +theme: + name: null + custom_dir: "theme/" + features: + - content.code.copy + palette: + primary: indigo + +extra_css: + - css/base.css + - css/blog.css + - css/code.css + - css/content.css + - css/footer.css + - css/home.css + - css/nav.css + - css/partners.css + - css/search.css + - css/team.css + - css/tokens.css + - css/utilities.css + +extra_javascript: + - js/theme.js + - js/osl-search.js + - js/vendor/lunr.min.js + - js/vendor/lunr.stemmer.support.min.js + - js/vendor/lunr.multi.min.js + - js/vendor/lunr.es.min.js + - js/vendor/lunr.pt.min.js + +nav: + - Blog: "blog/index.md" + - Projects: + - Overview: "projects/index.md" + - Incubation: "projects/incubation/index.md" + - Affiliation: "projects/affiliation/index.md" + - All Projects: "projects/list/index.md" + - Opportunities: + - Overview: opportunities/index.md + - OSS Internship: + - Overview: "opportunities/internships/oss/index.md" + - Project Ideas: "opportunities/internships/oss/project-ideas/index.md" + - "Contribution Guidelines": "opportunities/guides/contribution/index.md" + - "Candidates' Guide": "opportunities/internships/guides/interns/index.md" + - "Template: Projects Ideas": "opportunities/internships/templates/projects-ideas/index.md" + - "Template: Candidates's Project Proposal": "opportunities/internships/templates/candidate-proposal/index.md" + - OSS Research Seed Internship: + - Overview: "opportunities/internships/oss-research-seed/index.md" + - Project Ideas: "opportunities/internships/oss-research-seed/project-ideas/index.md" + - "Contribution Guidelines": "opportunities/guides/contribution/index.md" + - "Candidates' Guide": "opportunities/internships/guides/interns/index.md" + - "Template: Projects Ideas": "opportunities/internships/templates/projects-ideas/index.md" + - "Template: Candidates's Project Proposal": "opportunities/internships/templates/candidate-proposal/index.md" + - Google Summer of Code: + - Overview: "opportunities/gsoc/index.md" + - Project Ideas: "opportunities/gsoc/project-ideas/index.md" + - "Contribution Guidelines": "opportunities/guides/contribution/index.md" + - "Candidates' Guide": "opportunities/gsoc/guides/contributor/index.md" + - "Template: Project Idea": "opportunities/gsoc/templates/project-ideas.md" + - "Template: Candidates Project Proposal": "opportunities/gsoc/templates/contributor-proposal.md" + - Partnership: + - Overview: "partnership/index.md" + - Partners: "partnership/partners/index.md" + - Open Proposals: + - Overview: "partnership/open-proposals/index.md" + - Community Training: "partnership/open-proposals/community-training/index.md" + - Learning: + - Overview: learning/index.md + - Events: learning/events/index.md + - Study Groups: learning/study-groups/index.md + - About: + - Overview: "about/index.md" + - About OSL: + - Overview: "about/index.md" + - Contact Us: about/contact/index.md + - Our Formula: "about/formula/index.md" + - Roadmap: about/roadmap/index.md + - Code Of Conduct: about/coc/index.md + - Governance: about/governance/index.md + - Team: about/team/index.md + - Fiscal Sponsor: about/fiscal-sponsor/index.md + - Guidelines: + - Overview: about/guidelines/index.md + - Articles: about/guidelines/articles/index.md + - DEI: about/guidelines/dei/index.md + - Mentoring: about/guidelines/mentoring/index.md + - Donate: "donate/index.md" + +markdown_extensions: + - toc: + permalink: " #" + - pymdownx.highlight: + anchor_linenums: true + line_spans: __span + pygments_lang_class: true + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.superfences + - mdx_truly_sane_lists + +plugins: + - include-markdown: + start: + end: + + - blogging: + template: theme/blog-list.html + dirs: + - blog + features: + tags: {} + + - rss: + abstract_chars_count: 160 # -1 for full content + abstract_delimiter: + categories: + - tags + comments_path: "#__comments" + date_from_meta: + as_creation: "date" + as_update: false + datetime_format: "%Y-%m-%d" + default_timezone: Europe/Paris + default_time: "09:30" + enabled: true + feed_ttl: 1440 + image: https://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Feed-icon.svg/128px-Feed-icon.svg.png + length: 20 + pretty_print: false + match_path: ".*" + url_parameters: + utm_source: "documentation" + utm_medium: "RSS" + utm_campaign: "feed-syndication" + - git-revision-date-localized: + enabled: true + enable_creation_date: false + type: iso_date + + - search: + lang: + - en + - es + - pt + prebuild_index: true diff --git a/pages/.well-known/funding-manifest-urls b/pages/.well-known/funding-manifest-urls new file mode 100644 index 000000000..f90b3f5a2 --- /dev/null +++ b/pages/.well-known/funding-manifest-urls @@ -0,0 +1,2 @@ +https://opensciencelabs.org/funding.json +https://www.opensciencelabs.org/funding.json diff --git a/content/guidelines/coc/index.md b/pages/about/coc/index.md similarity index 77% rename from content/guidelines/coc/index.md rename to pages/about/coc/index.md index 6458585bd..fc916cc2d 100644 --- a/content/guidelines/coc/index.md +++ b/pages/about/coc/index.md @@ -1,20 +1,21 @@ --- title: "Contributor Covenant Code of Conduct" date: 2022-09-14 -author: Mariangela Petrizzo -draft: false +authors: ["Mariangela Petrizzo"] tags: [coc] -usePageBundles: true -aliases: ["/coc/", "/guidelines/mentoring/en/coc/"] +template: single-sidebar.html --- + +# Code of Conduct + ## Our Pledge We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, religion, or sexual identity -and orientation. +nationality, personal appearance, race, religion, or sexual identity and +orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. @@ -24,23 +25,23 @@ diverse, inclusive, and healthy community. Examples of behavior that contributes to a positive environment for our community include: -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience -* Focusing on what is best not just for us as individuals, but for the - overall community +- Focusing on what is best not just for us as individuals, but for the overall + community Examples of unacceptable behavior include: -* The use of sexualized language or imagery, and sexual attention or - advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email - address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a +- The use of sexualized language or imagery, and sexual attention or advances of + any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email address, + without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities @@ -67,8 +68,8 @@ representative at an online or offline event. Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at -opensciencelabs@gmail.com. -All complaints will be reviewed and investigated promptly and fairly. +team@opensciencelabs.org. All complaints will be reviewed and investigated +promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. @@ -89,15 +90,15 @@ behavior was inappropriate. A public apology may be requested. ### 2. Warning -**Community Impact**: A violation through a single incident or series -of actions. +**Community Impact**: A violation through a single incident or series of +actions. **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or -permanent ban. +like social media. Violating these terms may lead to a temporary or permanent +ban. ### 3. Temporary Ban @@ -113,11 +114,11 @@ Violating these terms may lead to a permanent ban. ### 4. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an +standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. -**Consequence**: A permanent ban from any sort of public interaction within -the community. +**Consequence**: A permanent ban from any sort of public interaction within the +community. ## Attribution @@ -125,8 +126,8 @@ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. -Community Impact Guidelines were inspired by [Mozilla's code of conduct -enforcement ladder](https://github.com/mozilla/diversity). +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity). [homepage]: https://www.contributor-covenant.org diff --git a/pages/about/contact/index.md b/pages/about/contact/index.md new file mode 100644 index 000000000..123d35bbb --- /dev/null +++ b/pages/about/contact/index.md @@ -0,0 +1,40 @@ +--- +title: Contact Us +date: 2025-01-07 +authors: + - Ivan Ogasawara +template: single-sidebar.html +--- + +# Contact Us + +Open Science Labs welcomes your inquiries and feedback. Connect with us through +the following channels to learn more about our projects, collaborations, or any +other questions you might have. + +## Email + +For general inquiries, suggestions, or official communications, please email us +at: [team@opensciencelabs.org](mailto:team@opensciencelabs.org) + +## Social Media + +Stay updated with our latest news, events, and community highlights by following +us on social media: + +- [GitHub](https://github.com/OpenScienceLabs) - Follow our projects and + contributions. +- [LinkedIn](/linkedin) - Connect with us professionally. +- [Twitter](https://twitter.com/opensciencelabs) - Follow us for quick updates + and engagements. +- [Facebook](/facebook) - Join our community discussions. +- [Discord](/discord) - Engage in live discussions and community support. +- [YouTube](/youtube) - Watch our tutorials, webinars, and community highlights. + +## RSS Feed + +Subscribe to our [RSS feed](/feed_rss_created.xml) to receive automatic updates +on new content and announcements. + +We look forward to hearing from you and exploring potential collaborations to +further open science and technology. diff --git a/pages/about/fiscal-sponsor/index.md b/pages/about/fiscal-sponsor/index.md new file mode 100644 index 000000000..6f2e2d65f --- /dev/null +++ b/pages/about/fiscal-sponsor/index.md @@ -0,0 +1,51 @@ +--- +title: "Fiscal Sponsor: The GRAPH Network" +description: "Fiscal Sponsor: The GRAPH Network" +date: "2024-02-24" +authors: ["OSL Team"] +template: main.html +--- + +# Fiscal Host + +Open Science Labs (OSL) operates under the fiscal support of **Open Source +Collective** and **The GRAPH Network**, ensuring proper financial management for +its projects. + +## Open Source Collective + +[Open Source Collective](https://opencollective.com/opensource) (OSC) is a +non-profit fiscal host that manages financial resources for open-source +projects. OSL receives fiscal sponsorship from OSC for its open-source +initiatives, allowing it to receive and allocate funds transparently through +[OSL’s Open Collective page](https://opencollective.com/osl). + +### Financial Management and Fees + +OSC charges a **10% operational fee** on incoming funds to cover administrative +costs. + +For further details, refer to the +[OSC Sponsorship Agreement](https://docs.google.com/document/u/1/d/e/2PACX-1vQbiyK2Fe0jLdh4vb9BfHY4bJ1LCo4Qvy0jg9P29ZkiC8y_vKJ_1fNgIbV0p6UdvbcT8Ql1gVto8bf9/pub). + +--- + +## The GRAPH Network + +[The Global Research and Analyses for Public Health (GRAPH) Network](https://thegraphnetwork.org) +is a multidisciplinary community of professionals, universities, NGOs, and +international organizations working in public health, epidemiology, data +analysis, software development, and education. + +OSL collaborates with The GRAPH Network for financial management of +**non-open-source projects**. The GRAPH Network operates under the legal +representation of ASCRES, which handles fiscal responsibilities. + +### Financial Management and Fees + +ASCRES/The GRAPH Network charges a **30% fee** on incoming funds to cover +bureaucratic, legal, and administrative expenses. + +For any grant proposal or funding request involving OSL, ASCRES/The GRAPH +Network must be explicitly mentioned as the fiscal host to ensure correct fund +management. diff --git a/pages/about/formula/index.md b/pages/about/formula/index.md new file mode 100644 index 000000000..602bd9d78 --- /dev/null +++ b/pages/about/formula/index.md @@ -0,0 +1,85 @@ +--- +title: "Open Science Labs Formula" +description: "Open Science Labs Formula" +date: "2024-02-14" +authors: ["OSL Team"] +template: single-sidebar.html +--- + +# Open Science Labs Formula + +This formula will encapsulate the values and practices that contribute to OSL's +mission of promoting open science and technology through community +collaboration, education, and project development. + +**1. Open Collaboration:** At the heart of OSL lies the belief in open +collaboration. We thrive by sharing knowledge freely, engaging with diverse +perspectives, and fostering an environment where everyone is encouraged to +contribute. Our success is built on the collective wisdom and efforts of our +community, partners, and stakeholders. + +**2. Continuous Learning and Innovation:** OSL commits to continuous learning +and pushing the boundaries of what's possible in open science and technology. We +encourage curiosity, experimentation, and the application of new ideas to solve +complex problems. By staying at the forefront of technological and scientific +advancements, we ensure that our community and projects remain relevant and +impactful. + +**3. Inclusivity and Accessibility:** We believe that open science is for +everyone. OSL is dedicated to creating inclusive spaces where individuals from +all backgrounds can learn, contribute, and grow. By removing barriers to entry +and promoting accessibility, we empower more people to participate in science +and technology, enriching our community with a wide range of experiences and +insights. + +**4. Ethical Responsibility:** Our work is guided by a strong sense of ethical +responsibility. OSL advocates for the responsible use of technology and data, +ensuring that our projects and collaborations contribute positively to society +and the environment. We prioritize transparency, accountability, and the ethical +implications of our actions in all our endeavors. + +**5. Community Empowerment:** Success for OSL is measured by the empowerment of +our community. We invest in programs, resources, and support systems that enable +our members to achieve their goals, whether they're learning new skills, +contributing to projects, or leading initiatives that drive open science +forward. By empowering individuals, we strengthen the foundation of our +collective mission. + +**6. Sustainability and Impact:** In all our activities, OSL emphasizes +sustainability and long-term impact. We seek to create lasting contributions to +the fields of open science and technology, focusing on solutions and projects +that have a positive, enduring effect on research, education, and society as a +whole. + +**7. Implementation and Adaptation:** Recognizing the dynamic nature of the open +science ecosystem, OSL remains flexible and responsive to change. We +continuously assess our strategies and operations, adapting our approach to meet +emerging challenges and opportunities. This agility ensures that OSL can sustain +its mission and impact over time. + +**8. Communication Excellence:** At OSL, we understand that effective +communication is foundational to the success of any project. We encourage our +community to continually refine their communication skills, fostering clarity, +openness, and constructive dialogue. Effective communication bridges the gap +between diverse members of our community, enabling seamless collaboration, +knowledge sharing, and mutual understanding. By prioritizing transparency in our +interactions and valuing every voice, we create an environment where ideas +flourish and challenges are addressed collaboratively. Our commitment to +communication excellence ensures that all members feel heard, valued, and +connected, driving the collective success of our initiatives. + +**9. Proactiveness and Initiative:** OSL champions a culture of proactiveness +and self-driven initiative. We encourage our community members to actively +engage in projects, propose new ideas, and take the lead in areas where they +feel passionate. This proactive mindset, coupled with effective communication, +enables individuals to navigate challenges creatively, seek feedback +constructively, and contribute significantly to the advancement of open science +and open source. By fostering an environment where taking initiative is +celebrated and supported, we empower our members to make meaningful impacts, +drive innovation, and steer OSL and its projects toward shared goals and +successes. + +This Success Formula represents the core principles and practices that guide +Open Science Labs. By adhering to these tenets, we aim to foster a vibrant +community that advances the frontiers of open science and technology, making +meaningful contributions to the world. diff --git a/pages/about/governance/index.md b/pages/about/governance/index.md new file mode 100644 index 000000000..b4e8f4634 --- /dev/null +++ b/pages/about/governance/index.md @@ -0,0 +1,113 @@ +--- +title: "Open Science Labs Project Governance" +date: 2025-02-11 +authors: ["Ivan Ogasawara"] +tags: ["governance"] +template: single-sidebar.html +--- + +# Open Science Labs Project Governance + +This document formalizes the governance structure of Open Science Labs (OSL). It +outlines decision-making processes and the interactions among community members, +including relationships between work supported by for-profit or nonprofit +organizations and open source collaborative development. + +## Summary + +OSL operates as a community-owned and community-run project. Typically, +decisions are made by the executive director, with support from the +[steering council](https://opensciencelabs.org/about/team/). Responsibility for +specific tasks or areas lies with individual members, who bring issues to the +community's attention for group discussion and decision-making in one of OSL’s +Discord channels. All content and access must relate to open technologies; +references to private technologies or content are prohibited, maintaining an +open and inclusive environment. + +## The Organization + +Open Science Labs aims to unite people globally to foster an open environment +for teaching, learning, and sharing knowledge about open science and +computational tools. The organization is led by the executive director and +supported by the [steering council](https://opensciencelabs.org/about/team/). +Financial and administrative support is provided by +[The GRAPH Network](https://thegraphnetwork.org) and +[Open Source Collective](https://opencollective.com/osl), which also supports +the OSL Internship Program. + +## Affiliated Projects + +Affiliated projects are independent in their governance. OSL does not control +these projects but offers suggestions and support to enhance their internal +organization, helping them better support their contributors and users. These +projects are eligible to participate in OSL activities like Internship Programs, +Google Summer of Code, Blog, and Newsletters. + +## Incubated Projects + +Projects incubated by OSL are released under OSI-approved licenses (BSD, Apache +2.0, MIT, etc.) and developed openly on public GitHub repositories. Contributors +include anyone who has collaborated through code, documentation, design, or +other contributions. The community, comprising all Contributors and Users, +strives for minimal barriers between participants, promoting an open and +transparent environment. + +## Incubated Project Governance + +Incubated project governance is based on principles of openness, transparency, +active contribution, institutional neutrality, diversity, equity, inclusion, and +education. + +### Consensus-based Decision Making + +Decisions are generally made by consensus among all interested Contributors, +aiming to incorporate diverse perspectives into the development process. The +consensus process does not necessarily involve voting but allows for vetoes to +ensure serious concerns are considered. Formal vetoes require a clear statement +and explanation from the vetoer. + +### Steering Council + +The Steering Council, composed of significant contributors, oversees the +project's technical and community health. The council facilitates +decision-making, helps resolve conflicts, and may intervene in governance if +necessary to maintain the project’s welfare. + +#### Council Decision Making + +When formal decisions are necessary, the council employs a consensus model +similar to that used by the Apache Foundation. This model uses a combination of +judgement and community discussion, with formal voting held open for sufficient +time to allow all council members to participate. + +#### Council Membership + +Council members are nominated based on their substantial and sustained +contributions. Inactivity for over six months may lead to removal from the +council, although re-nomination is always possible. The council also handles +conflicts of interest and private communications, maintaining transparency as +much as possible. + +#### Institutional Partners and Funding + +While OSL Incubated Projects is led by their authors, and core contributors, who +compose the Steering Council, funding and support from Institutional Partners +are acknowledged and facilitated. These partners can influence the project +through their council members but do not control the project. Partners must +align with OSL’s values and contribute through funding, contributing personnel, +or other means specified in partnership agreements. + +## Acknowledgements + +Portions of this governance document have been adapted from the governance +structures of other open source projects like NumPy. + +## Document History + +Changes and updates to this document can be tracked at +[OSL GitHub repository](https://github.com/opensciencelabs/opensciencelabs.github.io). + +## License + +This document is licensed under CC BY-SA 4.0: +[Creative Commons License](https://creativecommons.org/licenses/by-sa/4.0/). diff --git a/pages/about/guidelines/articles/index.md b/pages/about/guidelines/articles/index.md new file mode 100644 index 000000000..bf509df6e --- /dev/null +++ b/pages/about/guidelines/articles/index.md @@ -0,0 +1,115 @@ +--- +title: "Editorial Guidelines for Article Creation" +date: 2019-04-08 +authors: ["Mariangela Petrizzo"] +template: single-sidebar.html +--- + +# Articles + +## General Introduction + +The purpose of this guide is to accompany the first steps of OSL collaborators +in the elaboration of their posts to be published in our blog. + +In reading this guide you will find a simplified basis of the different elements +that should be taken into account in the writing of this material. + +## Basic characteristics of the posts + +- Although translated materials from other languages, correctly referenced, will + be admitted, in general the articles must be unpublished. This will improve + the positioning of the portal as a reference. Important: Do not address + similar topics to previous articles in the blog. +- In the articles we address general topics of open science, open source + software used in open science projects, team management, collaborative + science, and use of applications, libraries and other specific tools, among + others. +- The expected length of posts is up to 900 words. A minimum desirable length is + 750 words. +- Each post should be accompanied by a header image or featured image. In recent + articles, images have been obtained from some of these sites: + - + - + - +- Additionally, depending on the length of the article, there may be internal + images that serve as visual support for the ideas presented. +- Use Google Trends to locate reference words for article content. +- Titles must comply with the following characteristics: be short, be linked to + the content of the article and invite to read it. +- Emoticons can be added in the titles without abusing them. +- Up to three internal subtitles can be used to separate the sections of the + article if necessary. The subtitles have the H2 heading size. +- It is important to include references to the articles we provide from our + portal. +- It is also very important to include internal links in the articles. Links to + previous articles in the portal, as well as links to the pages of the + projects, applications, and tools that are reviewed in it among others. +- Attention to tags, always include them without making them too simple or + imprecise. +- The images used must have "Alt" content specified and authorship at the bottom + of the image. + +## About tone and inclusive language + +- The articles are written in a close, simple, direct, clear and precise tone. +- We are not interested in showing wisdom but in sharing knowledge! +- We want to encourage more people to engage in collaborative and open science + practices. The tone should be fresh, even in tasks that are a bit more complex + to explain, the idea is to encourage those who read us to continue with open + science practices. +- We practice inclusive language. Therefore, we seek the generic use of words + that do not indicate any sex or gender in a preferential way: people, + participants, who, among others. +- In the case of having to use a word that denotes sex and gender, we also + indicate references to other genders and sexes: /a/e. This applies to both + singular and plural. +- In general, both tone and speech should be respectful and clear. Words that, + for cultural reasons, may be misunderstood in other cultures should be + avoided. +- At OSL we are very respectful of other cultures, religious practices, + political preferences, sports and, in general, we never address in our + articles our personal preferences in any area that may be controversial and + uncomfortable to those who read us. This is key to making this space a safe + place where passion and interest in open science brings us together and + encourages collaboration. +- Although articles may refer to personal experiences, it is always important to + keep the focus of the writing on proposing a solution to a need for + information or knowledge on the topics addressed. + +## Workflow + +- Each contributor establishes the pace of work that he/she will contribute to + the portal and selects the topics and order in which they will be taken on, as + well as the dates when they will be available for review. +- Each collaborator has an initial support from 1 to 3 weeks for wordpress + management and first steps with the editing flow, as agreed by the OSL Board. +- Contributor writes the article from his/her account in the portal. +- Once the article is finished, along with the suggested images, it remains in + draft form waiting for the person assigned to the revision to make a basic + review of spelling, clarity and coherence. +- The person who reviews the article for publication is the one who must + schedule its publication in the portal. +- The articles must have between 5 and 8 keywords that will be placed in the + LABELS section of the article. +- Likewise, each article must have the category to which it belongs. +- Unless otherwise indicated or previously agreed, no contributor should edit + other contributors' writings. +- Our contributors are encouraged to replicate their publications in our portal, + through their personal social networks, as long as reference is made to OSL's + social networks for their promotion. + +## Proposed topics + +- Guides for installing frequently used applications, libraries or libraries in + open science and similar practices. Suggested titles: Learn how to install XX + in a few minutes, We show you how to install XX on your PC quickly. +- Tips to help solve specific problems. Suggested titles: 5 tips you need to + know to improve XX performance, 3 keys to keep an eye on for your next open + science project. +- Articles for the general public with information on aspects related to open + science, collaborative labs, citizen science, among others. +- Translations of interesting and relevant articles for the OSL portal (previous + consultation with the editorial team). +- Reviews of articles, books, videos, podcasts related to open science and + similar topics. diff --git a/pages/about/guidelines/dei/index.md b/pages/about/guidelines/dei/index.md new file mode 100644 index 000000000..32661c5cb --- /dev/null +++ b/pages/about/guidelines/dei/index.md @@ -0,0 +1,69 @@ +--- +title: "Statement on Diversity, Equity and Inclusion" +date: 2019-04-08 +authors: ["Mariangela Petrizzo"] +featured: true +tags: ["DEI"] +template: single-sidebar.html +--- + +# Statement on Diversity, Equity and Inclusion + +## OSL Description + +Open Science Labs (OSL) is a community that offers an open space to share, learn +and teach topics related to Open Science and Computational Technologies to the +people from all parts of the world. + +### OSL Mission + +Create an open collaborative space for organic learning among all members of the +community. Diversity, Equity and Inclusion is one of the community's core +values. + +### OSL Results + +Creation of local groups for knowledge dissemination. Acculturation of +collaborative and open work practices. Activities for knowledge dissemination +(blog, videos). + +## OSL DEI Statement + +OSL recognizes that the **pedagogical processes associated with the development +of new skills and abilities** are long term and are the result of the investment +of time, the acceptance of diversity in equitable and fair conditions, +perseverance and, above all, the cumulative impact of decisions framed by our +purpose as an organization. Therefore, OSL sets its goals to achieve measurable +progress in advancing DEI in four aspects: + +1. _Capabilities_: We will help the community of people with an interest in + mastering open technologies and applying them in science, to develop the + necessary capabilities to achieve this by generating diversity, equity and + inclusion that is observable in their work and interaction spaces. +2. _DEI with meaning_: We will assume our actions and work as an organization + with a positive and intentional focus on DEI among those who make up OSL in + their different roles as collaborators, volunteers and Steering Council + members. +3. _Diverse Open Science_: As a result of developing our current and future + initiatives, we will achieve a more diverse community of people interested in + technology in the field of open science. +4. _COC and DEI working together_: We will establish a Code of Conduct (COC) to + ensure the establishment of positive practices towards the respect of all + people and their considerations in terms of intellectual, academic and + personal honesty in the development of our activities. + +Based on this, our community considers the following parameters with respect to +the DEI: + +- **Diversity:** Our community is open to multiple demographics, social, + political, identities, perspectives and backgrounds. + +- **Equity:** Those who make up our community, as well as its different groups + and work teams, have access to all the opportunities and activities that we + carry out as we organize them explicitly seeking to eliminate the barriers + that have historically prevented the participation of minority or excluded + groups. + +- **Inclusion:** Everyone in our community experiences a sense of belonging, + high levels of commitment to the activities in which they participate, and + shared and mutually expressed respect. diff --git a/pages/about/guidelines/index.md b/pages/about/guidelines/index.md new file mode 100644 index 000000000..ecfdf7000 --- /dev/null +++ b/pages/about/guidelines/index.md @@ -0,0 +1,47 @@ +--- +title: Guidelines +authors: ["OSL Team"] +template: single-sidebar.html +--- + +# Guidelines + +The Open Science Labs Guideline is a collection of documents about how to get +started in specific areas. + +## Articles + +In this section, there are the guideline about how to write the blog posts for +Open Science Labs. OSL Blogs can be accessed [here](/blog/). + + + +## Diversity, Equity and Inclusion (DEI) + +Open Science Labs (OSL) is a community that offers an open space to share, learn +and teach topics related to Open Science and Computational Technologies to +people from any part of the world. + +DEI is a very important aspect of our community and we really care about that. + +In this section we can find our initial DEI declaration. + + + +## Mentoring + +In this section, there are documents about Open Science Labs Mentoring program. +The mentoring could be running as a community mentoring, where someone from the +community for the mentoring program and Open Science Labs tries to find one +mentor inside our community, using discord, or using the social media, in order +to reach someone outside. + +Another way that the mentoring can happen is inside the internship program. + + diff --git a/pages/about/guidelines/mentoring/index.md b/pages/about/guidelines/mentoring/index.md new file mode 100644 index 000000000..b79dc1ab3 --- /dev/null +++ b/pages/about/guidelines/mentoring/index.md @@ -0,0 +1,299 @@ +--- +title: Mentoring Guideline +date: 2019-04-08 +authors: ["Ingrid Bianka Garcia"] +tags: ["mentoring"] +category: ["mentoring"] +template: single-sidebar.html +--- + +# Mentoring Guideline + +## What is mentoring? + +Mentoring is a technique or process in which an experienced practitioner +(mentor) guides people (mentees) to achieve their goal and personal objectives +through time - limited. A mentor is not necessarily to be a person who teaches, +trains or coaches, it also supports, encourages their mentees and is open to ask +and listen to. It is about helping each other to expand and grow so that +everyone learns. + +Also, an effective mentoring provides opportunities to share talents, skills, +experiences and expertise afforded through regular training and on-going +coaching and feedback, not only for mentees but also for mentors. + +The mentors don't have direct responsibility for the mentees’ work performance. +They´ only give advice and they motivate to enhance the mentees’ professional +development. + +## Types of mentoring + +According to [The university of Auckland][auckland-mentoring-guide-final] +suggests two types of mentoring relationships: + +1. Informal mentoring, when somebody with more experience than others helps + spontaneously and without explicitly asking for mentoring. Partnerships are + initiated between individuals. + +1. Formal mentoring, there is an official ask for or offer of mentoring + relationships. Mentors and mentees follow a structured mentoring program, + make agreements about its nature and establish goals between them. + +## Skills and experience required to be a mentor + +According to [Manchester Metropolitan University +(MMU)][mmu-mentoring-guidlines], it exists at least ten requirements to be a +mentor: + +1. Self awareness: it is related to having your own personal goals, career, and + knowing your own strengths. + +2. Organisational know-how: it means an individual knowledge that mentors have, + it provides an advantage over others in the same field, it is about to know + how things work. + +3. Credibility in Determining Goals and Building Capacity: It is important for + mentors to have personal and professional credibility in their area and being + a member of relevant organizations + +4. Accessibility: successful mentors should be able to commit sufficient time to + their mentees. Further, mentors should talk regularly to establish a level of + comfort in the relationship around the easy topics, then when a challenge or + a concern arises, it is much easier for both to have a useful discussion + +5. Communication skills or listening actively, (taking into consideration + interests, body language, attention, and giving advice) help to ascertain + their mentees motivation and needs. + +6. Ability to empower: mentors have the ability to create a working environment + where mentees feel secure to contribute in different ways. + +7. A desire to help others develop: mentors should understand how mentees learn + and acquire experience from mentoring, either formally or informally way. + +8. Inventiveness: mentors should be open minds of doing new and different things + in mentoring, in order to help mentees gain broader perspectives of their + experiences. + +9. Empathy: the ability to sense mentees emotions, or what might be thinking or + feeling + +10. Understanding: mentors can observe their mentees how they learn and provide + them constructive feedback. + +Some other extra skills are: + +Encouraging and inspiring: mentors have the ability to comment on mentees +accomplishments. They believe in the mentees capacity to grow personally and +professionally. In addition, they respond to their frustrations and challenges. +It is important that mentors share their personal vision or those of other +leaders, such as their experiences, mistakes and successes in achieving their +goals [The Center for Health Leadership & Practice +(CHLP)][umich-mentoring-guide]. + +## The mentoring process / stages + +The process of mentoring is an activity that has a beginning and ending, +[MMU][mmu-mentoring-guidlines] lists three stages: + +1. Initial;(building the relationship): explain goals of this mentoring. Time to + involve (schedule for communication). Discuss backgrounds, experiences, + interests and expectations. Establish the rules (format of the meeting). +2. Mentor sessions; planning mentoring sessions (review experiences, when and + how long, goals, progress advance). Mentors should tell about themselves, + their skills, their organization, experience, and challenges they are facing. + Besides, they can exchange information and help their mentees to set and + refocus their goals periodically. Finally, they must work towards the goals + (long and challenging part of the mentoring process), through discussing, + sharing material, trying other learning materials, and development + activities. Mentors create opportunities for mentees to gain experience, + introduce them to other colleagues. Evaluate the progress of this + relationship mentor-mentees (adjustments, results, benefits). +3. Moving on; identify when the relationship mentors-mentees will end such as + when objectives conclude, challenges, and progress towards goals. Help + mentees to identify next steps, self-reflection. Explore other types of + support for their needs. Also, there are other reasons for ending the + mentoring relationship, for example, the program is coming to a close or the + relationship isn’t working successfully and both parties wish to move on. + +## Setting goals and expectations + +According to [Harvard University][harvard-mentoring-guide] suggests that both +mentors and mentees establish their objectives, expectations and actively +collaborate to have effective mentoring. Here there some steps to consider: + +1. Commitment between mentees and mentors before to start a mentoring + relationship because it requires time and effort from both. +1. Self-knowledge, mentees start by determining specific objectives and what is + the most relevant and appropriate for them in the mentoring relationship. + Once they clarify their goals, now they can consider how this relationship + might bring to achieve their goals. +1. Matching: Mentees are ready to consider potential mentors to support them, + based on their expectations regarding the qualities and attributes of + mentors. +1. Establishing the mentoring relationship. Mentors and mentees should define + guidelines and agreements early in mentoring. +1. Planning will keep the mentoring partnership on track and focused on main + objectives. Mentors and Mentees should work together to develop action steps + for each objective, and how to make it effective. A successful mentoring + depends on relationship investment of energy and the commitment to the + experience. +1. The end of a mentoring is as much a part of the process as the preceding + steps. It is important to understand that it does not mean the end of the + relationship. In this process, it can be an excellent opportunity to have a + similar discussion about the experience as a whole or celebrate + accomplishments. Moreover, former Mentees and Mentors are excellent resources + to include on the network. As with any network connection, mentees need to + make a point of staying in touch and participate in communities. + +## Mentoring and ethics + +The mentors need to continuously examine and reflect on their ethical values and +how they may influence decisions in their mentoring practice. In the following, +there are some professional characteristics that contribute to having effective +mentoring: + +1. The mentors and mentees need to be well aware of their institution’s code of + conduct for mentoring. At the same time, they should read professional codes + of ethics to have a healthy mentoring relationship and accept that before + mentoring starts. +1. The mentors need to continuously explore and reflect on their own ethical + values and how they may influence decisions in their mentoring practice. +1. The development of normative guidelines, between mentors and mentees are a + powerful tool for reflecting together on values and boundaries, and to + promote ethical thinking. +1. In most professions, a set of values determine the ethical professional + conduct and become a part of the professional identity. +1. The mentors need to take responsibility for the power they hold and never use + it abusively over others more vulnerable. It should be an open and clear + reporting structure for any misuse of power. +1. The mentees can identify with mentors who have values, attitudes, and + experiences that the mentees holds or aspires to have. + +In addition, [The Actuaries w Without Borders][actuaries-mentoring-guidelines] +describes some personal characteristics in mentoring: + +1. Mentors; ask open and supportive questions and provide constructive feedback. +2. Mentors; maintain a friendly tone and be positive. +3. Mentors; encourage developmente opportunities for mentees. +4. Mentors; help mentees solve their own problem, rather than how to do it. +5. Mentors; give positive reinforcement. +6. Mentors; have to be accessible for helping mentees. +7. Mentees; be prepared. +8. Mentees; take responsability for mistakes. +9. Mentees; thank your mentor. +10. Mentors and mentees; Value the mentoring partner as a person +11. Mentors and mentees; Developing mutual trust and respect. +12. Mentors and mentees;Listen actively both to what is being said and how it is + being said. + +## Mentoring Best Practices + +Mentoring involves the relationship between mentors and mentees. Good mentors +are enthusiastic people, enjoying the role they play in helping others achieve +their goals [(CHLP)][umich-mentoring-guide]. There are some different roles that +Mentors may be required to take: + +1. Networking; mentors help mentees to find people and resources that go beyond + their experience. +1. Counselling; mentors encourage, inspire and challenge mentees to achieve + their goals. Also, They act as a confidant, helping mentees to clarify real + issues and seeing the general view. +1. Facilitating; mentors share your experiences, advice, emphasizing how your + experience could be different from their experiences. +1. Coaching; mentors build their mentees confidence through supportive feedback. +1. Enjoying the process of mentoring; mentors should be spontaneous just to send + an encouraging word or piece of new information. +1. Avoid controlling the mentoring relationship. + +## Mentoring Code of Conduct (MCoC) + +By accessing or using the OSL mentoring services, and thereby becoming a part of +this community, you are agreeing to abide by our Code of Conduct. + +Participants agree not to engage in any tortious or criminal activity and if you +do engage in such activity, you understand that you are fully responsible to the +fullest extent of the law and that you will retain your own legal counsel at +your own expense, pay and all necessary fines and other costs and agree to hold +OSL harmless. OSL is further indemnified for any actions that you take outside +the scope of your contract and mentorship. + +Participation is voluntary and participants shall fully indemnify, hold harmless +and defend (collectively “indemnify” and “indemnification”) OSL and its staff or +members from and against all claims, demands, actions, suits, damages, +liabilities, losses, settlements, judgments, costs and expenses (including but +not limited to reasonable attorney’s fees and costs), whether or not involving a +third party claim, which arise out of or relate to (1) any breach of any +representation or warranty of OSL contained in this Agreement, (2) any breach or +violation of any covenant or other obligation or duty of OSL under this +Agreement or under applicable law, (3) (4) (5)] [other enumerated categories of +claims and losses], in each case whether or not caused by the negligence of OSL +or any other Indemnified Party and whether or not the relevant Claim has merit. + +### Mentors and Mentees + +As a participant in the mentoring community, you agree to: + +- Treat others within the mentoring community with respect. +- Put an honest effort and commit sufficient time towards each mentoring + relationship established. +- Not promote goods or services from sources in which you have a financial or + personal interest. +- Not accept fees or commissions. +- Represent oneself honestly without fake identities or aliases. +- Recognize the diversity of the OSL community and respect the variety of + cultural norms, beliefs, practices, and values it contains. + +#### Mentors + +As a mentor within the community, you agree to: + +- Not use any ideas, products or materials that a mentee has, or may develop, to + further your own business or financial interests. +- Maintain the confidentiality of all ideas, products or materials that have + been entrusted to you by your mentee. +- Encourage your mentee to maintain the highest ethical standards in their + works. +- Maintain a high standard of personal and professional conduct with your + mentee. Demonstrates empathy without making the mentee feel uncomfortable. +- Always communicate in a truthful manner. +- Support the goals of your mentee and help him/her set achievable goals. +- Avoid the intent or appearance of unethical or compromising practice in + relationships, actions and communications. +- Refer your mentee to the mentoring program administrator for issues or + questions for which you feel unqualified. +- Don’t hesitate to ask questions if you find any part of the guidelines unclear + or confusing. +- Both the mentor and the mentee have great responsibility to maintain and + respect the confidentiality of all the information imparted during the + mentoring relationship as they may hear sensitive and personal information. + However, if such information is dangerous or illegal, an appropriate approach + for the mentor is to encourage the mentee to take appropriate action + themselves. + +#### Mentees + +As a mentee within our community, you agree to: + +- Put effort and energy into getting matched with a mentor. +- Create relevant, specific, detailed, and clear mentoring relationship. +- Maintain the confidentiality of your mentoring relationship. +- Build proactively your mentoring relationship. +- Communicate regularly and openly with your mentor. +- Honor your commitment to your mentor and to your learning process. +- Complete any tasks agreed upon between your mentor and yourself. +- Hold all sensitive information provided through your mentoring relationship in + strict confidence. + +[umich-mentoring-guide]: + https://www.rackham.umich.edu/downloads/more-mentoring-guide-for-mentors.pdf +[mmu-mentoring-guidlines]: + https://www.mmu.ac.uk/media/mmuacuk/content/documents/human-resources/a-z/guidance-procedures-and-handbooks/Mentoring_Guidlines.pdf +[albany-mentoring-best-practices]: + https://www.albany.edu/academics/mentoring.best.practices.chapter3.shtml +[auckland-mentoring-guide-final]: + https://cdn.auckland.ac.nz/assets/auckland/business/current-students/PDFs/mentoring-guide-final.pdf +[harvard-mentoring-guide]: + https://cdn2.sph.harvard.edu/wp-content/uploads/sites/31/2015/10/Mentoring_Guide.pdf +[actuaries-mentoring-guidelines]: + https://www.actuaries.org/AWB/Projects/Global_Mentorship/Guidelines%20for%20Mentors%20and%20Mentees.pdf diff --git a/pages/about/health-safety-policy.md b/pages/about/health-safety-policy.md new file mode 100644 index 000000000..476459620 --- /dev/null +++ b/pages/about/health-safety-policy.md @@ -0,0 +1,3 @@ +# COVID/Health & Safety Policy + +There are no restrictions given that all our activities are fully online. diff --git a/pages/about/index.md b/pages/about/index.md new file mode 100644 index 000000000..5dbc45aca --- /dev/null +++ b/pages/about/index.md @@ -0,0 +1,86 @@ +--- +title: "About" +description: + "Open Science Labs — empowered growth through belonging, mentorship, and + purpose." +date: "2026-01-19" +authors: ["OSL Team"] +template: single-sidebar.html +--- + +# About Open Science Labs + +Open Science Labs (OSL) is a unified, no-fee commons where people and open +projects grow together. We exist to turn learning into real-world experience, +and open collaboration into visible, lasting social and technological impact. + +OSL is for the moments when people feel stuck or unseen—finishing a course and +wondering “now what?”, facing “experience required” walls, or watching a project +stall without contributors. We bring belonging, momentum, and recognition by +helping contributors ship meaningful work alongside supportive peers and +mentors. + +## Our Gift + +We envision a world where opportunity is not reserved for the few—where +newcomers and early-stage projects, regardless of background or location, enter +an open, supportive commons. In this environment, anyone aligned with our values +grows through learning and contribution, and together we turn open science and +open technology into tangible social and technological impact. + +## Our Promise + +**OSL empowers people and projects to grow together**—turning learning into +real-world experience, careers with purpose, and open collaboration into lasting +social and technological impact. + +## What We Stand For + +- **Growth:** learning by doing, with steady progress and real outcomes. +- **Belonging:** a friendly, supportive place to contribute and be seen. +- **Mentorship:** trust, care, and guidance that builds confidence and skill. +- **Collaboration:** collective momentum across cultures, disciplines, and time + zones. +- **Empowerment:** pathways that help people believe in their potential. +- **Purpose:** work that matters—socially, technically, and scientifically. +- **Gratitude & recognition:** celebrating contributions and making impact + visible. + +## What We Do + +- **Project Incubation:** we support mission-driven open projects with a path + from idea → contributors → releases → adoption. +- **Internships & structured onboarding:** we help newcomers build credible, + portfolio-ready experience through real work on real projects. +- **Mentorship network:** multi-level mentoring that supports both contributors + and maintainers over time. +- **Programs & partnerships:** we collaborate with institutions and communities + to grow open ecosystems (including participating in initiatives like GSoC when + applicable). +- **Visibility & storytelling:** we publish and amplify work through posts, + updates, and public artifacts so contributors and projects get recognized. +- **Community space:** our Discord is where people meet, ask, build, review, and + ship—together. + +## Who OSL Is For + +- **Newcomers** who want a real path from learning to meaningful experience. +- **Maintainers** who need contributors, structure, and long-term momentum. +- **Researchers and developers** who want to build openly, reproducibly, and + with purpose. +- **Communities across geographies** looking for a welcoming place to grow. + +## Join Us + +If you want to learn by contributing, grow with others, or help open projects +move forward, join our community: + +[Discord](https://opensciencelabs.org/discord) + +## Global, by design + +OSL is shaped by contributors from many parts of the world. We prioritize +cross-geography collaboration so that opportunity, mentorship, and visibility +are not limited by location. + +Map of countries engaged with OSL diff --git a/pages/about/roadmap/index.md b/pages/about/roadmap/index.md new file mode 100644 index 000000000..797bb434c --- /dev/null +++ b/pages/about/roadmap/index.md @@ -0,0 +1,80 @@ +--- +title: "Open Science Labs Roadmap - 2025" +date: 2024-01-19 +authors: ["Ivan Ogasawara"] +tags: ["roadmap"] +template: single-sidebar.html +--- + +# Open Science Labs Roadmap - 2025 + +## Introduction + +As Open Science Labs continues to evolve, our focus shifts towards more +structured and impactful initiatives. This roadmap outlines our strategic plan, +highlighting new areas of development while maintaining our commitment to the +open science and technology community. + +## Initiatives and Objectives + +### Collaborative Research Initiative + +- **Objective:** Establish a collaborative research network with an initial + focus on data science. This will serve as a hub for innovation, research, and + development in cutting-edge data science methodologies. +- **Plan:** Identify key areas within data science for initial research + projects, seek partnerships with industry experts, and secure funding for + research activities. + +### Educational Partnerships for Complementary Support + +- **Objective:** Partner with educational institutions to provide students and + alumni with supplementary support aimed at enhancing their programming skills + and familiarity with open technological tools. +- **Plan:** Open Science Labs will keep leveraging its Discord server to offer a + supportive community where students and alumni can enhance their professional + skills. Additionally, we offer internships involving real-world projects that + not only help participants gain practical experience but also contribute to + open projects impacting a wide user base. + +### Participation in Google Summer of Code + +- **Objective:** Apply to become a mentoring organization in Google Summer of + Code. +- **Plan:** Prepare a compelling application showcasing OSL’s commitment to + mentoring and contribution to open source, and outline potential projects and + mentor profiles. + +### OSL Grants Program + +- **Objective:** To provide financial support to affiliated and incubated + projects. +- **Historical Records:** In 2024, OSL allocated funds to support the + development of the SciCookie project. +- **Plan:** Establish transparent criteria and a robust selection process for + grant allocation; and secure additional funding and manage the distribution of + grants to foster innovation within the OSL community. + +### Open Source Internship Program + +- **Objective:** Refine and expand the internship program based on insights + gained from previous iterations. +- **Plans:** Broaden the participation by increasing the number of projects that + are affiliated or incubated within the program; enhance communication + strategies to effectively engage and attract more potential candidates. + +### Study Group + +- **Description:** Open to all who wish to sharpen their problem-solving skills, + the study group currently tackles the Advent of Code 2025 challenges, + providing a focused arena for technical development. +- **Objective:** To expand community participation, thereby enriching the + learning environment through exposure to diverse perspectives and + problem-solving approaches. +- **Plans:** To intensify outreach efforts aimed at attracting a wider audience + and boosting participation rates. + +## Conclusion + +This roadmap represents OSL's commitment to advancing open science and open +source communities through research, education, and collaborative efforts. diff --git a/content/team/_index.md b/pages/about/team/index.md similarity index 60% rename from content/team/_index.md rename to pages/about/team/index.md index bcbc85013..8245ef1a2 100644 --- a/content/team/_index.md +++ b/pages/about/team/index.md @@ -1,7 +1,8 @@ --- -title: OSL Team +title: Team date: 2022-12-22 type: team-template +template: team.html teams: - name: Steering Council members: @@ -14,16 +15,6 @@ teams: github_url: "https://github.com/xmnlab" github_sponsor: "https://github.com/sponsors/xmnlab/button" - - name: Eunice Rodas - bio: | - I’m currently working on Beek.io as Data Engineer, I work create and model, - ETL, pipelines and Datawarehouse using Python, Pandas, Airflow and GCP. - I'm data passionate, I studied a postgraduate in Data Predict and Analytics - using Pandas, Tensorflow and R. - image_url: https://avatars.githubusercontent.com/u/12076074?v=4 - github_url: https://github.com/eunrod16 - # github_sponsor: - - name: Ever Vino bio: | Bioprocess & Chemical processes Mathematical Modelling Developer, @@ -38,37 +29,53 @@ teams: CEO and Owner at AyPhu. image_url: https://avatars.githubusercontent.com/u/4383323?v=4 github_url: https://github.com/luisgagocasas - # github_sponsor: - - name: Agustina Pesce Lopez + - name: Yuvi Mittal bio: | - I'm a Physicist and a PhD in Geophysics. All those years, I worked in applied - geophysics and studied subduction zones through geodynamical numerical modeling. - I'm also committed to contribute to open-source software projects to improve - science openness and reproducibility. - image_url: https://avatars.githubusercontent.com/u/13738018?v=4 - github_url: https://github.com/aguspesce - # github_sponsor: + Software Engineer and open-source contributor with a strong interest in compilers, + systems programming, and backend development. Experienced in JavaScript, C, and Python, + with hands-on work in LLVM-IR generation, APIs, and collaborative open-source projects. + github_url: https://github.com/yuvimittal + github_sponsor: https://github.com/sponsors/yuvimittal + + - name: Aniket Kumar + bio: | + Machine learning Engineer passionate about Open Science and Open Source. + Experienced in python development, data science and collaborative research. + image_url: https://avatars.githubusercontent.com/u/116947102?v=4 + github_url: https://github.com/whitewolf2000ani + github_sponsor: https://github.com/sponsors/whitewolf2000ani - - name: Interns + - name: Coordinators members: - - name: Anavelyz Pérez + - name: Saransh Chopra bio: | - Statistician, data analyst. Python and R learner. + I am currently based at CERN, working as a Research Fellow with the Princeton + Research Computing Group and IRIS-HEP. I am broadly interested in Research + Software Engineering, Scientific Computing, DevOps, Theory of Computation, + and Type Theory. I am extremely passionate about Open-Source and Open-Science. + image_url: https://saransh-cpp.github.io/assets/img/SaranshChopra.jpeg + github_url: https://github.com/Saransh-cpp + + - name: Anavelyz Perez + bio: | + OSL Coordinator. + Statistician and data analyst proficient in Python and R, currently exploring + Flutter. image_url: https://avatars.githubusercontent.com/u/42752529?v=4 github_url: https://github.com/Anavelyz - # github_sponsor: + - name: Associated collaborators + members: - name: Yurely Camacho bio: | Statistician, data analyst. Python and R learner. image_url: https://avatars.githubusercontent.com/u/49034451?v=4 github_url: https://github.com/YurelyCamacho - # github_sponsor: - name: Steering Council Emeritus members: - - name: Fracisco Palm + - name: Francisco Palm bio: | Computation & Data Science Senior Researcher, Python & R Developer and Software Architect. Special emphasis on hacker ethic as a learning @@ -77,14 +84,12 @@ teams: Distributed Massive Empowerment. image_url: https://avatars.githubusercontent.com/u/236351?v=4 github_url: https://github.com/map0logo - # github_sponsor: - name: Ingrid Garcia bio: | Research Coordinator at 60 Decibels. image_url: https://avatars.githubusercontent.com/u/47956238?v=4 github_url: https://github.com/ibianka - # github_sponsor: - name: Mariangela Petrizzo bio: | @@ -93,7 +98,6 @@ teams: plenty of selfishness. image_url: https://avatars.githubusercontent.com/u/221018?v=4 github_url: https://github.com/petrizzo - # github_sponsor: - name: Sandro Loch bio: | @@ -103,6 +107,24 @@ teams: github_url: https://github.com/esloch github_sponsor: https://github.com/sponsors/esloch/button + - name: Eunice Rodas + bio: | + I’m currently working on Beek.io as Data Engineer, I work create and model, + ETL, pipelines and Datawarehouse using Python, Pandas, Airflow and GCP. + I'm data passionate, I studied a postgraduate in Data Predict and Analytics + using Pandas, Tensorflow and R. + image_url: https://avatars.githubusercontent.com/u/12076074?v=4 + github_url: https://github.com/eunrod16 + + - name: Agustina Pesce Lopez + bio: | + I'm a Physicist and a PhD in Geophysics. All those years, I worked in applied + geophysics and studied subduction zones through geodynamical numerical modeling. + I'm also committed to contribute to open-source software projects to improve + science openness and reproducibility. + image_url: https://avatars.githubusercontent.com/u/13738018?v=4 + github_url: https://github.com/aguspesce + - name: Alumni members: - name: Luã Bida Vacaro @@ -110,16 +132,35 @@ teams: Software Developer and DevOps image_url: https://avatars.githubusercontent.com/u/82233055?v=4 type: team-template - date: 2022-04-12 github_sponsor: https://github.com/sponsors/luabida/button github_url: https://github.com/luabida + + - name: Daniela Iglesias Rocabado + bio: | + Graduate in Systems Engineering with a passion for Python and Web Development. + image_url: https://avatars.githubusercontent.com/u/107383061?v=4 + github_url: https://github.com/DanielaIgRo + + - name: Mfonobong Emmanuel Uyah + bio: | + Electrical and Electronics Engineering graduate with interest in software development using Python, Django, and JavaScript. Looking to develop and participate in open-source and open-science projects. + image_url: https://avatars.githubusercontent.com/u/97167651?v=4 + github_url: https://github.com/investor-uyah --- # OSL Team -OSL is a Open-Source community and everyone can join, check our [GitHub](https://github.com/OpenScienceLabs/opensciencelabs.github.io) to be apart of the issues. +Join our community of innovators, thinkers, and creators. Whether you're a +researcher, student, or open science enthusiast, there's a place for you at OSL. +Explore our programs, participate in our events, and contribute to making +science and technology open and accessible to all. + +Join our Discord server ## How can you contribute? -To be contributing with the community you must know our [Guidelines](https://opensciencelabs.org/guidelines/list/), -there you will find the workflow of the running projects and how you can apply to our team. +To contribute alongside the community, be sure to check our +[Code of Conduct](/about/coc). diff --git a/pages/blog/artbox-what-is-it-how-to-collaborete/header.jpg b/pages/blog/artbox-what-is-it-how-to-collaborete/header.jpg new file mode 100644 index 000000000..8b3b3b806 Binary files /dev/null and b/pages/blog/artbox-what-is-it-how-to-collaborete/header.jpg differ diff --git a/pages/blog/artbox-what-is-it-how-to-collaborete/index.ipynb b/pages/blog/artbox-what-is-it-how-to-collaborete/index.ipynb new file mode 100644 index 000000000..1827c391e --- /dev/null +++ b/pages/blog/artbox-what-is-it-how-to-collaborete/index.ipynb @@ -0,0 +1,439 @@ +{ + "cells": [ + { + "cell_type": "raw", + "id": "7e609acc", + "metadata": {}, + "source": [ + "---\n", + "title: \"ArtBox: What is it and how to collaborate?\"\n", + "slug: artbox-what-is-it-how-to-collaborete\n", + "date: 2024-04-02\n", + "authors: [\"Daniela Iglesias Rocabado\"]\n", + "tags: [open-source, art, python, multimedia processing]\n", + "categories: [python]\n", + "description: |\n", + " ArtBox is a tool set for handling multimedia files with a bunch of useful functions.\n", + "thumbnail: \"/header.jpg\"\n", + "template: \"blog-post.html\"\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "24d656a5-38e6-4ed0-bf15-b8854b96b475", + "metadata": {}, + "source": [ + "# How to use it?\n", + "\n", + "## What is ArtBox?\n", + "\n", + "ArtBox is a versatile tool set designed for efficient multimedia file handling, offering a range of valuable functions to enhance your multimedia processing experience.\n", + "\n", + "\n", + "Key features of ArtBox include capabilities for text-to-audio conversion, YouTube video downloading, musical composition from notes, audio removal from video clips, audio extraction, and merging audio with video files. These functionalities position ArtBox as a pivotal tool for multimedia enthusiasts, content creators, and anyone in need of efficient multimedia processing solutions.\n" + ] + }, + { + "cell_type": "markdown", + "id": "ebda1853", + "metadata": {}, + "source": [ + "### Installation\n", + "\n", + "ArtBox relies on certain dependencies that may not function optimally on your machine. To ensure a smooth installation process, it is recommended to create a conda/mamba environment and install ArtBox within that environment.\n", + "\n", + "```bash\n", + "$ mamba create --name artbox \"python>=3.8.1,<3.12\" pygobject pip\n", + "```\n", + "\n", + "The command is creating a conda environment named \"artbox\" with Python version 3.8.1 or later, and includes the pygobject and pip packages in the environment. This is useful for setting up an isolated environment for a specific project or application, ensuring compatibility and reproducibility of the software stack.\n", + "\n", + "```bash\n", + "$ conda activate artbox\n", + "```\n", + "\n", + "To prevent dependency conflicts, please install the numpy library using the following command:\n", + "\n", + "```bash\n", + "$ pip install \"numpy>=1.20\"\n", + "```\n", + "\n", + "The `conda activate artbox` command is used to activate the \"artbox\" conda environment, ensuring that subsequent commands or scripts run within this isolated environment. Activation modifies the system's `PATH` to prioritize the \"artbox\" environment, allowing for the use of specific Python versions and packages associated with the project, thus maintaining a clean and reproducible development or execution environment." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "1ed9bbc9-2c65-4377-86a1-a4099944b065", + "metadata": {}, + "outputs": [], + "source": [ + "$ !mamba install -q -y -c conda-forge pygobject pip" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "df3d4252-6fc3-46c0-93a2-009b29a06950", + "metadata": {}, + "outputs": [], + "source": [ + "$ !pip install -q artbox" + ] + }, + { + "cell_type": "markdown", + "id": "70667c02", + "metadata": {}, + "source": [ + "The `pip install artbox` command is used to install the Python package named \"artbox\" using the pip package manager. This command fetches the \"artbox\" package from the Python Package Index (PyPI) and installs it into the currently active Python environment. The `pip install` command is commonly used to add external packages or libraries to a Python environment, expanding its functionality for a particular project or application." + ] + }, + { + "cell_type": "markdown", + "id": "4a4eae64-6196-4f02-8f6a-bc591f975bd5", + "metadata": {}, + "source": [ + "## Examples of Artbox usage.\n", + "For the following examples, create the a temporary folder for artbox:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4dd7d934", + "metadata": {}, + "outputs": [], + "source": [ + "$ mkdir /tmp/artbox" + ] + }, + { + "cell_type": "markdown", + "id": "11d1f56e-0465-47d4-8e9f-3e4b4c517159", + "metadata": {}, + "source": [ + "### Convert text to audio\n", + "\n", + "By default, the `artbox voice` uses\n", + "[`edge-tts`](https://pypi.org/project/edge-tts/) engine, but you can also\n", + "specify [`gtts`](https://github.com/pndurette/gTTS) with the flag\n", + "`--engine gtts`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "84661a75", + "metadata": {}, + "outputs": [], + "source": [ + "$ echo \"Are you ready to join Link and Zelda in fighting off this unprecedented threat to Hyrule?\" > /tmp/artbox/text.md\n", + "$ artbox speech from-text \\\n", + " --title artbox \\\n", + " --input-path /tmp/artbox/text.md \\\n", + " --output-path /tmp/artbox/speech.mp3 \\\n", + " --engine edge-tts" + ] + }, + { + "cell_type": "markdown", + "id": "f3b10b2b", + "metadata": {}, + "source": [ + "If you need to generate the audio for different language, you can use the flag\n", + "`--lang`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "357a98eb", + "metadata": {}, + "outputs": [], + "source": [ + "$ echo \"Bom dia, mundo!\" > /tmp/artbox/text.md\n", + "$ artbox speech from-text \\\n", + " --title artbox \\\n", + " --input-path /tmp/artbox/text.md \\\n", + " --output-path /tmp/artbox/speech.mp3 \\\n", + " --lang pt" + ] + }, + { + "cell_type": "markdown", + "id": "ec19fb71", + "metadata": {}, + "source": [ + "If you are using `edge-tts` engine (the default one), you can also specify the\n", + "locale for the language, for example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6968f686", + "metadata": {}, + "outputs": [], + "source": [ + "$ echo \"Are you ready to join Link and Zelda in fighting off this unprecedented threat to Hyrule?\" > /tmp/artbox/text.md\n", + "$ artbox speech from-text \\\n", + " --title artbox \\\n", + " --input-path /tmp/artbox/text.md \\\n", + " --output-path /tmp/artbox/speech.mp3 \\\n", + " --engine edge-tts \\\n", + " --lang en-IN" + ] + }, + { + "cell_type": "markdown", + "id": "35887f10", + "metadata": {}, + "source": [ + "Additionally, if you are using edge-tts, you can specify `--rate`, `--volume`, and `--pitch`, for example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8eafb782", + "metadata": {}, + "outputs": [], + "source": [ + "$ echo \"Do you want some coffee?\" > /tmp/artbox/text.md\n", + "$ artbox speech from-text \\\n", + " --title artbox \\\n", + " --input-path /tmp/artbox/text.md \\\n", + " --output-path /tmp/artbox/speech.mp3 \\\n", + " --engine edge-tts \\\n", + " --lang en \\\n", + " --rate +10% \\\n", + " --volume -10% \\\n", + " --pitch -5Hz" + ] + }, + { + "cell_type": "markdown", + "id": "1764b8ec", + "metadata": {}, + "source": [ + "### Convert audio to text\n", + "ArtBox uses `speechrecognition` to convert from audio to text. Currently, ArtBox just support the google engine.\n", + "\n", + "For this example, let's first create our audio:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "88c5fe25", + "metadata": {}, + "outputs": [], + "source": [ + "$ echo \"Are you ready to join Link and Zelda in fighting off this unprecedented threat to Hyrule?\" > /tmp/artbox/text.md\n", + "$ artbox speech from-text \\\n", + " --title artbox \\\n", + " --input-path /tmp/artbox/text.md \\\n", + " --output-path /tmp/artbox/speech.mp3 \\\n", + " --engine edge-tts" + ] + }, + { + "cell_type": "markdown", + "id": "e41a2821", + "metadata": {}, + "source": [ + "Now we can convert it back to text:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2a45b8a", + "metadata": {}, + "outputs": [], + "source": [ + "$ artbox speech to-text \\\n", + " --input-path /tmp/artbox/speech.mp3 \\\n", + " --output-path /tmp/artbox/text-from-speech.md \\\n", + " --lang en" + ] + }, + { + "cell_type": "markdown", + "id": "828f8b46", + "metadata": {}, + "source": [ + "### Download a youtube video\n", + "\n", + "If you want to download videos from the youtube, you can use the following\n", + "command:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5012eb6b", + "metadata": {}, + "outputs": [], + "source": [ + "$ artbox youtube download \\\n", + " --url https://www.youtube.com/watch?v=zw47_q9wbBE \\\n", + " --output-path /tmp/artbox/" + ] + }, + { + "cell_type": "markdown", + "id": "83199889", + "metadata": {}, + "source": [ + "The command above downloads the video using a random resolution. If you want a specific resolution, use the flat `--resolution`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "06146a5c", + "metadata": {}, + "outputs": [], + "source": [ + "$ artbox youtube download \\\n", + " --url https://www.youtube.com/watch?v=zw47_q9wbBE \\\n", + " --output-path /tmp/artbox/ \\\n", + " --resolution 360p" + ] + }, + { + "cell_type": "markdown", + "id": "fe09ce73", + "metadata": {}, + "source": [ + "### Remove the audio from a video\n", + "\n", + "First, download the youtube video `https://www.youtube.com/watch?v=zw47_q9wbBE`, as explained before.\n", + "\n", + "Next, run the following command:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3effd893", + "metadata": {}, + "outputs": [], + "source": [ + "$ artbox video remove-audio \\\n", + " --input-path \"/tmp/artbox/The Legend of Zelda Breath of the Wild - Nintendo Switch Presentation 2017 Trailer.mp4\" \\\n", + " --output-path /tmp/artbox/botw.mp4" + ] + }, + { + "cell_type": "markdown", + "id": "605d4b77", + "metadata": {}, + "source": [ + "### Extract the audio from a video\n", + "\n", + "First, download the youtube video `https://www.youtube.com/watch?v=zw47_q9wbBE`, \n", + "as explained before.\n", + "\n", + "Next, run the following command:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22980244", + "metadata": {}, + "outputs": [], + "source": [ + "$ artbox video extract-audio \\\n", + " --input-path \"/tmp/artbox/The Legend of Zelda Breath of the Wild - Nintendo Switch Presentation 2017 Trailer.mp4\" \\\n", + " --output-path /tmp/artbox/botw-audio.mp3" + ] + }, + { + "cell_type": "markdown", + "id": "2f032912", + "metadata": {}, + "source": [ + "### Combine audio and video files\n", + "\n", + "First, execute the previous steps:\n", + "\n", + "- Download a youtube video\n", + "- Remove the audio from a video\n", + "- Extract the audio from a video\n", + "\n", + "Next, run the following command:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "159d2762", + "metadata": {}, + "outputs": [], + "source": [ + "$ artbox video combine-video-and-audio \\\n", + " --video-path /tmp/artbox/botw.mp4 \\\n", + " --audio-path /tmp/artbox/botw-audio.mp3 \\\n", + " --output-path /tmp/artbox/botw-combined.mp4" + ] + }, + { + "cell_type": "markdown", + "id": "eee13338", + "metadata": {}, + "source": [ + "## Additional dependencies\n", + "\n", + "If you want to use Python to play your audio files, you can install `playsound`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "03b8a0d7", + "metadata": {}, + "outputs": [], + "source": [ + "$ pip wheel --use-pep517 \"playsound (==1.3.0)\"" + ] + }, + { + "cell_type": "markdown", + "id": "a99f84ca", + "metadata": {}, + "source": [ + "### Demo Video\n", + "\n", + "For a better explanation of the facilities and usage, please watch to the following video.\n", + "\n", + "" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pages/blog/artbox-what-is-it-how-to-collaborete/index.md b/pages/blog/artbox-what-is-it-how-to-collaborete/index.md new file mode 100644 index 000000000..63fc151d5 --- /dev/null +++ b/pages/blog/artbox-what-is-it-how-to-collaborete/index.md @@ -0,0 +1,230 @@ +--- +title: "ArtBox: What is it and how to collaborate?" +slug: artbox-what-is-it-how-to-collaborete +date: 2024-04-02 +authors: ["Daniela Iglesias Rocabado"] +tags: [open-source, art, python, multimedia processing] +categories: [python] +description: | + ArtBox is a tool set for handling multimedia files with a bunch of useful functions. +thumbnail: "/header.jpg" +template: "blog-post.html" +--- +# How to use it? + +## What is ArtBox? + +ArtBox is a versatile tool set designed for efficient multimedia file handling, offering a range of valuable functions to enhance your multimedia processing experience. + + +Key features of ArtBox include capabilities for text-to-audio conversion, YouTube video downloading, musical composition from notes, audio removal from video clips, audio extraction, and merging audio with video files. These functionalities position ArtBox as a pivotal tool for multimedia enthusiasts, content creators, and anyone in need of efficient multimedia processing solutions. + + +### Installation + +ArtBox relies on certain dependencies that may not function optimally on your machine. To ensure a smooth installation process, it is recommended to create a conda/mamba environment and install ArtBox within that environment. + +```bash +$ mamba create --name artbox "python>=3.8.1,<3.12" pygobject pip +``` + +The command is creating a conda environment named "artbox" with Python version 3.8.1 or later, and includes the pygobject and pip packages in the environment. This is useful for setting up an isolated environment for a specific project or application, ensuring compatibility and reproducibility of the software stack. + +```bash +$ conda activate artbox +``` + +To prevent dependency conflicts, please install the numpy library using the following command: + +```bash +$ pip install "numpy>=1.20" +``` + +The `conda activate artbox` command is used to activate the "artbox" conda environment, ensuring that subsequent commands or scripts run within this isolated environment. Activation modifies the system's `PATH` to prioritize the "artbox" environment, allowing for the use of specific Python versions and packages associated with the project, thus maintaining a clean and reproducible development or execution environment. + + +```python +$ !mamba install -q -y -c conda-forge pygobject pip +``` + + +```python +$ !pip install -q artbox +``` + +The `pip install artbox` command is used to install the Python package named "artbox" using the pip package manager. This command fetches the "artbox" package from the Python Package Index (PyPI) and installs it into the currently active Python environment. The `pip install` command is commonly used to add external packages or libraries to a Python environment, expanding its functionality for a particular project or application. + +## Examples of Artbox usage. +For the following examples, create the a temporary folder for artbox: + + +```python +$ mkdir /tmp/artbox +``` + +### Convert text to audio + +By default, the `artbox voice` uses +[`edge-tts`](https://pypi.org/project/edge-tts/) engine, but you can also +specify [`gtts`](https://github.com/pndurette/gTTS) with the flag +`--engine gtts`. + + +```python +$ echo "Are you ready to join Link and Zelda in fighting off this unprecedented threat to Hyrule?" > /tmp/artbox/text.md +$ artbox speech from-text \ + --title artbox \ + --input-path /tmp/artbox/text.md \ + --output-path /tmp/artbox/speech.mp3 \ + --engine edge-tts +``` + +If you need to generate the audio for different language, you can use the flag +`--lang`: + + +```python +$ echo "Bom dia, mundo!" > /tmp/artbox/text.md +$ artbox speech from-text \ + --title artbox \ + --input-path /tmp/artbox/text.md \ + --output-path /tmp/artbox/speech.mp3 \ + --lang pt +``` + +If you are using `edge-tts` engine (the default one), you can also specify the +locale for the language, for example: + + +```python +$ echo "Are you ready to join Link and Zelda in fighting off this unprecedented threat to Hyrule?" > /tmp/artbox/text.md +$ artbox speech from-text \ + --title artbox \ + --input-path /tmp/artbox/text.md \ + --output-path /tmp/artbox/speech.mp3 \ + --engine edge-tts \ + --lang en-IN +``` + +Additionally, if you are using edge-tts, you can specify `--rate`, `--volume`, and `--pitch`, for example: + + +```python +$ echo "Do you want some coffee?" > /tmp/artbox/text.md +$ artbox speech from-text \ + --title artbox \ + --input-path /tmp/artbox/text.md \ + --output-path /tmp/artbox/speech.mp3 \ + --engine edge-tts \ + --lang en \ + --rate +10% \ + --volume -10% \ + --pitch -5Hz +``` + +### Convert audio to text +ArtBox uses `speechrecognition` to convert from audio to text. Currently, ArtBox just support the google engine. + +For this example, let's first create our audio: + + +```python +$ echo "Are you ready to join Link and Zelda in fighting off this unprecedented threat to Hyrule?" > /tmp/artbox/text.md +$ artbox speech from-text \ + --title artbox \ + --input-path /tmp/artbox/text.md \ + --output-path /tmp/artbox/speech.mp3 \ + --engine edge-tts +``` + +Now we can convert it back to text: + + +```python +$ artbox speech to-text \ + --input-path /tmp/artbox/speech.mp3 \ + --output-path /tmp/artbox/text-from-speech.md \ + --lang en +``` + +### Download a youtube video + +If you want to download videos from the youtube, you can use the following +command: + + +```python +$ artbox youtube download \ + --url https://www.youtube.com/watch?v=zw47_q9wbBE \ + --output-path /tmp/artbox/ +``` + +The command above downloads the video using a random resolution. If you want a specific resolution, use the flat `--resolution`: + + +```python +$ artbox youtube download \ + --url https://www.youtube.com/watch?v=zw47_q9wbBE \ + --output-path /tmp/artbox/ \ + --resolution 360p +``` + +### Remove the audio from a video + +First, download the youtube video `https://www.youtube.com/watch?v=zw47_q9wbBE`, as explained before. + +Next, run the following command: + + +```python +$ artbox video remove-audio \ + --input-path "/tmp/artbox/The Legend of Zelda Breath of the Wild - Nintendo Switch Presentation 2017 Trailer.mp4" \ + --output-path /tmp/artbox/botw.mp4 +``` + +### Extract the audio from a video + +First, download the youtube video `https://www.youtube.com/watch?v=zw47_q9wbBE`, +as explained before. + +Next, run the following command: + + +```python +$ artbox video extract-audio \ + --input-path "/tmp/artbox/The Legend of Zelda Breath of the Wild - Nintendo Switch Presentation 2017 Trailer.mp4" \ + --output-path /tmp/artbox/botw-audio.mp3 +``` + +### Combine audio and video files + +First, execute the previous steps: + +- Download a youtube video +- Remove the audio from a video +- Extract the audio from a video + +Next, run the following command: + + +```python +$ artbox video combine-video-and-audio \ + --video-path /tmp/artbox/botw.mp4 \ + --audio-path /tmp/artbox/botw-audio.mp3 \ + --output-path /tmp/artbox/botw-combined.mp4 +``` + +## Additional dependencies + +If you want to use Python to play your audio files, you can install `playsound`: + + +```python +$ pip wheel --use-pep517 "playsound (==1.3.0)" +``` + +### Demo Video + +For a better explanation of the facilities and usage, please watch to the following video. + + diff --git a/pages/blog/avances-scicookie-grant-2024/header.png b/pages/blog/avances-scicookie-grant-2024/header.png new file mode 100644 index 000000000..36d4607fc Binary files /dev/null and b/pages/blog/avances-scicookie-grant-2024/header.png differ diff --git a/pages/blog/avances-scicookie-grant-2024/index.md b/pages/blog/avances-scicookie-grant-2024/index.md new file mode 100644 index 000000000..818d613cf --- /dev/null +++ b/pages/blog/avances-scicookie-grant-2024/index.md @@ -0,0 +1,36 @@ +--- +title: "Implementaciones recientes en SciCookie gracias a la subvención de la PSF" +slug: avances-scicookie-grant-2024 +date: 2024-06-21 +authors: ["Yurely Camacho"] +tags: [psf, osl, scicookie, subvención, grant, comunidad, colaboración, desarrollo] +categories: [código abierto, desarrollo de software, python] +description: | + Descripción de las mejoras y tareas realizadas en SciCookie gracias a la subvención de la PSF. +thumbnail: "/header.png" +template: "blog-post.html" +--- + +Como mencionamos en el post anterior [SciCookie recibe nueva subvención de PSF para mejoras y crecimiento](https://opensciencelabs.org/blog/scicookie-recibe-nueva-subvencion-de-psf-para-mejoras-crecimiento/), en enero de 2024 la PSF aprobó nuestra solicitud de subvención. Esto nos ha permitido implementar una serie de mejoras significativas en SciCookie. A continuación, presentamos los avances y tareas realizadas. + + + +Se han incorporado nuevas opciones de herramientas a la plantilla, incluyendo los códigos de conducta (CoC) de Python (adaptado) y de NumFOCUS. También se ha añadido soporte para prettier como una opción de linter, proporcionando más flexibilidad a los usuarios. + +![Nuevas opciones de CoC](scr1.png) + +En cuanto a la estructura de la herramienta, se han realizado varias optimizaciones. Se implementó una opción condicional para las preguntas de uso de herramientas en el proyecto (`depends_on`) y se corrigió la indentación en algunos archivos de configuración para mejorar la legibilidad. Además, se unificaron estos archivos según las distintas opciones de sistemas de construcción (*build systems*) para evitar la repetición innecesaria de código y texto. También se creó un ejemplo para la opción de Interfaz de línea de comandos (CLI) como base del contenido de ese archivo. + +En el ámbito de la documentación, se ha automatizado el proceso de mover archivos de configuración a la raíz del proyecto, manteniendo una estructura ordenada. La selección del motor de documentación sphinx se ha dividido en `sphinx-rst` y `sphinx-md(myst)` para ofrecer opciones específicas. Se ha generado la documentación de la API para estas opciones, añadido `quarto` como un motor de documentación adicional, y se han incorporado distintos temas para cada motor de documentación disponible en la plantilla. + +![Nuevas opciones de documentación](scr2.png) + +Se ha iniciado comunicación con Leah Wasser, directora ejecutiva de pyOpenSci, quien ha revisado directamente el uso de SciCookie para las necesidades de pyOpenSci como plantilla de proyectos para recomendar a su comunidad. A partir de sus revisiones y sugerencias, se ha mejorado SciCookie para cumplir con sus principales expectativas. Leah también ha comenzado la creación de un perfil (conjunto de configuraciones por defecto) específico para pyOpenSci en [SciCookie](https://github.com/osl-incubator/scicookie/pull/273). Debido a sus prioridades y cronograma, este trabajo aún está en progreso. + +Con estos avances, SciCookie se presenta como una herramienta más completa y adaptable a diversas necesidades. Continuaremos trabajando para ofrecer mejoras a la comunidad de código abierto. + +Puedes consultar nuestro post [Collaborating and learning from SciCookie](https://opensciencelabs.org/blog/scicookie-collaborating-and-learning/) para más información sobre la herramienta. + +Mantente atento a futuras actualizaciones sobre SciCookie en próximos posts. + +Elementos gráficos de la portada fueron extraídos de [Job illustrations by Storyset](https://storyset.com/job) diff --git a/pages/blog/avances-scicookie-grant-2024/scr1.png b/pages/blog/avances-scicookie-grant-2024/scr1.png new file mode 100644 index 000000000..c3d8837b0 Binary files /dev/null and b/pages/blog/avances-scicookie-grant-2024/scr1.png differ diff --git a/pages/blog/avances-scicookie-grant-2024/scr2.png b/pages/blog/avances-scicookie-grant-2024/scr2.png new file mode 100644 index 000000000..1f640171b Binary files /dev/null and b/pages/blog/avances-scicookie-grant-2024/scr2.png differ diff --git a/pages/blog/console-based-representation-in-astx/header.png b/pages/blog/console-based-representation-in-astx/header.png new file mode 100644 index 000000000..84b830f40 Binary files /dev/null and b/pages/blog/console-based-representation-in-astx/header.png differ diff --git a/pages/blog/console-based-representation-in-astx/index.ipynb b/pages/blog/console-based-representation-in-astx/index.ipynb new file mode 100644 index 000000000..c012793f7 --- /dev/null +++ b/pages/blog/console-based-representation-in-astx/index.ipynb @@ -0,0 +1,532 @@ +{ + "cells": [ + { + "cell_type": "raw", + "id": "087f2f63-a7a4-4ca7-a007-ac84e0f40aad", + "metadata": {}, + "source": [ + "---\n", + "title: \"Console-based representation in ASTx\"\n", + "slug: \"console-based-representation-in-astx\"\n", + "date: 2024-08-08\n", + "authors: [\"Ana Krelling\", \"Ivan Ogasawara\"]\n", + "tags: [\"abstract syntax tree\", \"ascii\", \"console\"]\n", + "categories: [\"abstract syntax tree\", \"console\"]\n", + "description: |\n", + " Recently, console-based AST representation was included in the ASTx framework. Such feature can enhance the debugging and analysis capabilities of ASTx, particularly in environments such as a pdb session. In this tutorial, we'll explore this new feature as well as the ASTx Graphviz visualization.\n", + "thumbnail: \"/header.png\"\n", + "template: \"blog-post.html\"\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "dc9b5a46", + "metadata": {}, + "source": [ + "# Introduction\n", + "\n", + "The ASTx library is an agnostic framework for constructing and representing Abstract Syntax Trees (ASTs). Its primary objective is to provide a versatile and language-independent structure for ASTs, with the flexibility to be utilized across various programming languages and parsing tools. ASTx doesn't aim to be a lexer or a parser, although it could be used by any programming language or parser written in Python in order to provide a high level representation of the AST.\n", + "\n", + "Many kinds of nodes (classes) are currently supported. Below is a list with just some examples:\n", + "\n", + "##### Statements:\n", + "* Function\n", + "* Function Prototype\n", + "* FunctionReturn\n", + "* ForRangeLoop \n", + "* VarDecl\n", + "\n", + "##### Operators:\n", + "* BinaryOp\n", + "* UnaryOp\n", + "\n", + "##### Data types:\n", + "* Boolean\n", + "* Literal \n", + "* Variable \n", + "\n", + "\n", + "The ASTx project is still under development, so new classes may be added to the ones above at any time.\n", + "\n", + "Below are installation instructions and an example, so you can have an overview of how you can leverage the ASTx library for your needs.\n", + "\n", + "# Installation\n", + "The first step is to install ASTx. You can do it simply by running the command below in your terminal:\\\n", + "`$ pip install astx`\\\n", + "If you need more information on installation, you can get it in the [ASTx installation page](https://github.com/arxlang/astx/blob/main/docs/installation.md).\n", + "After that, you can just open a Jupyter Notebook instance and start writing your first AST.\n", + "\n", + "\n", + "# Example: an AST of a series of mathematical operations\n", + "Here we will present a quick example of an AST of the expression \\\n", + "`basic_op = lit_1 + b - a * c / a + (b - a / a)`, in which \\\n", + "$~~~~$ `lit_1` is a defined integer, and \\\n", + "$~~~~$ `a`, `b`, and `c` are variables.\\\n", + "The first thing to do is, in your Jupyter Notebook instance, import `display`, which will allow you to have a basic visualization of the AST, and the astx library itself. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "774dd917-ba8d-4718-b359-9faccd1d918e", + "metadata": {}, + "outputs": [], + "source": [ + "# import display for AST visualization\n", + "import astx\n", + "\n", + "from astx.viz import graph_to_ascii, traverse_ast_ascii" + ] + }, + { + "cell_type": "markdown", + "id": "870951f8-904f-4947-8d17-e6483674ac7e", + "metadata": {}, + "source": [ + "Then we create an instance of the Module class, and this instance will be the first node of the tree, or the root node. After that, we declare the variables and literal that will be part of the basic operation that we will parse into an AST." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7b733009-e028-458d-b2ee-6e2310044e0f", + "metadata": {}, + "outputs": [], + "source": [ + "# Create module\n", + "module = astx.Module()\n", + "\n", + "# Declare variables\n", + "decl_a = astx.VariableDeclaration(name=\"a\", type_=astx.Int32, value=astx.LiteralInt32(1))\n", + "decl_b = astx.VariableDeclaration(name=\"b\", type_=astx.Int32, value=astx.LiteralInt32(2))\n", + "decl_c = astx.VariableDeclaration(name=\"c\", type_=astx.Int32, value=astx.LiteralInt32(4))\n", + "\n", + "a = astx.Variable(name=\"a\")\n", + "b = astx.Variable(name=\"b\")\n", + "c = astx.Variable(name=\"c\")\n", + "\n", + "# Declare literal\n", + "lit_1 = astx.LiteralInt32(1)\n", + "\n", + "# State the expression\n", + "basic_op = lit_1 + b - a * c / a + (b - a / a)" + ] + }, + { + "cell_type": "markdown", + "id": "84c6d62e-253d-4e93-aa54-998aa1889ce1", + "metadata": {}, + "source": [ + "After the basic expression is stated, we create an instance of the Function class. As mentioned in the API documentation, each instance of the Function class must have a prototype and a body, so we'll create those first.\n", + "\n", + "The body is made of a block that is created and the variables, as well as the basic operation, are appended to it afterwards." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "78e439f2-22d2-47bc-aa41-5f32f19320e5", + "metadata": {}, + "outputs": [], + "source": [ + "# Create FunctionPrototype\n", + "main_proto = astx.FunctionPrototype(\n", + " name=\"main\", args=astx.Arguments(), return_type=astx.Int32\n", + ")\n", + "\n", + "# Create FunctionReturn\n", + "main_block = astx.Block()\n", + "main_block.append(decl_a)\n", + "main_block.append(decl_b)\n", + "main_block.append(decl_c)\n", + "main_block.append(astx.FunctionReturn(basic_op))\n", + "\n", + "# Create Function\n", + "main_fn = astx.Function(prototype=main_proto, body=main_block)\n", + "\n", + "# Append function to module\n", + "module.block.append(main_fn)" + ] + }, + { + "cell_type": "markdown", + "id": "7e67f20e-1ffa-4cb6-b7e6-669c7a53e955", + "metadata": {}, + "source": [ + "After this, the module is complete. We can get its AST structure as a dictionary, as well as a PNG representation." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "a183ca30-a5e3-4445-b0df-3833bca3cd58", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'MODULE[main]': {'content': [{'FUNCTION[main]': {'content': {'args': {'Arguments(0)': {'content': [],\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}},\n", + " 'body': {'BLOCK': {'content': [{'VariableDeclaration[a, Int32]': {'content': {'Literal[Int32]: 1': {'content': 1,\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': 'c4848732a3c542f1b3818bc799dc0b26',\n", + " 'kind': }}},\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}},\n", + " {'VariableDeclaration[b, Int32]': {'content': {'Literal[Int32]: 2': {'content': 2,\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': 'b63f0bf700194bb7abbdf99d8cc20336',\n", + " 'kind': }}},\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}},\n", + " {'VariableDeclaration[c, Int32]': {'content': {'Literal[Int32]: 4': {'content': 4,\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '0c0686b5f12a45bd9ff1a20da82702a0',\n", + " 'kind': }}},\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}},\n", + " {'RETURN': {'content': {'BINARY[+]': {'content': {'lhs': {'BINARY[-]': {'content': {'lhs': {'BINARY[+]': {'content': {'lhs': {'Literal[Int32]: 1': {'content': 1,\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '8d5d86d52b98484a8e5947ae4e6556f1',\n", + " 'kind': }}},\n", + " 'rhs': {'Variable[b]': {'content': 'b',\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}}},\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}},\n", + " 'rhs': {'BINARY[/]': {'content': {'lhs': {'BINARY[*]': {'content': {'lhs': {'Variable[a]': {'content': 'a',\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}},\n", + " 'rhs': {'Variable[c]': {'content': 'c',\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}}},\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}},\n", + " 'rhs': {'Variable[a]': {'content': 'a',\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}}},\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}}},\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}},\n", + " 'rhs': {'BINARY[-]': {'content': {'lhs': {'Variable[b]': {'content': 'b',\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}},\n", + " 'rhs': {'BINARY[/]': {'content': {'lhs': {'Variable[a]': {'content': 'a',\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}},\n", + " 'rhs': {'Variable[a]': {'content': 'a',\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}}},\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}}},\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}}},\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}},\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}}],\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}}},\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}}],\n", + " 'metadata': {'loc': {line: -1, col: -1},\n", + " 'comment': '',\n", + " 'ref': '',\n", + " 'kind': }}}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create dictionary representation\n", + "module.get_struct()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e551c944-a801-47b3-a995-bed0ae10762b", + "metadata": {}, + "outputs": [], + "source": [ + "# Create ascii representation\n", + "dot_graph = traverse_ast_ascii(module.get_struct(simplified=True))\n", + "graph = graph_to_ascii(dot_graph) \n", + "print(graph)" + ] + }, + { + "attachments": { + "0d8393a6-fb00-4364-8f2f-319295075948.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABMQAAAcACAYAAAA/oZ/FAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4nOzdf5DddX0v/ufJyWZ3IZAsCcYoNwQIIkGWH3LFGW/jD4xiAlXvWOtQ4I5FOU2VW6VAb4VihxupYm1NLdMiMiySq7n2DmKyadWMOoncemGHxGBQJD+QBBLCJmGzBDcnIdnvH47n25gFQpLdz+5+Ho+ZM+ac1/vz+Tw/yzh75jmfz2cr73rXu/oDAAAAACVROe644xRiAAAAAJTG2Gq1WnQGAAAAABgyYyuVStEZAACOirvvvjstLS1JknHjxiVJ9uzZc9C6w50lSU9PTyZOnDjgrFKppL9/4IvvR+PsxhtvzIYNGwZcCwAwnI0tOgAAwNHyX/7Lf8nHPvaxJElTU1MqlcqAxdbhzpJk3759eakr7FtbW9PX11eK2U033ZQJEyYMuA4AYLhTiAEAo8b+/fuzfPnyomOUwrx584qOAABw2MYUHQAAAAAAhpJCDAAAAIBSUYgBAAAAUCoKMQAAAABKRSEGAIway5YtKzpCaXR1daWnp6foGAAAh6XS1tbWX3QIAAAAABgqrhADAEaNlStXFh2hNDo6OtLe3l50DACAw6IQAwBGjWOPPbboCEdk2rRp2bZtW1avXp1Zs2Ydtf3eddddueyyy17VNvfee2/Wr1+f22+/fcB5S0tLqtXq0YgHADDkFGIAwKh14403ZseOHTn77LOTJOecc0527NiRG2+8MUlyxhln5Ac/+EGeeeaZ/OAHP8gZZ5yRJLnggguyY8eObNu2LWvWrMn//J//M83NzY39rlu3Lm9961sb77/97W/n4x//eJLks5/97EuWSLfffnt27NhxwOujH/3oAWt6enpyzjnnZMWKFUft57Bw4cJ0dXW9qm2uuOKKfP7znz9qGQAAhhOFGAAwqq1fvz5z585Nklx66aVZv359Y/bVr341y5cvzxvf+MY88MADufPOOxuz3t7eTJ06NR/+8IdzwQUX5Lbbbjsqeb785S9n6tSpjdfXv/71o7Lfl/OjH/0oa9euHfTjAACMFAoxAGBU+9GPfpR3vvOdSZJ3vvOdjSuvpk+fnpkzZ+Zv//Zv09PTky9+8YuZOXNmTj311Ma2e/fuzc9//vN8+tOfzh/+4R9m/PjxR5xn3759qdfrjde+fftedv20adPyyCOP5IEHHsiSJUvypS99KY8//nje9ra3JUkuueSS/Pu//3s2bdqUn/zkJ43yL0lmzZqV1atX5+mnnz7olsk77rgjCxYsSGdnZ372s5/l2muvPeJzAwAYKRRiAMCoVq/Xs3nz5syZMye/+tWvUq/XkySnnnpqtm3bll//+tdJkl27dmXbtm057bTTDtrHL3/5yyRp3FI51I499tjMnj07kydPzpo1a3LLLbfkD/7gD5Ik/f39+eQnP5np06fnz/7sz3LnnXdm8uTJSZIVK1bknHPOyXe/+90B93vmmWfmgx/8YN797nfn05/+dCZMmDBk5wQAUCSFGAAw6nV2duaLX/xiOjs7G58dc8wx6evrO2BdX19fjjnmmIO27+/vT19f31G5QuwTn/hE1q1b13i9+c1vfsVtnnnmmfT19eWpp57Khg0bsmnTpkyaNClJsnTp0qxcuTL79u3LQw89lA0bNuQNb3jDIWXp7OzM3r17s3Xr1jzzzDOZNm3aEZ0bAMBIMbboAAAAg+373/9+Pvaxj2XZsmX5z//5PydJfv3rX6e1tfWAda2trY0rxv6jSqWS1tbW7Nq1K0myf//+g9YM9NlA7rnnnnzlK19pvN+2bdsrbvPb2yr37dvX+PfYsb/5Gnfuuefms5/9bE455ZRUKpVMmTIlTU1Nh5Tl+eefb/x77969B/zhAACA0cwVYgDAqPf888/nfe97X6PQSpInnngikydPblwRNn78+EyePPmAh+7/1hvf+MYk//+tk7/+9a9TrVYb82q1mhdeeOGQsuzatSubN29uvPbs2XNY51SpVJIkd911V775zW/m3HPPzTnnnJMnnnjisPYHAFAmCjEAoJSeeOKJPPbYY7n22mszYcKE/Pmf/3l+8YtfZMOGDY01LS0taW9vz4IFC/K///f/bhRqDz74YD7ykY9kwoQJueCCC/KmN70pDz/8cGO7arWa5ubmxus/XrH1u7PfXul1uI4//vg88sgjSZK3vOUtOf30049ofwAAZaAQAwBK6+qrr85FF12Uxx9/PO94xzvy8Y9/vDE7/vjj89RTT+Wb3/xmHnroodxwww2N2c0335wpU6bk0Ucfzd13352bb745a9eubcw//OEPZ8uWLY3XN7/5zcbsU5/61AGzv/iLvziic7j++utz99135/7778+HPvShrFmzpjG7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UEKVtra2/qJDAAAAAMBQccskAIesvb09HR0dRccYNKP9/ACGo1qtllqtVnQMAEpGIQbAIatWq2lpaTkq+zr99NPz6KOPHvF+Lrvsstxzzz1HIdHRPT8ADk1TU1OampqKjgFAySjEAAAAACgVhRgAAAAApaIQA6BQX/ziF7Np06YsWbIkU6dObXx+ySWXpKurK+vXr89dd92V448/vjG76qqr8otf/CKrV69Oe3t74/Prr78+X/nKVxrvm5ub8+STT2batGlDczIAAMCIoBADoDBTp07Nhg0bctppp+XRRx/N3/zN3yRJTjzxxPzTP/1Trrnmmpx11lkZN25c/vIv/zJJMmPGjNx888354Ac/mHe/+91597vf3djffffdlzlz5jSeRfOOd7wja9euzcaNG4f+5AAAgGFLIQZAYfbs2ZOvfe1r2bNnT7761a/mPe95T5LfFFk//elP8//+3//L7t2780//9E9573vfmySZPXt2fvjDH+axxx5Ld3d3vvWtbzX2t379+mzcuDG/93u/lyS59NJLc9999w39iQEAAMOaQgyAwuzcuTN79+5NknR3d6elpSXHHntsJk+enO7u7sa6rVu35jWveU2SZNKkSXnmmWcas//47yT59re/nQ984AMZO3Zs3vve9+Y73/nOEJwJAAAwkijEACjMhAkTMm7cuCS/uU2yr68vL7zwQrZt25YTTzyxsW7KlCmNgmzbtm2ZMGFCYzZx4sQD9vntb38773vf+/KOd7wj69aty9NPPz0EZwIAAIwkCjEACjNu3LhcddVVaWpqytVXX53vfe97SZLly5fnvPPOy1vf+ta0tLRk3rx5jdmyZcvyzne+MxMnTkxTU1Pe//73H7DPTZs25Yknnsj8+fPz7W9/e8jPCQAAGP4UYgAUZsuWLTnllFOyYcOGzJw5s/Hg/GeffTbz5s3LP/7jP+bnP/95XnzxxcYD99evX5/bbrstS5cuzXe+852sW7fuoP3ed999Of3007NkyZIhPR8AAGBkGFt0AADKae3atTnrrLOSJDfccMNB8yVLlrxkoXX33Xfn7rvvfsl9b968OV1dXdmyZcvRCQsAAIwqrhADYFSpVqv56Ec/esBfnwQAAPiPFGIAHLJ6vX7AX38cbs4+++w88cQT6e3tzb333vuqtx/u5wcwGvX29qa3t7foGACUTKWtra2/6BAAjAzNzc2ZOHFitm7dWnSUQTHazw8AAPgNV4gBcMhmzpyZBQsWFB1j0Iz28wMYjmq1Wmq1WtExACgZD9UHAAAK09TUVHQEAErIFWIAAAAAlIpCDAAAAIBSUYgBAAAAUCoKMQAAAABKxUP1AXhVzjvvvCxatChJMmbMmOzfv3/AdSNxdvzxx6e3t3fAdQAAwOihEAPgkK1duzZXX311431ra2v6+voGXHs0ZjNmzMhHPvKRzJ8/f0iOlyTbt28fcB0AADB6KMQAOGS7du3K8uXLh+x4vb29mT179pAeEwAAGP08QwwAAACAUlGIAQAAAFAqCjEAAAAASkUhBgAAAECpeKg+AMNWT09Purq6io4BwCDq7e0tOgIAJVRpa2vrLzoEAAAAAAwVt0wCMGy1t7eno6Oj6BgADKJarZZarVZ0DABKxi2TAAxb1Wo1LS0tRccAYBA1NTUVHQGAEnKFGAAAAAClohADAAAAoFQUYgAAAACUikIMAAAAgFJRiAEAAABQKgoxAAAAAEpFIQYAAABAqSjEAAAAACgVhRgAAAAApaIQAwAAAKBUFGIAAAAAlMrYogMAwEup1+vp7u4uOgYAg6i3t7foCACUUKWtra2/6BAAAAAAMFTcMgkAABSmVqulVqsVHQOAknHLJAAAUJimpqaiIwBQQq4QAwAAAKBUFGIAAAAAlIpCDIBh5+abb87nPve5xvuJEydm06ZNGT9+fIGpAACA0UIhBsCws2TJksydO7fx/uKLL84DDzyQXbt2FZgKAAAYLRRiAAw7q1atSqVSydlnn50kmTt3bpYsWVJwKgAAYLRQiAEwLHV2dmbu3LlpbW3NrFmz8m//9m9FRwIAAEYJhRgAw9LixYszd+7cXHTRRXn44Yfz3HPPFR0JAAAYJRRiAAxLDz30UCZPnpx58+Zl8eLFRccBAABGEYUYAMNSf39/Ojs7c+GFF2bp0qVFxwEAAEYRhRgAw9b111+fyZMnp7u7u+goAADAKKIQAwAAAKBUxhYdAAAAKK/e3t6iIwBQQpW2trb+okMAAAAAwFBxyyQAAAAApaIQAwAAClOr1VKr1YqOAUDJeIYYAABQmKampqIjAFBCrhADAAAAoFQUYgAAAACUikIMAAAAgFJRiAEAAABQKh6qD8ABTj311Nx6662N92PGjMn+/fsHXFu22cqVK3PbbbcNuBYAABg5FGIAHGDChAmZNGlS5s+fnyRpbW1NX1/fgGvLNJsxY0Zmz5494DoAAGBkUYgBcJDt27dn+fLlRccYVnp7exViAAAwSniGGAAAAAClohADAAAAoFQUYgAAAACUikIMAAAAgFLxUH0ADtDT05Ourq6iYww7fi4Ag6O3t7foCACUUKWtra2/6BAAAAAAMFTcMgnAAdrb29PR0VF0jH4l1XIAACAASURBVGHHzwVgcNRqtdRqtaJjAFAybpkE4ADVajUtLS1Fxxh2/FwABkdTU1PREQAoIVeIATBo5s6dmx07dmTHjh156qmnct999+Xkk09OkjQ3N2fHjh2ZNm3agNteeumlWb16dbZs2ZJ77rkn48ePb8za2try1a9+NRs3bsz69evzN3/zN0mST33qU1m4cGFj3QUXXJDHH38855133iCeJQAAMNIoxAAYVOvWrcsJJ5yQ008/PevXr8/f/u3fvuI2r3nNa/LP//zPufHGG9Pe3p62trZ85jOfacy/8pWvpLm5ORdeeGHe9ra35bHHHjtoHzNmzMjChQszb968rFq16qieEwAAMLIpxAAYEn19ffne976XN77xja+4dvbs2fn5z3+ezs7OdHd35x//8R/z/ve/P0ly2mmn5aKLLsq1116bLVu25Jlnnsk999xzwPZTpkzJv/zLv+Sv//qv84Mf/GBQzgcAABi5FGIADIljjjkm73//+w/paq3TTjstv/rVrxrvN2zYkKlTp6a1tTVvetObsmHDhmzfvn3AbcePH59vfetb6ezszKJFi45WfAAAYBTxUH0ABtWMGTOyY8eOJMmWLVvywQ9+8BW3aW1tze7duxvvf/vvY489Nq95zWvy3HPPveS2s2bNyurVq/OOd7wjTU1N2bt37xGeAQAAMNq4QgyAQfXbZ4i97nWvyxe+8IV861vfyrhx4152m76+vgP+ouNv//3CCy9k27ZtaWtre8ltH3744cyePTsvvvhi/vt//+9H5yQAAIBRRSEGwJDYvXt3vv71r+e1r31tTjvttJddu2HDhkyfPr3x/pRTTsmWLVvS19eXRx99NKeddlomTZo04LZbt27Niy++mD//8z/Ptdde+4rHAgAAykchBsCgGzt2bI455ph8+MMfTn9/fzZv3tyYjRs3Ls3NzY1XpVLJsmXLMnPmzLzvfe/LpEmT8olPfCKLFy9Okjz++ONZvnx5/u7v/i6vfe1rc+KJJ+byyy8/6JgrV67MokWL8uUvfzmVSmXIzhUAABj+FGIADKoZM2bk2Wefzfr163PNNdfkj//4j7Nz587G/KGHHsqWLVsarze/+c3ZunVr/vRP/zS33XZb1qxZk97e3tx6662Nbf70T/80+/btS1dXVx588MGcddZZAx77lltuyRve8IZceeWVg36eAADAyOGh+gAMmqVLl+aEE04YcFav119yliTf+c538p3vfGfA2fbt2/PHf/zHB33+5S9/+YD3O3fuzBlnnPEqEgMAAGXgCjEAAAAASsUVYgAcoF6vp7u7u+gYw46fC8Dg6O3tLToCACVUaWtr6y86BADDR3NzcyZOnJitW7cWHWVY8XMBAIDRwy2TABxg5syZWbBgQdExhh0/F4DBUavVUqvVio4BQMm4ZRIAAChMU1NT0REAKCFXiAEAAABQKgoxAAAAAEpFIQYAAABAqSjEAAAAACgVD9UH4CDnnXdeFi1alCQZM2ZM9u/fP+C6Ms2OP/749Pb2DrgOAAAYWRRiABxg7dq1ufrqqxvvW1tb09fXN+Da/zibMWNGPvKRj2T+/PmvarvDnb3c8Q539kpZtm/fPuA6AABgZFGIAXCAXbt2Zfny5a96u97e3syePfuwtj0cL3e8w50BAADl4BliAAAAAJSKQgwAAACAUlGIAQAAAFAqCjEAAAAASsVD9QE4Knp6etLV1TUsjne4MwCGXm9vb9ERACihSltbW3/RIQAAAABgqLhlEoCjor29PR0dHcPieIc7A2Do1Wq11Gq1omMAUDJumQTgqKhWq2lpaRkWxzvcGQBDr6mpqegIAJSQK8QAAAAAKBWFGAAAAAClohADAAAAoFQUYgAAAACUikIMAAAAgFJRiAEAAABQKgoxAAAAAEpFIQYAAABAqSjEAAAAACgVhRgAAAAApaIQAwAAAKBUxhYdAIDRoV6vp7u7e1gc73BnAAy93t7eoiMAUEKVtra2/qJDAAAAAMBQccskAEdFc3NzpkyZUnSMVzRScgIAAINHIQbAUTFz5swsWLBgyI7X3t6ejo6OVz0b6pwAvLxarZZarVZ0DABKxjPEABiRqtVqWlpaXvUMgOGlqamp6AgAlJArxAAAAAAoFYUYAAAAAKWiEAMAAACgVBRiAAAAAJSKh+rDCHLDDTfk/PPPb7x/8sknc/LJJw+4tl6vp7m52WwYzzZu3Jhp06YNOBszZkz2798/ombHH398ent7B1w33Jx33nlZtGhRksH5uezcuTMTJkwYcDZu3LgkyZ49e8xG4CxJenp6MnHixAFnlUol/f39Zkk+85nPZMOGDQOuBQAomkIMRpDzzz8/y5Yty7p165Ike/fufcm/zNTS0pLdu3ebDePZy/33a21tTV9f34ibbd++fcB1w8natWtz9dVXN94Pxs9l3759qVarA86amppSqVQGLFvMhv8sefn/vkX/f3C4zG666aaXLIUBAIYDhRiMMCtXrsyqVauKjgEj1q5du7J8+fKiY8CoNm/evKIjAAC8LM8QAwAAAKBUFGIAAAAAlIpCDAAAAIBSUYgBAAAAUCoeqg8jSFdXV3p6eoqOAcNCvV5Pd3f3q54Bg8/vK16N3t7eoiMAUEKVtra2/qJDAMCr1dzcnIkTJ2br1q1FRwEAAEYYt0zCCNLR0ZH29vaiY8CwMHPmzCxYsGDAWXt7ezo6OoY2ENDg9xWvRq1WS61WKzoGACXjlkkYQVpaWlKtVouOAcNetVpNS0tL0TGgtPy+4tVoamoqOgIAJeQKMQAAAABKRSEGAAAAQKkoxAAAAAAoFYUYAAAAAKXiofrAkLrkkkty+eWXN97X6/U0NzcPuHa0zzZu3Jhp06YNOBszZkz2799v9jKz448/Pr29vQOuAwAAeDkKMWBITZ8+PVu2bMn999+f5Dd/iWz37t0Drh3ts717977kX9ZqbW1NX1+f2SvMtm/fPuA6AACAl6MQA4bc+vXrs3z58qJjAAAAUFKeIQYAAABAqSjEAAAAACgVhRgAAAAApaIQAwAAAKBUPFQfRpDu7u7U6/WiYxyRDRs2FB2BEqjX6+nu7i46BpTWaPh9xdDp7e0tOgIAJVRpa2vrLzoEAAAAAAwVt0wCQ6pWq6VWqxUdg1Guvb09HR0dRceA0uro6Eh7e3vRMRghfDcAoAhumQSGVFNTU9ERKIFqtZqWlpaiY0BptbS0pFqtFh2DEcJ3AwCK4AoxAAAAAEpFIQYAAABAqSjEYJg77rjj8vTTT+eEE05ofDZ//vz81V/9VYGpAAAAYORSiMEw9/zzz+fHP/5xLr744sZnc+bMyZIlSwpMBQAAACOXQgxGgCVLlmTOnDlJkje96U2pVqv56U9/WnAqAAAAGJkUYjAC/Ou//mtmzZqV1tbWzJ0719VhAAAAcAQUYjACPPfcc3n44Ydz0UUX5ZJLLsnixYuLjgQAAAAjlkIMRojFixdn3rx5mTRpUrq6uoqOAwAAACOWQgxGiM7Ozlx44YVZunRp+vv7i44DAAAAI9bYogMAh6a7uzuTJ08uOgYAAACMeK4QAwAAAKBUXCEGDKne3t6iI1AC9Xo93d3dRceA0uru7k69Xi86BiOE7wYAFKHS1tbmYUQAAAAAlIZbJoEhVavVUqvVio7BKNfe3p6Ojo6iY0BpdXR0pL29vegYjBC+GwBQBLdMAkOqqamp6AiUQLVaTUtLS9ExoLRaWlpSrVaLjsEI4bsBAEVwhRgAAAAApaIQAwAAAKBUFGIAAAAAlIpCDAAAAIBS8VB9OAI33HBDzj///Mb7SqWS/v7+AdcOxuzJJ5/MySefPOCsXq+nubn5iGcLFy5MZ2fngGsBAABgJFKIwRE4//zzs2zZsqxbty5J0tramr6+vgHXDsZs7969L/mXmVpaWrJ79+4jmn3gAx/I9OnTB1wHAAAAI5VCDI7QypUrs2rVqqJjDIqzzz676AgAAABw1HmGGAAAAAClohADAAAAoFQUYgAAAACUikIMAAAAgFLxUH04Al1dXenp6Sk6xqDZsGHDUd9nb2/vUd8n/K56vZ7u7u6iY0BpdXd3p16vFx2DEcJ3AwCKUGlra+svOgQAAAAADBW3TAIAAABQKgoxOAIdHR1pb28vOsagqdVqqdVqw36f8Lva29vT0dFRdAwordH++5Gjy3cDAIrgGWJwBFpaWlKtVouOMWiamppGxD7hd1Wr1bS0tBQdA0prtP9+5Ojy3QCAIrhCDIbQr371q+zYsSPPPPNM/u///b+ZM2dOY3b77bdnx44dB7w++tGP5rrrrjvo8x07djQeGH7PPffkuuuua+znuuuuyz333JMkWbhwYXbs2JHt27fnZz/72QHrFi1alMcff7zxJfSKK67I//k//2cofgwAAABQKIUYDLH3vOc9+U//6T/lS1/6Uu66665MmTKlMfvyl7+cqVOnNl5f//rX8/d///eN948++mjmzZuXqVOn5qSTTjqk491yyy2ZPHly/uiP/ii1Wi2XXHJJY3bcccfl4osvPurnCAAAAMOZQgwKsHfv3tx3333p6+vLmWee2fh83759qdfrjde+ffsO+Ky/vz979+5tvD9U/f39eeSRR/KTn/wk5557buPzzs7OXHHFFUf13AAAAGC4U4hBAcaOHZuLL74448ePz4YNGwb9eJVKJW94wxvylre8JWvXrm18/uMf/zinnHJKXve61w16BgAAABguFGIwxL7//e/n2WefzYIFC3LVVVdl48aNjdknPvGJrFu3rvF685vffMTHu/nmm7N9+/Y88MAD+drXvpZ/+Zd/acz6+/uzaNGiXHbZZUd8HAAAABgpFGIwxN7znvfk9a9/fZYvX56zzjrrgNk999yTWbNmNV4/+9nPXnF/+/fvf9nPbrnllpx44om58cYb8/a3vz39/f0HrP3GN76RP/zDP0ylUjnMMwIAAICRRSEGBejr68uNN96YWq2WqVOnNj7ftWtXNm/e3Hjt2bPnFff1wgsvHPCn7avVanbt2nXAmn379uXOO+/Msccem0svvfSA2ZYtW7Jhw4b83u/93hGeFQAAAIwMCjEoSHd3d5YsWZJPfvKTjc+q1Wqam5sbr7Fjx77ifh588MHMmTMnr3/96/P6178+c+bMyUMPPTTg2n/+53/Otddee9Dn99577wF/fRIAAABGM4UYFOirX/1q/tt/+2854YQTkiSf+tSnsmXLlsbrL/7iL15xH9/4xjfy4IMPZsWKFVmxYkUefPDBfOMb3xhw7f3335+pU6fmXe961wGff+9730tvb++RnxAAAACMAK98+Qlw1EyfPv2A92vWrMlJJ52U5DcP1P/EJz7xstvPmjXroM/27duXG264ITfccMNBs8svv/yA93v27MkZZ5yRJPnhD3/Y+Hzv3r2NzwEAAGC0c4UYAAAAAKXiCjE4At3d3anX60XHGDSDcRulWzMZCvV6Pd3d3UXHgNIa7b8fObp8NwCgCJW2trb+okPASDVlypT09PSM2i/9EyZMSJLs3Lmz4CQAAABw9LhlEo7AggULMnPmzKJjDJorrrgiV1xxxVHdZ61WS61WO6r7hN/V3t6ejo6OomNAaXV0dKS9vb3oGIwQvhsAUAS3TAJDqqmpqegIlEC1Wk1LS0vRMaC0WlpaUq1Wi47BCOG7AQBFcIUYAAAAAKWiEAMAAACgVBRiAAAAAJSKQgwAAACAUvFQfThCn/vc59Lb25skqVQq6e/vH3DdYMyefPLJnHzyyQPO6vV6mpubj2g2ffr0LFy4cMB1AAAAMFIpxOAIzJ8/P5MmTWq8b21tTV9f34Brj8bspptuyqJFi7Ju3bokyd69e1/yLzO1tLRk9+7dRzxbv379gOsAAABgpFKIwRFYs2bNkB5v3rx5WblyZVatWjWkxwUAAIDRxDPEAAAAACgVhRgAAAAApaIQAwAAAKBUFGIAAAAAlIqH6sMI0tXVlZ6enqJjHJHe3t6iI1AC9Xo93d3dRceA0uru7k69Xi86BiOE7wYAFKHS1tbWX3QIAAAAABgqbpmEEaSjoyPt7e1FxzgitVottVqt6BiMcu3t7eno6Cg6BpTWaPh9xdDx3QCAIrhlEkaQlpaWVKvVomMckaampqIjUALVajUtLS1Fx4DSGg2/rxg6vhsAUARXiAEAAABQKgoxAAAAAEpFIQYAAABAqSjEAAAAACgVhRgAAAAApaIQAwAAAKBUFGIAAAAAlIpCDAAAAIBSUYgBAAAAUCoKMQAAAABKRSEGAAAAQKmMLToAcOi6u7tTr9eLjnFEent7i45ACdTr9XR3dxcdA0prNPy+Yuj4bgBAESptbW39RYcAgKOpubk5EydOzNatW4uOAgAADENumYQRpKOjI+3t7UXHOCK1Wi21Wq3oGIxyM2fOzIIFC4qOAaU1Gn5fMXR8NwCgCG6ZhBGkpaUl1Wq16BhHpKmpqegIAAyy0fD7iqHjuwEARXCFGAAAAAClohADAAAAoFQUYgAAAACUikIMAAAAgFLxUH0Kc8MNN+T8889vvK9UKunv7x9wbZlnW7ZsSU9PT5Lk9NNPz8c+9rE8++yzSZIxY8bkjDPOGHC7er2e5ubmYTHr7u7Otm3bkqTx33zSpElJksmTJ+fEE08cFjmHerZx48ZMmzZtwNmYMWOyf/9+s8OcHX/88ent7R1wHQAAgEKMwpx//vlZtmxZ1q1blyRpbW1NX1/fgGvLPDvrrLMyZsxvLubcu3dvdu7cme3btydJ1q1blx/+8IcDbtfS0pLdu3cPi9m0adMyYcKEJMmvf/3/sXf/QXLW933AP6tldXs+C3EIkHHwScE4xsKskMyEH6ayUxBRgTbU9qQZGzVmSliLuEntJrQDwu4wgnpw7UYeHAcHwrqIhDE0pZLwLznjih/G9ZUVWMCYSAgkHwi8SJwWzGl1cNc/qK+WtRK60919d/d5vWY8vr3P9/nu+7k97rvPR8/z7GsREWP78Mwzz8T27dtbIud014aHhw/6yVqt9DvYrrVf/o4BAAD8Og0xkqpWq7Fp06bUMVraxo0bx74+77zz4u677+6In9nNN9+cOgIAAAAZ5R5iAAAAAGSKhhgAAAAAmaIhBgAAAECmaIgBAAAAkCluqk8y/f39MTg4mDpGW6nVatFoNFLHOCL1ej11BACmWCesV0wf7w0ASCHX29s7mjoE2TR37twYHBz0hhkAAACYVi6ZJJnVq1fHggULUsdoK5VKJUqlUuoYR6RcLke5XE4dA4Ap1AnrFdPHewMAUnDJJLSRYrEY+Xw+dYwjUigUUkcAYIp1wnrF9PHeAIAUnCEGAAAAQKZoiAEAAACQKRpiAAAAAGSKhhgAAAAAmeKm+m2qUqlEsViMiIiZM2dGRMS+ffuajh0cHIxjjjmmaS2Xy8Xo6GiS2qJFi5qOAQAAAJhKGmJt6oMf/GBcccUVEfHmJ/PkcrmDNsTeeOONg37SU3d3dwwNDSWrbdmypek4AAAAgKmiIdamRkZGYuPGjaljAAAAALQd9xADAAAAIFM0xAAAAADIFA0xAAAAADJFQwwAAACATHFT/Ta1YcOG1BFIoFarRaPRSB3jiNTr9dQRAJhinbBeMX28NwAghVxvb+9o6hAAAAAAMF1cMgkAAABApmiItalqtZo6AkxIuVyOcrmcOgYAU6hSqUSpVEodgzbhvQEAKbiHWJvq6elJHQEmpFAopI4AwBQrFouRz+dTx6BNeG8AQArOEAMAAAAgUzTEAAAAAMgUDTFocbNmzYrnnnsujj322LHvrVq1Kq677rqEqQAAAKB9aYhBi3vllVfigQceiGXLlo1976KLLop169YlTAUAAADtS0MM2sC6devioosuioiI97///ZHP5+PRRx9NnAoAAADak4YYtIFvfetbsWTJkuju7o6LL77Y2WEAAABwBDTEoA28/PLL8cgjj8T5558fl1xySaxduzZ1JAAAAGhbGmLQJtauXRsrVqyIOXPmRH9/f+o4AAAA0LY0xKBNrF+/Ps4666y47777YnR0NHUcAAAAaFtHpQ4AHJ5arRbHHXdc6hgAAADQ9pwhBgAAAECmOEOsTQ0MDKSOABNSr9dTRwBgitVqtWg0Gqlj0Ca8NwAghVxvb6+bEQEAAACQGS6ZbFPVajV1BJiQcrkc5XI5dQwAplClUolSqZQ6Bm3CewMAUnDJZJvq6elJHQEmpFAopI4AwBQrFouRz+dTx6BNeG8AQArOEAMAAAAgUzTEAAAAAMgUDTEAAAAAMkVDDAAAAIBMcVN92s7VV18dixcvHnucy+VidHS06dhOr23fvj3mzZs39njNmjWxfv36pmMBAKATVCqVKBaLERExc+bMiIjYt2/fAeOyVtu7d2988pOfPGAc0JyGGG1n8eLFsWHDhti6dWtERHR3d8fQ0FDTsZ1eGx4eHvtkpksvvTTmz5/fdBwAAHSKD37wg3HFFVdExJufUprL5Zo2jLJWu/XWWw8YAxychhhtqVqtxqZNm1LHaCmnn3566ggAADDlRkZGYuPGjaljtJyRkZHUEaCtuIcYAAAAAJmiIQYAAABApmiIAQAAAJApGmIAAAAAZIqb6repgYGB1BGS6e/vj8HBwdQxWs62bdtSRzgs9Xo9dQQAplitVotGo5E6Bm3CewPGa8OGDakjtCQ/FxifXG9v72jqEAAAAAAwXVwy2aaq1WrqCMlUKpUolUqpY7Sccrkc5XI5dYy31C45AZg4azXj4b0B45XlY6FD8XOB8dEQa1M9PT2pIyRTLBYjn8+njjFhfX198dJLL8Vjjz0WS5YsOezt7rjjjnj66afjq1/9atN6oVCIQqEwWTGnTLvkBGDi2n2tZnp5b8B4tfux0Mc//vF47rnn4rHHHovu7u7D2qarqysee+yxeO655+LjH/940zHt/nOB6aYhRke4//77Y/fu3bFr167YvHlzfOpTnxqrfeUrX4ndu3fv9793vvOdEfHmvdjWrFkzNvaWW26Jf/fv/t3Y4+OPPz527doVX/7yl/d7vmeffTZ2794dL7zwQjz00ENx0UUXRUTE7/zO78RPf/rT/Ra2P/7jP47vfOc7+20/ODgYCxcujPvvv/+w93H58uXxhS984bDHAwBAFsyePXvsff6LL74YDzzwQHzoQx8aqz/yyCP7HQs88sgjERGxaNGi2L17d6xYsWJs7BNPPBFnnnnm2ONLL700du/eHR/5yEfGvnf66aePzfWzn/0s/uf//J/x3ve+NyIirrvuuvjbv/3b/fL93d/9XaxcuXK/733/+9+PhQsXxtDQ0GHtY6PRiIULF8b3v//9w/ypAG9FQ4yOccUVV8Rxxx0X/+pf/av4j//xP8YHPvCBiIj47Gc/GyeeeGI89dRT8Ud/9Edx4oknxvPPPz+23Yc+9KE44YQTms65dOnS2LlzZ1xwwQUH1C688MJ417veFV/60pfitttui7lz58YPfvCDePLJJ+PKK6+MiDf/leZP//RP43Of+9xh78ell1461rADAAAOz6mnnhonnXRSrF69Or7xjW/EzJkzIyLinHPOidNOOy0iIk477bQ455xzxrZpNBrxiU984qBzLl26NJ5//vlYunTpft9vNBpx7LHHxqmnnhpPPvlk3HrrrRER8Rd/8Rdx5plnjh2L/PLr1atXH/Z+XHXVVYc9Fpg4DTE6yujoaDz55JOxdevWOPXUUyMi4vXXX49GoxGjo6MxPDx8wKdefec734k/+IM/aDrf0qVL4+tf/3ocffTR8b73ve+A+vDwcPz93/99DA0NjdU///nPx6c//emYNWtWXHXVVfHwww/Hj3/848Peh8suuyz6+voOezwAAPCm4eHhWL9+fRx99NFj/8i8b9++2Ldv3wFfR0Ts3r079uzZE4sXLz5grlwuFxdccEF88YtfjPPPPz9yudwBY37xi1/EmjVrYsGCBTFz5sx45ZVX4ktf+tLYGWErV66M//Jf/ku88sorh70P11xzzbj2GZgYDTE6Si6Xi4ULF8Zv/dZvxU9+8pPD2mbNmjVN/1XoqKOOig9/+MPxv/7X/4oHH3zwgH8V+uWYZcuWxdvf/vbYtm1bRERs3rw5vv/978e1114bV155ZVx//fVHtlMAAMBhKRQK8bGPfSx+/vOf73dVyKGsWbMmli9ffsD3zzjjjCgUCnHnnXdGPp+PRYsWHTCmWCzGRz/60di+fftYo+1v/uZvoq+vL6655po46aST4vbbbz+ynQKmxFGpA8BkufXWW8dOVf7a174WmzdvPqztfvazn8Xzzz8fZ5999n7f/+3f/u0YGRmJxx9/PO6///645JJL4itf+cpY/Xvf+15ERNRqtfg3/+bfxI4dO8ZqN9xwQ/T398eaNWvi6aeffssMZ511Vtx5550RETFr1qw488wz4/XXX4//83/+z0HPXgMAAP6/n/70pxHx5uWMV1111X5ngh3KvffeG9dee+0BN7hfunRpPPTQQ/H666+P/QP5Lz/JsaurK3bv3h0REY899th+DbXh4eG4/vrr4/bbb4/LL788hoeH3zLDn/zJn8Sf/MmfRETE2972tti6dWtERHz1q1+N//pf/+th7QcwPs4Qo2NcccUVMWfOnFi0aFGcffbZ8a//9b8+7G3vuOOOuOyyy/b73oUXXhgPPvhgjIyMxP333x9nnXVWzJo1a7/6b/zGb8TGjRvH7knwSwMDA/HMM8/EAw88cFjP/+ijj8aSJUtiyZIl8b//9/+OT3/607FkyZL49Kc/fdj7AAAAWXbqqafGCSecEP/iX/yLuOmmm8ZudP9WhoaG4nvf+15ceuml+33/wgsvHHs//8ADD+x3xcgv7yG2YMGCyOfzB9yT+MEHH9zv/9/K7bffPnY8MDQ0NPb1L//BH5h8GmJ0lNHR0di+fXvcd999cf755x/2dvfdd1986EMfire//e1j31u6dGn8s3/2z2LnagiYEgAAIABJREFUzp3xgx/8IAqFQnz4wx/eb7uhoaG49tpro1wux4knnjjh3I1GI55//vl4/vnnY9++ffHSSy/F888/Hy+99NKE5wQAgKx5/fXXo7+/PzZv3hxLliw57O1+/R/I58yZE2eccUZcf/31sXPnzli1alWcccYZcdxxx+233QsvvBA33nhjrFq1quk9xg7XK6+8MnY8MDo6Ovb1eO49BoyPhhgdY8aMGVEoFOJd73pXXHjhhWP39DrqqKOiq6srcrlcFAqF6OrqOmDbRqMR69evj3/6T/9pRET8xm/8Rpx66qmxcOHCOPHEE+PEE0+MO+64Iy688MIDtq3VarFu3TpncwEAQEL5fD66urpi0aJFsXDhwrHjgZkzZ4594uSvfv2rNm3aFLNmzYpjjz02IiIuuOCCeOaZZ+Id73hHnHjiifGOd7wjnn322ab/6P7d7343Zs6cGcuWLZvCvQMmm4YYHePrX/96vPDCC/EP//APsW3btvjSl74UERFf/vKXY+fOnfHe9743/vqv/zp27tw59okzv2rNmjVjzbKlS5fGo48+Gjt37hyrf+tb3zroWWdf//rX4w//8A/HFtAj8bGPfSx+9KMfHfE8AACQJU888UT87Gc/i0qlEn/5l38Z//AP/xAREQ8//HA88cQTY2Mefvjhptvfeeed+x0PfPvb396v/u1vf7vpB22Njo7GbbfdFp/5zGcmZT9OOumkSZkHODQ31acjHOp06F+9QeWv+9XF5oknntivoVWpVPYb+93vfjcWLFgQERHz58/fr/b4448fsHCde+65TZ9zZGQkZsyYEY899lj823/7b+P+++8/aPZfdccdd8SZ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zU/0y+VyTZtXU1GLiHjjjTcO+mnHk/Hf7kRrK1eujNmzZzcdBwDA/jTEgI7w9NNPx8aNG1PHaCn1el1DjI40MjLiv/cmVqxYkToCAEDbcA8xAAAAADJFQwwAAACATNEQAwAAACBTNMQAAAAAyBQ31W9TAwMDqSMkU6vVotFopI5BC9m2bVvqCC1pcHAw+vv7U8eAg5roWrZhw4ZJTtIZ+vv7Y3BwMHWMzKvX66kj8BYajUbUarXUMTiELLxGWT6eg1aR6+3tHU0dAgAAAACmi0sm21S1Wk0dIZlKpRKlUil1DFpIuVyOcrmcOkbLKZVKUalUUseAg5roWpblNfBQrI+twZrU+qyPrS8Lr5G1DNLTEGtTPT09qSMkUywWI5/Pp45BCykUClEoFFLHOCJf/epX4+mnn46//du/PextPvjBD8Zjjz0WL730UvT19R1Qz+fzUSwWJzMmTKqJrmXtvgb29fXFSy+9FI899lgsWbLksLe744474umnn46vfvWrTevWx9bQCWtSp7M+tr4svEbtvpZBJ9AQAzrSjTfeGLt3747du3fH1q1b4ytf+Up0dXVFRMTv//7vj9V++b/f//3fj4iIu+66K/7xH/9x7GBm+fLlcc899+w3949+9KP48Y9/vN/31qxZE7t3745du3bF5s2b48/+7M8iImLOnDnx7LPPxhlnnDE29owzzohnn3025syZs98cX/jCF+LjH//4Ye/jQw89FAsXLnTPIDJv9uzZY/8tv/jii/HAAw/Ehz70obH6I488st9/74888khERCxatCh2794dK1asGBv7xBNPxJlnnjn2+NJLL43du3fHRz7ykf2e89lnn43du3fHCy+8EA899FBcdNFFERHxO7/zO/HTn/40uru7x8b+8R//cXznO9/Zb/vBwcFYuHBh3H///Ye9n8uXL48vfOELhz0eAICD0xADOlalUoljjz02zjnnnHjf+94Xn/rUpyIi4p577okTTzwxbr/99rj99tvjxBNP3K/pNWvWrFi2bFnTOd/1rnfFiSeeGHPnzo358+fvV7v++uvjuOOOi0984hNRLpfjkksuiV27dsVXvvKVuPbaa8fGrVy5MlavXh27du2a/J2GDDv11FPjpJNOitWrV8c3vvGNmDlzZkREnHPOOXHaaadFRMRpp50W55xzztg2jUYjPvGJTxx0zqVLl8bzzz8fS5cuPaB24YUXxrve9a740pe+FLfddlvMnTs3fvCDH8STTz4ZV155ZUS8eQbAn/7pn8bnPve5ydxVAACOkIYY0PFqtVo89NBDceqpp0ZExMjISDQajXjjjTfijTfeiEajESMjI2Pj169fH8uXL28614UXXhg//OEP44c//GHTA+TR0dH4yU9+Eg8//PDYWWF/+Zd/GQsWLIizzz47zjnnnDj11FPja1/72hTsKTA8PBzr16+Po48+Ot75zndGRMS+ffti3759B3wdEbF79+7Ys2dPLF68+IC5crlcXHDBBfHFL34xzj///Mjlck2f7+///u9jaGgo3ve+90VExOc///n49Kc/HbNmzYqrrroqHn744QPOKgUAIC0NMaDjveMd74gPf/jD8eijjx7W+AceeCB+8zd/c+xg+lctXbo07r///rj//vubNsRyuVz81m/9Vvz2b/92bNmyJSIi9u7dGzfeeGOsXLkyVq5cGf/5P//n2Lt375HtFNBUoVCIj33sY/Hzn/88nn/++cPaZs2aNU2b4GeccUYUCoW48847I5/Px6JFiw4Yc9RRR8WyZcvi7W9/e2zbti0iIjZv3hzf//7349prr40rr7wyrr/++iPbKQAAJp2GGNCxPvnJT8bu3bvjySefjKGhofjGN75xWNuNjo7GXXfddcD9vLq6uuKf/JN/Eg888EBs3LgxzjvvvLH7kkVEfO5zn4tdu3bFgw8+GLfeemvcfffdY7W/+7u/i//L3h0HyXnW9wH/3a1Wt8cR684SNiJEOLIce9R4jZLMmAmGJBiBB0FxM7R1qRTXDXgrGmZaCpmJ45ppRva0ToYZZVyooU02gSQa2imqLNcOHhJkrEmKyqrUhuLKlhN5Y2EW4dNW9Wkl665/OFwRWl108t0+77vP5zPDjPae933e73uPtL/xj32fnZqaisnJyfijP/qjpblB4Czf+ta34vnnn4/f/M3fjF/7tV8765NgC9m9e3ds3rz5rH2/Il5ugO/fvz9eeumleOyxx85pgn/xi1+M73znO7Fz58745V/+5Thy5Mj82N133x233npr7N69O55++ulXfnMAACwpDTFgaH1/D7Err7wyDh06FL/92799wef+4R/+Yfz9v//3z3pE6i1veUvMzMzEN77xjfhf/+t/xf/5P/8n3vKWt8yP/8Zv/Ea85jWviV//9V+Pn/u5n4u5ubn5sdnZ2di/f3/s37//rMcz/yY/8zM/M78R+Be+8IULPg9ydM0118Rll10Wf/tv/+2499574+qrr76g82ZmZuKLX/xi3HzzzWf9/B3veEd85StfiYiXPzn6ww2xd7zjHfGjP/qjsW/fvvk9yr6v3W7HM888M3/+hfpP/+k/zf+bf9Ob3rSocwEAuHAaYsDQe+GFF+Jzn/tcvO1tb7vgc44ePRqHDx8+q+G1efPmmJycjOeeey6ee+65WL169Tn/gXzmzJn4zGc+ExMTE/Ge97znFWf/7//9v8ell14al156afydv/N3XvF8MOxeeumlOHDgQDz++OPx1re+9YLP++xnPxtbt26df7169ep44xvfGL/xG78RR48ejR07dsQb3/jGWLNmzVnnzczMxK//+q9Ho9GItWvXvuL873vf++b/zf/5n//5K54PAID+NMSAoTUyMhIrVqyIqampeN/73hfPPPNMRESMjo7G2NhYVCqVqFQqMTY2FqOj574dfvazn413v/vd86/f/va3xz/5J/8k1q5dG2vXro3t27fH29/+9r7X/nf/7t/FRz7ykeW5MaCv7/973rRpU1x33XXze3qtXLly/hsnf/DPP+jgwYPxIz/yI3HppZdGxMv/3p955pl47WtfG2vXro3Xvva18Rd/8Rdx4403nnNup9OJBx54IH7lV35lGe8OAIClpCEGDK1bb701vvOd78T/+B//I6666qr5/1h93/veF0ePHo3bbrstbrvttjh69Gi8733vO+f8P/7jP45utxsRERs2bIgf+7Efi0ceeWR+/Itf/GL82I/9WGzYsOGcc3fv3h1r165d1KfSgFfmG9/4Rjz77LPRbDbjk5/8ZHzpS1+KiIg/+7M/i2984xvzx/zZn/1Z3/P/4A/+YH5fwM2bN8dDDz101vhDDz3U98s0IiI+/elPx6233jrfUAMAoNhWpA4AsBzuuOOOuOOOO/qOff7zn4/Pf/7zfcduueWW+T+fPn36rD2ILrvssrOOPX78+PzPfvBRq4iIU6dOnbN/0a/+6q+eN+/MzEx85CMfiV/4hV84ZzP/83nzm98cn/zkJ2N0dHRR+5LBsDl+/PiCjaif/umf7vvzgwcPnrX31/333x/3339/RER84AMfOOf4f/kv/+X8n6+44oqzxp544ol4/etff9bPfvZnf7bvdWdn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yZ/8SVx66aXxlre8Jd7whjfEr/3ar0VExF133RX/7J/9s/lPHjUajXjiiSfiy1/+8qLu5wMf+EB85jOfWdQ5AABAeWiIAbBkZmZm4o//+I/jmmuumf9Zr9eL06dPx9zcXPR6vXjppZfmx/7kT/4ktmzZEmNjY+fMdfXVV8fk5GR8+tOfjne84x19r/ftb387/st/+S+xadOmiIj46le/Gn/+538e27dvj0suuST+6T/9p/Hxj398Uffwcz/3c3HmzJl47LHHFnUeAABQHitSBwBgeLzqVa+K9773vXHw4MELOv7EiRPx5S9/Od797nefc87mzZtj//798ad/+qfxL/7Fv4gVK1ac1UyLiFizZk3cdNNNcejQofmf/at/9a/i4Ycfjte85jXxyCOPxBNPPLGoe7j99tvj05/+9KLOAQAAysUnxAB4xTZs2DC/h9jb3va22LFjxwWf+9nPfja2bt16zs83b94cX/nKV+KJJ56IU6dOxfXXXz8/9ra3vS2+973vxf/+3/87Xnjhhbjrrrvmx55++unYvXt3/NIv/VLcfffdi7qPN7zhDXH99dfH5z//+UWdBwAAlIuGGACv2Pf3EHvd614X/+bf/Jv4/Oc/HytXrrygc//bf/tvsXbt2rO+vfFHfuRH4k1velM8+uijMTc3F/v374/NmzfPj39/D7F3vvOdsWnTpnO+De0rX/lKPPPMM/FXf/VXi7qPX/7lX44/+qM/ipmZmUWdBwAAlIuGGABL5uTJk/H7v//78drXvjauvPLKCz7vD/7gD87aXP/nf/7no1qtxpe+9KU4evRovOtd7zqrIfZ9Bw4ciAcffDA++tGPvuLs4+Pj8Q/+wT+I//Af/sMrngsAACg2DTEAlsSKFSviVa96Vfy9v/f3Ym5uLp577rmIiBgbG4tqtRojIyMxNjYWK1acu33lrl274p3vfOf863e84x3x+7//+7F27dpYu3ZtvPGNb4xrrrkmfvRHf/Scc++///54//vfH695zWteUf6/+3f/bhw4cCD+4i/+4hXNAwAAFJ+GGACv2IYNG+I73/lOPP300/HhD384/vE//sdx/PjxeN3rXhdHjx6Nz3zmM3H11VfH0aNH4xOf+MQ553c6nfjyl788//rGG2+M//pf/+v86+eeey6+/vWv9/2U2LPPPht/+qd/Gtu3b39F9/DBD37QZvoA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bIuls+y4FnnllVdUXl6uhoaGrI/9eRs3bky5Ftm4cWO7+z7yyCO67777Tvr6ggULtGPHDn3wwQdatGhRshDetWtXPfHEE3r33Xe1e/du/fGPf0x57+GGaxHALnlVEHv11Vc1atSolK+NGjVKK1euzMr4zz33nI4cOZKVsTIVj8dVVlamG264QcOHD9fMmTNtjSdXVq1ape3bt9sdRkbuvfdelZWVadu2bbr99ttVVlamDz/8sFNjrly5UuPHj9fgwYM1Y8YM/eEPf5BhGJKkXr166bHHHtOFF16ou+++W48++qiGDx+ejV3pkMOHD6uqqirld3D06NHauHFjxovlft57772nysrKTo/TWQ8++KCCwaAWLVqkhQsXpr0L1O3q6+u1YMECu8PIyIcffqiysjLdfvvt2rZtm8rKynTvvfd2asx4PK4HHnhAw4YN06WXXqo+ffrorrvuknTi7qqXX35Zl1xyia6++mqNGTNG3//+97OxKwCADKxcuTLlWqRPnz7q1auX1q5d2+mxnZIfX3zxRfXv318PPPCApkyZon/5l3+xO6Ssc8qxztSIESM0dOhQSdLQoUM1YsSITo85Z84cjRw5UhdccIHeeustzZo1S9KJOyUPHjyob33rW/ryl78s0zSTbQBal1cFsfXr16t79+7JavlZZ52lM844Q+vWrZN04i6bzZs3629/+5tefPFFDR48OKX/3/72N918882qqqrStm3b9K//+q+SThQ4Wrolva0xb7zxRu3cuVNVVVUaOXJku/ajd+/eWrBggWpra7V27dqTihtNTU3aunWr7rnnHn3729/Wqaee2q5+l19+uSorK7V7926tWrVKAwYMaDOWCRMm6PXXX9cHH3ygdevWafz48Snt8+fP1/33368VK1bo3XffTT4O1Vq/mpoaPfbYY/ra176mmpoa1dTU6IwzzpAkXXrppS3e0nv66afrmWeeSR7Pz4/51FNPadasWaqoqNDmzZs79AY4k+PSmk8//VSmaSqRSKipqSnlU71ai7O14/Lmm2+qrq5Ohw8f1t69e3Xqqacm//Lz3HPPqaKiQtFoVJWVlaqpqdGXv/zlTu1DplatWpXycz5q1Ci9+uqrkk7c+v7iiy+qrq5Ob7/9tn70ox/J5/Mlt508ebKefPJJPfPMM3rnnXe0efNmnXLKKSoqKmrxca62xjz99NO1bNky7dq1S48//ri6du3arv249dZbtXHjRm3fvv2kO34k6eDBg5o3b55WrlypiRMntqvfgAED9Kc//Um1tbWqqak56XcpnS5duugPf/iDduzYoffff19z587VaaedlmwfNmyYNm7cqHvuuUdvv/22tm3bppEjR7bab/LkyaqpqdG5556rcDismpoaTZs2LTnm888/3+IjthMmTFBVVZV27typZ555Jnnn3znnnKNt27ZpxowZWrt2rSorK3XWWWe161hL0n/8x3/ogw8+0NKlS1VWVtbufi0xTVNNTU1KJBIyTVOffvppm3G2dlwOHjyoN998Ux9//LEOHjyoeDyePNe/8cYbmjt3riKRiHbs2KElS5bY9vuXS9dcc43effddvffeexozZkzy6+eee65eeeUV7dq1S5s3b9YNN9xgX5A50tK1gSQNHDhQa9euVV1dXcr5/JRTTtGzzz6rnTt36v3339eMGTPsCN2RWrpukDie2VZUVKQFCxYoEono2WefTXnsZ8qUKdq2bZtqa2u1bNkydeni6g+eT7Fq1aqT/jj3xhtv6OjRoxnnVanl/NjWmFJmee5rX/uaXn31Ve3atUsLFy5MXhN+5pNPPtGqVav0q1/9Srfffnu7+p122mmaNWuW3nvvPe3YsUM//vGP24zDadcigwcP1ksvvaS6ujq99NJLKe+93nnnHU2bNk0rV65UTU1NSr5qTVvv5zLR2NioxsbGk/7fWpzDhw9XTU2NJk6cqDvvvFM1NTVaunRpsl9lZaX279+v+vp6RaPRZJxHjx7VtGnT9N577ykajWrevHmuvBbJ9H1nz5499Ze//EUffPCBfvOb3+jtt9/W+eefL4n8gbblVUGssbFRa9euTSbB0aNH6/XXX08WJPbv368JEybonHPO0Ysvvqi5c+eeNMY//dM/6etf/7rOO+88VVRUSJL+67/+q8Vb0tsac/DgwRoyZIhmzJihuXPntusN+WeJ4dxzz9W0adM0b968tP22bdsm6cQbkrb6DRgwQHPnztXUqVPVv+EcvEYAACAASURBVH9//du//Vu7nodOJBK666671K9fP/3whz/U008/rR49eqRsc+ONN+r222/X+eefr5/85Cdt9isvL9c999yj9evXq7y8XOXl5dq/f7+kE7dOt3TL9o9//GN17dpVQ4cO1Q9+8AM9+eST6tWrV7L9/PPP17e+9S1dccUVuueee1RSUtLm/mV6XDqjpThbOy6SdNddd2nHjh3661//qlWrVmnXrl0njV1YWKhBgwbprbfeyuk+tOSLf5X9fEGssLBQv/3tb3Xuuefqyiuv1A033KCrr746pf8111yjP/7xjxo6dKjGjx+vTz/9VA0NDS0+ztXWmJdddpkeeughBYNBnX/++br55pvb3IfPvi833HCDLrzwQg0aNKjFfps3b9awYcPa7BcIBPQ///M/euWVV3Teeefp6quvbtfdpj6fT+vWrdPw4cM1bNgwBQIBPfDAAynb9O7dW8XFxSovL9fFF1+s2traVvvNmTNH5eXl2rZtm2655RaVl5frZz/7WXK8m266Ke0j1D179tScOXP0gx/8QEOHDlXXrl1TYunZs6fWrFmj0aNHa926dSkX560pKytTbW2tBgwYoHfeeScnj0d8XktxtnVcpBPn3Lq6Oo0bN07PPfdc2vGDwaCj1mPMlsGDB+vCCy/Ur371q+R5Xjrxpnr58uXq37+/xowZo/fee8/GKHMn3bWBJI0ZM0bf+ta3NGHCBN13333J8/l3vvMdGYah8847T8OGDdOyZcvsCt2R0l03SBzPbBszZox++ctf6oILLtCQIUN02WWXSTpxHfLd735XI0eO1KBBg/TII48okcifD51/8803VVJSoj59+kiSRo4cqVWrVknKPK9KLefHtsbMJM/17NlTzz//vB599FENGjRImzZt0i9/+cu0237+WqStfjNnztRpp52mf/zHf9SFF17YrnU8nXQtIklPP/20li1bpoEDB6qiouKk916BQECXX365pk6dmnJ+aU173iNmW7o433zzTZWXl2v+/PmaPXu2ysvLdc0116T0e/bZZ1VXV6dHH320xXUC3Xotkun7zocffli7d+/WwIEDtXnz5pQ/ypI/0Ja8KohJJx6b/OwvOV98XHLevHmqq6tTc3OznnvuOQ0ZMuSk/k888YQ++eQTJRKJZAJsTVtjPv300zJNU4sXL1YikdAFF1zQ6ngDBw7Uueeeq5kzZ6qpqUkrV67UgQMHkonu8xKJhBoaGnTqqae22e/6669XRUWF1qxZo+PHj6u6ulrvv/9+m/u3bNkyVVdX6/jx49qwYYNqa2tP+qvJCy+8oL/97W+SpJ07d7a7X0ddeeWVeuqpp3Ts2DGtX79e1dXVKX/5qaioUFNTk/bt26ePPvqoXYulZ3pcOiOTOKUTP2uXXXaZHnzwQS1cuDDtxeu0adO0evVqvfHGG9kOu11qamp06qmn6qyzztKZZ56pkpISbdq0SZK0ZcsWVVRU6NixY/roo4+0YsWK5K3kn9m4cWNyfYPdu3en/DUtnbbGfOONN7Rx40YdPnxYzz77rK688so29+HGG2/U7373O+3cuVNHjx7V7373O40bNy7ttkePHk3eodlav6985SsqKCjQnDlz1NjYqD179rTr8c+mpib99re/VSwWk2maWrRo0UnHTDrxl+dEIqGjR4/qo48+ane/jhgzZozeeustrV+/XseOHdOcOXNS1mM5duxYspBdVVXV7jstGxsbNXfuXDU2Nup3v/tdu75HnZFpnJJ0ySWX6Jvf/KZ+//vf69133z2pfcKECRowYECLH+bgZv/93/8t0zRVUVGRcsyam5vVv39/9ezZUwcPHtTbb79tY5S509K1wZ/+9CdFo1Ft3rxZH374YfJ83tzcrF69eunss8+WaZp6/fXX7QrdkdJdN0gcz2xbv369Nm3apFgsptdee00DBw6UdOJ4nnrqqcnrstdee03Hjx+3M9Ss+vTTT7V69erkH+g+/8e5TPNqa9oaM5M8N378eG3YsEErVqzQp59+qt/85jctroF29OhRFRYWqkuXLq3269Kli6677jr95Cc/0eHDh3XkyJGUu48y3b/PWHEtUlZWpvPOO09PPvmkmpqa9NRTT2nQoEE688wzk9v8+c9/liRt2LCh3Tm+Pe8Rsy2TOKUTH5Y1duxY/eY3v0kWej/v7LPP1p133qmHHnooa7FaJdP3nVdddZVmz54t0zQ1b968lKdzyB9oS/7cH/3/vfrqq8mPXx41apSeeOKJZNt1112nO++8U927d5fP51NBQYH8fn/KRcDu3bs7NF9bY0aj0eS20WhUPXv2bHW8M888U4ZhpHyE7SmnnKIePXqcdIeaz+dTUVGRjhw50mo/6cRfbiKRSIf2TZIuvPBCTZs2Tf3795fP51OvXr1Oenws3TFrT7+O6tmzZ8odU/v37085nocPH07+v6mpqV0fOJDpcemMTOKUTlzwHD16VHPmzNH69eu1efNmbd26Ndl+880366tf/epJf0myUnNzsyorK5MXoZWVlcnfhR49emjGjBkaPny4unTpom7dup1UOOjo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OXtMLYvFolatWmnUqFH6r//6Ly1YsMDvfKdPn9abb76pxx57TK1atVJSUpLGjh3rt5ZoOhYpKSnR3r17Pec7U6dO1b59+zxXh4UikPO59u3ba968eZ5xmwORkJDgOR44+/8D8e2339bZLr169dKdd96pLl266LzzztNjjz2moqIiHT58WFarVYsWLdKOHTu0cOFC2e32oM4/okWo553vvfeepk6dqubNm2vChAle25r8gD9x2SG2du1ajRw50isA9+zZo+XLlysnJ0d///vfPZeWBmLz5s1yOp1q166d/vnPf8rpdKpfv34BLTM/P1+7du3SjBkzNHnyZM8l09KZXu8vvvhCe/fu9fSA19TU6M4779Tw4cO1e/dubd26Vb/4xS88v2y1atVKxcXFev3117Vp0yY98MADAc23b98+TZkyxfPl+eyzz3r1sLvdbj366KPKzs5WcXGxZzDC+++/X4sWLdLKlSs1btw4rw69hvibb8uWLdq0aZO2bdumnTt3em69eumll+R0OjV69Gg9+uijcjqdnoHJn3jiCZ0+fVq7d+/W/PnzNW3aNL/jOvjjb7tIZwb29DWGW33mzZunkpIS9enTRwsWLFBJSYnniZD+1Ldd+vXrp9WrV2vnzp2aOHGi7rrrLk9w14bjp59+qpKSEpWUlOjBBx8MuN5wKykpUUVFhU6fPu11m+BTTz2l22+/XWvWrNG8efMCfvz5lClT5HQ6NXPmTN1www1yOp16/vnnA1rm2rVrNWvWLG3btk27du3Sq6++6tU+Z84cPfDAAyouLvY8svz999/XggULtHz5ch04cEBZWVlevzTNnj1bTqdTv/zlL3XLLbd49kND81VUVOjWW2/VyJEjlZ+fr3fffbfOE6iysrKUmpqq4uJizZs3T5K0dOlSJSYmau3atXrjjTcCGvw20Pmee+45TZ8+Xbt27fIMZDtgwAA5nU699dZb6tKli5xOp+e76fDhw5o2bZrmz5+vXbt26fTp02EZAL+kpEQ9evTQ/v371a9fvzoD9V500UW64447Av6ltkuXLiopKdGCBQvUp08flZSUeLZnIHxtl+rqas2cOVPbtm3T6tWrtXv3bs2cOVPSmXErevbsqYULF3o+f2+99VbA64smvjLJnyFDhujTTz/Vl19+qbFjx9bZf2bVrVs3LV++XEVFRXrppZc0depUr/xH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JORlnHu84U+4878hdrtdR48ebbDzoqHv+vXr19c53m0KgWb1uXncpUuXOsd2zz33XMDr9fX6evTooezsbBUXF6ugoEB/+tOfZLfbJUm9evXSsmXL9OWXX2rv3r168sknvU5amyL/58yZo7y8PB09elQDBgwI23Lrw/lj/ep7fUuXLtW+fft08OBBrVixwvN5S0hI0Pz587V7924dOHBAr7/+urp06eKZrymOUy677DK9/fbbOnTokJYuXRq25TakQ4cOOnLkSFDfg9GmMeeyt912mz777DOvHElISNCLL76oQ4cOafPmzV59CpK0bt069enTR3369GlU3eEWdx1igViyZIl++OEHo8sIyZAhQ3TxxRdLki6++GINGTKk0ctcu3atxowZowsvvFBz5szRq6++6rkiIykpSdOnT9cll1yiN998U0uWLInILw6zZs3S3r17m3w9gfjwww9VUFBgdBkhWbFihTp37qxFixZp0aJF6ty5s1asWNGoZRYUFOjOO+9Unz59dOutt+qee+7RoEGDJEmdOnXSn/70J1166aX6j//4Dz3++OO6/PLLw/FSfIrk+o4fP67c3FwNGzbM87fhw4dr8+bNKisra/Tyjx07FrEQj3Vr16712g/nn3++OnXqpA0bNjR62eyHwK1bt85rP0hnrhRYu3ZtWJYfy1kdSZ988onat2+vCy64wPO3oUOHhq1DLJYzMJKaOiP27NmjnJycRi8HZ8Tyd/2hQ4fUuXNnTZkyRfn5+ercuXOj7w4oKyvTH/7wB/Xv319XXHGFzj//fE2fPl3SmSuT3n//ff3kJz/RddddpyuvvFK//e1vw/FS6rVr1y5NnTpVx48fb9L1BCOWM6kpzh9ffPFFDR06VJdccom2bt2qzMxMSWeu8jly5Ih+8YtfaODAgXK73Z62puJ2u5WVlaW//OUvTbqes40aNUolJSW66qqrIrbOaHLnnXfq73//u9ff7r77bvXp00dpaWl6+umntXDhwjr9BitXrmzwqm4jmKpD7D//8z99XtJ7+eWXy+l06o477tDdd98tp9OpVatWedq7dOmipUuXav/+/dqwYUOdE+6vvvpKEyZMUG5urvLz8/X73/9e0pkrr7Zv366vvvpK77zzji688MJGv4aKigpVVFTU+X9J2rlzpx5++GGtXbtWTqdTV155pafN6XTqT3/6kwYPHiyn0ymn06mOHTtKkr744gsVFRXp+PHjKikpUYsWLTw9+U8++aQ+//xzHT16VC+99JJat27t85aU+nz88ceaMGFCUK/xxz/+sex2u7744oug5gu3K664ot5Lehvanna7XU888YR2796t7du313n9ixcv1v3336/s7Gzt3r3bcxn82LFj9emnn+rgwYPauHGjxowZ0+jXUF1dLbfbraqqKlVVVcntdqu6ulrSmV/N33zzTS1evFhffPGFXnnlFc8lwQsXLtSGDRtktVo9r6+2noKCAu3Zs0dlZWX69ttvVV5e7nlvL1myRKtXr5bL5VJOTo6cTqcGDhwYcL2ZmZlBhWZj1xesDz/8UEOHDvX8e9iwYZ6TztTUVL3zzjsqKirStm3b9OCDD8pisXimnTZtmv7yl79o4cKF2rlzp7Zv364f/ehHkqTXXnvN560kzZs316uvvqp9+/Zp7969evnll9WyZUuvaZ5++mkdPHhQq1atUufOnQN6HYMHD9a6dev05Zdfavny5Z73bkMCqSVSPvzwwzonnZ9//rlOnDjht87+/ftr8+bNuvfee7Vt2zbl5+d79mmk94O/bKmPxWLR9OnTlZeXp6KiIr3xxhuGXM7/2WefqV27dp487datmzp27KiNGzdK8p+B9WVnfVkdyDJvu+02FRYWKjc31+uz2pBQ90NTfGeHory8XJ999lmdz0Ttd5O/OuvLpIYy0N8y+/fvry1btig/Pz/g8UD8ZWdDQllfU2iKjEhMTKz3Nil/y2zVqpXWrFmjL7/8Us8995wSEhICeh2TJk3S5s2bVVBQUOdqoIaEur5Iq++7ftq0aXI6nerTp4+ysrLkdDr18MMPe9obys76sqWpstPtdquyslI1NTVyu906ffq0JKlnz57Kz8/XnDlztGHDBuXk5Khbt25+X9+RI0f0xRdf6Pvvv9eRI0dUVlbm+X79/PPP9fLLL6u4uFj79u3T22+/HdSx1oQJE/Txxx8H9fqWLFmiTZs2qabG+Ge/mfX80d/ry8nJ0eHDh3Xs2DG5XC5PnSdOnNDDDz+sPXv2yOVyadGiRUEfmwd7/rhz5069+eabPu9saSqjRo3SX//6V7Vq1UoXXXSRV1t9udqhQwf94x//0MGDB/X8889r27ZtnnlfeuklTZo0ybOMTz/9VJdffrlSUlK0bds2bdiwQatWrdL//u//au/evZ7Mbyg7X3rpJWVmZmr16tXavn27V8d5Q+eyP/rRj/TKK6+osLBQe/fu1Zw5c7xeX9u2bdWvX7865+o///nPtWDBAn333XdaunSpTp48qZ/85Cde03z66acaOXJkSNu8qZiqQ2zevHk+LxH/4osvlJ6ersWLF+uFF15Qenq6rr/+ek97bWj06dNHDz/8sBYtWlQn5K+99lr99Kc/Vd++fbV69WpJZy7HHjt2rHr27Kl33nmnwXtmw8Vms2nkyJGaOXOm/vjHP3r+np6ernvvvVefffaZ0tPTlZ6ersOHD3vap0+frn379umjjz7Shx9+qC+//LLOsi+55BIdP348qEei9u7dW23btg14+mbNmmnOnDlhu+WmMdavX1/vpewNbc8//OEP6t27twYNGqSxY8fqgQceqPNFedttt2nKlCm66KKLPPuppqZG06dPV/fu3XXPPfdowYIFat++fZO+xssvv1z33XefBg8erJSUFI0YMUKSdNddd2n48OGqqqryvL41a9Z45vvxj3+s/Px85efny2az6b333quzbLvdrtTUVG3dujXgerp27aquXbuG9FpCWV+wzr0y6eyTHbvdrj//+c/q06ePrr76at1yyy267rrrvOa//vrr9frrr+viiy/WmDFjPAewt99+u8/biCwWizZu3KjLL79c/fv3l81m0x/+8AdPe+fOnbV//3716tVLO3fuDOhWvw4dOui1117T448/rtTUVG3ZskVPPvmk3/n81RJJX3zxhZKTk3X++edLOnM1zIcffhhwnV26dFFSUpLS09N12WWXeb7TIrkfpMCyxZfbb79dv/rVr3TTTTepd+/eev3119WsWeTjvKKiQhs2bPB8JoYPH65PP/1UbrdbUmAZ6Cs768vqQJZ54YUXql+/fpozZ45efvnlgLZnqPvBiO/s+qxbt87TEdOtWze1a9fOc5tjIHX6yqSGMtDfMkeMGKGrr75aY8aM0YMPPlgnA30JJDvrE8r6mkJTZER5eXm9t0n5W+aIESP00EMPKS0tTRdddFFAJ5hXXXWV7r33Xt1yyy269NJLlZqaGvCJaSjrM0J93/Uvvvii0tPTlZ+fr4kTJyo9PV2zZs2SFFh2+soWI7KzQ4cO+vjjjzV8+HBt3LhRU6ZM8fv6auXn56uoqEijR4/WkiVLfC4/LS0tqPHX2rZtq969e4f+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lXRm/+3Zs0dut1vt2rUL+BaThrRq1UoHDx7U0aNH1bx5c916661e7QkJCbrrrrtks9n0m9/8ps5Ybvv379fgwYO9wm7NmjUaOXKkhg0b5rmyw9dYKsHWEmm1txPcfPPNXiedTVFnOPbDud/1oWaLdOY75p577lGPHj1ks9l0/fXXG3ZlknSmI+bBBx/0+jwEkoHBCmSZkydPlt1u14033qiamhqvjpFw7wd/39mRtm7dOt18882yWCxet582RZ3+lnnzzTerQ4cO6tWrl0aNGqX333/f01ZfloWanf7WF2mRzoiGljlo0CANHDhQLVu21IQJE+p8NxUWFtZ5+MSyZcv029/+Vt27d5fFYtGFF17o+bXfH3/ri7SEhASv47tAfhSWzlwlde75QFNmp6+s9qf2eNVisQR97OPr9V199dW65ppr1L59e/Xt21f33nuvNm3aJOnMDw3Lly/XrFmztHXrVtnt9qDOPyZOnBj0DwY2m81zfH32/zclzh998/X6evXqpTvvvFNdunTReeedp8cee0xFRUU6fPiwrFarFi1apB07dmjhwoWe7RmMYM4fJXk+B1ar1evcpyl07dpVffv2VXp6ujp37qzOnTvr1VdfDegOp/fee09Tp05V8+bNNWHCBK/9UFhYqMsuu0ySNHDgwIDHVG5MdtZ3Ljt06FDPrbOnTp3S6dOnvW7hP3r0qHbt2lXnQRFvv/22Jk+erDZt2mjcuHFKSkqq80CNcD6NPFziskPs2WefVUlJiee/3/3ud5LOjM3gdDrVrl07/fOf/5TT6fS6L/uNN95QSkqK9uzZo3feeUfSmV7xO++8U8OHD9fu3bu1detW/eIXv/D71JM9e/Zo+fLlysnJ0d///nefvaAbN27UF198ob179wYcFBs3btTOnTslnblFIpiA2bJlizZt2qRt27Zp586dnidJ9OvXT6tXr9bOnTs1ceJE3XXXXZ4v4oyMDM/AoLXb89ynRTSke/fuXr3f0eiWW27xer/UXmb60ksvyel0avTo0Xr00UfldDq9Boitb3vOnTtXLpdLGzduVEFBgWbMmBHQl/L999+vRYsWaeXKlRo3blydX7jdbrceffRRZWdnq7i4OKCBGMeNG6eSkhJNmjRJkyZNUklJSVBjdM2ePVtvv/22du7cqbFjx0o6czXMwoULtWfPHs2fP19//vOfPdus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" + } + }, + "cell_type": "markdown", + "id": "3f8481ce-adb3-450a-be4b-31b1b131af12", + "metadata": {}, + "source": [ + "![non-funky_ascii_tree.png](attachment:0d8393a6-fb00-4364-8f2f-319295075948.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d53ada78-86da-4b8d-9d14-cc1337e17999", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABSkAAAOjCAYAAABX9IGXAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzde3zPdf/H8ed3350PmA3LqUZp5bDKxFxEQlwmhxxSlK6wLqG1Ulak4sJVMsqxSFdShssoOaQo2UWh8MvVnMlpCY3NYdn2/v3Rb99fX9/v2LB9bHvcb7fdbrw/78Pr89btlp593p+PzRhjBAAAAAAAAADWWOBhdQUAAAAAAAAAyjZCSgAAAAAAAACWIqQEAAAAAAAAYClPqwsAAKCorF+/XgcPHrS6DOCK1ahRQ9HR0VaXAQAAABQ5QkoAQKk1YcIELVy40OoygCvWrVs3LViwwOoyAAAAgCJHSAkAKNUIeVBSde/e3eoSAAAAgGLDOykBAAAAAAAAWIqQEgAAAAAAAIClCCkBAAAAAAAAWIqQEgAAAAAAAIClCCkBAAAAAAAAWIqQEgAAAAAAAIClCCkBAAAAAAAAWIqQEgAAAAAAAIClCCkBAAAAAAAAWIqQEgAAAAAAAIClCCkBAAAAAAAAWIqQEgAAAAAAAIClCCkBAAAAAAAAWIqQEgCA/5OZmSmbzeb0s379+suOGzp0qNOY0aNHu/TZtGmT+vbtq5tuukm+vr6qUKGCGjVqpNdee03p6elu5w0MDHSpx8PDQ8HBwYqMjNTAgQO1efNml3GHDh1yGWez2bR48WKnfsOHD3fpk5qamu/a48ePv+Q+uBuT38+mTZsc4z788EOna4GBgZfd85Jg2LBhTvfVpEkTq0sCAAAArluElAAA/J/AwEAZY/TDDz842kaNGnXJMSdOnND06dMlSY888oiMMRo+fLhTn4SEBDVp0kTBwcFaunSp0tPTtW/fPo0cOVLJycmqU6eOUlJSXObOzMx01NKpUycZY3ThwgWlpqbqtddeU2pqqqKiovT444/r7NmzjnHVq1eXMUYff/yxJOmFF16QMUadO3d2mn/06NEyxqhFixZ69913ZYxRREREvms/99xzl9wLd2Pc/ZQvX97t+GnTpskYo8zMzEuuU9QyMzN1yy23KCYm5qrmGTdunOOe7Xb7NaoOAAAAKJ0IKQEAcMPPz0833nijli9f7vTU38USExNVo0aNfK+PHj1a48aN05QpU5SYmKh69erJ19dXwcHBiomJUUpKimrWrKn27ds7nmK8FLvdripVqqhTp05avXq1nn/+eb3//vvq1auXjDFXdK9wZoxRbm6ucnNzrS4FAAAAKDMIKQEAcMPDw0PDhg2TJLfHtyUpPT1d06ZN0wsvvOD2+u7du/Xqq6/qrrvuUmxsrNs+/v7+SkxMVEZGhoYMGVLoOseNG6fGjRvrk08+0bx58wo93grp6emKioqyuox8BQUFac+ePVq2bJnVpQAAAABlBiElAAD5ePzxx1WtWjV98skn2rZtm8v1t956S3/9619Vu3Ztt+OnT5+u7Oxsde/e/ZLrNG/eXFWrVtWqVau0d+/eQtVos9k0aNAgSdLUqVMLNba4NWvWTO+//77VZQAAAAC4DhFSAgCQDx8fHw0dOlTGGP3jH/9wupaZmam3335bL774Yr7jv/76a0lSZGTkZdfK6/PNN98Uus5mzZpJkjZs2KALFy4Uevz1avHixU4fnjlw4IB69uypoKAghYSEqE+fPvrtt9+0f/9+dezYUUFBQbrhhhvUv39/ZWRkOM2VnZ2tpKQktWnTRmFhYfLz81P9+vU1adIkp2PdF695/vx5t+379+9Xz549VaFCBYWEhCgmJkZ79uwp1v0BAAAAShNCSgAALmHAgAGqUqWKFi5cqJ9++snRPmXKFLVq1Uq33XZbvmMPHz4sSQoJCbnsOnl9jhw5Uugaw8LCJP0RxB0/frzQ44vCkiVLXL7o7e7jQJfSuXNnGWPUqVMnSVJ8fLyef/55paWlaeLEifrwww/1yCOPKC4uTqNGjdLRo0f1yiuvaObMmRo5cqTTXCtWrNBDDz2kVq1a6aefftLBgwc1YMAAxcfHOx3Xv3jN/Nrj4uIUFxenw4cPKykpSatXr1avXr2uZKsAAAAAiJASAIBL8vPzU3x8vHJzczVmzBhJ0tmzZ5WYmKiXXnqpQHPYbLYCr1eYvnmuxw/muPu691/+8permvOJJ55Qw4YNFRAQoD59+qhu3bpavny54uPjdccddygwMFCxsbEKDw93+z7Jli1bKiEhQcHBwQoNDdXgwYP18MMPa9KkSTp9+nShaunXr5+io6MVEBCg1q1bq0OHDtq4ceN1ExIDAAAAJQ0hJQAAlzFw4ECFhITo448/1u7duzVjxgw1adJEDRo0uOS4qlWrSpJOnDhx2TXy+uSNKYyjR49Kkry8vBQaGupot9vtkqScnJxLjs/JyXH0vZ5d/LGdvL26uL1atWouT6TGxMRozZo1LnNGRkbqwoUL2r59e6FqadSokdPv877wfiVPwgIAAACQPK0uAACA611gYKDi4uI0YsQIjRw5Ul999ZWWLFly2XEtWrTQ5s2btWXLFrVr1+6Sfbdu3Srpj6f9CmvdunWSpOjoaHl5eTnVLemyTwmmp6erXLlyhV63sPLqvFIX1+jh4SG73S5/f3+ndrvd7vSeSUk6deqU3nzzTSUnJ+vQoUNKT093un727NlC1VK+fHmn33t7e0uSy7oAAAAACoYnKQEAKIDBgwerfPny+uijjxQZGeny9J47sbGx8vT01IIFCy7Zb926dTpy5Ig6duyomjVrFqqu3NxcTZkyRZL01FNPOV2rU6eOJF3yKcGsrCzt3r1bt9xyS6HWLWk6duyoUaNGqX///tq5c6dyc3NljFFiYqKk6/PIPAAAAFCWEFICAFAA5cuXV3x8vMqXL6/hw4cXaEydOnU0cuRIff/995oxY4bbPmfPnlVcXJxCQkI0ceLEQteVkJCg7777Tl26dFH37t2drtWuXVsRERHasGGDdu3a5Xb8/PnzValSJdWrV6/Qa0uSp6enUlNTCzUmKipK8+bNu6L1rkROTo5SUlIUFhamIUOGqFKlSo53f547d67Y6gAAAACQP0JKAAAK6OWXX1Z6erqaNm1a4DHDhw9XQkKCnnrqKcXHx2v79u3KyspSenq6li5dqmbNmiktLU0rV65UrVq1Ljtfbm6ujh07piVLlui+++7T66+/rr/97W+aO3eu24/uJCYmysPDQ+3bt9eiRYt08uRJ5eTk6MiRI5o6daoGDRqkCRMmyMOj9P6VwG63q2XLlkpLS9Mbb7yh48eP69y5c1qzZo2mT59udXkAAAAAREgJAICTwMBA3XnnnTpz5oxsNttl3yVps9nUvHlzSXIEhZMnT3bqM2bMGG3YsEEnT55Uhw4dVK5cOdWsWVOvvvqqHnzwQW3fvl0NGzbMtxZJWrJkiWw2mzw9PVWnTh2NGDFCt956qzZv3qxZs2bJz8/PbX3t2rXThg0bFB0drWeffVZVq1aVv7+/GjdurK+++krLly9Xt27dCrS2u58/f5SnoGM2b958yT3Ns2HDBtlsNsf7P/38/DR8+HBt2rRJNptNK1euVE5Ojmw2m8aNG6d169bJZrPp66+/dvz5vfLKK5KkpKQkxcbG6u2331bVqlUVHh6uDz74QA8//LAkqU2bNoqKitLixYtd1uzdu3e+tUh//DPwz3/+U5J05513KiYmpkD3BwAAAOD/8eEcAAD+JDMzs1D9C/ouw6ioKL3//vtFWkt+7rrrLs2ZM6fI175W9eZp0qRJvvtb2PbQ0NB8n5ocO3bsVc3N+ywBAACAq8eTlAAAAAAAAAAsRUgJAACuC3//+99ls9kUGBhodSnXxLBhw9weiwcAAADgipASAABYqnfv3jLGOH6u9bFxq4wbN87pvjZs2GB1SQAAAMB1i5ASAAAAAAAAgKUIKQEAAAAAAABYipASAAAAAAAAgKUIKQEAAAAAAABYipASAAAAAAAAgKUIKQEAAAAAAABYipASAAAAAAAAgKUIKQEAAAAAAABYipASAAAAAAAAgKUIKQEAAAAAAABYipASAAAAAAAAgKUIKQEAAAAAAABYipASAAAAAAAAgKUIKQEAAAAAAABYytPqAgAAKEqHDh3S/PnzrS4DKLRDhw6pevXqVpcBAAAAFAtCSgBAqbZhwwb17NnT6jKAK9KtWzerSwAAAACKhc0YY6wuAgAAlDw9evSQJJ5UBQAAAHC1FvBOSgAAAAAAAACWIqQEAAAAAAAAYClCSgAAAAAAAACWIqQEAAAAAAAAYClCSgAAAAAAAACWIqQEAAAAAAAAYClCSgAAAAAAAACWIqQEAAAAAAAAYClCSgAAAAAAAACWIqQEAAAAAAAAYClCSgAAAAAAAACWIqQEAAAAAAAAYClCSgAAAAAAAACWIqQEAAAAAAAAYClCSgAAAAAAAACWIqQEAAAAAAAAYClCSgAAAAAAAACWIqQEAAAAAAAAYClCSgAAAAAAAACWIqQEAAAAAAAAYClCSgAAAAAAAACWIqQEAAAAAAAAYClCSgAAAAAAAACWIqQEAAAAAAAAYClCSgAAAAAAAACWIqQEAAAAAAAAYClCSgAAAAAAAACWIqQEAAAAAAAAYClCSgAAAAAAAACWIqQEAAAAAAAAYClCSgAAAAAAAACWIqQEAAAAAAAAYClCSgAAAAAAAACW8rS6AAAAcP379ttvtXXrVqe2vXv3SpLeeecdp/YGDRqoSZMmxVYbAAAAgJKPkBIAAFzWsWPHFBsbK7vdLg+PPw5iGGMkSYMGDZIk5ebmKicnR5988olldQIAAAAomWwm778wAAAA8nHhwgWFhobq9OnTl+wXFBSk48ePy9vbu5gqAwAAAFAKLOCdlAAA4LK8vLz00EMPXTJ89PLyUq9evQgoAQAAABQaISUAACiQXr166ffff8/3+oULF/Twww8XY0UAAAAASguOewMAgALJzc1V1apV9csvv7i9XqlSJaWlpTneWQkAAAAABcRxbwAAUDAeHh7q3bu32+Pc3t7eeuyxxwgoAQAAAFwR/ksCAAAUWH5Hvn///Xf16tXLgooAAAAAlAYc9wYAAIVy8803a8+ePU5tN954o/bv329NQQAAAABKOo57AwCAwundu7e8vLwcv/f29tbjjz9uYUUAAAAASjqepAQAAIWye/du3XLLLU5tO3bsUJ06dSyqCAAAAEAJx5OUAACgcG6++WY1aNBANptNNptNDRo0IKAEAAAAcFUIKQEAQKE9+uijstvtstvtevTRR60uBwAAAEAJx3FvAABQaEeOHFGNGjVkjNHPP/+s6tWrW10SAAAAgJJrgafVFQAAUBg2m83qEnCRGjVqWF0C/g//7xkAAAAlFSElAKDEiYuLU3R0tNVllHlffPGFbDab7rvvPqtLKfPWr1+viRMnWl0GAAAAcMUIKQEAJU50dLR69OhhdRllXl44GRISYnElkERICQAAgBKNkBIAAFwRwkkAAAAA1wpf9wYAAAAAAABgKUJKAAAAAAAAAJYipAQAAAAAAABgKUJKAAAAAAAAAJYipAQAAAAAAABgKUJKAAAAAAAAAJYipAQAAAAAAABgKUJKAAAAAAAAAJYipAQAAAAAAABgKUJKAAAAAAAAAJYipAQAAAAAAABgKUJKAAAAAAAAAJYipAQAlGqBgYGy2WwF+pk5c6YOHTrk9trixYud5h0+fLhLn9TUVB0/ftyp7c4779T58+dd6rq4n81mU1RUlNt72Lhxo/r27avw8HD5+fmpYsWKqlevnh588EFNmzZNe/bscfS94447Cny/NptNo0ePznefxo8f77aeTZs2qW/fvrrpppvk6+urChUqqFGjRnrttdeUnp5+2Xu90j358MMPna4FBga6ra+kGTZsmNN9NWnSxOqSAAAAgGJHSAkAKNUyMzP1ww8/SJI6deokY4zbnxYtWkiSqlevLmOMPv74Y0nSCy+8IGOMOnfu7DTv6NGjHePeffddGWMUERGh0NBQGWO0ceNGSdKWLVsUFxfnUlde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Gj16tKQ//mz/3N6tW7crujcAAACgSBkAAFCmZGRkGF9fXzNr1ixH26effmokmTFjxpiTJ0+aX3/91bz11lvGw8PDPPfccy5zdOrUyUgyLVq0MGvWrDFnzpwxGzZsMHa73fz6669m165dpkKFCqZatWrm888/NxkZGebHH380rVu3NpUqVTI+Pj5O8/Xr18+UL1/efP7552DNWwQAACAASURBVObs2bMmLS3NPPfcc0aSWbNmTVFviZPExETHXhRUZGSkKV++vLn33nvNunXrTEZGhtm4caNp0KCB8fb2Nl999ZWj79GjR014eLipUqWK+fTTT82pU6fMjh07TNeuXY3NZjPvvvuuo6+7fdy2bZtp27atuemmm1z28f777zceHh5m9+7dLjVGR0ebuXPnXsGOAAAAAEVuPiElAABlTFJSkrHb7ebYsWOOtk8//dS0bNnSpW/v3r2Nl5eXOXXqlFN7Xki5bNkyt2t0797dSDILFy50aj927Jjx9/d3CdfCw8NN06ZNXeapU6dOsYeUxhQ+qIyMjDSSzPr1653at23bZiSZyMhIR1vfvn2NJPPxxx879T1//rypWrWq8fPzM2lpacaY/Pfx8OHDxsfHx2UfV65caSSZgQMHOrWvW7fOVKtWzfz+++8Fuh8AAACgmM3nuDcAAGVMcnKymjdvrkqVKjnaYmJi3B41joyM1IULF7R9+3a3c919991u21esWCFJuv/++53aK1WqpIiICJf+7dq103/+8x8NGDBAGzZscBzx3rFjh1q2bFmg+7qWruTot6+vrxo3buzUVr9+fVWtWlVbt27V0aNHJf2x/5LUoUMHp74+Pj667777dO7cOa1cuVJS/vtYtWpV1alTx6WGtm3bqn79+nr//fd14sQJR/sbb7yhwYMHy8vLq0D3AgAAABQ3QkoAAMqQrKwsLVu2TF26dHFqP3XqlF5++WXVr19fwcHBjvcXDh06VJJ09uxZt/MFBAS4XSMjI0O+vr4KDAx0uR4cHOzSNmXKFH3wwQfau3ev7rvvPpUrV07t2rVzBHpWKGxQmfdezotVrlxZknTs2DFlZWXp1KlT8vX1VVBQkEvfKlWqSJLS0tIuu49587qr++zZs5o6daokaefOnVq9erUGDBhw2XsAAAAArEJICQBAGfLll18qIyNDnTt3dmrv2LGjRo0apf79+2vnzp3Kzc2VMUaJiYmSJGNMgdfw8fFRUFCQzp8/r8zMTJfrx44dc2mz2Wzq06ePvvjiC6Wnp2vx4sUyxqhr166aMGFCIe/y2ilMUHnq1Cm37Xn3W7lyZfn4+Kh8+fI6f/68MjIyXPr+8ssvkqSwsLDL7uPJkyfdrvfII4+oSpUqmjx5srKysvTmm2/qsccecxsOAwAAANcLQkoAAMqQ5ORkNWzYUDVr1nS05eTkKCUlRWFhYRoyZIgqVarkeCLw3LlzV7RO+/btJf3/ceU8aWlp2rlzp0v/ChUqKDU1VZLk5eWlNm3aOL4k/tlnn11RDddKQYPKzMxMbd261antf/7nf3TkyBFFRkbqhhtukCTHU6wX31dWVpa+/PJL+fn5OY5357ePx48f144dO9zW4ePjo4EDB+rYsWN68803NXfuXD399NOFuGMAAACg+BFSAgBQRuTm5mrp0qUuR73tdrtatmyptLQ0vfHGGzp+/LjOnTunNWvWaPr06Ve01pgxY1SxYkXFxcVp1apVyszM1I8//qjHH39cYWFhbsc8+eST2rZtm7KysnTs2DG9/vrrMsaoVatWV1TDtVSQoDIgIECDBg3St99+qzNnzmjTpk3q3bu3vL29NWnSJEe/sWPHKjw8XHFxcVq6dKkyMjK0c+dOPfzwwzp69KgmTZrkOPbtbh//+9//qnfv3m6PgOcZOHCg/Pz8NHz4cLVu3Vo333zztd0QAAAA4BojpAQAoIxYt26d0tLSXEJKSUpKSlJsbKzefvttVa1aVeHh4frggw/08MMPS5LatGmjqKgobdiwQTabTUuWLJEk+fn5uX0PY+3atbV+/Xo1atRI3bp1U5UqVRQbG6uEhASFh4fLbrc79f/6668VERGhhx56SBUrVtRtt92mFStW6N1339WLL75YBLtReO6CyvHjx8tms2nr1q2qUKGCJkyYoISEBIWFhemee+5RcHCwVq9erRYtWjjmCQsL08aNG9WrVy8NGTJEISEhuvvuu3XmzBl98cUX6t+/v6PvxftYuXJl9e3bV4MHD1b9+vWVlZUlm82mfv36OdUaGhqq3r17yxij+Pj44tkgAAAA4CrYTGFeMgUAAEqsZ555RsuWLcv3mHBxiYiI0Llz53TgwAFL67hSEydO1DPPPKMxY8YoISHB6nLyNXv2bE2ZMkWbNm2yuhQAAADgchZ4Wl0BAAAoHkuWLNFDDz1ULGulpaXp9ttv1y+//CIvLy9H+/79+7Vnzx717t27WOooCnFxcZL+CH0lXbdB5fTp03mKEgAAACUGx70BACgDfvjhB+3bt8/tUe+i8ttvvyk2NlYHDx7U2bNn9d1336lnz54qV66cRowYUWx1FIXCfPW7uMycOVNdunRRZmampk+frt9++009evSwuiwAAACgQHiSEgCAMiA5OVnVqlVTVFRUsawXFhamL774QlOmTNE999yjI0eOKDg4WK1bt9ZHH32kWrVqFUsdRel6fKJy8eLFCg4O1u2336558+bJ05O/6gEAAKBk4J2UAACUAfXq1VOrVq301ltvWV1KqVNS3lEJAAAAXMd4JyUAAKXd7t27tX37dr399ttWl1IqXY9PVAIAAAAlDSElAACl3L///W+FhISoefPmVpdSahFUAgAAAFeHkBIAgFIuOTlZDzzwAO8nLGIElQAAAMCV479WAAAoxY4cOaLvvvtOL730ktWllAkElQAAAMCVIaQEAKAUS05OVkBAgFq3bm11KWUGQSUAAABQeISUAACUYsnJyWrfvr38/PysLqVMIagEAAAACoeQEgCAUio9PV1r167Vv/71L6tLKZMIKgEAAICCI6QEAKCUWrJkiSSpffv2FldSdhFUAgAAAAVDSAkAQCkwc+ZMRUVF6Y477nC0JScnq3Xr1qpQoYKFlYGgEgAAALg8QkoAAEqByZMna+vWrapevbp69uypdu3aadWqVZo4caLVpUEFDyr37Nmj2rVrF1tdAAAAwPXCw+oCAADA1fP29pYkHTp0SG+99ZbatGmj3NxcrV27VitXrtTvv/9ucYWIi4tTYmKiXnzxRY0dO9bl+sSJE9W0aVOdO3fOguoAAAAAaxFSAgBQCvj6+jp+feHCBUnS+fPnNW/ePLVr107BwcHq1auXVqxYYVWJUP5B5cSJExUfH69ff/1VM2fOtLBCAAAAwBoc9wYAoBTw8/Nz256dnS1JOnv2rJKSktS9e/fiLAtuXHz028/Pz/FrSfrHP/6h2NhYx9OxAAAAQFlASAkAQCmQX0iZx9PTUwMHDlTXrl2LqSJcSlxcnHJzczV58mTt27fP6dqvv/6qOXPm6IknnrCoOgAAAKD4cdwbAIBSwM/PTzabze01T09P1atXT6+//noxV4VL8fDwcAkoJckYo9dee83xFCwA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F1u8eLHTRzl27NihHj16KCQkxNF2/PhxSX88Lda5c2eVL19e/v7+uvvuu7V06VK1bt3a0bdfv34aPXq02498rFixwtH+51Dp4hoOHDignj17KigoSCEhIerTp49+++037d+/Xx07dlRQUJBuuOEG9e/fXxkZGS739Ouvv2rIkCG66aab5O3trUqVKqlr167asmVLvmvu379fPXv2VIUKFRQSEqKYmBinD5yMHz9eNptNZ86cUUpKimPcn8OmrKwsvfzyy4qIiJC/v78qVqyojh076pNPPnH6uMvWrVv1yy+/KDIy0qX2vGPE1atXd7lWrVo1SdLOnTtdrt1xxx2SpJUrV7pcK20yMzP1zTff6Mknn5S/v7/j2PfV+PrrryXJ7Z/JxfL6fPPNN462tWvXSpIaNGhw1bVMnjxZAwcO1LJlyxQTE3PV8wEAAKD0IKQEAJQoH330kaKjoxUeHi5J6t27t7y8vPTZZ5/p2LFjTn07d+4sY4w6deokSYqNjdXAgQN18OBBbdiwQXa7XdIfx2Gjo6O1adMmLVy4UMeOHdPs2bM1adIkbdu2TT4+Po4nBIcPHy5jjAICApzWateunYwxatiw4SVriI+P1/PPP6+0tDRNnDhRH374oR555BHFxcVp1KhROnr0qF555RXNnDlTI0eOdJrr6NGjatSokebPn6+pU6fq5MmT+uqrr3Ty5ElFR0dr/fr1bteMi4tTXFycDh8+rKSkJK1evVq9evVyzPvcc8857ukvf/mL4yMufz5ePWjQIL311lt6++23deLECf3000+KiIhQp06dnAKtH3/8UZL7IDLv69EX7530x/swJem3335zuZYXYObNXdosWbLEEQznvZMyKytLc+bMUdeuXa96/sOHD0uSQkJCLts3r8+RI0ccbXm/Lsj4S/nyyy81ePBg9e7dW3ffffdVzQUAAIDSh5ASAFCizJ492/H0pCSFhoYqJiZG2dnZmjNnziXHvvDCC2rZsqX8/f3VuHFjZWdnKzQ0VC+++KLS09M1adIktWnTRoGBgapbt64++ugjnTlz5prW/8QTT6hhw4YKCAhQnz59VLduXS1fvlzx8fG64447FBgYqNjYWIWHh7scYU9ISNCBAwc0YcIE/fWvf3XUOW/ePBljNHjwYLdr9uvXT9HR0QoICFDr1q3VoUMHbdy40fEUaUF8+eWXqlu3rtq0aSM/Pz9VqVJFb7zxhurUqePU7+jRo5Kk8uXLF2pfjDGSJJvN5nKtXLlystlsjrlLmz9/3fvChQvau3evHnroIXXr1k0PPvjgNflwjuR+bwvTtzDj3alWrZrKlSunN998U+PHj7+quQAAAFD6EFICAEqMbdu2adeuXXrwwQed2vNCy8t95Tu/p7dWrFghSbr//vud2itVqqSIiIgrLdeti9/HmPfexovbq1Wr5vQ0m/THMW4PDw+XY7JhYWGqW7euNm/erEOHDrms2ahRI6ff16hRQ5Jc5r+Udu3a6T//+Y8GDBigDRs2OI5479ixQy1btnT0O3/+vCTJy8vLZY4KFSpIktvgN68tr8/FPD09de7cuQLXW1J5enoqPDxcr7zyih5++GEtWrRIb7311lXNmffP2IkTJy7bN6/Pn98nmvfrwoTa7kRERGjFihUKCgrS0KFDNWHChKuaDwAAAKULISUAoMR47733lJGRoYCAAKd3Lj7wwAOSpO3bt+u7777Ld7y7Y8ZZWVnKyMiQr6+v48jxnwUHB1+7G9AfTwX+mYeHh+x2u/z9/Z3a7Xa7cnNzneo8deqUcnNzVb58eaf7t9ls+v777yVJu3btclnz4qcavb29Jclp/suZMmWKPvjgA+3du1f33XefypUrp3bt2ik5Odmpn6+vryS5ffovL/B1F6TmHUm++MnMPNnZ2U5fBC8L7rnnHknuPyZUGC1atJAkp/eW5mfr1q2S5BQ8543ftm3bVdUh/fFxneXLlyswMFDPPvusJk6ceNVzAgAAoHQgpAQAlAgXLlzQ3LlzlZKS4jga++efuLg4SZd/mvJiPj4+CgoK0vnz55WZmely/eL3XObx8PDQ77//7tKe997Fa83Hx0cVKlSQp6enLly44HYPjDG69957r3iNSx3ntdls6tOnj7744gulp6dr8eLFMsaoa9euTk/E3XDDDZKkU6dOucyRV9vmzZtdruW13XfffS7XTp8+LWOMY+6yIu8I/NmzZ69qntjYWHl6emrBggWX7Ldu3TodOXJEHTt2VM2aNV3GL1y48JLjn3/+eXl4eDg+kJSfv/zlL1q2bJkCAgL0zDPP6O233y74zQAAAKDUIqQEAJQIn376qUJDQ9W0aVO315944glJ0scff1zoY8Ht27eX9P/HvvOkpaW5/dq09EcYl/f035/7//zzz4VauzC6du2q7OxspaSkuFz75z//qZo1azp97Kaw/P39nYLXW2+9Ve+8846kP45h54VPXl5eatOmjeMr4p999pljTL169SS5f1qyRYsWuv3227Vw4ULHsXBJysnJ0bx581SjRg116NDBZVzePufNXVbkfZDo4uP6BeHp6en486pTp45Gjhyp77//XjNmzHDb/+zZs4qLi1NISIjL04154zdt2qT33nvP7fgdO3ZoxowZ6tGjR4FekdC8eXN99tln8vf315AhQzRlypRC3iEAAABKG0JKAECJMHv2bP3tb3/L93q9evV0991369SpU1q0aFGh5h4zZowqVqyouLg4rVq1SpmZmfrxxx/1+OOPKywszO2Ytm3b6siRI5o8ebIyMzO1Z88ePf3006pcuXKh1i6MsWPHqnbt2vrb3/6m5cuX69SpUzp58qRmzJih1157TePHj5enp+cVz3/XXXdp586dOnjwoNavX6+9e/eqefPmjutPPvmktm3bpqysLB07dkyvv/66jDFq1aqVo09kZKQqV67sODb8Zx4eHpo1a5ZOnjypxx9/XGlpaTpx4oSeeuop7dq1S++++67juPif5R1Tbtu27RXfW0mRnZ2t/fv365VXXtFHH32katWqKT4+/qrnHT58uBISEvTUU08pPj5e27dvV1ZWltLT07V06VI1a9ZMaWlpWrlypWrVquV2/LBhw/Tkk09q2LBh2rlzp37//XcdPnxYs2bN0r333qsGDRpo1qxZBa6pRYsWWrp0qfz8/DRo0CBNnTr1qu8TAAAAJZgBAMACkkxSUtJl+x08eNBIcvw0btzYpc++ffuc+kgyVapUMevXr3dpz+9ffTt27DCdO3c25cqVM/7+/qZp06bm66+/Ni1btjT+/v4u/dPT002/fv3MDTfcYPz8/EyzZs3Mxo0bTcOGDR3rvPDCC25reOmll8zGjRtd2seOHWu++eYbl/aRI0c61j1x4oSJj483tWrVMl5eXqZSpUqmbdu2ZtWqVY4++a2Zt+9//unQoYNjXGpqqmnevLkJCAgwNWrUMFOmTHFc27Jli4mNjTW33Xab8ff3NxUrVjRNmjQx7777rsnNzXXamxdffNF4enqaw4cPu93r77//3rRv396UK1fOBAYGmlat/pe9O4+rss7///88cNhk01xRScUdFATcwa2cHNNqaiRrNFvna01NmqXZx3a1zSbD9pm2SVvUppqxslIzDQNFREwFNc1RBxR3cQOB9+8Pf+fkEZTFAxfL4367nRtyneu63q/3OYeX1/U61/V+X2GSkpJKXdcYYxISEkyrVq1MQUHBBde5kPnz51/wPXeXUaNGmVGjRlVoG39//1I/mzabzQQGBpqoqCgzZcoUs2/fvnJtV9ojMzOzRLupqanm1ltvNW3atDHe3t4mMDDQ9OzZ08yYMcMcOXKkzLjXrFljbrnlFhMaGmq8vLxMYGCg6du3r0lMTDT5+fnl6uesWbNc1lm6dKnx8/NzPj99+vRyv47lzSMAAACo8RbYjPn/BzwCAKAa2Ww2zZ8/XzfeeKPVoVxUly5ddOrUKf33v/+1OpRa4+jRo4qIiNDIkSP15ptvXtK+MjIyFB0drY8++kg33XRThbdfsGCBRo8erao83ElISJCkMsd8hPvVljwCAACAMi3kdm8AQL23d+9eXXbZZSVmpN65c6e2b9/ucjszyhYcHKxFixbp008/vaSxBnfs2KEbbrhBjzzySKUKlAAAAABqD4qUAABIOnz4sMaPH6/du3fr5MmTWrNmjUaPHq2goCA99thjVodX60RHR2vt2rVavHixjh07Vql9vPXWW5o5c6Zmzpzp5ugAAAAA1DQUKQEA9V6LFi20dOlSHTlyRAMHDlSjRo107bXXqmPHjlqzZk2pE4mgbG3bttWXX36poKCgSm3//PPPcwUlAAAAUE9UfgpQAADqkCuvvFJXXnml1WEAqKB3331Xx44dU0xMjLp37y4vLy+rQwIAAEAlUKQEAABArfXrr79qwoQJOnnypLy9vdW9e3fFxMQoJiZGsbGx6t69u3x9fa0OEwAAAGWgSAkAAIBaa/r06frjH/+o//73v9q0aZPS0tKUlpamRx99VAcPHpTdblenTp0UGxvrfERHR8vf39/q0AEAAHAOipQAAACo1Tw9PRUWFqawsDBdc801zuXZ2dnOomVaWppmzpyp/fv3y9PTU507d1ZERITCw8MVGxuruLg4XXbZZRb2AgAAoH6jSAkAAIA6qWXLlmrZsuVFC5dvvvmm9u3bJ0kKCQlxueKyX79+atKkiVXhAwAA1CsUKQEAAFBvlFa43LVrl9LS0rRu3TqtW7dOb731lvbu3Subzab27dsrNjZWPXv2dBYvKztjPQAAAC6MIiUAAADqtcsvv1yXX365rr/+euey7OxsrVu3znnF5UsvvaScnBzZbDZ16tTJWbTs2bOnoqOjFRAQYGEPAAAAaj+KlAAAAMB5HFdcjhw50rns/FvFn3/+eeet4mFhYYqLi3NebRkTE6MGDRpYFT4AAECtQ5ESAAAAKIfyjHH5zDPPKDc31zk5z7ljXMbGxsrPz8/CHgAAANRcFCkBAACASipP4XLGjBk6cOCA7Ha7OnXq5FK07Nmzp3x9fS3sAQAAQM1AkRIAAKASDh48qEWLFmnr1q3q1KmT1eGgBilP4fLpp5/WoUOH5OXlpY4dO7oULnv16iUfHx8LewAAAFD9KFICAACU065du/TvCjUU+AAAIABJREFUf/9bn3/+uVauXCkvLy81bdrU6rBQC5xfuCwuLtaWLVu0du1arV27VmlpafrXv/6lkydPys/PT9HR0erVq5d69eql3r17q0OHDrLZbBb3AgAAoOpQpAQAALiAoqIipaamavHixfrqq6+0bt06BQUF6eqrr9bHH3+s3//+97rjjjusDhO1kIeHh7p27aquXbvqlltukXT287Z582alpaUpNTVVq1at0uuvv64zZ86oUaNGzoKlo3gZEhJicS8AAADchyIlAADAOfbv369vv/1Wixcv1rfffquDBw+qTZs2Gj58uGbOnKkhQ4bI29vb6jBRB3l6eqp79+7q3r27brvtNklSYWGhtmzZorS0NK1atUqfffaZnnnmGRUXFyskJMTlNvH+/furcePG1nYCAACgkmzGGGN1EACA+ofbFlGdLna4c+zYMa1cuVLLly/X8uXLlZGRIbvdrvj4eA0fPlxXX321wsPDL7h9QkKCPv3006oIG+Uwf/583XjjjVaHUa3y8vKUkZHhMsbl5s2bJUkhISGKj49XXFwcM4oDAIDaZCFFSgCAJRYsWGB1CKhHzi1inTx5UklJSc6iZFpamoqKihQREaErrrjC+QgMDCzXvpOTk7V7926XZUVFRVqyZIkWLFggb29v3XXXXerZs6db+1QffPDBB/rmm28UGhqq22+/XV26dCmxTv/+/dW6dWsLoqtZcnJynGNbpqWlKSUlpdQZxePj4xUdHS0PDw+rQwYAADgXRUoAAFC3HT9+XKtXr9bKlSv1/fffa82aNSooKFDnzp01ZMgQDRkyRIMHD1azZs3c0t7y5cs1YcIEZWVl6Z577tH06dMVFBTkln3XR1u2bNGkSZP09ddfa+TIkXrllVfUtm1bq8OqFRwziq9atUpJSUlat26dTp06pYCAAEVFRbncKh4REWF1uAAAoH6jSAkAAOqWffv2KSkpSUlJSVq1apXS09NVWFiosLAwDR48WEOGDNEVV1yhli1burXd3bt3a9q0aZo7d66GDh2qxMTEi94mjopZtGiRHnjgAeXk5Gjy5Ml6+OGHuY25gs6cOaMNGzZozZo1Sk1N1Zo1a5SVlaWioiKFhIS4zCbeq1cvNWrUyOqQAQBA/UGREgAA1G47duxwFiSTkpKUmZkpDw8Pde7c2Tk238CBA6vs6ruTJ0/qhRde0PPPP6/Q0FDNnj1bI0aMqJK26rszZ87o9ddf1+OPP66goCDNnDlT48aNszqsWu348eNav369y/iWmZmZMsaUGN+yV69e8vHxsTpkAABQN1GkBAAAtceJEye0du1apaSkKCUlRT/99JNyc3PVoEED9e7dWwMGDFBcXJz69etXLbdYL1q0SH/961918OBBPfjgg3rkkUco4lSD7OxsPfXUU3r77bc1cOBAJSYmKjIy0uqw6ox9+/ZpzZo1Wr16tVJSUpSamqpjx46pQYMGio2NVZ8+fdSvXz/16dNHrVq1sjpcAABQN1CkBAAANZMxRlu2bHEWSpKTk7Vp0yYVFhaqVatW6tOnj+Li4tS/f3/FxsbKy8ur2mJLT0/XhAkTlJSUpLFjx2rWrFlq3rx5tbWPs1JTUzVhwgStXr1aY8aM0d/+9jc1bdrU6rDqJMcVy44xLtevX++8TfzcSXn69++vBg0aWB0uAACofShSAgCAmiEvL08ZGRnO27YdsxN7eXkpMjLSecuplZN8HDx4UE8//bRee+01xcTEaM6cOerbt68lseAsY4zmzp2rKVOmqKCgQE888YTuvfde2e12q0Or0869TXzVqlVauXKl9u3b5zKbuONW8a5duzKbOAAAKAtFSgAAUP1OnTql9PR0paamOh/btm2TMUbt27dX37591adPH/Xp00fR0dHVepVkaRxjIT7xxBPy9/fXs88+q1tuuUU2m83SuPCbEydOaNasWXruuefUrl07vfzyyxo2bJjVYdUr588mnpaWptOnTysoKEjdu3d3Fi379eunJk2aWB0uAACoWShSAgCAqlVYWKiNGze6FCQ3btyowsJCNW7cWL169VLP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QVaHCwBATUGREgCAshw+fFgbN27Upk2btGHDBm3evFk///yzDh06JElq3ry5unfvroiICOfs2hERERTKqtiWLVs0adIkff311xo5cqReeeUVxoRDtVm+fLkmTJigrKws3XPPPZo+fToFJ1zQ+eNabt68WXa7XVFRUYqLi1N8fLyGDBmiJk2aWB0qAABWoUgJAIBDQUGBtm3b5jKJzebNm/Xrr7/KGOMykY3jdu2ePXsqJCTE6tDrlSNHjui5557T7NmzFRERocTERA0YMMDqsFAPFRYW6t1339W0adPk5eWlJ598UnfddZc8PDysDg01XE5OjpKSkpyFy/T0dBUXFyssLMxZtPzd736ndu3aWR0qAADVhSIlAKD+KSws1K5du1wKkZs2bdKWLVtUVFQkb29vdejQwWXcyIiICLVr146JbCxUXFysefPmafLkySosLNTjjz+u++67T56enlaHhnru0KFDeuqpp/Taa6+pR48emjNnjvr37291WKhF8vLytHr1amfR8scff1R+fr5CQkKct4fHx8crOjqaIjgAoK6iSAkAqNuys7NLXBm5adMmnT59Wna7XZdffrnLlZGxsbHq0qULha8aZs2aNbr//vuVlpamO+64QzNnzuS2SNQ4mZmZmjhxopYsWaJRo0bpb3/7m0JDQ60OC7XQyZMntW7dOuft4UlJSTpy5IiCgoLUu3dvZ9FywIABzDQPAKgrKFICAOqGw4cPlyhEZmRk6Pjx45KkkJCQEldGhoeHM25kDfe///1PjzzyiObNm6chQ4YoMTFR3bp1szos4KIWLVqk+++/X/v379dDDz2kRx55hEISLklRUZGysrKcRcsffvhBu3fvVoMGDRQdHe282nLAgAFq2LCh1eECAFAZFCkBALXLvn37tGnTJmVmZjons9m4caMOHz4sSWrZsqVzAhvHz/DwcPn7+1scOSri1KlTmjNnjmbOnKlmzZrp2WefVUJCgtVhAeXm+AzPmDFDLVq00DPPPMNnGG6VlZWlpKQk/fjjj0pKStKOHTtkt9sVGxurwYMHa9CgQYqPj1dgYKDVoQIAUB4UKQEANVNOTo42b97svCoyMzNTmzZt0sGDByVJl112mbp166bw8HBFRkYqIiJC3bp102WXXWZx5LhUixYt0oQJE7Rv3z5NnjxZU6dOla+vr9VhAZWyZ88e/d///Z/mzZunK664QomJiYqIiLA6LNRB2dnZWrlypVauXKkffvhBmZmZFC0BALUJRUoAgLUct2k7ipGbN2/Wzz//rH379kmSGjVqpLCwMJdxIyMiIhQWFmZx5HC3rKwsTZw4Ud99951GjRqlF198UZdffrnVYQFusWLFCk2YMEGbN2/WPffco6efflrBwcFWh4U6LDc3V6tXr9aqVau0dOlSrVu3Th4eHurRo4fLDOLcHg4AqCEoUgIAqkdpxcgNGzYoNzdX0tli5LkFSIqR9cfhw4f15JNP6vXXX1dkZKQSExMVHx9vdViA2507Q31RUZEee+wxZqhHtaFoCQCo4ShSAgDcq7RiZEZGhvbv3y/JtRjp+BkREaGQkBCLI0d1cxRsHnroIRUXF1OwQb1BYR41AUVLAEANQ5ESAFA52dnZLoXITZs2acOGDcrLy5NUejGyW7duatGihcWRoyb44YcfNGHCBGVmZnLrK+qtLVu2aOLEifrmm280cuRIvfrqq2rTpo3VYaGeKk/RcujQoWrUqJHVoQIA6iaKlACACysuLtbOnTudk9ac+/P48eOSpFatWrkUIx0PTmJQmnMnEbnyyiv18ssvM4kI6r1FixZp4sSJ2rt3L5NFocagaAkAqGYUKQEA0pkzZ7R7927nVZE7duzQpk2btH79ep04cUJS6VdGRkZGqlmzZhZHj9rg5MmTeuWVVzRjxgyFhIRo5syZSkhIsDosoMYoKCjQG2+8occee0wNGzbUjBkzNG7cOKvDApwoWgIAqhhFSgCoT/Ly8pSVlaXMzExlZmYqKytLmzZt0q+//qrCwkJ5enqqXbt2Cg8PV9euXdWlSxeFh4erS5cuCgoKsjp81FKLFi3S/fffr/379+uhhx7SI488Ih8fH6vDAmqk7OxsTZ06VfPmzdPgwYOVmJio7t27Wx0WUML+/fuVkpJC0RIA4C4UKQGgLjp8+LDzashzx43cuXOniouL5eXlpdDQ0BJXRnbt2lUNGjSwOnzUAl999ZUyMzP10EMPXXCd9evXa8KECfrxxx81duxYvfDCC4xJCpTTmjVrNGHCBK1du1Z33HGHZs6cqSZNmpS6bnFxsUaPHq1XX31VzZs3r+ZIgbNyc3O1YsUKrVixQj/88IM2b94sT09PxcTEaNCgQRo8eLAGDBigwMBAq0MFANRMFCkBoDZzTF5zbkFy48aN2rt3ryQpODhYHTp0UFhYmEtBskuXLsygjEpbu3at4uPj5eHhoe3bt5eYmf3QoUN66qmn9Nprryk6OlqJiYnq37+/RdECtVdxcbHmzZunKVOm6MyZM3r88cd13333lcjf77zzju666y7FxMQoKSlJfn5+FkUM/OZiV1oOHTpUQ4cOVXx8POOvAgAcKFICQE1XWFioXbt2lRgvMiMjwzl5zbnjRZ5bkGzXrp1sNpvFPUBdsnv3bsXGxurw4cOy2WwaPXq05s6dK+nsZ/Xdd9/VtGnT5OXlpSeffFJ33XWXPDw8LI4aqN2OHDmi5557TrNnz1Z4eLgSExM1cOBASdLRo0cVFhamw4cPy9PTU9dcc40+/fRT/u5Q4+Tm5uqHH37Q999/r++//17btm2Tn5+f+vfvryuvvFJXXHGFevbsyZeoAFB/UaQEgJri+PHjysrKUlZWljZv3uz8uWPHDp05c0YeHh5q27atyziRjp+M94TqkJeXp759+2rbtm06c+aMJMlms2nlypUqKCjQxIkTlZWVpXvuuUfTp09nHFPAzbZu3aoHHnhAX3/9tUaOHKlXXnlFr7zyiubMmaPCwkJJkoeHhyZPnqznnnvO4miBi9u7d69+/PFHLV26VN9884127dolf39/9evXz3mlZUxMDF+2AkD9QZESQP1TUFAgb29vy9o/fPhwiasiLzZepOPKyOjoaPn7+1sWN+q3oqIiXXvttfruu++cxRBJstvtatmypXbt2qVrrrlGL730kjp06GBhpEDd95///EeTJk1STk6OCgoKXP4mHd544w3dfffdFkQHVM6OHTu0dOlSLV26VMuWLdOhQ4fUtGlTDR48WEOHDlVcXJwiIiKsDhMAUHUoUgKoP06dOqVXXnlFH374oTIyMqq0rYKCAm3btk1ZWVnasmWLcybtLVu2KC8vT9LZW7Q7d+6srl27qnPnzurcubPCw8MVFhYmu91epfEBFXXffffpzTffVFFRUYnnPDw8NGnSJM2aNcuCyID6KT8/X/3799fPP//svLL5XJ6envrmm280dOhQC6IDLk1xcbEyMzOd41l+++23OnbsmEJCQpyzhg8fPlyhoaFWhwoAcB+KlADqPsc4eY8//rhyc3Mlnb1t1R1XJTpm0T5/Ju2tW7c6r2wJCQkpMVZkWFgY40Wi1khMTNTEiRMv+LzNZlOjRo20Y8cOBQcHV2NkQP315Zdf6pprrrng8x4eHvL19dXq1avVrVu3aowMcL+CggIlJyfr+++/17Jly7RmzRqdOXNG3bp10+9+9zsNHTpUgwYNuuRju927d8vHx0fNmjVzU+QAgAqgSAmg7jLG6Msvv9SUKVO0detWGWPkSHnr1q1TdHR0ufdV2izajuKkJHl7e6tDhw4lipFdunThFm3UaosXL9bIkSNVXFx80fXsdrseeOABvfDCC9UUGVB/FRQUqEuXLtq1a1epVzc72O12NW/eXGlpaWrevHk1RghUrePHj2vlypVatmyZlixZoo0bN8rLy0v9+vVzFi0rMwnP888/r1mzZumdd97RddddV0XRAwAugCIlgLpp6dKlmjx5stavXy8PDw+XAouHh4c+/PBD3XTTTS7b5Ofn65dffilRjMzMzNTJkyclnb1F+9wipONn27ZtmUkVdU56erri4uKUn59fZpFSOlsQ2bx5szp27FgN0QH116xZszRlypRyrevl5aWoqCj9+OOP8vX1reLIAGvk5uZqxYoVLpPwBAQEqG/fvs5JeGJjY8vcz6BBg/Tjjz/KGKPbbrtNiYmJTAIHANWHIiWAuiU1NVVTpkzRDz/8ILvdXupkAt7e3rrpppvUp08fl7Eid+/eLensCV379u2dY0V26dLF+W9uZUV98b///U8xMTE6dOhQqX9H0tmCv91uV0FBgSSpadOmmjJlih566KHqDBWoVwoLCzVixAitXLlSp0+fLvF3WBq73a7rr79e8+fPZ5gR1AvnTsLz3Xff6ejRo87xLEeOHKkRI0aocePGLtucOHFCjRo1co7x6uXlpaZNm+rDDz/U4MGDLegFANQ7FCkB1A1btmzRtGnT9Nlnn8lut5c6iYCDh4eHbDabAgMD1b59+xJjRUZERHC1Ceq148ePq1+/ftq8ebPzCkpPT0/ZbDZnwbJly5bq06ePevbsqejoaEVHR6tFixZWhg3UK0VFRdq2bZvS09O1bt06paamKj09XceOHZPNZpOvr2+Jq6CnTZumGTNmWBg1UP2Kioq0fv16Z9FyxYoVKioqUnR0tPMqy/j4eC1btkwjR4502dbT01PFxcW67777NGvWLPn4+FjUCwCoF0oWKZOTk/XSSy9ZFRAAVMipU6fUokULvf/++/L09LzolSTn6tKlizIzM8tc76WXXlJycvKlhgnUGsYY/fTTT8rJyZF0dlIcf39/XXbZZWrUqJEaNmyohg0bysvLy+JIcTELFy6ssn2TF2u2kydP6siRIzpy5IgOHTqkw4cPKz8/3/l8z5491bZtW+sCBKpZv379NGnSJOfvR44c0fLly7VkyRItWbJEv/zyixo0aKCmTZsqJyen1GNJu92usLAwffLJJy5jmpMPa7dJkyapX79+VocB4DcL7ecv2b17tz799FONGjXKioAAoFyKi4u1Zs0a7dmzR9LZQkp5xsxz2Llzp4wxZd72lpycrJSUFPXt2/eS4gVqi927d8vPz08xMTFq2LChgoODKzzxAKyzZ88epaSkVGkb5MWarUGDBmrQoIFatmzpXJafn68jR47o8OHDys3NVZMmTRQQEGBhlED1KC0fNmzYUNdff72uv/56SWePCZcsWaLJkydf8MvuwsJC7dixQ7169dKjjz6qxx57TJ6enuTDWuzTTz9VQkICRUqghilRpHSoym/gAcAd5s+fr5tuukkLFizQ+vXrtX79eqWlpWnfvn2Szo49aYwp9dbv06dPa/fu3br88svLbKdv377kRAC1woIFCzR69Ogqb4e8CKA2SEhIKHOdtm3b6qqrrtL/+3//76LrOYY7mT59ur7++mt99NFHksiHtRXj8wI10wWLlABQ0zkOLhISElwOQg8cOKD169crIyNDGRkZSk1N1bZt21RUVCRPT0/Z7Xbl5+dry5Yt5SpSAgAAoO769ttv5enpqaKiojLXLS4u1vr16xUZGamuXbsqLCysGiIEgPqBIiWAOqdJkybOgdAdCgoKtHHjRmVkZGj9+vVKT09Xdna2hVECAACgJvjmm2/KtZ6Xl5c8PDxkjNGpU6e0bt067d27V7m5uWrWrFkVRwkAdR9FSgD1gre3t2JiYhQTE2N1KAAAAKghioqK9P3335e4itLf31/BwcFq1KiRGjdurObNm6tRo0Zq1KiRczK5d999V97e3jpx4oRF0QNA3UKREgAAAABQL50+fVrz588vUYD08PAoc9vvvvtOktSuXbuqDhMA6gWKlAAAAACAesnf31/Dhg2zOgwAgKSyvx4CAAAAAAAAgCpEkRIAAAAAAACApShSAgAAAAAAALAURUoAAAAAAAAAlqJICQAAAAAAAMBSFCkBAAAAAAAAWIoiJQAAAAAAAABLUaQEAAAAAAAAYKlLKlKuX79eNpvN5dGhQ4cS6x05cqTEejXJiy++6IyrdevWbl//QgICAkq8Lh4eHmrUqJGioqL0l7/8RWlpaZXef0W5q1/1wbx581zet4CAgGppt7TPzIsvvlhl7RljtGrVKt17773q1KmTfHx81KxZM8XHx2vevHkyxrisf/jwYb355pu64oordNlll8nPz08dO3bUmDFjlJGRUWL/U6dOdelL3759q6wv1YGcSE6sry6UE6vjNSQv1mzkRfJifcWxIjnxQkp7jxwPX19fRUZG6rXXXivx2l1su/Mfa9eulST16NGj3NvYbDbNmDFDe/bsKfW5L774wiWeRx99tMQ6WVlZle7jgQMHXNaLjo7W6dOnS7x+569ns9nUs2dPd79NAKxizjN//nxTyuKLuvPOO40kM23atIuud+2115rnn3++Qvsuj7y8PNOhQwczYsSIS9pPVFSUadWqVZWtX5r09HQjyVx33XX+PmkcAAAgAElEQVTGGGMKCwvN3r17zRdffGGGDBliJJnbbrvNnDhx4pLaqQh39Ks6uev9r4i5c+caSeaNN96otjYdzv/MVKXMzEwjyQwdOtRkZGSYU6dOme3bt5ubb77ZSDIPPvigy/p33nmnsdvt5uWXXzY5OTnmxIkTZuXKlSY8PNx4enqazz///IJteXp6mj59+lQovsrkq4oaNWqUGTVqVIW2ISdWHjnx0tXEnFjVryF58TfkxdKRF92LvFg2jhVrRk6sTL6qjv2X9h7l5+eb9PR0ExcXZySZyZMnl2u78wUHB5vU1FRjzNm/1YULF7o8P378eCPJLF682GX56NGjzfTp052/f/zxx0aSefjhhy/al0GDBpl//OMfbutjamqqkWQkmfHjx1+w3eTkZNO4ceOLxnYxksz8+fMrvT2AKrHALbd733777ZKkDz74QMXFxaWuk5ubq++++0633HKLO5p0YYxRcXHxBduuTTw9PdW8eXNdd911+v777zVlyhS9//77uvnmm0t8m1afBAQEKD4+vtTn6tL7b4WLvbaSZLfbtWDBAkVGRsrX11dhYWF6//331bhxY7366qvKz893Wf+OO+7QhAkT1KJFCzVo0EADBgzQRx99pKKiIk2ZMqWqu1MjkBPdh5xYOnJi1SIvuh950X3Ii6UjL1YdcmL18Pb2Vo8ePfTxxx/Lw8NDs2fP1qFDh6wOy63K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uHTpkp544gmNHz9eY8aM0f79+zV06FCrYwFoIMMwlJGRofLycqujALgCRUoAAAAAqMHu3bvVt29frVixQmvWrFFycrLatWtndSwA1yEmJkYFBQXas2eP1VEAXIEiJQAAAABcpaysTPPmzdPw4cN18803Ky8vT7GxsVbHAtAIevfure7duzPlG3AyFCkBAAAA4ApffvmlIiIilJSUpLlz5+qjjz5SQECA1bEANKLo6GiKlICToUgJAAAAAP8vLS1NISEhOnPmjHJycjR79my5ufFrE9DSGIahffv26dixY1ZHAfD/+L8tAAAAgFavsLBQU6dOVXx8vOLi4rR7927169fP6lgAmkh4eLh8fX21fv16q6MA+H8UKQEAAAC0ajk5Oerfv782bdqkdevWafHixfL29rY6FoAmZLfbNXLkSKZ8A06EIiUAAACAVqm0tFRJSUkaMWKE+vTpo88++0xjxoyxOhaAZmIYhrZu3apz585Jkv79739r06ZNevzxx/X9999bnA5ofWymaZpWhwAAAACA5pSfn68pU6bo4MGDevHFF/XEE09YHQlXGTlypHbt2qUrf2UtKiqSp6dnpeeE2u127du3T4GBgVbEhAs7e/asunTpokcffVRff/21PvzwQ128eFHS5UdAtG/f3uKEQKuS5mF1AgAAAABoLJcuXVJ+fr5CQkJq3Cc5OVmPPfaYevbsqby8PPXo0aMZE6KufvGLX2jz5s1VtpeWljr+22azqX///hQoUS+HDx9WRkaG1qxZo7KyMi1cuFBubm6V+paPj4+FCYHWieneAAAAAFqMZ555RjExMSosLKzy3unTpxUbG6sHH3xQDz/8sHbs2EGB0olNmjSp1pXV3d3ddf/99zdTIri6rKws/fSnP1VQUJCee+455eTkyDRNlZeXVypQenp6yt3d3cKkQOtEkRIAAABAi7Bhwwa99dZb+vrrr/Xoo49Wem/Tpk3q16+f8vLytHXrVi1YsECenp4WJUVd/Nd//ZeGDRt2zUJleXm5Jk6c2Iyp4MpGjBghNzc3ubu7q6SkRDU9/a5t27bNnAyARJESAAAAQAtw+vRp3XfffbLZbCovL9fKlSu1YsUKFRUVKTExUZGRkRo2bJjy8vJ0++23Wx0XdTR16tQa33N3d1d4eLi6dOnSjIngynx8fLRmzZpa75L09vZupkQArkSREgAAAIBLM01TDzzwgH788UeVl5dLuvyswmnTpqlv3756++23tXz5cqWmpqpjx44Wp0V9TJgw4ZoFpWsVMYHq9OrVS/Pnz5fNZqtxH4qUgDUoUgIAAABwaQsXLtSHH36okpISxzbTNFVaWqozZ85o7969uueeeyxMiIbq2LGjRo4cWW2h0s3NTWPHjrUgFVzdrFmzFB0dLbvdXu37LJoDWIMiJQAAAACXdfDgQT311FPVPluupKREhYWFWrVqlQXJ0FimTJniuEO2goeHh6KiouTr62tRKrgym82mP//5z/L396+2AH7DDTdYkAoARUoAAAAALqm4uFgTJ06sUsC6UllZmX7zm99o165dzZgMjSk2NlZt2rSptK28vFxTpkyxKBFago4dO+ovf/lLtX/goEgJWIMiJQAAAACX9Oyzz+rw4cMqLS295n6maWrSpEm6cOFCMyVDY/L29tb//M//VJqa27ZtW40ZM8bCVGgJbr/9dj377LNV7qZs3769RYmA1o0iJQAAAACXs2nTJr322mvXLFDabDbZ7XaVl5fr/PnzysrKasaEaEyTJ092PHPUbrdrwoQJ8vLysjgVWoKkpCQNGTLEUQR3d3fnmZSARTysDgAAAAAA9fH999/rvvvuk5ubm8rKyiq9Z7fbVVZWJtM01bt3b/3iF79QdHS0hg4dKjc37tFwVaNHj1b79u31448/qqSkRJMnT7Y6EloId3d3rVy5Ur169dK5c+fk5uZGkRKwCEVKAAAAAC7l/vvv1+nTpx0FSrvdrpKSEnXo0EFRUVGKjo7WqFGj5OfnZ3FSNBa73a577rlHixcvlq+vr+666y6rI6EF6datm5YuXarx48fLNE2KlIBFKFICAAAADXDixAnt3LnT6hitzpYtW5SZmSnp8nTum2++WaGhoerXr59uvfVW2Ww2x36NKTAwUEOGDGnUc9ZHamqqZW07i65du0qSBg0apNWrV1ucxnpDhw5Vt27dLGm7pY5/I0eO1KZNm/Svf/2L77krWD3+ofWwmdUtZQUAAADgmlJTUxUfH291DDSTCRMmKC0tzbL2K4qvQIVVq1Zp4sSJlrTN+Ne6WD3+odVI405KAAAA4DrwN//mc+rUKfn5+VVZibepxcXFNWt7NbGyKOUs3njjDc2cObPVF22d5fpb4vh34MAB/eMf/9B9991ndRSn4CzjH1oHipQAAAAAXELnzp2tjgCLUaBEUwsODtZtt91mdQygVWJ5OwAAAACAS6BAiebg4cH9XIAVKFICAAAAAAAAsBRFSgAAAAAAAACWokgJAAAAAAAAwFIUKQEAAAAAAABYiiIlAAAAAAAAAEtRpAQAAAAAAABgKYqUAAAAAAAAACxFkRIAAAAAAACApShSAgAAAAAAALAURUoAAAAAAAAAlqJICQAAAAAAAMBSFCkBAACAZtKuXTvZbLZqX97e3urbt69effVVlZWV1XrcK6+8Ikk6c+ZMpe0hISEqKiqq0vbV+9lsNg0cOLDGrEeOHJHNZlNYWFiDr6lt27bq06ePFi5cKNM0JUm5ublV9vP19a10zjVr1lR6Pzo6WpK0fPnyStvbtWtXbabt27fLZrPpk08+UWJiYqVjarueloK+1jx9rSHok/TJ5uqTrbWvwXVRpAQAAACayfnz5/Xpp59KkmJjY2WapkzT1I8//qisrCxJ0lNPPaVnnnmm1uOefvppSZK/v79M09Tu3bslSXl5eUpISKjSdsV+OTk58vPzk2ma2rNnT41Z33vvPUnSrl27dPDgwXpfU3FxsXJzc9W+fXvNnDlTs2fPliSFhYXJNE09+OCDkqT77rtPP/zwQ6Vzjh07VidOnFCXLl107NgxrVu3rtL7ixYtkmmaOn/+fLWZMjIy1KlTJw0fPlwvvfSSI5O7u3uN19HS0Neap69dKSwszFFQuhb6JH2yufpka+1rcF0UKQEAAACL3XDDDbr99tv19ttvS5IWL16skpKSep+nTZs28vPz0+LFi7Vy5coG5ykvL1dycrJCQkIk/ecX9vrw9PRUv379tHLlSrm5uem1117T2bNnHe/Pnz9ffn5+Sk5O1t/+9rcqxyckJCghIUE333xzvdteu3atoqKi5OHhUe9jWzr6WuP2NVw/+iR9EqhAkRIAAABwErfddpsk6eLFiyosLKz38W3btlVKSorc3Nw0ffp0ff755w3KsXHjRnl4eOidd96RJC1btkylpaUNOldgYKBuuukmlZaWat++fY7tfn5+mjdvniTpscceq1SUyMrK0sGDB/XUU0/Vu738/Hx9/vnnio2NbVDe1oK+dtn19DU0LvrkZfRJtGYUKQEAAAAncfjwYUnSjTfeKH9//wadY/To0ZozZ47OnTunuLi4ap/PVpulS5fqgQce0MCBA9WnTx8VFBRow4YNDcojyfE8trZt21ba/tBDD2nYsGE6cOCAXnvtNUlSUVGRZs2apbfeekt2u73eba1du1Zt2rTR6NGjG5y3NaCvXX9fQ+OiT9InAYqUAAAAgMXOnz+v7OxszZgxQ97e3o5pjw3129/+VqNGjdL+/fs1a9aseh179uxZZWZm6v7775ckx7PTli5d2qAsX331lb755hu1b99ewcHBld6z2WxatGiRPDw8NHfuXH311Vd64YUXNHToUN1xxx0Nai8jI0MRERGNutBJS0Jfa7y+hsZBn6RPAhUoUgIAAAAWWLt2rWPF1YpnshUXF2vZsmUaN27cdZ3bzc1NKSkpCgwM1LvvvquUlJQ6H7tixQoNGTJE3bt3lyRNmTJFdrtd69ev16lTp+p8npKSEuXl5Wny5Mmy2+1688031b59+yr79e7dWwkJCbpw4YLuvfdeLVmyRPPnz69zO1c6deqUcnNzmep9FfraZY3Z13B96JOX0SeByihSAgAAABa4ciXYkpISHT16VJMmTdKECRM0fvz4Bi0ccSV/f3+lpqbKbrdr+vTpys/Pr9Nx7733nuPuoYrzREdHq7S0VMuWLbvmsVcWHjw9PRUSEqLOnTvr4MGDmjp1ao3HJSUlKTAwUNu3b9ecOXPUuXPnul3kVTIzM2WapgzDaNDxLRV97T8aq695eHg42q947dq1S+vXr6+yvWvXrg1qoyWjT/5HY/VJoCWgSAkAAABYzMPDQ927d1dSUpImT56s1atX6/XX/4+9e4/L8f7/AP666y6dUCohOaXJIXJIkkMijEimGtLMTBjLl1HbjGZ7OEzfbXZgyGFySqMaWl8xQyUKMTEq52M5RYeluq/fH/t1TzrXfd9X3b2ej0ePx1z3dV/X67ruz3Xd1/3e9bk+39V6uf369UNQUBBycnLg4eGBvLy8Cue/cOECUlNT8dZbb5WYXvyjvbJRbl8tPNy5cwdeXl4IDw+XD0BRHn19fQwaNAgA0KNHj8o2q1yRkZHo06cPWrVqVeNlqDu2NcW0tcLCQvn6i//s7e0xevToUtMfPHhQ4/U0BGyTtWuTFy9eLFUYnzNnTrWXQ1QXsEhJRERERFSHFP9YPXLkiEKW9+GHH8LLywsXL16s9Ifr5s2b8eLFC+jr65f4wTt27FgAQEpKCk6fPl2l9Zqbm2Pr1q2wtLTE6tWrkZSUVOttqUhubi4OHz7Mrt7VwLZGdQ3bZPV169atVGH8hx9+UNr6iJSJRUoiIiIiojqkeCTY3NxchS0zODgYnTp1wubNm8vtslhQUIAdO3YgLi6u1A9eQRAwb948AJXfTfQqHR0dLF++HIIgICAgQCHbUp6YmBjk5eWxSFkNbGtU17BNEjVsLFISEREREdUhJ06cAADY2dkpbJkGBgbYu3cv9PX1sXbt2jLn2b9/P0xMTNC/f/8yX3/vvfcAALt27aq02+SrPDw80LNnTxw5cgQxMTHVD19FkZGR6NChA7p166a0dagbtjWqa9gmiRo2FimJiIiIiERWWFiIGzduIDAwEDt37oS5uTnmz5+v0HV07doV69evL/f1LVu2YNq0aeW+3q1bN/Tt2xdZWVnYt29fldcrkUjw5ZdfAgACAgLkd0opkkwmw4EDB+TdMql8bGtU17BNEpGcQERERERE1RYaGipU93JaX19fAFDqTyKRCI0bNxZ69OghLFq0SHj48GGl71u9erUgCIKQmZlZ6rXevXuXm2HWrFmCsbGx/N+3b98u8V57e/tS77l+/XqpdZiZmZWbzcvLq9QyBgwYIH/d0dFRPn3dunVl7pOCgoJSywgJCREACOvWrSsxPTY2VgAgHD16tNztFgRB0NTULHP7KjNhwgRhwoQJ1X6fIgEQQkNDqzw/25py2lpF7O3thdGjR1d5fkGoeZusbntQNJ7/6kebfFV9Pv9Rg7FHWmEFk4iIiIiIFCY7O1vh7zMxManW3Tlr164t0eWxdevWlb6/Xbt25c5T1W0q7sb5upkzZ2LmzJlVWkZ5IiMj0axZMwwYMKBWy1EnbGulKaKtVSQhIUFpy1YHbJOlKbtNEtU37O5NRERERET1WmRkJEaNGgWplPcItPaHAAAgAElEQVRgEBER1VcsUhIRERERUb0ya9YsSCQSGBgYAACuXLlS7qi9AQEBkEgkkEgkKCoqUmVMUgOvtzVFYJuk2qhOm2Rbo/qGRUoiIiIiIqoXvL29IQiC/K8qXS1XrlxZ4j3skktVUZO2VlVsk1QTPP9RQ8AiJREREREREREREYmKRUoiIiIiIiIiIiISFYuUREREREREREREJCoWKYmIiIiIiIiIiEhULFISERERERERERGRqFikJCIiIiIiIiIiIlGxSElERERERERERESiYpGSiIiIiIiIiIiIRMUiJREREREREREREYmKRUoiIiIiIiIiIiISFYuUREREREREREREJCoWKYmIiIiIiIiIiEhULFISERERERERERGRqFikJCIiIiIiIiIiIlFJxQ5ARERERFSf7dmzR+wIpGR37txB69atxY6BkydPih2BqASe/9RfXTn/UcPAIiURERERUS14eXmJHYFUYMKECWJHwLfffotvv/1W7BhEcjz/NQx14fxHDYNEEARB7BBERERERFQ7Z8+exfDhw9G7d29ER0dDIpEoZT3Lly/Hli1bkJqaqpTlE73q559/xsyZM5GTkwMNDfGfVpaZmYlJkybh2LFjCAwMhL+/PzQ1NcWORSoikUgQGhoKT09Pla730qVLcHd3R1ZWFnbs2IGhQ4eqdP1EKhIm/lmeiIiIiIhq5cyZM3BxcYGNjQ327t2rtAIlAOjp6SE3N1dpyyd6VVpaGiwtLetEgRIATE1NcejQIaxevRrLli3DgAEDkJ6eLnYsUnNdunRBUlIShgwZAhcXFwQEBKCoqEjsWEQKVzfO9EREREREVCNxcXFwdnZG3759ERUVBQMDA6Wuj0VKUqW0tDR07NhR7BglSCQS+Pn54cyZM8jLy0OvXr0QEhIidixSc40bN8auXbvw008/4dtvv4WLiwsePHggdiwihWKRkoiIiIionjpx4gTefPNNDBw4EOHh4dDV1VX6OvX09JCXl6f09RABdbNIWaxr165ISEjArFmzMHXqVHh6euLp06dixyI1N2PGDMTHx+PmzZvo06cPYmNjxY5EpDAsUhIRERER1UPHjh3DqFGjMGLECISHh0NHR0cl69XV1UV+fj4KCwtVsj5q2NLT02FpaSl2jHLp6Ohg5cqViI6ORlxcHGxtbXHs2DGxY5Ga69WrF86dOwcHBwcMGTIEgYGBkMlkYsciqjUWKYmIiIiI6pno6Gi8+eabGDVqFHbt2gUtLS2VrVtPTw8AeDclKd2jR4/w9OnTOnsn5atcXFyQnJyMnj17wtnZGX5+fnj58qXYsUiNNWnSBHv27EFQUBCWL18ONzc3PHnyROxYRLXCIiURERERUT0SFRUFd3d3jBs3Djt27IBUKlXp+ouLlHwuJSlbWloaAMDKykrkJFVjamqKiIgIbNmyBZs2bYKjoyOuXr0qdixSY8XPR42Li8PFixfRs2dPJCQkiB2LqMZYpCQiIiIiqicOHDiA8ePHY/Lkydi+fbvKC5QA76Qk1UlLS4O2tjYsLCzEjlItPj4+SEpKgiAIsLW1xZo1a8SORGrOzs4OiYmJ6NKlCwYNGoRVq1aJHYmoRlikJCIiIiKqB/bs2YPx48fjnXfewYYNG6ChIc6lPO+kJFVJS0tDhw4doKmpKXaUarO2tkZCQgIWLVqEBQsWwN3dHY8ePRI7FqkxExMTREVF4YsvvsCnn34Kd3d3PHv2TOxYRNXCIiURERERUR23e/duTJ48GdOnT8dPP/0kWoESYJGSVKcuj+xdFVKpFIGBgThx4gQuXLiAbt264eDBg2LHIjUmkUjg7++Pw4cP49SpU+jbty/Onz8vdiyiKmORkoiIiIioDtuyZQsmT56M//znP1i7di0kEomoefT19QGwSEnKV9+LlMUcHBxw9uxZuLi4YMyYMfD19eXxQ0rl5OSE5ORktG3bFv369eMjB6jeYJGSiIiIiKiOCg4OxvTp0/Hxxx/jq6++EjsOAMDAwAAAkJ2dLXISUndpaWmwtLQUO4ZCNG3aFCEhIQgNDUVYWBjs7OyQnJwsdixSY82bN0d0dDT8/f0xf/58+Pj4ICcnR+xYRBVikZKIiIiIqA7atGkTfH19sXDhQnz55Zdix5HT1dWFpqYmi5SkVM+ePcPjx4/V4k7KV3l4eODcuXMwMTGBg4MDVq1aBZlMJnYsUlOampoIDAzEr7/+iqioKPTp0wcXL14UOxZRuVikJCIiIiKqY4KDgzFjxgwsWbIEK1euFDtOCRKJBAYGBnjx4oXYUUiNpaamAgCsrKxETqJ4bdu2xe+//47AwEAsWbIEI0aMwN27d8WORWps9OjROHfuHJo1awYHBwfs2rVL7EhEZWKRkoiIiIioDgkODoavry+WLFmCpUuXih2nTCxSkrKlpaVBKpWiTZs2YkdRCk1NTfj7+yM2NhY3b96Era0tIiIixI5FaszCwgLHjh3DBx98gMmTJ8PHxwd5eXlixyIqgUVKIiIiIqI6YuPGjfD19cXSpUvrbIESABo3bswiJSlVamoq2rdvDy0tLbGjKJWdnR3Onz+PSZMmwd3dHT4+PnyUAimNVCrFypUrER4ejgMHDsDR0RHp6elixyKSY5GSiIiIiKgO2LhxI2bOnCnvAlqXsUhJypaenq52z6Msj66uLtasWYN9+/YhKioK3bt3R3x8vNixSI25ubnh3Llz0NLSQq9evRAWFiZ2JCIALFISEREREYluw4YN8PX1RWBgID777DOx41SKRUpStrS0tAZTpCzm7u6OlJQUdO7cGYMHD0ZgYCCKiorEjkVqqm3btjh+/DimTp0KT09P+Pr64uXLl2LHogaORUoiIiIiIhFt2LABM2fOxLJly+pFgRJgkZKULy0tDZaWlmLHUDkzMzMcOHAAQUFBWLlyJQYMGMDuuKQ0jRo1wpo1a7B9+3bs3LkTjo6OuH79utixqAFjkZKIiIiISCTr16/HzJkz8cUXX2Dx4sVix6myxo0b87l5pDTPnz9HRkZGg7uTsphEIoGfnx/OnDmDvLw89OrVCyEhIWLHIjU2efJkJCUlIT8/H3Z2dvjtt9/EjkQNFIuUREREREQi+OmnnzBr1ix8+eWX+PTTT8WOUy0c3ZuUKS0tDQBgZWUlchJxde3aFQkJCZg1a5a8S+7Tp0/FjkVqqlOnTjh16hTc3d0xevRo+Pn5oaCgQOxY1MCwSElEREREpGLffvstZs+ejS+//BKffPKJ2HGqjd29SZnS0tKgqamJdu3aiR1FdDo6Oli5ciWio6MRFxcHW1tbHDt2TOxYpKZ0dXWxceNGbN26FcHBwRg2bBju3bsndixqQFikJCIiIiJSoW+++Qbz58/H6tWr62WBEmCRkpQrNTUVbdu2hba2tthR6gwXFxckJyejZ8+ecHZ2hp+fHwc5IaXx8fFBXFwc7t27B1tbW8TExIgdiRoIFimJiIiIiFTku+++w4IFC/Df//4XCxYsEDtOjTVp0oRFSlKa9PT0Bvs8yoqYmpoiIiICW7ZswaZNm+Do6IirV6+KHYvUlK2tLc6ePQtnZ2e8+eabCAwMhEwmEzsWqTkWKYmIiIiIVCA4OBjz5s3D8uXLUVRUBIlEAolEgtatW8vniYiIkE+XSCT4+++/RUxcvqZNm+LZs2dixyA1lZaWhuzs7Hp9jCiTj48PkpKSIAgCbG1tsWbNGtGyNMTPY//+/Q2mbTZu3Bi7d+/G2rVrsWLFCri4uODhw4cqW7867lOqGIuURERERERKtnnzZvj6+uKLL75AQEAAPvroIwiCgB49epSYb9y4cRAEAW5ubiIlrRpDQ0Pk5OSwuykpRVpaGt566616fYwom7W1NRISErBo0SIsWLAA7u7uePTokcpzNMTPY8yYMQ2ubc6YMQPx8fG4ceMG+vTpg7i4OJWsV533KZWNRUoiIiIiIiXaunUr3n//fQQGBta7UbzLY2hoCADIysoSOQmpm5ycHDx48KDBj+xdFVKpFIGBgThx4gQuXLiAbt264eDBg2LHIjXVu3dvnD17Fvb29nByckJgYCAEQRA7FqkZFimJiIiIiJQkNDQU06dPx+LFi/HZZ5+JHUdhiouUT58+FTkJqZu0tDQIgsBnUlaDg4MDzp49CxcXF4wZMwa+vr7Izc0VOxapoaZNmyIsLAxBQUFYvnw5xo0bx+8BUigWKYmIiIiIlCAsLAze3t6YN28ePv/8c7HjKJSRkREA8LmUpHBpaWnQ0NBA+/btxY5SrzRt2hQhISEIDQ1FWFgY7OzskJycLHYsUkMSiQR+fn44cuQIkpKSYGtri1OnTokdi9QEi5RERERERAq2d+9eTJo0CXPnzkVQUFCNl/PgwQN4eXnB0NAQxsbGcHV1RXp6eol58vPzsWTJElhbW0NPTw/NmjXDmDFj8Ouvv6KoqKi2m1Km4jspWaQkRUtNTYWFhQV0dHSqNH9dPUbE4uHhgXPnzsHExAQODg5YtWpVjUdkfn3QkitXrsDT0xPGxsbyaa8/B5Ofx7/UfV8MHDgQ58+fR+fOnTF48OBqD+DE9kVlEoiIiIiISGH27dsnaGlpCX5+fpXO26NHD8Hc3LzUdDc3NwGA4ObmJsTHxwvZ2dnCkSNHhCZNmgh2dnYl5p0+fbrQtGlT4dChQ0Jubq7w4MED4aOPPhIACEePHlXUZpUgk8kETU1NITQ0VCnLp4Zr+vTpwtChQ+X/rq/HiNgKCwuFlStXCtra2sKwYcOEO3fu1HhZxft68ODBwtGjR4WcnBwhISFB0NTUFDIzM0vMo+6fBwD5eY9t8x8ymUxYuXKloKmpKYwfP1549uxZtd7P9kWv2MM7KYmIiIiIFOS3337DxIkTMXXqVHzzzTe1Xt706dPh4OAAfX19ODs7w9XVFYmJiSXuLjly5Ai6du0KFxcX6OrqwszMDKtXr8Ybb7xR6/WXRyKRoEmTJryTkhQuLS2tWs+jrKvHiNg0NTXh7++P2NhY3Lx5E7a2toiIiKjVMv39/eHk5AQ9PT3Y29ujsLAQJiYmJebh5/GvhrIvJBIJ/P39ERMTg/j4ePTt2xcXLlyo9nLYvghgd28iIiIiIoX43//+h/Hjx8Pb2xs//fQTJBJJrZdpZ2dX4t/m5uYAgHv37smnjRw5EvHx8ZgxYwYSEhLk3dmuXLkCJyenWmcoj6GhIQdMIIVLS0uDpaVlleevy8dIXWBnZ4fz589j0qRJcHd3h4+PD7Kzs2u0rL59+1Zpfa9qyJ9HQ9sXQ4YMQVJSEpo3bw57e3ts3LixWu9n+yKARUoiIiIiolqLiYnBuHHjMHHiRGzYsAEaGoq5zG7atGmJfxcv99VnzP3444/Ytm0brl27hqFDh6JJkyYYOXIkwsPDFZKhPIaGhsjKylLqOqhhycvLw71792BlZVXl99TlY6Su0NXVxZo1a7Bv3z5ERUWhe/fuiI+Pr/Zy9PX1K52Hn8e/GuK+MDc3x9GjR+Hv74+ZM2fCx8enyiPNs30RwCIlEREREVGtHD58GG5ubvDy8kJwcLDCCpRVJZFIMGXKFBw+fBjPnj1DREQEBEHA+PHj8fXXXyttvUZGRuzuTQqVnp4OmUxWre7eVSHWMVLXuLu7IyUlBdbW1hg8eDACAwNFGUiEn8e/1HFfSKVSBAYGIjIyEgcPHkSfPn2QkpKisvWr4z5tSFikJCIiIiKqodjYWLi7u2PMmDGiFCiBf+5o/OuvvwAAWlpacHFxkY+aevDgQaWul0VKUqS0tDRIJBJ06NBBocsV6xipi8zMzHDw4EEEBQVh5cqVGDBgQKnRkZWNn8e/1HlfuLq6Ijk5GYaGhnBwcMDu3btVsl513qcNAYuUREREREQ1EB8fj1GjRmHkyJHYsWMHpFKpaFlmzpyJCxcuID8/HxkZGfjqq68gCAKcnZ2Vtk4+k5IULTU1Febm5tDT01P4ssU4RuoqiUQCPz8/nDlzBnl5eejVqxdCQkJUmoGfx7/UeV9YWFjg+PHjmD17NiZOnAgfHx/k5eUpfb3qvE/VnljjihMRERER1Vfx8fFC48aNhfHjxwsvX76s9vtXr14tACjx9+mnnwonT54sc7ogCKWmjx49WhAEQUhOThZ8fX2Fzp07C3p6ekKzZs2Efv36CRs3bhRkMplCt/tV8+fPF/r166e05VPD4+vrKzg5OQmCoB7HSH2Ql5cn+Pv7CxoaGoKHh4fw5MkT+Wtl7evXSwgN7fMAIHh7e7Nt1kB4eLhgaGgo9OrVS0hLS2P7orLskQiCICig1klERERE1CCcPXsWw4YNQ79+/RAeHo5GjRqJHUkUy5cvx5YtW5Camip2FFITw4YNQ/v27as9KjDVXkxMDKZOnQqpVIqQkBAMGjRI7Eh1kkQiQWhoKDw9PcWOUi+lpqbCw8MD169fx6ZNmzBhwgSxI1HdEsbu3kREREREVXTmzBkMHToUjo6OiIiIaLAFSgAwMTHBo0ePxI5BaiQtLQ2WlpZix2iQXFxckJycDFtbWwwZMgR+fn54+fKl2LFIzVhZWSEhIQFTp06Fp6cn/Pz8UFBQIHYsqkNYpCQiIiIiqoI///wTI0aMgL29PX755Rdoa2uLHUlUJiYmyMrK4g9MUoj8/HzcuXMHVlZWYkdpsExNTREZGYktW7Zg06ZNcHR0xNWrV8WORWpGR0cHa9aswbZt2+Tt7MaNG2LHojqCRUoiIiIiokqkpqZixIgR6Ny5M/bu3dug76AsZmJiAkEQ8PjxY7GjkBq4du0aioqK0LFjR7GjNHg+Pj5ISkqCIAiwtbXFmjVrxI5Easjb2xtJSUnIy8uDnZ0doqOjxY5EdQCLlEREREREFbh58yZcXFzQrl07REVFQV9fX+xIdYKJiQkAsMs3KUTxs007dOggchICAGtrayQkJGDRokVYsGAB3N3deayTwllbW+PkyZMYPnw4Ro0ahYCAABQVFYkdi0TEIiURERERUTlu376NIUOGwMjICAcPHkTjxo3FjlRnsEhJipSWloaWLVvyGKtDpFIpAgMDceLECVy4cAHdunVDVFSU2LFIzRgYGGDHjh3YunUrvv/+ewwbNgz3798XOxaJhEVKIiIiIqIyPHz4EMOHD4eBgQEOHz4MIyMjsSPVKcbGxtDQ0GCRkhQiPT2dXb3rKAcHB5w9exYuLi5wdXWFr68vcnNzxY5FasbHxwexsbG4c+cObG1tcfjwYbEjkQhYpCQiIiIiek1mZiacnZ0hk8lw6NAhGBsbix2pztHU1IShoSGLlKQQaWlpLFLWYU2bNkVISAhCQ0MRFhYGOzs7JCcnix2L1EzPnj1x5swZODk5YeTIkQgMDIRMJhM7FqkQi5RERERERK949uwZRo4ciZcvX+Lo0aNo0aKF2JHqLBMTE2RmZoodg9QAi5T1g4eHB86dOwcTExM4ODhg1apVLCKRQjVp0gShoaFYu3YtVqxYgeHDhyMjI0PsWKQiLFISEREREf2/58+fY/jw4cjMzERMTAxatWoldqQ6zcTEhKN7U60VFBTg1q1bLFLWE23btsXvv/+OwMBALFmyBCNGjMDdu3fFjkVqZsaMGYiLi8O1a9fQp08fxMfHix2JVIBFSiIiIiIiALm5uRgzZgxu3bqFmJgYtGvXTuxIdZ6pqSm7e1OtXb9+HYWFhSxS1iOamprw9/dHbGwsbt68CVtbW0RGRoodi9RMnz59kJiYCBsbGwwePBirVq2CIAhixyIlYpGSiIiIiBq8vLw8uLq64vLly/j999/RqVMnsSPVCyYmJixSUq2lpqYCACwtLUVOQtVlZ2eH8+fPY9KkSRg3bhx8fHyQnZ0tdixSI8bGxjhw4ACCgoLw2Wefwd3dHU+fPhU7FikJi5RERERE1KC9fPlS/py16OhodOnSRexI9QaLlKQIaWlpaN68OZo2bSp2FKoBXV1drFmzBnv37kVUVBS6d+/OrrmkUBKJBH5+fjh8+DASExPRs2dPnD59WuxYpAQsUhIRERFRg1VUVARvb2/Exsbi0KFD6NWrl9iR6hVjY2MWKanW0tPT2dVbDYwfPx4pKSmwtrbG4MGDERgYiKKiIrFjkRoZNGgQkpOT0alTJwwaNAhr1qwROxIpGIuURERERNQgFRUVYcqUKTh48CD2798POzs7sSPVO6amphzdm6olIiICW7ZswYkTJ/DgwQMAHNlbnZiZmeHgwYMICgrCypUrMWDAAKSnp4sdi9SIqakpoqOj8fnnn2P+/Pnw9vbmIwbUCIuURERERKS2YmNjMXfu3FIP2hcEATNnzkRERAQOHDiAgQMHipSwfjMzM0Nubi5evHghdhSqJ1JSUjBt2jQMGjQILVu2hJ6eHk6fPo2UlBR8/PHH2LRpE44dO8bRouux4q65Z86cQV5eHnr16oWQkBCxY1Wbi4sLmjRpgsaNG8v/pFIp3n333RLTmjVrhtu3b4sdt0GRSCTw9/dHTEwMDh8+jD59+uDPP/8UOxYpAIuURERERKS2Vq9ejR9++AGzZ8+GTCYD8E+B8oMPPsC2bdvwyy+/YMiQISKnrL9atmwJALh//77ISai+eP2RCnl5eXj8+DHOnTuHb775Br6+vnByckKbNm2QkpIiUkpShK5duyIhIQGzZs3C1KlT4enpWeGAJzk5OTh//rwKE1bszTffxIsXL5CdnS3/KywsRG5urvzfOTk56NChAywsLMSO2yA5OzsjKSkJJiYmsLe3R3BwcLnznjp1CocOHVJhOqoJFimJiIiISC2lpqZi//79AIANGzbgnXfeQVFREfz9/REcHIywsDCMGjVK5JT1W4sWLQCwSElV17t37zKny2Qy5Ofno6ioCFKpFF5eXujatauK05Gi6ejoYOXKlYiOjkZcXBxsbW1x/PjxMuf18/ODm5tbnbkz++2334aGRsUlE01NTbzzzjsqSkRlad26Nf744w8sWrQIvr6+8PHxQW5ubol5njx5gvHjx2Pq1Kl4/vy5SEmpKlikJCIiIiK19N///hdSqRTAPwWQ3bt3480330RoaCh27NiBsWPHipyw/mvevDmkUqn82YJElWnevDnMzMwqnEcmk2Hp0qUqSkSq4OLiguTkZNja2mLIkCHw8/PDy5cv5a9HRERg06ZNuH37NubOnSti0n+1atUKjo6OFRYqZTIZPD09VZiKyiKVShEYGCh/hIudnR0uXboE4J/eE97e3sjMzERmZiYWLFggclqqCIuURERERKR2Hj9+jJ9//hkFBQXyaYWFhTh69CisrKzg6uoqYjr1oaGhAVNTU95JSdXSt2/fcgs/WlpamDp1Kjp16qTiVKRspqamiIyMxJYtW7Bp0yY4Ojri6tWryMjIwHvvvQcNDQ3IZDL8/PPPCA0NFTsuAGDKlCnlvqapqQknJ6dKi+6kOmPGjEFycjKaNGmCfv36ITQ0FKtWrUJ0dDQKCgpQWFiITZs24X//+5/YUakcLFISERERkdr5/vvvUVhYWGp6YWEhjh07BhcXlzrTpbC+a9GiBe+kpGqxs7OT3+X8OkEQsHjxYhUnIlXy8fFBUlISZDIZevXqhWHDhuHFixfy5wZLJBJMnz4dt27dEjkpMGHCBGhqapb7ekVFTBJHmzZt8Mcff2DKlCmYPHkyFi9eXGLwPIlEgmnTpvEaoI5ikZKIiIiI1EpeXh6+++67MouUwD+FylOnTmHo0KHIyspScTr107JlSxYpqVp69+5doqtvMS0tLcycORPt27cXIRWpkrW1NU6ePIl+/frh4sWLJe56FwQB+fn5mDhxIoqKikRMCRgZGcHFxaXMQqWGhgbGjRsnQiqqTKNGjbB06VIYGhqWek0mkyEzMxOLFi0SIRlVhkVKIiIiIlIrISEhlT4Yv7CwEImJiRg7dqz87h2qmRYtWrC7N1VLeYPnSCQSBAQEqDgNiSU1NRUnTpwocZdbsYKCAiQkJOC///2vCMlK8vb2LvU9IZVKMXr06DKLYCQ+mUyGSZMm4fnz52UWugsKCrB+/XrExMSIkI4qwiIlEREREakNmUyGVatWVVh4lEqlaNSoERYsWIBffvml0tFbqWItW7ZkkZKqxczMDKampiWmaWlpYd68eTA3NxcpFalSfn4+PD09KzxXy2QyfPLJJzh9+rQKk5Xm5uaGRo0alZgmk8ng7e0tUiKqzLJly3D06NESd+i+TiKR4N1332W37zqGV2REREREpDb279+Pa9eulXlnjra2NqRSKd59911cu3YNQUFBpQolVH18JiXVhL29fYn/QSCVSjnqbgPi7++Py5cvl/tYjmISiQSTJk1Cbm6uipKVpqenB3d3d2hpacmn6ejoYNSoUaJlovIdPnwYy5Ytq7SXhEwmw8OHD/Hxxx+rKBlVBYuURERERKQ2Vq1aVerZYVpaWtDU1ISnpyeuXr2KDRs2oFWrViIlVD8tWrTAo0ePKrxjheh1rw6eI5VKsXDhQjRv3lzkVKQKDx8+xNGjRyEIAjQ1NSscmKawsBA3b97Ef/7zHxUmLG3SpEnyc5yWlhYmTJgAXV1dUTNR2SwsLBAYGIguXboA+OfzKq/HRGFhIdauXYvjx4+rMiJVQCKU9b+ZiYiIiIjqmcTERPTt21f+by0tLRQVFWHSpEkIDAyEpaWliOnUV1xcHAYMGIDbt2+jdevWYseheuLgwYNwdXUFABgYGODWrVswMjISORWpUkZGBqKjo7F//35ER0cjOzsbjRo1Qn5+fql5JRIJwsPD4ebmJkLSf55haGJiIn/ecXR0NEaMGCFKFqq6GzduIDIyEjt37kRiYiI0NDQgCEKJuyw1NTXRsmVLXL58GQYGBiKmJQBhvJOSiIiIiNTCV199BYlEIr9rwsPDA1euXEFISAgLlErUokULAGCXb6qWXr16yf/7k08+YYGyAWrevDl8fHwQFhaGJ0+e4Pfff8eHH36IN954A8A/d9gW320LABPBfJQAACAASURBVFOnThXt+bdaWlqYOHEiAMDQ0BBDhw4VJQdVT7t27eDn54dTp07h5s2b+Prrr+Hg4AANDQ1oampCKpWiqKgI9+7dw6effip2XALvpCQiIiJSuTt37iA+Pl7sGGolIyMDH374IQCgX79+8PDwqLMDcFhYWMDBwUHsGAqTm5sLfX19/PrrrxgzZozYcWptz549YkdoMKZPnw6ZTIZ169aVGpiEaq5///5Ku6tZVd9fjx49QnJyMs6ePYs///wTL1++BAB069YNixcvhkQiUXqG1126dAmff/45hg8fjvfee0/l668LlP39parzb1ZWFhITE5GQkICUlBTIZDJIJBIEBgbC2tpaJRkI8PT0fH1SGIuURERERCq2Z88eeHl5iR2DRDJhwgSEhYWJHUOhmjZtiqCgILz//vtiR6k1MYofRIoUGhpa1o9/heD3V8Om7O8vnn8bljLKkWHSsmYkIiIiIuXj/ytWnNTUVFhZWYkdo1IeHh5iR1CKVq1a4e7du2LHUBhlFnnoXxs2bMCUKVM4AIkCqarII+b31/3799GyZUtR1v39999jzpw5DbKYpqrvLzHPv9nZ2Xj58iWaNWsmyvobior+ZweLlERERERU79WHAqU6a9OmDW7fvi12DKpn3n///QZZ7KHaEatACaDBFigbCg6cIz4OnENERERERLXSpk0b3Lp1S+wYVM+w2EP1DdsskXKxSElERERERLViYWHBIiURERHVCouURERERERUK8V3UvI5q0RERFRTLFISEREREVGttG3bFn///TcyMzPFjkJERET1FIuURERERERUK23atAEAdvkmIiKiGmORkoiIiIiIasXCwgIaGhq4efOm2FGIiIionmKRkoiIiIiIakVbWxtmZma8k5KIiIhqjEVKIiIiIiKqtTZt2uD27dtixyAiIqJ6ikVKIiIiIiKqtbZt2/JOSiIiIqoxFimJiIiIiKjW2rRpwyIlERER1RiLlEREREREVGsWFhYcOIeIiIhqjEVKIiIiIiKqtTZt2iAzMxN5eXliRyEiIqJ6iEVKIiIionrAwMAAEomkzD89PT306NEDX3/9NYqKiip9X1BQEADg0aNHJab37NkTf//9d6l1vz6fRCJBnz59ys2ampoKiUSCfv361XibdHR00L17d/z4448QBAEAkJCQUGo+Q0PDEsuMiIgo8bqrqysAYPv27SWmGxgYlJnJ0tISO3bsKPO1gICAEsuobPsamrZt20IQhBoPnvP6Z1dWW6yLKjrG1EVQUJB821q3bl3itYqOLVXvG0EQEBcXhw8++ABvvPEGGjVqhObNm2PAgAHYvn27/FxS7OnTp/jpp5/g7OyMZs2a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lERERERERHrq0qVLeOONN/DJJ59o3+d54wzgRUVF2q9ZkCQiIimxSElERERERKRnWlpa8Omnn2L16tW4fv06NBoNNBrNTftdvXoVwcHBKC4uxoULFyCTyTB06FAolUqsWrUKSqUSDz74IHr37i3BXRARkSFhkZKIiIiIiEiPpKWlYdmyZTh9+nSHhck/Mzc3x0svvQSlUgkPDw9YWlrqICUREVF7LFISERERERHpiUcffRRJSUkwNja+qwKliYkJlEolXnzxRR2kIyIiujUjqQMQERERERHRvaurq8PmzZsBAElJSZDJZGhtbb2rY9Vqdbv3UhIREUmFRUoiIiIiIqIeTCaT4eGHHwYAvP7663j88cfh4eEBc3Nz7T7Gxsa47777YGxs3O5YjUZzxxm+iYiIdIHDvYmIiIiIiHowCwsLuLq6AgBee+21dtuqqqpw4sQJnDp1CidPnsSJEydw9OhRnDlzBtevXwcAVFZW4tKlS5ytm4iIJMUiJRERERERkZ6ys7ODnZ0d/P39263XaDQoLS3FyZMncerUKTQ2NrJISUREkuJwbyIiIqJu7tChQ5DJZO2WIUOG3LRfbW3tTft1J++//742V//+/Tt9/1v55ptv2n0mFhYW93SemJiYdud56KGH7jlTd8L2ZZjty8jICAMGDEBoaCiWLVsGZ2fnLr0eERHRnbBISURERNTNubu7QwiBJ598EgCwevVqnD59+qb9rKysIITAlClTsHbtWgghOjVHfX09hg4disjIyHs6ftWqVRBCwM3NrUv2v5P169dDCIH6+vp7Ov6dd96BEAJCiJve69eTsX2xfREREXUHLFISERER9RBPPPEEACAuLg4ajabDfaqqqrBnzx7Mmzev068vhIBGo7nltalnY/siIiIiKbFISURERNRD+Pr6YujQoSgtLUVqamqH+8TFxSEkJASOjo6dfv37778fv/32G3bt2tXp5ybpsX0RERGRlFikJCIiIupBFi5cCADYuHFjh9s3btyo7RFH9FexfREREZFUWKQkIiIi6kHmz58PIyMjbN++HbW1te227d+/H1VVVZg8eTIAQK1WIz4+HqGhoXBwcMB9992HsWPHYt26de2G1G7fvr3dhB0nTpzAzJkzYWNjo123YcOGdvs0Nzdrj7/b6/zZ8ePHMWnSJFhaWsLMzAyBgYHIycm568/i4sWLWLFiBQYOHAgTExP07dsXM2bMwKFDh+76HABw6dIlrFy5EoMHD4apqSn69++PkJAQfPXVV2hqavpL5+rp2L7+X2e0r3vNTkREZIhYpCQiIiLqQdoKaM3NzdiyZUu7bRs3bkR0dDQUCgUAICUlBbNnz0ZQUBCOHTuG0tJSLF68GCtXrsTLL7+sPW7atGkQQmDq1KkAgCVLlmDZsmUoLS1Ffn4+jI2Nb9rnRnd7nRvV19dj2bJl+Oc//4ny8nJkZmaipqYGQUFB+Omnn+74OZw/fx5eXl5ISEjAp59+ipqaGuzbtw81NTV4+OGHkZeXd1efZ2VlJby8vLBlyxasW7cO1dXVKCoqQkBAAJ544gnExsbe1Xn0BdvXHzqrfd1LdiIiIoMliIiIiEjnHnvsMfHYY4/d07FbtmwRAISXl5d2XWNjo7C0tBRHjhzRrlOpVCIgIOCm46Ojo4VCoRBXrlxpt37q1KkCgNi1a9ctr922T1NT0z1fx83NTQAQeXl57dYfOXJEABBubm437d+vX7926xYsWCAAiM2bN7dbf/78eWFqaiqUSqV23aZNmwQAsX79+psyLly4UAAQ8fHxN22bOHGi+PDDD29aL4QQxsbGYty4cR1uu5X4+Hihq1+/2b66R/v6q9nbdPf2RURE1AUS2JOSiIiIqIeZNm0arKyscODAARQXFwMAkpKSMGTIEIwdO1a7X2RkJDIyMm463s3NDS0tLdpj/8zb2/sv5bmX6/Tq1Qvjxo1rt27s2LFwcnLC4cOHcf78+dtec/v27TAyMkJkZGS79Q4ODhg9ejSKiopQVlZ2x+zbtm0DAERERNy0bffu3Xj++efveA59w/bVee3rXj8jIiIiQ8QiJREREVEP06tXL8yePRsA8O9//1v730WLFrXb78qVK3j11VcxduxY9OnTR/u+v5deegkA0NjY2OH5zc3N/1Kee7lO2/sI/8zOzg4AUFVVdcvrXbt2DVeuXIFGo4GlpWW7dxnKZDIcPHgQAHDq1Knb5m47T69evXD//fff9f3qO7avzmlf95qdiIjIULFISURERNQDtc2w/M033+D06dPIy8vD448/3m6fyZMnY82aNXjqqadw8uRJaDQaCCHw4YcfAgCEEJ2S5V6uc+XKlQ7P1VY8aismdcTU1BRWVlaQy+VoaWmBEKLDJTAw8La5TU1NYWlpiebmZtTV1d3t7RoEtq+/377uNTsREZGhYpGSiIiIqAfy9vbGqFGjUFVVhblz52Lq1Kno06ePdntraytycnLg4OCAFStWoG/fvtqeZZ05Y/W9Xqe+vh6HDx9ut+6XX35BRUUF3Nzc4OjoeNvrzpgxA2q1usPZmteuXQsXFxeo1eo75p8+fToAYNeuXTdt8/DwwAsvvHDHc+gjtq+/37509RkRERHpCxYpiYiIiHqohQsXAgAKCgq0Pd/aGBsbIyAgAJWVlXjvvfdQXV2NpqYmZGRk4LPPPuu0DPd6HXNzcyxfvhz79+9HQ0MDCgsLER0dDRMTE6xbt+6O13377bcxePBgLFq0CLt378aVK1dQU1OD2NhYvPnmm3j//fchl8vv6jyDBg3CCy+8gJ07d6Kurg5lZWVYtmwZzp8/b7BFSoDt6++2L119RkRERHpDl9P0EBEREdEf/s7sy23Onz8v5HK5cHZ2Fq2trTdtv3jxoliyZIlwdnYWCoVC2Nvbi4ULF4qYmBgBQAAQSqVS5OXlab+/cbnRtm3bbto+d+7cv3Sd9957T/t9v379REFBgQgMDBQWFhbivvvuExMmTBDZ2dnaa964f9uyevVq7fZLly6JlStXCldXV6FQKETfvn1FWFiY2Lt3b7vst5t9WQghqqurxfPPPy8GDRokFAqFcHR0FLNnzxYnT5685Wff3WdfZvvqHu3rbrP/WXdvX0RERF0gQSYEX4RCREREpGtRUVEAgMTERImT6L9vvvkG8+bNw/r167F06dJOOadcLoenpyfy8/Pv+piEhATMmjVLJ+8hZPvSHUNsX0RERF0gkcO9iYiIiIiIiIiISFIsUhIRERGRQXj66achk8lgYWFxT8fHxMRAJpNBJpOhtbW1k9NRT8f2RURE9PewSElEREREei06OhpCCO1SX19/T+d555132p3nrwzFJf3F9kVERNQ5WKQkIiIiIiIiIiIiSbFISURERERERERERJJikZKIiIiIiIiIiIgkxSIlERERERERERERSYpFSiIiIiIiIiIiIpIUi5REREREREREREQkKRYpiYiIiIiIiIiISFIsUhIREREREREREZGkWKQkIiIiIiIiIiIiSbFISURERERERERERJJikZKIiIiIiIiIiIgkxSIlERERERERERERSYpFSiIiIiIiIiIiIpIUi5REREREREREREQkKbnUAYiIiIgMVVlZGRISEqSOQTqSl5en0+uxfRkWXbcvIiKizsYiJREREZFE8vPzMWvWLKljkJ5i+yIiIqKeRCaEEFKHICIiIiIiIiIiIoOVyHdSEhERERERERERkaRYpCQiIiIiIiIiIiJJsUhJREREREREREREkpIDSJQ6BBERERERERERERms/P8Fj6rs/ttsLNsAAAAASUVORK5CYII=", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create PNG representation\n", + "module" + ] + }, + { + "cell_type": "markdown", + "id": "3bcc23a8-df87-468f-b100-84260d3347da", + "metadata": {}, + "source": [ + "We can also get the PNG representation of parts of the AST, such as `basic_op` and the variable `a`:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "ec46ee68-8e7e-4b45-a316-a5522349d310", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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S8DSTERERESkBkszEREREZEaLM1ERERERGqwNBMRERERqcHSTERERESkBkszEREREZEaLM1ERERERGqwNBMRERERqcHSTERERESkBkszEREREZEaLM1ERERERGqwNBMRERERqcHSTERERESkBkszEREREZEaMqkDkH5lZWVJHYH07MqVK2jdurXUMVBQUCB1BCIVfP8zf8by/keWgaXZzEVEREgdgQwgLCxM6gj49NNP8emnn0odg0iJ73+WwRje/8gyCKIoilKHIPN37NgxDBo0CN26dcOePXsgCIJexpk/fz7Wr1+Ps2fP6mX/RI/auHEjYmNjcf/+fVhZST/b7datW4iMjMSBAweQkJCA2bNnw9raWupYZCCCICAzMxOjR4826LinT5/GiBEjUF5ejrS0NAwcONCg4xMZSLb07/Jk9r7//nsEBQWhc+fO2Lx5s94KMwA4ODjgwYMHets/0aPOnTuHdu3aGUVhBoDnnnsOe/fuRWJiIubOnYtevXrh/PnzUsciM/f666/ju+++Q//+/REUFIT4+HjU1NRIHYtI54zjnZ7M1uHDhzFgwAD06NEDu3fvhpOTk17HY2kmQzp37hxeeeUVqWOoEAQB06dPx/fff4+HDx+ia9euSE1NlToWmblmzZohIyMDq1evxqeffoqgoCBcv35d6lhEOsXSTHqTn5+PN998E71790ZOTg7s7e31PqaDgwMePnyo93GIAOMszXU8PT1RWFiIKVOmYPz48Rg9ejR+/fVXqWORmZs8eTKOHDmCS5cuwdfXF4cOHZI6EpHOsDSTXhw4cABDhw7F4MGDkZOTAzs7O4OMa29vj6qqKigUCoOMR5bt/PnzaNeundQxGmVnZ4cFCxZgz549OHz4MLy9vXHgwAGpY5GZ69q1K44fPw5/f3/0798fCQkJqK2tlToW0VNjaSad27NnD958800MHToUGRkZsLGxMdjYDg4OAMCrzaR3ZWVl+PXXX432SvOjgoKCUFxcDB8fHwwYMADTp0/H77//LnUsMmPNmzdHVlYWFi9ejPnz5yM0NBR37tyROhbRU2FpJp3avXs3RowYgeHDhyMtLQ0ymWGfalhXmjmvmfTt3LlzAIBXX31V4iRN89xzz2Hr1q1Yv349/vWvfyEwMBA//vij1LHIjNXNrz98+DBOnjwJHx8fFBYWSh2LSGsszaQzO3fu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yEBBQcFrz3nq1Cloa2s3aU82aNAgjBkzBmlpacjLy2s1e0xMDABgxowZTdadO3cO69ata/UYPQ3HV8eNr/Z+RkRERJqow4vmXr16wcvLCwDwww8/KP+7YsUKle3Ky8vx5ZdfwsrKCv3791fOF920aRMAoKqqqtnj6+vrv1Ge9pyncT7rq4yNjQG8aG3WkufPn6O8vBwKhQKGhoZNHriRnp4OALh79+5rczcep1evXujbt2+b329Px/HVMeOrvdmJiIg0VYcXzcD/euoePXoUOTk5SEpKwqJFi1S2mT17NrZt24a//OUvyM7OhkKhgCAI2LNnDwB02MMp2nOe8vLyZo/VWMw0FjfN0dPTg5GRESQSCerq6pQPhHj15ebm9trcenp6MDQ0RE1NDSoqKtr6djUCx9fbj6/2ZiciItJUnVI029vbY/To0Xj06BGWLFmCuXPnon///sr1DQ0NkMvlGDRoENauXYuBAwcqr7x1ZEeI9p6nsrISGRkZKst+/fVX5Ofnw9rautU+wPPmzUN9fX2z3RB27twJMzMz1NfXt5r/o48+AoBmewPb2tri888/b/UYPRHH19uPL3V9RkRERD1FpxTNwP966qampjbpnaujowNXV1cUFhbi22+/RUlJCaqrq3Hx4kUcOHCgwzK09zz6+vpYvXo1UlJS8OzZM1y7dg3e3t7Q1dVFcHBwq+fdvn07LCwssGLFCpw7dw7l5eUoLS1FSEgIvv76a+zatQsSiaRNxxkx+hmK+wAAAnpJREFUYgQ+//xznD17FhUVFcjLy0NAQAAKCgo0tmgGOL7ednyp6zMiIiLqMZq7PfBtuhs0KigoECQSiWBqaio0NDQ0WV9cXCysWrVKMDU1FaRSqWBiYiL4+voKgYGBAgABgCCTyYSkpCTln19+vSwmJqbJ+iVLlrzReb799lvln4cOHSqkpqYKbm5ugoGBgdC7d29h0qRJQkJCgvKcL2/f+AoKClKuf/z4sbB+/XrB3NxckEqlwsCBA4Vp06YJ//nPf1Syv667gSAIQklJibBu3TphxIgRglQqFQYPHix4eXkJ2dnZLX72Xb27AcdX1xhfbc3+qq4+voiIiDpBlJYgNJ246OnpCQA4ceJEhxTm1LKjR49i6dKl2L9/P/z9/TvkmBKJBOPHj0dycnKb94mKisLChQvVMo+V40t9NHF8ERERdYITnTY9g4iIiIiop2DR3EV88skn0NLSgoGBQbv2DwwMVLYMa2ho6OB01N1xfBEREb0dFs0i8/b2VmkVVllZ2a7j7NixQ+U4b/LTOfVcHF9EREQdg0UzEREREVErWDQTEREREbWCRTMRERERUStYNBMRERERtYJFMxERERFRK1g0ExERERG1gkUzEREREVErWDQTEREREbWCRTMRERERUStYNBMRERERtYJFMxERERFRK1g0ExERERG1gkUzEREREVErWDQTEREREbVC0tKKvLw8REVFqTMLiSgpKUmt5+P40izqHl9EREQdrcWiOTk5GQsXLlRnFtIgHF9ERETUnWgJgiCIHYKIiIiIqAs7wTnNREREREStYNFMRERERNQKFs1ERERERK2QADghdggiIiIioi4s+f8ApJANXH/cQ5oAAAAASUVORK5CYII=", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create PNG representation\n", + "basic_op" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "15f25501-fd77-4927-b17d-15e82b3105cf", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create PNG representation\n", + "a" + ] + }, + { + "cell_type": "markdown", + "id": "c23049f4-e640-4059-94e1-26e8d0de8700", + "metadata": {}, + "source": [ + "## Custom shapes\n", + "\n", + "It is also possible to use custom shapes for the output using the function `viz.visualize`. The Default shape is `box`, but `diamond`, `ellipse`, and `circle` are also avaiable options. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e765eebe-f2f8-498b-b47b-ac840b30a97f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Import visualization module\n", + "from astx import viz\n", + "\n", + "# Create PNG representation with diamond shape\n", + "viz.visualize(a.get_struct(), shape=\"diamond\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "b2543b53-7c97-4280-b369-deb514c4689c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAK4AAACuCAYAAACvDDbuAAAABmJLR0QA/wD/AP+gvaeTAAAeE0lEQVR4nO3de1hUdf4H8PcMc+MOgokJCiSZl2EkwgsI4j6FgHgtsS0si8xqzbS1jU1/uru6hnkpa9UwrbybpaiksOJ1c8AxsrioQQqDJrjcFAG5zczn94c/+Ikww8wwM2eA7+t55ulx5nvO9x2+OZ45c84ZHhERGKZ72cTnOgHDGIMVl+mWWHGZbknAdYDuqq6uDhUVFa2Pu3fv4vbt2wCA5uZm1NbWgs/nw9nZGQAgFovh5OQENze31oe7uzsEAvZXYAz2U9OhoaEBly5dQk5ODi5fvoyioiIolUoolUpUVla2GftgSYVCIRwcHKDRaFBdXQ3g/8v8IIFAAE9PT/j4+MDb2xuDBw+GVCqFVCqFt7e3Rf4fuyseO6pwHxHhypUrkMvlkMvluHDhAgoKCqBWq2Fra4uhQ4fCx8entWTe3t5wd3eHu7s7+vbtCycnp07nUKlUqKioQGVlJSorK1FSUtLml6GgoABKpRIA4OzsjJEjRyI4OLj10adPHzP/FLqNTb26uCUlJUhLS0NaWhpOnjyJqqoqODg4YNSoURg7dixkMhn8/f0xePBg2NjYWCTT3bt3kZubi9zcXGRlZSEjIwO//vorAGD48OGIjIxEZGQkQkNDIRKJLJLJCvW+4ubn5+Pbb7/FgQMHkJ2dDYlEgvHjxyMyMhLjxo2DTCazuv3OyspKZGZm4vTp00hNTcWVK1fg4OCAiRMnYubMmYiJiYG9vT3XMS2pdxS3tLQU27dvx759+5CdnY1+/frh2WefRUxMDMLDw2Fra8t1RIMolUqkpaUhOTkZp06dgkgkwqRJkxAXF4fo6Gir+8Uzg02gHkqtVtOxY8do2rRpJBAIyM3Njd544w06deoUqVQqruOZTHl5OSUlJdGECROIz+fTgAEDaOnSpVRUVMR1NHPa2OOKW1NTQ0lJSTRkyBACQIGBgZSUlER1dXVcRzO7GzduUGJiIg0cOJD4fD7FxMRQeno617HMoecU97///S8lJCSQq6sr2dvb01tvvUX5+flcx+JEc3MzfffddzR27FgCQKNHj6YDBw6QRqPhOpqpdP/iVlRUUEJCAtnb21O/fv1o5cqVVFFRwXUsqyGXy2nGjBnE5/Np5MiRdPjw4Z5Q4O5b3Lq6Ovr73/9OTk5O5O7uTh999FGv2B0wVk5ODk2fPp14PB4FBQXR6dOnuY7UFd2vuBqNhvbs2UNeXl7k5OREK1asoLt373Idq9vIysqiiRMnEgB69tlnqbCwkOtIxuhexc3Ozqbg4GDi8/kUHx9PpaWlXEfqto4ePUpDhgwhiURCS5cupfr6eq4jGaJ7FLehoYGWLl1KQqGQgoOD6eLFi1xH6hGamppo/fr15OjoSEOGDKGzZ89yHUlf1l/cjIwMeuKJJ8jR0ZE+/fRTUqvVXEfqcYqLi2nSpEnE4/HojTfeoJqaGq4jdcZ6i9vc3Ex/+9vfSCAQ0MSJE6m4uJjrSD3enj17yN3dnfz8/EihUHAdRxfrLO61a9do7NixZGtrS5999llPOHzTbdy8eZMiIiJIKBTSihUrrPVTRusrbkpKCrm4uJBMJqO8vDyu4/RKGo2G1q9fT2KxmCIiIqzxuLj1FFej0VBiYiLx+XyKi4tjx2StwMWLF8nHx4e8vLysbdfBOopbU1NDMTExJBKJaPPmzVzHYR5QXl5OTz/9NEkkEtq9ezfXcVpwX9ybN29SQEAAPfLII5SRkcF1HKYDKpWKFi1aRDwej1auXMl1HCKui5uTk0NeXl70xBNP0LVr17iMwujhX//6F9nY2FB8fDw1NTVxGYW74p4/f55cXV0pPDycqqqquIrBGCglJYUcHBxoypQp1NDQwFWMjZzcV+GHH35AREQEgoODcezYMbi6unIRgzFCTEwMTp06BblcjsjISNTU1HCSw+LFTU9Pb73gLzk5udtdNsMAQUFBSE9PR15eHqKjozkpr0WLe/bsWUybNg3PPvss9uzZA6FQaMnpGRMKCAjA2bNn8dtvv2HKlCmor6+36PwWK65CocDkyZMRGRmJL7/80mKXezPmM2zYMKSnpyM3NxdTp05FY2Ojxea2SHFzc3MRFRWF8PBw7Nu3rzdchdprSKVSpKamQqFQIC4uDhqNxiLzmr24JSUlmDRpEmQyGfbv3892D3qgoKAgpKSkICUlBYsXL7bInGYt7r179zB9+nTY29vj4MGDkEgk5pyO4VBYWBh27NiBDRs24LPPPjP7fGb7N1uj0WDWrFlQKpXIzMxkh7x6gdjYWFy9ehWLFi3CY489hujoaPNNZq4jxMuWLSORSMQ+xu2FXnrpJXJ1daWrV6+aa4qNZrkF0/fff4+pU6di06ZNmDdvnqlXz1i5hoYGjBs3Dk1NTcjMzDTHfc1M/x0QhYWFmD17Nl5++WVW2l5KIpHg22+/xc2bN/Hmm2+aZQ6TbnFVKhXCwsJw7949nD9/nr0Z6+WOHTuGmJgY7Ny5Ey+++KIpV23aLe7KlSvx888/Y8eOHay0DKKjo/H222/jT3/6U+sNq03FZFvczMxMhIWFYf369Xj77bdNsUqmB2hoaMCoUaPg7OyMM2fOmOoTU9PcH7exsREjR47EoEGDkJqaCh6PZ4pwTA+Rm5uLp556CqtXr8bChQtNsUrT7CqsWLECN27cwObNm1lpmXakUin++te/YsmSJSgsLDTJOru8xc3NzUVgYCDWr1+P+fPnmyQU0/M0NTXhySefhJeXF1JTU7u6uq7tKhARQkJCAADnzp0Dn8++74/RTi6XIywsDHv37kVsbGxXVtW1XYU9e/ZAoVDg008/ZaVlOhUSEoLZs2dj8eLFuHfvXpfWZXTb6uvr8cEHH+DVV1/FU0891aUQTO+xevVqVFdXY926dV1aj9HFXbNmDe7cuYMVK1Z0KQDTu/Tr1w8JCQlYvXo1SkpKjF6PUcWtrKzEunXr8N5778HDw8PoyZneadGiRejTpw/++c9/Gr0Oo4q7du1aiEQivPPOO0ZPzPReEokEH3zwAbZu3YqioiKj1mFwcSsqKrBx40a8//77cHR0NGpShomPj4enpydWrVpl1PIGF3fdunWws7PDW2+9ZdSEDAPc/4b5pUuXYvv27bhx44bByxtU3Lq6OnzxxRdYsGAB7OzsDJ6MYR4UFxcHDw8PbNiwweBlDSrutm3bUF9fz86zZUxCKBRi/vz52LJlC6qrqw1aVu/iqtVqbNiwAa+88grc3NwMDskwHZk3bx54PB62bt1q0HJ6F/f48eMoKirCggULDA7HMNo4Oztjzpw5+Pzzz2HI2Qd6F3fLli0IDw/H448/blRAhtFm7ty5uHr1Ks6cOaP3MnoV99atWzh69Cjmzp1rbDaG0WrEiBEYM2YMvvjiC72X0au4X3/9NZycnDB9+nSjwzGMLnPnzsXBgwdx+/ZtvcbrVdx9+/YhNjaWXUfGmM3MmTPB5/ORnJys1/hOi5ufn4/s7Oyunj/JMDo5OjoiMjIS+/fv12t8p8X95ptv4OHhgdDQ0C6HYxhdYmNjcfLkSZSVlXU6ttPiJicnY8aMGex+tozZxcTEQCgUIiUlpdOxOotbWlqK7OxsTJ482WThGEYbBwcHhIeHIy0trdOxOoubmpoKiUSCsLAwk4VjGF0iIyNx/PhxNDc36xzXaXHDw8PZCTWMxURGRuLu3btQKBQ6x2ktLhHh1KlTiIiIMHk4htHm8ccfh6+vL9LT03WO01rcy5cvo6qqiu0mMBYXGhqKc+fO6RyjtbhyuRz29vbw9/c3eTCG0SUkJAQKhQIqlUrrGK3FzcjIwJgxY9g35DAWFxISgrq6OmRnZ2sdo7W4Fy5cwJgxY8wSjGF0GTp0KFxcXHS+QeuwuPX19SgoKMDIkSPNFo5htOHxePD390dOTo7WMR0W99KlS1Cr1ZBKpWYLxzC6SKVSw4ubk5MDW1tbDB482GzBGEYXqVSKvLw8rVdFdFjcK1eu4IknnmDnJzCcGTFiBGpqarReut5hcYuKivDYY4+ZNRjD6OLr6wsAWu90o7W4Pj4+5kvFMJ3w8PCAnZ2d1i896bC4SqUS3t7eZozFMLrxeDwMHDhQ/y1uXV0dqqqqMHDgQLOHe9Avv/wCHo/X5tHRm8M7d+60G2dN1q5d25rL09PT5OO12bVrV5ufiYODg1HrSUhIaLMeLo/le3t7o7i4uMPX2hW3vLwcwP37mFrSyJEjQUSIj48HACxZsgRXr15tN87FxQVEhClTpmD16tUGXYuvj9raWvj5+SEmJsao5RcvXgwigkwmM8v4zmzevBlEhNraWqOWT0xMBBGBiDh/c963b19UVFR0+Fq74rYM5OpuNa+88goAYMeOHdBoNB2OKSsrw/HjxzF79myTz09E0Gg0WudmLMfd3R2VlZUdvtauuC0D3d3dzZtKi5CQEPj5+eHGjRs4ceJEh2N27NiBp59+Gv379zf5/I6Ojrh27RqOHTtm8nUzhnFzc9N/i3v79m0IBAJO7307Z84cAMBXX33V4etfffVV65aZ6bnc3NxQVVXV4WvtiltfXw9bW1tO3/S89NJL4PP5OHToEO7cudPmNYVCgbKystbr4FQqFb755hs888wz8PDwgK2tLaRSKTZs2NDmn/tDhw61edORn5+P2NhYuLm5tT63devWNmMaGhpal9d3nof9+uuvmDRpEpydnWFnZ4cJEyZALpfr/bMoLy/HggUL4O3tDZFIhL59+2LGjBn45Zdf9F6Hsdm5JpFI2vwdtEEP2bx5M7m5uT38tMVFREQQANq0aVOb5+fNm0cLFy5s/XNKSgoBoFWrVlFVVRWVl5fTp59+Snw+nxYvXtxuvVOnTiUANH78eDp9+jTV1dXR+fPnycbGhsrLy9uMqa+vN3oemUxGzs7ONGHCBDp37hzV1NTQjz/+SP7+/iQSiejMmTPtxg8YMKDNcyUlJTRo0CDq168fHT16lGpqaigvL4/Gjx9PEomEMjIyWsfu3LmTANDmzZvbZTE0ewsbGxsaPXq01tfNbc+ePSQQCDp6aWO74m7YsIH69+9v/lSd2Lt3LwGgoKCg1ufu3btHzs7OlJOT0/pcSkoKhYeHt1s+Li6OhEIhVVdXt3m+pZTHjh3TOre24hoyj0wmIwCUmZnZ5vmcnBwCQDKZrN34h4v78ssvEwDavXt3m+dLS0tJLBZTYGBg63OdFdeQ7C24Lu53331HAEilUj380sZ2uwrNzc0QCoUm3+wbatq0aXBxccGPP/6IS5cuAQAOHjyIwYMHtzlrLSYmBqdPn263vEwmQ3Nzc+uyDxs1apRBeYyZRyKRYPTo0W2ek0qlePTRR5GdnY3S0lKdcx46dAh8Pr/doTkPDw8MHz4cP/30E37//XezZLcGYrEYwP0vOX9Yu+LyeDyr2O+RSCR4/vnnAQBffvll639fffXVNuOqq6uxbNkySKVSuLq6tu6fvvfeewCg9RsM7e3tDcpjzDwt+88Pe+SRRwBA5x1bGhsbUV1dDY1GA2dn53Yfuly8eBEA8Ntvv5kluzVQq9UA0OFVOO2KKxaL0dTUZP5Uemg5crBr1y5cvXoVmZmZ+OMf/9hmzOTJk7FixQrMnTsXBQUF0Gg0ICJ8/PHHAGCyDyiMmUfb7eFbCttS4I6IxWK4uLhAIBCgubm59UOBhx8TJkwwS3Zr0NTUBB6P1+EeQLviikQiqynuqFGjMGzYMJSVleHFF1/E1KlT4erq2vq6Wq2GXC6Hh4cHFixYgL59+7Zu4err602Ww9h5amtr2103lZubi5KSEshksk6PQ8+YMQMqlarDoxCrV6/GwIEDdV5Q2JXs1qCxsREikajDf7WseosL/P8x3QsXLrQ7dmtjY4Pw8HDcunULa9asQUVFBerr63H69Gl8/vnnJstg7Dz29vaYP38+FAoF6urqkJWVhbi4OIhEIr2+aebDDz/EY489hldffRWpqamorq5GVVUVkpKS8I9//ANr167t9GJWS/2MzKGpqQkikajjFx9+u3bw4EHi8XjU1NRkvreLBigtLSWBQEBeXl6kVqvbvV5eXk7z5s0jLy8vEgqF1K9fP5ozZw4lJCQQAAJAgYGBlJmZ2frnBx8PSk5Obvf6iy++aNA8a9asaf3zgAED6MKFCzRhwgRycHAgW1tbGj9+PJ07d651zgfHtzyWLFnS+nplZSW9++675OvrS0KhkPr27UsRERGUnp7eJruuowr6Zn8Y10cV1q9f3+5Iy/9pfzjs7NmzBIBu3bpl/mSMyegqrrG4Lu6SJUvI39+/o5faHw5rOblG22fEDGMplZWVWs+ZaVfcloGsuN3Tm2++abLzcVsOR3GloqJC61mKHW5xBQJBpwfHGesSFxfX5jCZKc7HJSKcP3/exEn1V1paqvW88HbFFQgE8PT01HqtD8NYiq5rHzu85szb25sVl+FUQ0MDbt26ZVhxfXx8tF6kxjCWUFxcDI1Go/Wi3Q6LO3jwYBQUFJgzF8PoVFBQAB6Pp/X+Hh0WVyqVori4uN1J3AxjKTk5ORg0aBCcnJw6fL3D4vr7+4OIrPZ0N6bny83N1XlT8Q6LO3DgQLi4uOi8Wx7DmJNRxeXxeJDJZK3nfDKMJdXW1qKgoMDw4gJAcHCwQRf1MYypnD9/HiqVCsHBwVrH6Czur7/+yj76ZSxOLpfD19cXAwYM0DpGa3FDQkLA4/E4/ciP6Z3kcjlCQkJ0jtFaXFdXVwwbNqzDi+wYxlwaGxuRkZGB0NBQneN0fiVqZGQkUlNTTRqMYXT5z3/+g7q6OkycOFHnuE6Le+XKFRQWFpo0HMNok5aWhuHDh3d6m1udxQ0NDYWDgwOOHz9u0nAMo01aWhoiIyM7HaezuCKRCBEREUhOTjZZMIbRJj8/H5cvX9br3sQ6iwsAsbGxOHXqlM6bVzCMKezbtw8eHh6dvjED9Cju5MmTIRaL2VaXMbtvv/0WM2fO1OtO6J0W187ODtHR0di/f79JwjFMR/Ly8nDp0iXMnDlTr/GdFhe4fz3TmTNn2NEFxmy++uor+Pj4dPrBQwu9ihsdHY3+/fu33nyOYUypqakJO3fuRHx8PPh8vSqpX3EFAgHmzJmDbdu2obm5uUshGeZhBw8exO3bt1tvt6UP/eoN4LXXXkNZWRmOHDliTDaG0SopKQlRUVE6T6p5GI9I/3tMTp8+HTdv3sSFCxeMCsgwD8vKykJQUBBOnjyJP/zhD/outsmg4p47dw6hoaGQy+U6z5VkGH3NmjUL+fn5+Pnnnw35whzDigsAY8aMwaOPPoqDBw8anpJhHqBUKuHn54ft27fjhRdeMGTRTXrv47b4y1/+gsOHDyM3N9fQRRmmjVWrVsHT0xOxsbEGL2vwFpeI8OSTT8LHx4dtdRmjKZVKDBkyBJ9//rkxX7Zo+K4CABw5cgTTpk2DQqFAUFCQoYszDF5++WVkZGTgypUrnd5VvQPGFZeIMHr0aPTp0wdpaWmGLs70cpcuXYJMJsPXX3+NuLg4Y1ZhXHGB+9cFhYaG4vvvv0d0dLQxq2B6qcjISJSVlSErK0vvT8oeYnxxAeC5555DXl4ecnNzreJL/Rjrd+TIEUydOhVnz55FWFiYsasx/KjCg9asWYPi4mJs3LixK6theonGxkYsXrwYs2bN6kppARjwkW9HfHx8sHjxYixbtgw3btzoUhCm5/vwww9RWlqKjz76qMvr6tKuAnD/tyggIADe3t44duxYlwMxPVN+fj5kMhkSExOxcOHCrq6ua/u4LTIzMzFu3Djs3r279ft3GaaFRqPB+PHj0djYiMzMTL2ucOhE1/ZxW4wdOxavv/463n77bZSUlJhilUwP8vHHH0OhUGDr1q2mKC0AE+wqtKirq8OTTz6JQYMG4d///rchJ0wwPVheXh6CgoKwfPlyJCQkmGq1ptlVaPHTTz9h7Nix+Oijj0yxH8N0cw0NDRg1ahRcXFxw+vRpk21tYapdhRaBgYFYtmwZEhISkJWVZcpVM93Q/Pnz8fvvv2P37t2mLO19Jv76VVKr1RQVFUVeXl5UVlZm6tUz3URSUhLxeDw6cOCAOVbf/rt8u4rP52PXrl0QCoV4/vnnoVKpTD0FY+V+/vlnLFy4EEuWLMGMGTPMM4k5fh2IiLKyskgikdCiRYvMNQVjhW7evEleXl4UERFBKpXKXNOYfovbIjAwENu2bcMnn3zCPhLuJWprazF58mTY2dlh7969pt+vfYDBJ0Ia4oUXXkBhYSHeeecdeHp6YurUqeacjuGQWq1GXFwcrl+/joyMDPTp08e8E5prW/6g+Ph4sre3p4yMDEtMx1iYRqOh1157jWxtben8+fOWmHKjRYrb1NREU6ZMIRcXF7p48aIlpmQsaNGiRSQUCiklJcVSU1qmuEREjY2NFBUVRe7u7pSXl2epaRkz+5//+R+ysbGhvXv3WnJayxWXiKi2tpbGjRtH/fr1o5ycHEtOzZjBsmXLiMfj0bZt2yw9tWWLS3S/vE8//TS5urpSZmampadnTECj0dC7775LNjY2tHXrVi4iWL64RET37t2jqKgocnJyorNnz3IRgTGSSqWi1157jYRCIe3bt4+rGNwUl+j+Pu9zzz1HYrHY0vtHjJFqamooJiaGbG1tLflGrCPcFZfo/j85y5cvJx6PR8uXL+cyCtOJkpISCgwMJDc3N/rhhx+4jsNtcVt89tlnZGNjQy+99BLdu3eP6zjMQy5cuEBeXl40ZMgQunbtGtdxiKyluERER48eJVdXVwoICKDCwkKu4zD/Z8uWLSQWiykiIoIqKyu5jtPCeopLRHT16lWSyWTUp08fOnr0KNdxerW6ujqKj48nHo9HS5YsMecJM8awruIS3f+BzZ49m3g8Hi1YsIDq6+u5jtTrXLx4kYYOHUqurq50+PBhruN0xPqK22LXrl3k7OxMI0aMYB9WWIharaY1a9aQWCym8ePH0/Xr17mOpI31FpeIqLi4mMLCwkgoFNL7779PDQ0NXEfqsQoKCig8PJwEAgEtX77c2nYNHmbdxSW6vxVISkoiR0dH8vPzo1OnTnEdqUdpamqixMREEovFNHLkSMrKyuI6kj6sv7gtfv/9d5o2bRrxeDyaOXMmFRcXcx2p20tPT6dhw4aRnZ0dJSYmWvtW9kHdp7gtvvnmGxo0aBA5ODjQqlWr2Js3I+Tl5dEzzzxDPB6PYmNju+NGoPsVl+j+uQ6JiYnk6OhInp6e9Mknn7D9Xz0olUp6/fXXSSAQUEBAQHc+T6R7FrfFzZs36a233iKRSEQ+Pj705ZdfUmNjI9exrE5RURHNnTuXhEIh+fn50c6dO0mtVnMdqyu6d3FbKJXK1jOWBgwYQKtXr6Y7d+5wHYtzWVlZNGvWLBIIBOTt7U3btm2j5uZmrmOZQs8obovr16/Tn//8Z3JyciJHR0dasGAB5ebmch3LohoaGmjfvn0UHh5OACggIIB2797dUwrbomcVt8WdO3dozZo1NHjwYAJAY8eOpW3btlF1dTXX0cwmNzeXFi1aRO7u7iQQCGjKlCl04sQJrmOZS88s7oOysrLo9ddfJzs7OxKLxRQTE0Pbt2+nu3fvch2tywoLC+mTTz6hkJAQAkCenp70/vvvk1Kp5DqauW006d0ardnt27eRnJyM/fv34+TJkxAKhQgPD0dUVBQiIyPh5+fHdcRONTY24ocffkBaWhpSU1Nx+fJleHh44LnnnkNsbCxCQkKM/Rab7sa0txntLioqKnD48GGkpaXhxIkTuHPnDnx9fREaGoqQkBCEhIRg6NChnN/jt7a2FgqFAnK5vPVRV1eHYcOGISoqCjExMQgNDTXrHWOsVO8s7oNUKhUyMzNx4sQJyOVyKBQK1NbWwsXFBf7+/pBKpfD398fw4cPh6+uL/v37mzxDY2MjlEolCgoKkJeXh+zsbOTl5SE/Px8qlQo+Pj4ICQlBWFgYJk6ciIEDB5o8QzfDivswlUqF7OxsKBQK5OTkICcnB3l5eaipqQEASCQS+Pj4YNCgQejbty/c3Nzg7u4ONzc3iMViODg4AADs7e3R2NgIlUoFtVqNu3fvor6+HhUVFaisrER5eTlKS0tRVFSE0tJStPw1eHt7QyqVQiqVIiAgAMHBwXj00Uc5+3lYKVZcfRARrl+/DqVSiaKiIiiVSiiVSlRWVrZ5NDU1tRb8QQKBAI6OjrC1tYWbm1tr2fv37w9vb294e3vDx8cHvr6+cHZ25uD/sNthxTWX2tpaiMVi9o2b5rHJrHdr7M1adhkY8+gVx06YnocVl+mWBAC2cB2CYQwk/1/dMnNcyagp2AAAAABJRU5ErkJggg==", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Create PNG representation with circle shape\n", + "viz.visualize(a.get_struct(), shape=\"circle\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "a38ab2d0-7615-4c01-9bb1-08eedb6ca83c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Create PNG representation with ellipse shape\n", + "viz.visualize(a.get_struct(), shape=\"ellipse\")" + ] + }, + { + "cell_type": "markdown", + "id": "26ef1289-119b-43f2-b683-37ffc73f237b", + "metadata": {}, + "source": [ + "# Conclusion\n", + "\n", + "This guide provides clear instructions and a simple example for you to start using the ASTx library. But this is just the beginning of your journey. Make sure to check out the other tutorials available, such as the one for [variables](https://github.com/arxlang/astx/blob/main/docs/tutorials/variables.ipynb) and the one for [functions](https://github.com/arxlang/astx/blob/main/docs/tutorials/functions.ipynb)." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pages/blog/console-based-representation-in-astx/index.md b/pages/blog/console-based-representation-in-astx/index.md new file mode 100644 index 000000000..fb4cbef10 --- /dev/null +++ b/pages/blog/console-based-representation-in-astx/index.md @@ -0,0 +1,394 @@ +--- +title: "Console-based representation in ASTx" +slug: "console-based-representation-in-astx" +date: 2024-08-08 +authors: ["Ana Krelling", "Ivan Ogasawara"] +tags: ["abstract syntax tree", "ascii", "console"] +categories: ["abstract syntax tree", "console"] +description: | + Recently, console-based AST representation was included in the ASTx framework. Such feature can enhance the debugging and analysis capabilities of ASTx, particularly in environments such as a pdb session. In this tutorial, we'll explore this new feature as well as the ASTx Graphviz visualization. +thumbnail: "/header.png" +template: "blog-post.html" +--- +# Introduction + +The ASTx library is an agnostic framework for constructing and representing Abstract Syntax Trees (ASTs). Its primary objective is to provide a versatile and language-independent structure for ASTs, with the flexibility to be utilized across various programming languages and parsing tools. ASTx doesn't aim to be a lexer or a parser, although it could be used by any programming language or parser written in Python in order to provide a high level representation of the AST. + +Many kinds of nodes (classes) are currently supported. Below is a list with just some examples: + +##### Statements: +* Function +* Function Prototype +* FunctionReturn +* ForRangeLoop +* VarDecl + +##### Operators: +* BinaryOp +* UnaryOp + +##### Data types: +* Boolean +* Literal +* Variable + + +The ASTx project is still under development, so new classes may be added to the ones above at any time. + +Below are installation instructions and an example, so you can have an overview of how you can leverage the ASTx library for your needs. + +# Installation +The first step is to install ASTx. You can do it simply by running the command below in your terminal:\ +`$ pip install astx`\ +If you need more information on installation, you can get it in the [ASTx installation page](https://github.com/arxlang/astx/blob/main/docs/installation.md). +After that, you can just open a Jupyter Notebook instance and start writing your first AST. + + +# Example: an AST of a series of mathematical operations +Here we will present a quick example of an AST of the expression \ +`basic_op = lit_1 + b - a * c / a + (b - a / a)`, in which \ +$~~~~$ `lit_1` is a defined integer, and \ +$~~~~$ `a`, `b`, and `c` are variables.\ +The first thing to do is, in your Jupyter Notebook instance, import `display`, which will allow you to have a basic visualization of the AST, and the astx library itself. + + +```python +# import display for AST visualization +import astx + +from astx.viz import graph_to_ascii, traverse_ast_ascii +``` + +Then we create an instance of the Module class, and this instance will be the first node of the tree, or the root node. After that, we declare the variables and literal that will be part of the basic operation that we will parse into an AST. + + +```python +# Create module +module = astx.Module() + +# Declare variables +decl_a = astx.VariableDeclaration(name="a", type_=astx.Int32, value=astx.LiteralInt32(1)) +decl_b = astx.VariableDeclaration(name="b", type_=astx.Int32, value=astx.LiteralInt32(2)) +decl_c = astx.VariableDeclaration(name="c", type_=astx.Int32, value=astx.LiteralInt32(4)) + +a = astx.Variable(name="a") +b = astx.Variable(name="b") +c = astx.Variable(name="c") + +# Declare literal +lit_1 = astx.LiteralInt32(1) + +# State the expression +basic_op = lit_1 + b - a * c / a + (b - a / a) +``` + +After the basic expression is stated, we create an instance of the Function class. As mentioned in the API documentation, each instance of the Function class must have a prototype and a body, so we'll create those first. + +The body is made of a block that is created and the variables, as well as the basic operation, are appended to it afterwards. + + +```python +# Create FunctionPrototype +main_proto = astx.FunctionPrototype( + name="main", args=astx.Arguments(), return_type=astx.Int32 +) + +# Create FunctionReturn +main_block = astx.Block() +main_block.append(decl_a) +main_block.append(decl_b) +main_block.append(decl_c) +main_block.append(astx.FunctionReturn(basic_op)) + +# Create Function +main_fn = astx.Function(prototype=main_proto, body=main_block) + +# Append function to module +module.block.append(main_fn) +``` + +After this, the module is complete. We can get its AST structure as a dictionary, as well as a PNG representation. + + +```python +# Create dictionary representation +module.get_struct() +``` + + + + +
    +

    + OUTPUT + +

    +
    +  
    +{'MODULE[main]': {'content': [{'FUNCTION[main]': {'content': {'args': {'Arguments(0)': {'content': [],
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}},
    +'body': {'BLOCK': {'content': [{'VariableDeclaration[a, Int32]': {'content': {'Literal[Int32]: 1': {'content': 1,
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': 'c4848732a3c542f1b3818bc799dc0b26',
    +'kind': }}},
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}},
    +{'VariableDeclaration[b, Int32]': {'content': {'Literal[Int32]: 2': {'content': 2,
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': 'b63f0bf700194bb7abbdf99d8cc20336',
    +'kind': }}},
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}},
    +{'VariableDeclaration[c, Int32]': {'content': {'Literal[Int32]: 4': {'content': 4,
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '0c0686b5f12a45bd9ff1a20da82702a0',
    +'kind': }}},
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}},
    +{'RETURN': {'content': {'BINARY[+]': {'content': {'lhs': {'BINARY[-]': {'content': {'lhs': {'BINARY[+]': {'content': {'lhs': {'Literal[Int32]: 1': {'content': 1,
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '8d5d86d52b98484a8e5947ae4e6556f1',
    +'kind': }}},
    +'rhs': {'Variable[b]': {'content': 'b',
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}}},
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}},
    +'rhs': {'BINARY[/]': {'content': {'lhs': {'BINARY[*]': {'content': {'lhs': {'Variable[a]': {'content': 'a',
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}},
    +'rhs': {'Variable[c]': {'content': 'c',
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}}},
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}},
    +'rhs': {'Variable[a]': {'content': 'a',
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}}},
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}}},
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}},
    +'rhs': {'BINARY[-]': {'content': {'lhs': {'Variable[b]': {'content': 'b',
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}},
    +'rhs': {'BINARY[/]': {'content': {'lhs': {'Variable[a]': {'content': 'a',
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}},
    +'rhs': {'Variable[a]': {'content': 'a',
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}}},
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}}},
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}}},
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}},
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}}],
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}}},
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}}],
    +'metadata': {'loc': {line: -1, col: -1},
    +'comment': '',
    +'ref': '',
    +'kind': }}}
    +
    +
    +
    + + + + +```python +# Create ascii representation +dot_graph = traverse_ast_ascii(module.get_struct(simplified=True)) +graph = graph_to_ascii(dot_graph) +print(graph) +``` + +![non-funky_ascii_tree.png](index_files/0d8393a6-fb00-4364-8f2f-319295075948.png) + + +```python +# Create PNG representation +module +``` + + + +![png](index_files/index_11_0.png) + + + + + + +
    +

    + OUTPUT + +

    +
    +  
    +
    +
    +
    +
    + + + +We can also get the PNG representation of parts of the AST, such as `basic_op` and the variable `a`: + + +```python +# Create PNG representation +basic_op +``` + + + +![png](index_files/index_13_0.png) + + + + + + +
    +

    + OUTPUT + +

    +
    +  
    +
    +
    +
    +
    + + + + +```python +# Create PNG representation +a +``` + + + +![png](index_files/index_14_0.png) + + + + + + +
    +

    + OUTPUT + +

    +
    +  
    +
    +
    +
    +
    + + + +## Custom shapes + +It is also possible to use custom shapes for the output using the function `viz.visualize`. The Default shape is `box`, but `diamond`, `ellipse`, and `circle` are also avaiable options. + + +```python +# Import visualization module +from astx import viz + +# Create PNG representation with diamond shape +viz.visualize(a.get_struct(), shape="diamond") +``` + + + +![png](index_files/index_16_0.png) + + + + +```python +# Create PNG representation with circle shape +viz.visualize(a.get_struct(), shape="circle") +``` + + + +![png](index_files/index_17_0.png) + + + + +```python +# Create PNG representation with ellipse shape +viz.visualize(a.get_struct(), shape="ellipse") +``` + + + +![png](index_files/index_18_0.png) + + + +# Conclusion + +This guide provides clear instructions and a simple example for you to start using the ASTx library. But this is just the beginning of your journey. Make sure to check out the other tutorials available, such as the one for [variables](https://github.com/arxlang/astx/blob/main/docs/tutorials/variables.ipynb) and the one for [functions](https://github.com/arxlang/astx/blob/main/docs/tutorials/functions.ipynb). diff --git a/pages/blog/console-based-representation-in-astx/index_files/0d8393a6-fb00-4364-8f2f-319295075948.png b/pages/blog/console-based-representation-in-astx/index_files/0d8393a6-fb00-4364-8f2f-319295075948.png new file mode 100644 index 000000000..2643be25b Binary files /dev/null and b/pages/blog/console-based-representation-in-astx/index_files/0d8393a6-fb00-4364-8f2f-319295075948.png differ diff --git a/pages/blog/console-based-representation-in-astx/index_files/index_10_0.png b/pages/blog/console-based-representation-in-astx/index_files/index_10_0.png new file mode 100644 index 000000000..297df22d8 Binary files /dev/null and b/pages/blog/console-based-representation-in-astx/index_files/index_10_0.png differ diff --git a/pages/blog/console-based-representation-in-astx/index_files/index_11_0.png b/pages/blog/console-based-representation-in-astx/index_files/index_11_0.png new file mode 100644 index 000000000..297df22d8 Binary files /dev/null and b/pages/blog/console-based-representation-in-astx/index_files/index_11_0.png differ diff --git a/pages/blog/console-based-representation-in-astx/index_files/index_12_0.png b/pages/blog/console-based-representation-in-astx/index_files/index_12_0.png new file mode 100644 index 000000000..5ff07bfd8 Binary files /dev/null and b/pages/blog/console-based-representation-in-astx/index_files/index_12_0.png differ diff --git a/pages/blog/console-based-representation-in-astx/index_files/index_13_0.png b/pages/blog/console-based-representation-in-astx/index_files/index_13_0.png new file mode 100644 index 000000000..5ff07bfd8 Binary files /dev/null and b/pages/blog/console-based-representation-in-astx/index_files/index_13_0.png differ diff --git a/pages/blog/console-based-representation-in-astx/index_files/index_14_0.png b/pages/blog/console-based-representation-in-astx/index_files/index_14_0.png new file mode 100644 index 000000000..509062905 Binary files /dev/null and b/pages/blog/console-based-representation-in-astx/index_files/index_14_0.png differ diff --git a/pages/blog/console-based-representation-in-astx/index_files/index_15_0.png b/pages/blog/console-based-representation-in-astx/index_files/index_15_0.png new file mode 100644 index 000000000..67001b318 Binary files /dev/null and b/pages/blog/console-based-representation-in-astx/index_files/index_15_0.png differ diff --git a/pages/blog/console-based-representation-in-astx/index_files/index_16_0.png b/pages/blog/console-based-representation-in-astx/index_files/index_16_0.png new file mode 100644 index 000000000..67001b318 Binary files /dev/null and b/pages/blog/console-based-representation-in-astx/index_files/index_16_0.png differ diff --git a/pages/blog/console-based-representation-in-astx/index_files/index_17_0.png b/pages/blog/console-based-representation-in-astx/index_files/index_17_0.png new file mode 100644 index 000000000..003acccef Binary files /dev/null and b/pages/blog/console-based-representation-in-astx/index_files/index_17_0.png differ diff --git a/pages/blog/console-based-representation-in-astx/index_files/index_18_0.png b/pages/blog/console-based-representation-in-astx/index_files/index_18_0.png new file mode 100644 index 000000000..043b8e388 Binary files /dev/null and b/pages/blog/console-based-representation-in-astx/index_files/index_18_0.png differ diff --git a/pages/blog/exploring-llama-2-a-paradigm-shift-in-large-language-models/header.png b/pages/blog/exploring-llama-2-a-paradigm-shift-in-large-language-models/header.png new file mode 100644 index 000000000..92fd10edb Binary files /dev/null and b/pages/blog/exploring-llama-2-a-paradigm-shift-in-large-language-models/header.png differ diff --git a/pages/blog/exploring-llama-2-a-paradigm-shift-in-large-language-models/index.ipynb b/pages/blog/exploring-llama-2-a-paradigm-shift-in-large-language-models/index.ipynb new file mode 100644 index 000000000..cb92cbb98 --- /dev/null +++ b/pages/blog/exploring-llama-2-a-paradigm-shift-in-large-language-models/index.ipynb @@ -0,0 +1,116 @@ +{ + "cells": [ + { + "cell_type": "raw", + "id": "00f06fca-0418-47c9-966d-e0afd0dc3399", + "metadata": {}, + "source": [ + "---\n", + "title: Exploring LLama-2,A Paradigm Shift in Large Language Models\n", + "slug: exploring-llama-2-a-paradigm-shift-in-large-language-models\n", + "date: 2024-02-05\n", + "authors:\n", + " - Satarupa Deb\n", + "tags:\n", + " - open-source\n", + " - Machine Learning\n", + " - LLM\n", + " - python\n", + "categories:\n", + " - Python\n", + " - Machine Learning\n", + " - Natural Language Processing\n", + "description: |\n", + " Embark on an exploration of LLama-2, a game-changing innovation in\n", + " large language models, igniting dialogue applications with cutting-edge\n", + " performance and a commitment to ethical research practices.\n", + "thumbnail: /header.png\n", + "template: blog-post.html\n", + "\n", + "---\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "693ca0dc-d620-43c3-aae6-13d9a8751178", + "metadata": {}, + "source": [ + "# Exploring LLama-2: A Paradigm Shift in Large Language Models\n", + "\n", + "In the realm of artificial intelligence, language models have evolved significantly, reshaping how humans interact with technology. Among these advancements, LLama-2 stands out as a remarkable leap forward, offering cutting-edge performance tailored for dialogue applications while championing responsible research practices within the community.\n", + "\n", + "## Understanding LLama-2\n", + "\n", + "LLama-2 is not just another run-of-the-mill language model; it's a comprehensive collection of large language models (LLMs) meticulously crafted and released by a team of dedicated researchers led by Hugo Touvron and Louis Martin. What sets LLama-2 apart is its scalability, boasting models ranging from 7 billion to a staggering 70 billion parameters. These models are finely tuned and optimized specifically for dialogue applications, earning them the moniker \"LLama 2-Chat.\"\n", + "\n", + "## Performance Beyond Par\n", + "\n", + "The prowess of LLama 2-Chat shines through empirical evidence, showcasing superior performance compared to existing open-source chat models across various benchmarks. Human evaluations, focusing on metrics such as helpfulness and safety, have underscored LLama 2-Chat's potential as a compelling alternative to closed-source models. This performance excellence is a testament to the rigorous fine-tuning process and safety enhancements meticulously integrated into LLama-2's development.\n", + "\n", + "## Unlocking LLama-2: Installation Guide\n", + "\n", + "For those eager to harness the power of LLama-2, the installation process is straightforward, albeit with a few essential steps:\n", + "\n", + "To install Llama-2 models, follow these steps:\n", + "\n", + "1. Visit the Llama [download form](https://ai.meta.com/resources/models-and-libraries/llama-downloads/) on the official website and accept the License Agreement.\n", + "\n", + "2. Once your request is approved, you will receive a signed URL over email. Check your email inbox (including spam/junk folders) for the email containing the signed URL.\n", + "\n", + "3. Clone the Llama 2 repository from the provided link. You can typically do this using a Git command like:\n", + "\n", + " ```\n", + " git clone \n", + " ```\n", + "\n", + " Replace `` with the URL of the Llama 2 repository provided to you.\n", + "\n", + "4. Navigate to the directory where you cloned the Llama 2 repository.\n", + "\n", + "5. Run the `download.sh` script from the terminal, passing the signed URL provided in the email when prompted to start the download. You can run the script using the following command:\n", + "\n", + " ```\n", + " bash download.sh\n", + " ```\n", + "\n", + " Follow the on-screen instructions and paste the signed URL when prompted.\n", + "\n", + "It's worth noting that signed URLs expire after 24 hours, so timely action is crucial. In case of errors during the download process, re-requesting a new signed URL is the solution to ensure a seamless installation experience.\n", + "\n", + "## Hardware Requirements: Unleashing LLama-2's Power\n", + "\n", + "To unleash the full potential of LLama-2, adequate hardware is paramount. While a graphics card with at least 10GB of VRAM suffices for the 7B model, higher-end GPUs like the RTX 3090 or RTX 4090 are recommended for optimal performance, especially with larger models. For the behemoth 70B parameter model, enterprise-grade hardware like the NVIDIA A100 with 80GB of memory is indispensable.\n", + "\n", + "## Navigating LLama-2 Restrictions\n", + "\n", + "Despite its open-source nature, LLama-2 comes with certain restrictions, particularly concerning commercial use. Developers and commercial users must adhere to Meta's guidelines, including obtaining a license for popular applications and refraining from using LLama-2 output to enhance other large language models.\n", + "\n", + "## Final Thoughts\n", + "\n", + "LLama-2 heralds a new era in dialogue applications, pushing the boundaries of what's possible with language models while upholding ethical standards and responsible research practices. Whether you're a researcher, developer, or enthusiast, LLama-2 opens doors to a world of innovative possibilities, paving the way for transformative interactions between humans and machines.\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pages/blog/exploring-llama-2-a-paradigm-shift-in-large-language-models/index.md b/pages/blog/exploring-llama-2-a-paradigm-shift-in-large-language-models/index.md new file mode 100644 index 000000000..2e751456c --- /dev/null +++ b/pages/blog/exploring-llama-2-a-paradigm-shift-in-large-language-models/index.md @@ -0,0 +1,79 @@ +--- +title: Exploring LLama-2,A Paradigm Shift in Large Language Models +slug: exploring-llama-2-a-paradigm-shift-in-large-language-models +date: 2024-02-05 +authors: + - Satarupa Deb +tags: + - open-source + - Machine Learning + - LLM + - python +categories: + - Python + - Machine Learning + - Natural Language Processing +description: | + Embark on an exploration of LLama-2, a game-changing innovation in + large language models, igniting dialogue applications with cutting-edge + performance and a commitment to ethical research practices. +thumbnail: /header.png +template: blog-post.html + +--- + + +# Exploring LLama-2: A Paradigm Shift in Large Language Models + +In the realm of artificial intelligence, language models have evolved significantly, reshaping how humans interact with technology. Among these advancements, LLama-2 stands out as a remarkable leap forward, offering cutting-edge performance tailored for dialogue applications while championing responsible research practices within the community. + +## Understanding LLama-2 + +LLama-2 is not just another run-of-the-mill language model; it's a comprehensive collection of large language models (LLMs) meticulously crafted and released by a team of dedicated researchers led by Hugo Touvron and Louis Martin. What sets LLama-2 apart is its scalability, boasting models ranging from 7 billion to a staggering 70 billion parameters. These models are finely tuned and optimized specifically for dialogue applications, earning them the moniker "LLama 2-Chat." + +## Performance Beyond Par + +The prowess of LLama 2-Chat shines through empirical evidence, showcasing superior performance compared to existing open-source chat models across various benchmarks. Human evaluations, focusing on metrics such as helpfulness and safety, have underscored LLama 2-Chat's potential as a compelling alternative to closed-source models. This performance excellence is a testament to the rigorous fine-tuning process and safety enhancements meticulously integrated into LLama-2's development. + +## Unlocking LLama-2: Installation Guide + +For those eager to harness the power of LLama-2, the installation process is straightforward, albeit with a few essential steps: + +To install Llama-2 models, follow these steps: + +1. Visit the Llama [download form](https://ai.meta.com/resources/models-and-libraries/llama-downloads/) on the official website and accept the License Agreement. + +2. Once your request is approved, you will receive a signed URL over email. Check your email inbox (including spam/junk folders) for the email containing the signed URL. + +3. Clone the Llama 2 repository from the provided link. You can typically do this using a Git command like: + + ``` + git clone + ``` + + Replace `` with the URL of the Llama 2 repository provided to you. + +4. Navigate to the directory where you cloned the Llama 2 repository. + +5. Run the `download.sh` script from the terminal, passing the signed URL provided in the email when prompted to start the download. You can run the script using the following command: + + ``` + bash download.sh + ``` + + Follow the on-screen instructions and paste the signed URL when prompted. + +It's worth noting that signed URLs expire after 24 hours, so timely action is crucial. In case of errors during the download process, re-requesting a new signed URL is the solution to ensure a seamless installation experience. + +## Hardware Requirements: Unleashing LLama-2's Power + +To unleash the full potential of LLama-2, adequate hardware is paramount. While a graphics card with at least 10GB of VRAM suffices for the 7B model, higher-end GPUs like the RTX 3090 or RTX 4090 are recommended for optimal performance, especially with larger models. For the behemoth 70B parameter model, enterprise-grade hardware like the NVIDIA A100 with 80GB of memory is indispensable. + +## Navigating LLama-2 Restrictions + +Despite its open-source nature, LLama-2 comes with certain restrictions, particularly concerning commercial use. Developers and commercial users must adhere to Meta's guidelines, including obtaining a license for popular applications and refraining from using LLama-2 output to enhance other large language models. + +## Final Thoughts + +LLama-2 heralds a new era in dialogue applications, pushing the boundaries of what's possible with language models while upholding ethical standards and responsible research practices. Whether you're a researcher, developer, or enthusiast, LLama-2 opens doors to a world of innovative possibilities, paving the way for transformative interactions between humans and machines. + diff --git a/pages/blog/first-time-contributors/header.jpeg b/pages/blog/first-time-contributors/header.jpeg new file mode 100644 index 000000000..74d972f72 Binary files /dev/null and b/pages/blog/first-time-contributors/header.jpeg differ diff --git a/pages/blog/first-time-contributors/index.ipynb b/pages/blog/first-time-contributors/index.ipynb new file mode 100644 index 000000000..3698d5a4a --- /dev/null +++ b/pages/blog/first-time-contributors/index.ipynb @@ -0,0 +1,707 @@ +{ + "cells": [ + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "---\n", + "title: \"First Time Contributors\"\n", + "slug: first-time-contributors\n", + "date: 2024-04-08\n", + "authors: [\"Daniela Iglesias Rocabado\"]\n", + "tags: [open-source, contributors, git, osl]\n", + "categories: [contributors]\n", + "description: |\n", + " First Time Contributors\" refers to individuals making their initial foray into contributing to open-source projects within scientific laboratories. These newcomers bring diverse skills and fresh perspectives, enriching the collaborative environment. Embracing inclusivity and providing guidance fosters their engagement, leading to innovative solutions in open science.\n", + "thumbnail: \"/header.jpeg\"\n", + "template: \"blog-post.html\"\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Diving into project development can be overwhelming for beginners. A first-timers guide is key to navigate this unfamiliar terrain. From understanding basics to mastering tools, it'll help you contribute effectively. Join us as we explore how to get started in a development project!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Avoiding Issues in Your First Contributions\n", + "\n", + "The world of open-source programming project development is a vibrant and collaborative space, but it can also be daunting for those venturing in for the first time. We've noticed that new contributors often face significant challenges when taking their first steps in this environment. That's why we've created this first-timers guide.\n", + "\n", + "Our aim is to provide a comprehensive resource that helps newcomers overcome initial barriers and start contributing effectively right from the get-go. By offering a guide that covers everything from the basics to best practices in open-source project development, we hope to streamline the onboarding process and foster a more inclusive and productive collaborative environment.\n", + "\n", + "This guide will not only be beneficial for those starting their journey in open-source projects but will also serve as the primary reference for all affiliated projects and projects under the OSL Incubator Program. By standardizing practices and promoting a common understanding of the processes involved, we aim to enhance the experience for all contributors and promote more efficient and high-quality development in our open-source projects." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Getting Started\n", + "\n", + "In this guide, we'll tackle the common challenges that newcomers encounter in open-source projects. These include navigating Git and establishing your development environment. We'll provide step-by-step instructions on Git fundamentals and setting up your virtual workspace seamlessly.\n", + "\n", + "Additionally, we will offer further advice for the contributor to start with a solid initial structure, thus ensuring that their project is well-organized from the outset. From the initial setup to active contribution in the project, this guide aims to provide contributors with the tools and knowledge needed to effectively contribute to open-source programming projects." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# GIT\n", + "\n", + "## What is Git?\n", + "Git is a widely used distributed version control system in software development. It allows project collaborators to work collaboratively on the same set of files, recording changes, merging contributions, and maintaining a detailed history of all modifications made to the source code.\n", + "\n", + "## How to install Git?\n", + "To install Git, you can follow these steps:\n", + "\n", + "1. **Windows Operating System:** You can download the Git installer from the [official Git website](https://gitforwindows.org/). Once downloaded, run the installer and follow the installation wizard instructions.\n", + "\n", + "2. **macOS Operating System:** Git is usually pre-installed on macOS. However, if it's not installed or you want to update it, you can do so through the command line or using package management tools like Homebrew.\n", + "\n", + "3. **Linux Operating System:** In most Linux distributions, Git is available in the default package repositories. You can install it using the package manager specific to your distribution, such as apt for Ubuntu or yum for CentOS.\n", + "\n", + "For more detailed material on Git, we recommend using the Software Carpentry material, which is more focused on people who already have basic knowledge of Git but still face difficulties. You can access the material at the following link: [Software Carpentry - Git Novice](https://carpentries.github.io/workshop-template/install_instructions/#git-1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## First Steps to Collaborating on a Project\n", + "\n", + "### Understanding Repository Forking\n", + "When embarking on a collaborative project, the first step often involves forking a repository. Forking is a fundamental aspect of version control systems like Git, enabling individuals or teams to create their own copy of a project's repository. This copy acts as a sandbox where contributors can freely experiment, make changes, and propose improvements without affecting the original project.\n", + "\n", + "#### Steps to Forking a Repository\n", + "1. **Navigate to the Repository:** Visit the project's repository on the hosting platform, such as GitHub, GitLab, or Bitbucket.\n", + "\n", + "2. **Locate the Fork Button:** Look for the \"Fork\" button on the repository's page. This button is usually located in the top-right corner. Clicking it will initiate the forking process.\n", + "\n", + "3. **Choose Destination:** When prompted, select where you want to fork the repository. You can fork it to your personal account or to an organization you're a part of.\n", + "\n", + "4. **Wait for Forking to Complete:** The platform will create a copy of the repository in your account or organization. Depending on the size of the repository and the platform's load, this process may take a few seconds to complete.\n", + "\n", + "5. **Clone Your Forked Repository:** Once the forking process is finished, clone the forked repository to your local machine using Git. This will create a local copy of the repository that you can work on.\n", + "\n", + "#### Benefits of Forking a Repository\n", + "- **Independence:** Forking gives you complete control over your copy of the project. You can modify it as you see fit without impacting the original.\n", + "\n", + "- **Experimentation:** Forking provides a safe environment for experimenting with changes. You can try out new features, fix bugs, or test ideas without risking the stability of the main project.\n", + "\n", + "- **Collaboration:** Forking facilitates collaboration by enabling contributors to work on different aspects of the project simultaneously. Once you've made improvements or fixes in your fork, you can propose them to the original project through a pull request.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### What is a Pull Request / Merge Request and why is it important?\n", + "\n", + "A Pull Request (PR) is a proposed change that a collaborator makes to a code repository managed by a version control system such as Git. It's essentially a request for the changes made in one branch of a repository to be incorporated into another branch, usually the main branch. Pull Requests are essential in the collaborative workflow of software development, as they allow teams to review, discuss, and approve changes before they are merged into the codebase. This facilitates collaboration, improves code quality, and helps maintain a clear history of modifications made to the project.\n", + "\n", + "### Steps for creating a good Pull Request:\n", + "\n", + "1. **Create a feature branch:** Before starting to make changes to the code, create a new branch in the repository that clearly describes the purpose of the changes you plan to make. This helps keep the development organized and makes code review easier.\n", + "\n", + "2. **Make necessary changes:** Once you're on your feature branch, make the changes to the code as planned. Make sure to follow the project's coding conventions and write unit tests if necessary.\n", + "\n", + "3. **Update documentation if necessary:** If your changes affect existing functionality or introduce new features, it's important to update the corresponding documentation, such as code comments or user documentation.\n", + "\n", + "4. **Create the Pull Request:** Once you've completed your changes and are ready to request review, create a Pull Request. Provide a clear and concise description of the purpose of your changes, as well as any relevant context to facilitate review by your team members.\n", + "\n", + "5. **Request review:** After creating the Pull Request, assign relevant reviewers to examine your changes. This may include other developers on the team, technical leads, or anyone with expertise in the area affected by your modifications.\n", + "\n", + "6. **Respond to comments and make adjustments if necessary:** Once reviewers have provided feedback on your Pull Request, take the time to respond to their questions and make any necessary adjustments to your code. It's important to collaborate constructively during this process to ensure that the proposed changes are of the highest possible quality.\n", + "\n", + "By following these steps, you can effectively contribute to a project's development through Pull Requests that are easy to review, approve, and merge, ultimately leading to stronger code and more efficient teamwork.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Remotes Repositories\n", + "\n", + "In version control systems like Git, a remote repository is essentially a copy of your local repository stored on a server somewhere else, often online. It acts as a central hub for collaboration and version control.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Origin: This remote, typically created by default when cloning the repository, points to your fork on GitHub.\n", + "- Upstream: This remote points to the original (upstream) repository you forked from. It allows you to stay updated with the main project's development.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Creating the Upstream Remote\n", + "\n", + "```bash\n", + "git remote add upstream \n", + "```\n", + "\n", + "Using the Upstream Remote:\n", + "\n", + "Fetching Updates: Regularly use `git fetch upstream` to download the latest changes from the upstream repository without merging them into your local branch.\n", + "Creating Feature Branches: When starting work on a new feature, it's recommended to base your branch on the latest upstream main branch:\n", + "\n", + "```bash\n", + "git checkout upstream/main\n", + "git checkout -b my-feature-branch\n", + "```\n", + "This ensures your feature branch incorporates the most recent upstream developments." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Understanding Merge Commit vs. Rebase in Git\n", + "\n", + "In Git, managing branches is a fundamental aspect of collaboration and version control. When integrating changes from one branch to another, developers often encounter two primary methods: merge commit and rebase. Both approaches have their advantages and trade-offs, influencing how teams collaborate and maintain a clean project history. Let's delve into each method:\n", + "\n", + "### Merge Commit\n", + "\n", + "A merge commit, as the name suggests, involves creating a new commit to merge changes from one branch into another. Here's how it typically works:\n", + "\n", + "1. **Branch Divergence**: Suppose you have a feature branch (`feature`) and a main branch (`main` or `master`). As work progresses, both branches diverge, accumulating different commits.\n", + "\n", + "2. **Merge Process**: When it's time to integrate changes from `feature` into `main`, you execute a merge command. Git creates a new commit, known as a merge commit, to combine the histories of both branches.\n", + "\n", + "3. **Commit History**: The merge commit preserves the entire history of changes from both branches, making it clear when and how the integration occurred.\n", + "\n", + "4. **Parallel Development**: Merge commits allow parallel development, enabling team members to work independently without affecting each other's changes.\n", + "\n", + "### Rebase\n", + "\n", + "Rebasing is an alternative method for integrating changes, involving rewriting commit history to maintain a linear project history. Here's how it differs from merge commit:\n", + "\n", + "1. **Branch Adjustment**: Instead of creating a merge commit, rebasing adjusts the commit history of the feature branch (`feature`) to appear as if it originated from the tip of the main branch (`main` or `master`).\n", + "\n", + "2. **Commit Replay**: Git replays each commit from the feature branch onto the tip of the main branch, effectively transplanting the changes onto a different base.\n", + "\n", + "3. **Linear History**: By rewriting commit history, rebasing creates a linear sequence of commits, making the project history cleaner and easier to follow.\n", + "\n", + "4. **Conflict Resolution**: Rebasing can lead to conflicts if changes from the feature branch conflict with those on the main branch. These conflicts must be resolved manually during the rebase process." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " Recommendations and Best Practices\n", + "\n", + "While both merge commit and rebase have their merits, the choice often depends on the team's workflow and preferences. Here are some considerations:\n", + "\n", + "**Merge Commit**:\n", + "\n", + "* Suitable for preserving a detailed history of parallel development.\n", + "* Preferred when collaboration involves multiple contributors or when maintaining a clear record of individual contributions is essential.\n", + "\n", + "**Rebase**:\n", + "\n", + " - Promotes a cleaner, linear project history.\n", + " - Recommended for feature branches with short-lived changes or when maintaining a tidy commit history is a priority.\n", + "\n", + "It's worth noting that some organizations, such as the Open Source Initiative (OSI), recommend the usage of git rebase to maintain a clean and linear project history. You can configure Git to use rebase by default for pull operations with the command:\n", + "\n", + "```bash\n", + "$ git config --global pull.rebase true\n", + "```\n", + "\n", + "OSL recommends the usage of git rebase\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Mergin a Pull Requests (PRs)\n", + "Pull requests (PRs) are essential for collaborative software development, enabling contributors to propose changes to a project's codebase. Once a PR is submitted, it undergoes a review process before being merged into the main codebase. Here are three common methods for merging PRs:\n", + "\n", + "#### 1. Merge Commit:\n", + "A merge commit combines changes from different branches in version control systems like Git. It records the integration of these changes, preserving their histories and keeping the project's development organized.\n", + "\n", + "Use when you want to keep a detailed history of changes from multiple branches. It preserves individual commit histories, making it suitable for tracking the development of feature branches and bug fixes separately.\n", + "\n", + "\n", + "#### 2. Squash and Merge:\n", + "\"Squash and merge\" condenses multiple commits into one before merging, simplifying the project's commit history.\n", + "\n", + "Employ when you have multiple small, related commits that you want to consolidate into a single, more meaningful commit. It's useful for cleaning up the commit history, especially before merging feature branches into the main branch.\n", + "\n", + "#### 3. Rebase and Merge:\n", + "\"Rebase and merge\" rewrites commit history to integrate changes from one branch into another, maintaining a cleaner and more linear history.\n", + "\n", + "Opt for this method when you want to maintain a clean and linear commit history by incorporating changes from one branch into another. It helps to avoid unnecessary merge commits, keeping the commit history straightforward and easier to follow.\n", + "\n", + "\n", + "Each method offers distinct advantages and considerations, influencing the project's commit history and overall workflow.\n", + "\n", + "In their development workflow, **Open Science Labs** recommend using squash and merge." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Pre-commit\n", + "\n", + "Pre-commit is a tool used in software development to automatically run various checks and tests on files before they are committed to a version control system, such as Git. These checks can include code formatting, linting, static analysis, and other quality assurance tasks. The goal is to catch potential issues early in the development process, ensuring that only high-quality code is committed to the repository.\n", + "\n", + "Here's how to install and use pre-commit:\n", + "\n", + "1. Installation:\n", + "You can install pre-commit using pip, the Python package manager. Open your terminal or command prompt and run:\n", + "\n", + "``` bash\n", + "$ pip install pre-commit\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2. Configuration:\n", + "Once pre-commit is installed, you need to set up a configuration file named .pre-commit-config.yaml in the root directory of your project. This file specifies the hooks (checks) that pre-commit should run.\n", + "\n", + "Here's a basic example of a `.pre-commit-config.yaml` file:\n", + "\n", + "``` yaml\n", + "repos:\n", + " - repo: https://github.com/pre-commit/pre-commit-hooks\n", + " rev: v3.3.0\n", + " hooks:\n", + " - id: trailing-whitespace\n", + " - id: end-of-file-fixer\n", + " - id: check-yaml\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "3. Installation of Git Hooks:\n", + "After configuring `.pre-commit-config.yaml`, you need to install pre-commit hooks into your Git repository. Navigate to your project directory in the terminal and run:\n", + "\n", + "``` bash\n", + "$ pre-commit install\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "4. Running Pre-commit:\n", + "Once the pre-commit hooks are installed, you can run them manually using the following command:\n", + "\n", + "```bash\n", + "$ pre-commit run --all-files\n", + "```\n", + "This command tells pre-commit to run all configured hooks on all files in the repository. It will check for issues according to the configuration specified in `.pre-commit-config.yaml` and provide feedback on any problems found.\n", + "\n", + "\n", + "The Git hooks are triggered each time the user initiates a git commit command. By default, they operate on the files that have been modified, but their behavior can be adjusted to encompass all files if configured accordingly in the .pre-commit-config.yaml file." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Navigating Git Workflows: A Dive into GitHub Flow and GitFlow\n", + "\n", + "In the ever-evolving world of software development, efficient collaboration and streamlined workflows are paramount. Git, the popular version control system, offers a plethora of options for managing code changes, each tailored to different team structures and project requirements. Two widely used workflows, GitHub Flow and GitFlow, stand out for their simplicity and effectiveness. Let's explore these options in detail.\n", + "\n", + "### GitHub Flow:\n", + "\n", + "GitHub Flow is a lightweight, branch-based workflow specifically designed for teams using GitHub for version control. It emphasizes simplicity and continuous delivery, making it an ideal choice for projects with frequent releases and rapid iteration cycles. Here's a breakdown of its key features:\n", + "\n", + "**Branching Model:**\n", + "\n", + " - Main Branch: GitHub Flow revolves around a single main branch (often named \"main\" or \"master\"), representing the development branch that leads to production-ready code.\n", + " - Feature Branches: Developers create feature branches off the main branch for each new feature or bug fix.\n", + "\n", + "\n", + "**Workflow:**\n", + "\n", + "- Create a Branch: Developers create a new branch for each feature or bug fix.\n", + "- Make Changes: Developers create a new branch, with the latest changes from upstream/main (or origin/main, if you are not working on a fork) for each feature or bug fix.\n", + "- Open Pull Request: Once changes are complete, a pull request (PR) is opened to merge the feature branch into the main branch.\n", + "- Review and Merge: Team members review the code changes, provide feedback, and merge the PR into the main branch once approved.\n", + "\n", + "**Continuous Deployment**:\n", + "\n", + "- Continuous Integration: GitHub Flow encourages the use of continuous integration tools to automatically test changes before merging.\n", + "- Continuous Deployment: Merged changes are automatically deployed to production, ensuring a fast and reliable release cycle.\n", + "\n", + "GitHub Flow's simplicity and flexibility make it a popular choice for teams of all sizes, particularly those embracing agile development practices.\n", + "\n", + "### GitFlow:\n", + "\n", + "GitFlow, developed by Vincent Driessen, provides a more organized approach to branching and release management. It excels in larger projects with longer release cycles and strict versioning requirements. Here's how GitFlow differs from GitHub Flow:\n", + "\n", + "**Branching Model**:\n", + "\n", + "- Main Branches: GitFlow defines two main branches – \"master\" for stable releases and \"develop\" for ongoing development.\n", + "- Feature Branches: Developers create feature branches off the \"develop\" branch for each new feature.\n", + "\n", + "**Workflow**:\n", + "\n", + "- Feature Development: Developers work on feature branches, merging them into the \"develop\" branch once complete.\n", + "- Release Branches: When it's time for a new release, a release branch is created from the \"develop\" branch for final testing and bug fixing.\n", + "- Hotfix Branches: If critical issues arise in production, hotfix branches are created from the \"master\" branch to address them directly.\n", + "\n", + "**Versioning**:\n", + "\n", + "- GitFlow employs a strict versioning scheme, with each release assigned a unique version number based on semantic versioning principles.\n", + "\n", + "### Which Workflow to Choose?\n", + "\n", + "Choosing between GitHub Flow and GitFlow depends on your team's specific needs and project requirements:\n", + "\n", + "- **GitHub Flow**: Ideal for teams focused on continuous delivery, rapid iteration, and simplicity. This is most used in a bunch of projects.\n", + "- **GitFlow**: Suited for larger projects with longer release cycles, strict versioning, and a more structured approach to development.\n", + "\n", + "While both workflows have their merits, it's essential to assess your team's workflow preferences, project size, and release cycle frequency before making a decision.\n", + "\n", + "### Recommendation:\n", + "\n", + "For a deeper dive into their advantages and implementation details, consider referring to the following blog post: [click here](https://www.harness.io/blog/github-flow-vs-git-flow-whats-the-difference).\n", + "\n", + "OSL recommends the GitHub flow for development." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Python Linters Overview\n", + "\n", + "Here's a breakdown of popular Python linters and their functionalities:\n", + "\n", + "1. **ruff**: A high-performance Python linter and code formatter engineered for efficiency. It amalgamates the functionalities of multiple linters into a unified tool, encompassing features such as style checking, static type validation, and dead code detection. This holistic approach obviates the necessity of managing disparate linters, thus streamlining the development workflow. Notably, ruff excels in speed, rendering it well-suited for handling extensive codebases or integration into Continuous Integration/Continuous Deployment (CI/CD) pipelines. Moreover, its extensive configuration options empower users to customize its behavior according to the specific coding standards of their projects, ensuring adherence to desired styles and quality guidelines.\n", + "\n", + "2. **black**: An influential Python code formatter that ensures code uniformity by automatically applying a standardized style across the codebase.\n", + "\n", + "3. **flake8**: Integrates linting, style validation, and complexity analysis functionalities into a unified package. Widely utilized for enforcing PEP 8 coding standards and identifying common programming errors.\n", + "\n", + "4. **mypy**: A static type checker for Python that identifies type errors and enhances code maintainability through type annotations.\n", + "\n", + "5. **pydocstyle**: Ensures adherence to Python docstring conventions outlined in PEP 257, thereby enhancing code readability and documentation quality.\n", + "\n", + "6. **isort**: A utility for organizing and sorting import statements within Python code, maintaining a consistent import style and mitigating import-related issues.\n", + "\n", + "7. **vulture**: Identifies redundant code in Python projects by detecting unused variables, functions, classes, and modules.\n", + "\n", + "8. **mccabe**: Computes the McCabe cyclomatic complexity of functions and methods, highlighting intricate code segments for potential enhancements in readability and maintainability.\n", + "\n", + "9. **bandit**: A security-centric linter that identifies security vulnerabilities and insecure coding practices in Python codebases.\n", + "\n", + "These linters seamlessly integrate into development workflows, furnishing developers with real-time feedback and upholding code quality throughout the development lifecycle." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Documentation\n", + "\n", + "### Why Documentation is Essential\n", + "\n", + "Documentation is essential in software development for various reasons. Firstly, it enhances clarity and understanding by detailing the purpose, functionality, and usage of the software, aiding developers, users, and stakeholders in comprehending the system's workings. Additionally, it streamlines the onboarding process for new team members by furnishing them with a comprehensive overview of the project, including its architecture and coding standards. Furthermore, well-crafted documentation promotes maintainability and scalability by elucidating the project's structure, design decisions, and coding conventions, empowering developers to implement changes, rectify bugs, and incorporate new features without introducing errors.\n", + "\n", + "Moreover, documentation serves as a valuable resource for support and troubleshooting, furnishing users with troubleshooting guides, FAQs, and usage examples to swiftly resolve issues. It also contributes to the project's sustainability by encapsulating critical knowledge about its design, implementation, and maintenance, thereby preserving institutional knowledge and facilitating future enhancements or migrations.\n", + "\n", + "## Options for Creating Documentation\n", + "\n", + "Here are some popular tools for creating documentation for your project:\n", + "\n", + "1. **Sphinx**: Sphinx stands out as a robust documentation generator tool extensively employed within Python ecosystems. Supporting various markup formats such as reStructuredText and Markdown, Sphinx enables the generation of documentation in diverse output formats like HTML, PDF, and ePub.\n", + "\n", + "2. **MkDocs**: MkDocs emerges as a user-friendly documentation tool that simplifies the generation of static websites through Markdown files. Its straightforward setup process and flexibility in customization, utilizing Jinja2 templates, empower users to swiftly produce polished and professional documentation. Be it for small-scale projects or extensive documentation requirements, MkDocs offers an intuitive solution for crafting well-structured and visually appealing documentation.\n", + "\n", + "3. **Quarto**: Quarto represents a modern documentation tool tailored for data science and computational projects. Leveraging the amalgamation of Markdown, LaTeX, and Jupyter Notebooks, Quarto facilitates the creation of interactive and reproducible documentation, catering to the specific needs of these domains.\n", + "\n", + "## Recommended Resources for Improving Documentation Skills\n", + "\n", + "To enhance your documentation writing skills, consider exploring the following resources:\n", + "\n", + "1. **Diataxis**: [Diataxis](https://diataxis.fr/) offers comprehensive documentation writing guides, tutorials, and best practices for technical writers and developers. It covers various topics, including structuring documentation, writing clear and concise content, and using documentation tools effectively.\n", + "\n", + "2. **Write the Docs Slack Community**: Join the [Write the Docs Slack Community](https://www.writethedocs.org/slack/) to connect with other documentation enthusiasts, share ideas, and seek advice on writing documentation. The community is a valuable resource for learning from experienced writers, participating in discussions, and staying updated on the latest trends in documentation practices.\n", + "\n", + "By investing time and effort in creating high-quality documentation, you can significantly improve the usability, maintainability, and overall success of your software projects.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Continuous Integration (CI)\n", + "\n", + "Continuous Integration (CI) is a crucial practice in modern software development, enabling teams to deliver high-quality code efficiently. CI involves automating the process of testing and integrating code changes into a shared repository, typically multiple times a day. This approach helps teams to identify and resolve issues early in the development cycle, maintain a consistently deployable codebase, and streamline the overall development workflow.\n", + "\n", + "Here are some top options for CI/CD platforms:\n", + "\n", + "1. **GitHub Actions**: GitHub Actions is an integrated CI/CD solution provided within the GitHub platform. It allows developers to define workflows using YAML syntax directly in their GitHub repositories. With support for various triggers such as pushes, pull requests, and scheduled events, GitHub Actions enables flexible automation tailored to project needs.\n", + "\n", + "2. **Azure Pipelines**: Azure Pipelines, part of the Microsoft Azure suite, offers a cloud-based CI/CD service for building, testing, and deploying applications across different platforms. It provides extensive flexibility through YAML configuration or a graphical editor, facilitating seamless integration with Azure services and third-party tools.\n", + "\n", + "3. **CircleCI**: CircleCI is a popular cloud-based CI/CD platform known for its simplicity and scalability. It supports integration with version control systems like GitHub and Bitbucket, allowing teams to define build and deployment pipelines using YAML configuration files. CircleCI offers a wide range of pre-configured and customizable job types to meet diverse project requirements.\n", + "\n", + "GitHub Actions has emerged as one of the most popular options for automating workflows in software development pipelines. Its seamless integration with GitHub repositories, extensive marketplace of pre-built actions, and flexibility in creating custom workflows have contributed to its widespread adoption by developers and organizations alike.\n", + "\n", + "When choosing a CI/CD platform, consider factors such as integration capabilities, scalability, ease of use, and pricing. Evaluating these options based on your specific project requirements and existing development ecosystem will help determine the best fit for your team's needs. It's often beneficial to experiment with different platforms to find the one that aligns most closely with your workflow and objectives." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Unit Tests and Testing Frameworks in Python\n", + "\n", + "Unit tests are an essential part of software development, allowing developers to verify that individual components of their code behave as expected. The `unittest` module in Python provides a framework for organizing and running unit tests. Here's why you might consider using `unittest`:\n", + "\n", + "1. **Standard Library Inclusion**: `unittest` is part of Python's standard library, which means it's readily available without needing to install additional packages. This makes it convenient for projects that prefer minimal dependencies.\n", + "\n", + "2. **Built-in Assertions**: `unittest` offers a set of built-in assertion methods for verifying expected outcomes, such as `assertEqual`, `assertTrue`, and `assertRaises`. These assertions make it easy to write expressive and readable test cases.\n", + "\n", + "3. **Test Discovery**: `unittest` supports automatic test discovery, allowing you to organize your tests into separate modules and directories while effortlessly running them as a cohesive test suite.\n", + "\n", + "4. **Integration with IDEs and CI Tools**: `unittest` integrates well with popular IDEs like PyCharm, VS Code, and CI/CD platforms, enabling seamless test execution and reporting within your development workflow.\n", + "\n", + "While `unittest` is a solid choice for writing unit tests in Python, there are alternative frameworks that offer additional features and flexibility:\n", + "\n", + "1. **Pytest**: Pytest is a popular third-party testing framework known for its simplicity and powerful features. It provides concise syntax, fixtures for reusable test setup, parameterized testing, and extensive plugin support. Pytest excels in making test code more readable and maintainable.\n", + "\n", + "2. **Hypothesis**: Hypothesis is a property-based testing library that complements traditional example-based testing. Instead of writing specific test cases, you specify general properties that your code should satisfy. Hypothesis then generates input data automatically to thoroughly test these properties, uncovering edge cases and potential bugs." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Python Project Initialization\n", + "\n", + "When starting a new Python project, it's beneficial to use project templates that include predefined directory structures, configuration files, and boilerplate code to jumpstart development. Tools like `cookiecutter` and project templates such as `scicookie` provide convenient starting points for various project types:\n", + "\n", + "- **Cookiecutter**: Cookiecutter is a command-line utility that generates projects from project templates. It prompts you for project-specific details and then creates a customized project structure based on the selected template. There are many community-contributed templates available for various types of Python projects, including web applications, libraries, and data analysis projects.\n", + "\n", + "- **SciCookie**: SciCookie is a project template focused on the scientific python community, but it can be used by any python project. It includes a structured directory layout, documentation templates, and example code snippets. SciCookie helps streamline the setup process for scientific Python projects and encourages best practices in testing and documentation.\n", + "\n", + "In summary, while `unittest` provides a robust framework for writing unit tests in Python, alternative frameworks like Pytest and Hypothesis offer additional features and flexibility. When starting a new project, leveraging project templates such as `scicookie` with tools like `cookiecutter` can accelerate setup and promote best practices in project organization and testing." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# What is a virtual enviroment and why is it important?\n", + "\n", + "A virtual environment is a self-contained directory that isolates the dependencies for a specific project, regardless of the programming language. It can house an interpreter (like Python) along with its associated libraries, but it can also manage dependencies for other languages and tools. This isolation ensures that the project's requirements don't conflict with those of other projects on the same system.\n", + "\n", + "When you create a virtual environment for each of your projects, it essentially creates a sandboxed environment where you can install packages and dependencies without affecting the global Python installation on your system. This isolation is crucial because different projects often require different versions of libraries or dependencies, and conflicts can arise if they share the same environment.\n", + "\n", + "Creating virtual environments is crucial for several reasons:\n", + "\n", + "- **Isolation:** Virtual environments allow you to isolate project dependencies, preventing conflicts between different projects that may require different versions of the same packages. This ensures that your projects remain stable and reproducible.\n", + "\n", + "- **Dependency Management:** By creating separate environments for each project, you can manage dependencies more effectively. You can install specific versions of packages for each project without affecting other projects or the system-wide installation.\n", + "\n", + "- **Experimentation:** Virtual environments provide a safe space for experimentation. You can try out new packages or versions without worrying about breaking existing projects or the system environment.\n", + "\n", + "- **Reproducibility:** Utilizing virtual environments not only streamlines collaboration but also enhances reproducibility in project workflows. By sharing environment configuration files such as environment.yml, collaborators ensure uniformity in dependencies and versions across all team members. This practice mitigates compatibility issues and fosters consistency, enabling seamless replication of results and facilitating smoother collaboration.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conda/Mamba\n", + "Conda is a package manager, environment manager, and dependency solver that can install and manage packages and their dependencies. Mamba is a fast, drop-in replacement for Conda that aims to provide faster package management operations.\n", + "\n", + "An agnostic language package manager is a tool that handles dependencies for software projects using multiple programming languages. Unlike traditional package managers tied to one language (like npm for JavaScript), agnostic managers work across languages. They simplify development for projects using various languages, offering features like dependency management and version control in a unified way. This helps maintain consistency and flexibility, especially in projects with mixed-language environments or complex architectures.\n", + "\n", + "### Installation:\n", + "\n", + " For Windows users, Anaconda may be a suitable choice, providing a comprehensive Python distribution along with Conda. For Linux and macOS users, Miniconda or Miniforge offers a lighter and more streamlined approach to managing environments and packages. You can download Miniforge from [here](https://github.com/conda-forge/miniforge?tab=readme-ov-file#downloadhere), which includes Miniconda, Conda Forge configuration, and Mamba.\n", + "\n", + "**Creating a Conda Enviroment**\n", + "To create a new Conda enviroment named `myenv`, open a terminal or command promt and use the following commands:\n", + "\n", + "```bash\n", + "$ conda create --name myenv\n", + "```\n", + "\n", + "- On Windows:\n", + "```bash\n", + "$ activate myenv\n", + "```\n", + "\n", + "- On Unix/ MacOs:\n", + "```bash\n", + "$ source activate myenv\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Conda-Forge:\n", + "Is a community-driven collection of recipes, build infrastructure, and distributions for the Conda package manager. It provides a vast repository of pre-built packages for various programming languages, including Python, R, C, C++, Rust, Go, Fortran, and more. Conda-Forge aims to offer high-quality, up-to-date packages that are well-integrated with Conda environments.\n", + "\n", + "Conda is not limited to managing Python packages; it can handle packages for various programming languages. This capability makes Conda a versatile tool for software development, allowing users to manage complex dependencies and libraries across different programming ecosystems.\n", + "\n", + "### Anaconda:\n", + "\n", + "Anaconda is a popular Python distribution that bundles the Python interpreter, Conda package manager, and a comprehensive set of pre-installed packages for scientific computing, data analysis, and machine learning. It includes tools like Jupyter Notebook, Spyder IDE, and many essential libraries for scientific computing, making it a convenient choice for data scientists and researchers." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Virtualenv\n", + "Virtualenv is a tool to create isolated Python environments. It's lightweight and widely used in the Python community. Here's how to set up Virtualenv:\n", + "\n", + "Installation:\n", + "- Ensure you have Python installed on your system.\n", + "- Install Virtualenv using pip (Python's package installer):\n", + "\n", + "```bash\n", + "$ pip install virtualenv\n", + "```\n", + "\n", + "Create a new Virtualenv:\n", + "```bash\n", + "$ virtualenv myenv\n", + "```\n", + "\n", + "Activate the enviroment:\n", + "\n", + "- On Windows:\n", + "```bash\n", + "$ myenv\\Scripts\\activate\n", + "```\n", + "\n", + "- On Unix/MacOS:\n", + "```bash\n", + "$ source myenv/bin/activate\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pipenv\n", + "Pipenv is a higher-level tool compared to Virtualenv. It aims to simplify and streamline the process of managing dependencies and environments for Python projects. Here's how to get started with Pipenv:\n", + "\n", + "**Installation:**\n", + "\n", + "Make sure you have Python installed on your system.\n", + "Install Pipenv using pip (Python's package installer):\n", + "\n", + "```bash\n", + "$ pip install pipenv\n", + "```\n", + "\n", + "**Creating a new environment and managing dependencies:**\n", + "\n", + "Navigate to your project directory in the terminal.\n", + "Use Pipenv to create a new virtual environment and generate a Pipfile, which will manage your project's dependencies:\n", + "\n", + "```bash\n", + "$ pipenv --python 3.x\n", + "```\n", + "Replace 3.x with your desired Python version.\n", + "\n", + "**Installing dependencies:**\n", + "\n", + "Use Pipenv to install packages for your project:\n", + "\n", + "```bash\n", + "$ pipenv install package-name\n", + "```\n", + "\n", + "This will install the package and automatically update your Pipfile and Pipfile.lock.\n", + "\n", + "**Activating the environment:**\n", + "\n", + "Pipenv automatically activates the virtual environment when you enter the project directory. You'll see the name of the virtual environment displayed in your terminal prompt.\n", + "\n", + "**Deactivating the environment:**\n", + "\n", + "To deactivate the virtual environment and return to your global Python environment, simply use the exit command or close the terminal window.\n", + "\n", + "**Benefits of Pip**\n", + "\n", + "- *Dependency management:* Pipenv simplifies dependency management by automatically creating and managing a Pipfile and Pipfile.lock for each project.\n", + "- *Isolation:* Pipenv creates isolated environments for each project, preventing conflicts between dependencies.\n", + "- *Streamlined workflow:* Pipenv combines package installation, environment management, and dependency resolution into a single tool, streamlining the development process." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pixi\n", + "Pixi, developed by prefix.dev, is a dynamic cross-platform package manager and workflow tool inspired by the Conda and Pypi ecosystems. It caters to developers seeking a unified experience across multiple programming languages, akin to renowned tools like Cargo or Yarn. Pixi's adaptability and robust feature set make it a valuable asset in modern software development environments.\n", + "\n", + "Key highlights of Pixi include:\n", + "\n", + "- **Multi-language Compatibility:** Pixi adeptly manages packages written in various languages including Python, C++, R, and more, offering versatility in development workflows.\n", + "- **Platform Agnosticism:** It seamlessly operates on Linux, Windows, macOS, and diverse hardware architectures, ensuring consistent performance across different environments.\n", + "- **Up-to-date Dependency Locking:** Pixi's dependency locking mechanism guarantees the stability of projects by maintaining consistent package versions across different development setups.\n", + "- **Intuitive Command-line Interface:** With a clean and user-friendly interface, Pixi enhances developer productivity and ease of use, promoting efficient workflow management.\n", + "- **Flexible Installation Options:** Pixi accommodates both per-project and system-wide installations, allowing developers to tailor its usage according to specific project requirements.\n", + "\n", + "For comprehensive information, detailed installation guidelines, and practical examples, visit the official [Pixi website](https://pixi.sh/latest). Explore Pixi today to streamline your development process across multiple languages with ease.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "The proficiency in specific techniques and methodologies is crucial for anyone looking to make meaningful contributions to open-source projects. This article delineates the essential skills and practices required for effective participation, including but not limited to, adeptness with collaborative tools, version control systems, adherence to coding standards, and familiarity with contribution guidelines. Emphasizing the significance of tailored mentorship, accessible documentation, and active engagement within the community, the article serves as a comprehensive guide for enhancing the quality and impact of contributions. By adopting best practices in code review, project management, and fostering an inclusive dialogue, contributors can significantly elevate the collaborative dynamics and innovation within open-source endeavors. Thus, reading this article is instrumental for those aiming to navigate the complexities of open-source projects successfully and contribute to the advancement of collective scientific and technological objectives." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/pages/blog/first-time-contributors/index.md b/pages/blog/first-time-contributors/index.md new file mode 100644 index 000000000..89a936397 --- /dev/null +++ b/pages/blog/first-time-contributors/index.md @@ -0,0 +1,538 @@ +--- +title: "First Time Contributors" +slug: first-time-contributors +date: 2024-04-08 +authors: ["Daniela Iglesias Rocabado"] +tags: [open-source, contributors, git, osl] +categories: [contributors] +description: | + First Time Contributors" refers to individuals making their initial foray into contributing to open-source projects within scientific laboratories. These newcomers bring diverse skills and fresh perspectives, enriching the collaborative environment. Embracing inclusivity and providing guidance fosters their engagement, leading to innovative solutions in open science. +thumbnail: "/header.jpeg" +template: "blog-post.html" +--- +Diving into project development can be overwhelming for beginners. A first-timers guide is key to navigate this unfamiliar terrain. From understanding basics to mastering tools, it'll help you contribute effectively. Join us as we explore how to get started in a development project! + +### Avoiding Issues in Your First Contributions + +The world of open-source programming project development is a vibrant and collaborative space, but it can also be daunting for those venturing in for the first time. We've noticed that new contributors often face significant challenges when taking their first steps in this environment. That's why we've created this first-timers guide. + +Our aim is to provide a comprehensive resource that helps newcomers overcome initial barriers and start contributing effectively right from the get-go. By offering a guide that covers everything from the basics to best practices in open-source project development, we hope to streamline the onboarding process and foster a more inclusive and productive collaborative environment. + +This guide will not only be beneficial for those starting their journey in open-source projects but will also serve as the primary reference for all affiliated projects and projects under the OSL Incubator Program. By standardizing practices and promoting a common understanding of the processes involved, we aim to enhance the experience for all contributors and promote more efficient and high-quality development in our open-source projects. + +## Getting Started + +In this guide, we'll tackle the common challenges that newcomers encounter in open-source projects. These include navigating Git and establishing your development environment. We'll provide step-by-step instructions on Git fundamentals and setting up your virtual workspace seamlessly. + +Additionally, we will offer further advice for the contributor to start with a solid initial structure, thus ensuring that their project is well-organized from the outset. From the initial setup to active contribution in the project, this guide aims to provide contributors with the tools and knowledge needed to effectively contribute to open-source programming projects. + +# GIT + +## What is Git? +Git is a widely used distributed version control system in software development. It allows project collaborators to work collaboratively on the same set of files, recording changes, merging contributions, and maintaining a detailed history of all modifications made to the source code. + +## How to install Git? +To install Git, you can follow these steps: + +1. **Windows Operating System:** You can download the Git installer from the [official Git website](https://gitforwindows.org/). Once downloaded, run the installer and follow the installation wizard instructions. + +2. **macOS Operating System:** Git is usually pre-installed on macOS. However, if it's not installed or you want to update it, you can do so through the command line or using package management tools like Homebrew. + +3. **Linux Operating System:** In most Linux distributions, Git is available in the default package repositories. You can install it using the package manager specific to your distribution, such as apt for Ubuntu or yum for CentOS. + +For more detailed material on Git, we recommend using the Software Carpentry material, which is more focused on people who already have basic knowledge of Git but still face difficulties. You can access the material at the following link: [Software Carpentry - Git Novice](https://carpentries.github.io/workshop-template/install_instructions/#git-1) + +## First Steps to Collaborating on a Project + +### Understanding Repository Forking +When embarking on a collaborative project, the first step often involves forking a repository. Forking is a fundamental aspect of version control systems like Git, enabling individuals or teams to create their own copy of a project's repository. This copy acts as a sandbox where contributors can freely experiment, make changes, and propose improvements without affecting the original project. + +#### Steps to Forking a Repository +1. **Navigate to the Repository:** Visit the project's repository on the hosting platform, such as GitHub, GitLab, or Bitbucket. + +2. **Locate the Fork Button:** Look for the "Fork" button on the repository's page. This button is usually located in the top-right corner. Clicking it will initiate the forking process. + +3. **Choose Destination:** When prompted, select where you want to fork the repository. You can fork it to your personal account or to an organization you're a part of. + +4. **Wait for Forking to Complete:** The platform will create a copy of the repository in your account or organization. Depending on the size of the repository and the platform's load, this process may take a few seconds to complete. + +5. **Clone Your Forked Repository:** Once the forking process is finished, clone the forked repository to your local machine using Git. This will create a local copy of the repository that you can work on. + +#### Benefits of Forking a Repository +- **Independence:** Forking gives you complete control over your copy of the project. You can modify it as you see fit without impacting the original. + +- **Experimentation:** Forking provides a safe environment for experimenting with changes. You can try out new features, fix bugs, or test ideas without risking the stability of the main project. + +- **Collaboration:** Forking facilitates collaboration by enabling contributors to work on different aspects of the project simultaneously. Once you've made improvements or fixes in your fork, you can propose them to the original project through a pull request. + + +### What is a Pull Request / Merge Request and why is it important? + +A Pull Request (PR) is a proposed change that a collaborator makes to a code repository managed by a version control system such as Git. It's essentially a request for the changes made in one branch of a repository to be incorporated into another branch, usually the main branch. Pull Requests are essential in the collaborative workflow of software development, as they allow teams to review, discuss, and approve changes before they are merged into the codebase. This facilitates collaboration, improves code quality, and helps maintain a clear history of modifications made to the project. + +### Steps for creating a good Pull Request: + +1. **Create a feature branch:** Before starting to make changes to the code, create a new branch in the repository that clearly describes the purpose of the changes you plan to make. This helps keep the development organized and makes code review easier. + +2. **Make necessary changes:** Once you're on your feature branch, make the changes to the code as planned. Make sure to follow the project's coding conventions and write unit tests if necessary. + +3. **Update documentation if necessary:** If your changes affect existing functionality or introduce new features, it's important to update the corresponding documentation, such as code comments or user documentation. + +4. **Create the Pull Request:** Once you've completed your changes and are ready to request review, create a Pull Request. Provide a clear and concise description of the purpose of your changes, as well as any relevant context to facilitate review by your team members. + +5. **Request review:** After creating the Pull Request, assign relevant reviewers to examine your changes. This may include other developers on the team, technical leads, or anyone with expertise in the area affected by your modifications. + +6. **Respond to comments and make adjustments if necessary:** Once reviewers have provided feedback on your Pull Request, take the time to respond to their questions and make any necessary adjustments to your code. It's important to collaborate constructively during this process to ensure that the proposed changes are of the highest possible quality. + +By following these steps, you can effectively contribute to a project's development through Pull Requests that are easy to review, approve, and merge, ultimately leading to stronger code and more efficient teamwork. + + +## Remotes Repositories + +In version control systems like Git, a remote repository is essentially a copy of your local repository stored on a server somewhere else, often online. It acts as a central hub for collaboration and version control. + + +- Origin: This remote, typically created by default when cloning the repository, points to your fork on GitHub. +- Upstream: This remote points to the original (upstream) repository you forked from. It allows you to stay updated with the main project's development. + + +Creating the Upstream Remote + +```bash +git remote add upstream +``` + +Using the Upstream Remote: + +Fetching Updates: Regularly use `git fetch upstream` to download the latest changes from the upstream repository without merging them into your local branch. +Creating Feature Branches: When starting work on a new feature, it's recommended to base your branch on the latest upstream main branch: + +```bash +git checkout upstream/main +git checkout -b my-feature-branch +``` +This ensures your feature branch incorporates the most recent upstream developments. + +## Understanding Merge Commit vs. Rebase in Git + +In Git, managing branches is a fundamental aspect of collaboration and version control. When integrating changes from one branch to another, developers often encounter two primary methods: merge commit and rebase. Both approaches have their advantages and trade-offs, influencing how teams collaborate and maintain a clean project history. Let's delve into each method: + +### Merge Commit + +A merge commit, as the name suggests, involves creating a new commit to merge changes from one branch into another. Here's how it typically works: + +1. **Branch Divergence**: Suppose you have a feature branch (`feature`) and a main branch (`main` or `master`). As work progresses, both branches diverge, accumulating different commits. + +2. **Merge Process**: When it's time to integrate changes from `feature` into `main`, you execute a merge command. Git creates a new commit, known as a merge commit, to combine the histories of both branches. + +3. **Commit History**: The merge commit preserves the entire history of changes from both branches, making it clear when and how the integration occurred. + +4. **Parallel Development**: Merge commits allow parallel development, enabling team members to work independently without affecting each other's changes. + +### Rebase + +Rebasing is an alternative method for integrating changes, involving rewriting commit history to maintain a linear project history. Here's how it differs from merge commit: + +1. **Branch Adjustment**: Instead of creating a merge commit, rebasing adjusts the commit history of the feature branch (`feature`) to appear as if it originated from the tip of the main branch (`main` or `master`). + +2. **Commit Replay**: Git replays each commit from the feature branch onto the tip of the main branch, effectively transplanting the changes onto a different base. + +3. **Linear History**: By rewriting commit history, rebasing creates a linear sequence of commits, making the project history cleaner and easier to follow. + +4. **Conflict Resolution**: Rebasing can lead to conflicts if changes from the feature branch conflict with those on the main branch. These conflicts must be resolved manually during the rebase process. + + Recommendations and Best Practices + +While both merge commit and rebase have their merits, the choice often depends on the team's workflow and preferences. Here are some considerations: + +**Merge Commit**: + +* Suitable for preserving a detailed history of parallel development. +* Preferred when collaboration involves multiple contributors or when maintaining a clear record of individual contributions is essential. + +**Rebase**: + + - Promotes a cleaner, linear project history. + - Recommended for feature branches with short-lived changes or when maintaining a tidy commit history is a priority. + +It's worth noting that some organizations, such as the Open Source Initiative (OSI), recommend the usage of git rebase to maintain a clean and linear project history. You can configure Git to use rebase by default for pull operations with the command: + +```bash +$ git config --global pull.rebase true +``` + +OSL recommends the usage of git rebase + + +## Mergin a Pull Requests (PRs) +Pull requests (PRs) are essential for collaborative software development, enabling contributors to propose changes to a project's codebase. Once a PR is submitted, it undergoes a review process before being merged into the main codebase. Here are three common methods for merging PRs: + +#### 1. Merge Commit: +A merge commit combines changes from different branches in version control systems like Git. It records the integration of these changes, preserving their histories and keeping the project's development organized. + +Use when you want to keep a detailed history of changes from multiple branches. It preserves individual commit histories, making it suitable for tracking the development of feature branches and bug fixes separately. + + +#### 2. Squash and Merge: +"Squash and merge" condenses multiple commits into one before merging, simplifying the project's commit history. + +Employ when you have multiple small, related commits that you want to consolidate into a single, more meaningful commit. It's useful for cleaning up the commit history, especially before merging feature branches into the main branch. + +#### 3. Rebase and Merge: +"Rebase and merge" rewrites commit history to integrate changes from one branch into another, maintaining a cleaner and more linear history. + +Opt for this method when you want to maintain a clean and linear commit history by incorporating changes from one branch into another. It helps to avoid unnecessary merge commits, keeping the commit history straightforward and easier to follow. + + +Each method offers distinct advantages and considerations, influencing the project's commit history and overall workflow. + +In their development workflow, **Open Science Labs** recommend using squash and merge. + +### Pre-commit + +Pre-commit is a tool used in software development to automatically run various checks and tests on files before they are committed to a version control system, such as Git. These checks can include code formatting, linting, static analysis, and other quality assurance tasks. The goal is to catch potential issues early in the development process, ensuring that only high-quality code is committed to the repository. + +Here's how to install and use pre-commit: + +1. Installation: +You can install pre-commit using pip, the Python package manager. Open your terminal or command prompt and run: + +``` bash +$ pip install pre-commit +``` + +2. Configuration: +Once pre-commit is installed, you need to set up a configuration file named .pre-commit-config.yaml in the root directory of your project. This file specifies the hooks (checks) that pre-commit should run. + +Here's a basic example of a `.pre-commit-config.yaml` file: + +``` yaml +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v3.3.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml +``` + +3. Installation of Git Hooks: +After configuring `.pre-commit-config.yaml`, you need to install pre-commit hooks into your Git repository. Navigate to your project directory in the terminal and run: + +``` bash +$ pre-commit install +``` + +4. Running Pre-commit: +Once the pre-commit hooks are installed, you can run them manually using the following command: + +```bash +$ pre-commit run --all-files +``` +This command tells pre-commit to run all configured hooks on all files in the repository. It will check for issues according to the configuration specified in `.pre-commit-config.yaml` and provide feedback on any problems found. + + +The Git hooks are triggered each time the user initiates a git commit command. By default, they operate on the files that have been modified, but their behavior can be adjusted to encompass all files if configured accordingly in the .pre-commit-config.yaml file. + +## Navigating Git Workflows: A Dive into GitHub Flow and GitFlow + +In the ever-evolving world of software development, efficient collaboration and streamlined workflows are paramount. Git, the popular version control system, offers a plethora of options for managing code changes, each tailored to different team structures and project requirements. Two widely used workflows, GitHub Flow and GitFlow, stand out for their simplicity and effectiveness. Let's explore these options in detail. + +### GitHub Flow: + +GitHub Flow is a lightweight, branch-based workflow specifically designed for teams using GitHub for version control. It emphasizes simplicity and continuous delivery, making it an ideal choice for projects with frequent releases and rapid iteration cycles. Here's a breakdown of its key features: + +**Branching Model:** + + - Main Branch: GitHub Flow revolves around a single main branch (often named "main" or "master"), representing the development branch that leads to production-ready code. + - Feature Branches: Developers create feature branches off the main branch for each new feature or bug fix. + + +**Workflow:** + +- Create a Branch: Developers create a new branch for each feature or bug fix. +- Make Changes: Developers create a new branch, with the latest changes from upstream/main (or origin/main, if you are not working on a fork) for each feature or bug fix. +- Open Pull Request: Once changes are complete, a pull request (PR) is opened to merge the feature branch into the main branch. +- Review and Merge: Team members review the code changes, provide feedback, and merge the PR into the main branch once approved. + +**Continuous Deployment**: + +- Continuous Integration: GitHub Flow encourages the use of continuous integration tools to automatically test changes before merging. +- Continuous Deployment: Merged changes are automatically deployed to production, ensuring a fast and reliable release cycle. + +GitHub Flow's simplicity and flexibility make it a popular choice for teams of all sizes, particularly those embracing agile development practices. + +### GitFlow: + +GitFlow, developed by Vincent Driessen, provides a more organized approach to branching and release management. It excels in larger projects with longer release cycles and strict versioning requirements. Here's how GitFlow differs from GitHub Flow: + +**Branching Model**: + +- Main Branches: GitFlow defines two main branches – "master" for stable releases and "develop" for ongoing development. +- Feature Branches: Developers create feature branches off the "develop" branch for each new feature. + +**Workflow**: + +- Feature Development: Developers work on feature branches, merging them into the "develop" branch once complete. +- Release Branches: When it's time for a new release, a release branch is created from the "develop" branch for final testing and bug fixing. +- Hotfix Branches: If critical issues arise in production, hotfix branches are created from the "master" branch to address them directly. + +**Versioning**: + +- GitFlow employs a strict versioning scheme, with each release assigned a unique version number based on semantic versioning principles. + +### Which Workflow to Choose? + +Choosing between GitHub Flow and GitFlow depends on your team's specific needs and project requirements: + +- **GitHub Flow**: Ideal for teams focused on continuous delivery, rapid iteration, and simplicity. This is most used in a bunch of projects. +- **GitFlow**: Suited for larger projects with longer release cycles, strict versioning, and a more structured approach to development. + +While both workflows have their merits, it's essential to assess your team's workflow preferences, project size, and release cycle frequency before making a decision. + +### Recommendation: + +For a deeper dive into their advantages and implementation details, consider referring to the following blog post: [click here](https://www.harness.io/blog/github-flow-vs-git-flow-whats-the-difference). + +OSL recommends the GitHub flow for development. + +## Python Linters Overview + +Here's a breakdown of popular Python linters and their functionalities: + +1. **ruff**: A high-performance Python linter and code formatter engineered for efficiency. It amalgamates the functionalities of multiple linters into a unified tool, encompassing features such as style checking, static type validation, and dead code detection. This holistic approach obviates the necessity of managing disparate linters, thus streamlining the development workflow. Notably, ruff excels in speed, rendering it well-suited for handling extensive codebases or integration into Continuous Integration/Continuous Deployment (CI/CD) pipelines. Moreover, its extensive configuration options empower users to customize its behavior according to the specific coding standards of their projects, ensuring adherence to desired styles and quality guidelines. + +2. **black**: An influential Python code formatter that ensures code uniformity by automatically applying a standardized style across the codebase. + +3. **flake8**: Integrates linting, style validation, and complexity analysis functionalities into a unified package. Widely utilized for enforcing PEP 8 coding standards and identifying common programming errors. + +4. **mypy**: A static type checker for Python that identifies type errors and enhances code maintainability through type annotations. + +5. **pydocstyle**: Ensures adherence to Python docstring conventions outlined in PEP 257, thereby enhancing code readability and documentation quality. + +6. **isort**: A utility for organizing and sorting import statements within Python code, maintaining a consistent import style and mitigating import-related issues. + +7. **vulture**: Identifies redundant code in Python projects by detecting unused variables, functions, classes, and modules. + +8. **mccabe**: Computes the McCabe cyclomatic complexity of functions and methods, highlighting intricate code segments for potential enhancements in readability and maintainability. + +9. **bandit**: A security-centric linter that identifies security vulnerabilities and insecure coding practices in Python codebases. + +These linters seamlessly integrate into development workflows, furnishing developers with real-time feedback and upholding code quality throughout the development lifecycle. + +## Documentation + +### Why Documentation is Essential + +Documentation is essential in software development for various reasons. Firstly, it enhances clarity and understanding by detailing the purpose, functionality, and usage of the software, aiding developers, users, and stakeholders in comprehending the system's workings. Additionally, it streamlines the onboarding process for new team members by furnishing them with a comprehensive overview of the project, including its architecture and coding standards. Furthermore, well-crafted documentation promotes maintainability and scalability by elucidating the project's structure, design decisions, and coding conventions, empowering developers to implement changes, rectify bugs, and incorporate new features without introducing errors. + +Moreover, documentation serves as a valuable resource for support and troubleshooting, furnishing users with troubleshooting guides, FAQs, and usage examples to swiftly resolve issues. It also contributes to the project's sustainability by encapsulating critical knowledge about its design, implementation, and maintenance, thereby preserving institutional knowledge and facilitating future enhancements or migrations. + +## Options for Creating Documentation + +Here are some popular tools for creating documentation for your project: + +1. **Sphinx**: Sphinx stands out as a robust documentation generator tool extensively employed within Python ecosystems. Supporting various markup formats such as reStructuredText and Markdown, Sphinx enables the generation of documentation in diverse output formats like HTML, PDF, and ePub. + +2. **MkDocs**: MkDocs emerges as a user-friendly documentation tool that simplifies the generation of static websites through Markdown files. Its straightforward setup process and flexibility in customization, utilizing Jinja2 templates, empower users to swiftly produce polished and professional documentation. Be it for small-scale projects or extensive documentation requirements, MkDocs offers an intuitive solution for crafting well-structured and visually appealing documentation. + +3. **Quarto**: Quarto represents a modern documentation tool tailored for data science and computational projects. Leveraging the amalgamation of Markdown, LaTeX, and Jupyter Notebooks, Quarto facilitates the creation of interactive and reproducible documentation, catering to the specific needs of these domains. + +## Recommended Resources for Improving Documentation Skills + +To enhance your documentation writing skills, consider exploring the following resources: + +1. **Diataxis**: [Diataxis](https://diataxis.fr/) offers comprehensive documentation writing guides, tutorials, and best practices for technical writers and developers. It covers various topics, including structuring documentation, writing clear and concise content, and using documentation tools effectively. + +2. **Write the Docs Slack Community**: Join the [Write the Docs Slack Community](https://www.writethedocs.org/slack/) to connect with other documentation enthusiasts, share ideas, and seek advice on writing documentation. The community is a valuable resource for learning from experienced writers, participating in discussions, and staying updated on the latest trends in documentation practices. + +By investing time and effort in creating high-quality documentation, you can significantly improve the usability, maintainability, and overall success of your software projects. + + +## Continuous Integration (CI) + +Continuous Integration (CI) is a crucial practice in modern software development, enabling teams to deliver high-quality code efficiently. CI involves automating the process of testing and integrating code changes into a shared repository, typically multiple times a day. This approach helps teams to identify and resolve issues early in the development cycle, maintain a consistently deployable codebase, and streamline the overall development workflow. + +Here are some top options for CI/CD platforms: + +1. **GitHub Actions**: GitHub Actions is an integrated CI/CD solution provided within the GitHub platform. It allows developers to define workflows using YAML syntax directly in their GitHub repositories. With support for various triggers such as pushes, pull requests, and scheduled events, GitHub Actions enables flexible automation tailored to project needs. + +2. **Azure Pipelines**: Azure Pipelines, part of the Microsoft Azure suite, offers a cloud-based CI/CD service for building, testing, and deploying applications across different platforms. It provides extensive flexibility through YAML configuration or a graphical editor, facilitating seamless integration with Azure services and third-party tools. + +3. **CircleCI**: CircleCI is a popular cloud-based CI/CD platform known for its simplicity and scalability. It supports integration with version control systems like GitHub and Bitbucket, allowing teams to define build and deployment pipelines using YAML configuration files. CircleCI offers a wide range of pre-configured and customizable job types to meet diverse project requirements. + +GitHub Actions has emerged as one of the most popular options for automating workflows in software development pipelines. Its seamless integration with GitHub repositories, extensive marketplace of pre-built actions, and flexibility in creating custom workflows have contributed to its widespread adoption by developers and organizations alike. + +When choosing a CI/CD platform, consider factors such as integration capabilities, scalability, ease of use, and pricing. Evaluating these options based on your specific project requirements and existing development ecosystem will help determine the best fit for your team's needs. It's often beneficial to experiment with different platforms to find the one that aligns most closely with your workflow and objectives. + +## Unit Tests and Testing Frameworks in Python + +Unit tests are an essential part of software development, allowing developers to verify that individual components of their code behave as expected. The `unittest` module in Python provides a framework for organizing and running unit tests. Here's why you might consider using `unittest`: + +1. **Standard Library Inclusion**: `unittest` is part of Python's standard library, which means it's readily available without needing to install additional packages. This makes it convenient for projects that prefer minimal dependencies. + +2. **Built-in Assertions**: `unittest` offers a set of built-in assertion methods for verifying expected outcomes, such as `assertEqual`, `assertTrue`, and `assertRaises`. These assertions make it easy to write expressive and readable test cases. + +3. **Test Discovery**: `unittest` supports automatic test discovery, allowing you to organize your tests into separate modules and directories while effortlessly running them as a cohesive test suite. + +4. **Integration with IDEs and CI Tools**: `unittest` integrates well with popular IDEs like PyCharm, VS Code, and CI/CD platforms, enabling seamless test execution and reporting within your development workflow. + +While `unittest` is a solid choice for writing unit tests in Python, there are alternative frameworks that offer additional features and flexibility: + +1. **Pytest**: Pytest is a popular third-party testing framework known for its simplicity and powerful features. It provides concise syntax, fixtures for reusable test setup, parameterized testing, and extensive plugin support. Pytest excels in making test code more readable and maintainable. + +2. **Hypothesis**: Hypothesis is a property-based testing library that complements traditional example-based testing. Instead of writing specific test cases, you specify general properties that your code should satisfy. Hypothesis then generates input data automatically to thoroughly test these properties, uncovering edge cases and potential bugs. + +## Python Project Initialization + +When starting a new Python project, it's beneficial to use project templates that include predefined directory structures, configuration files, and boilerplate code to jumpstart development. Tools like `cookiecutter` and project templates such as `scicookie` provide convenient starting points for various project types: + +- **Cookiecutter**: Cookiecutter is a command-line utility that generates projects from project templates. It prompts you for project-specific details and then creates a customized project structure based on the selected template. There are many community-contributed templates available for various types of Python projects, including web applications, libraries, and data analysis projects. + +- **SciCookie**: SciCookie is a project template focused on the scientific python community, but it can be used by any python project. It includes a structured directory layout, documentation templates, and example code snippets. SciCookie helps streamline the setup process for scientific Python projects and encourages best practices in testing and documentation. + +In summary, while `unittest` provides a robust framework for writing unit tests in Python, alternative frameworks like Pytest and Hypothesis offer additional features and flexibility. When starting a new project, leveraging project templates such as `scicookie` with tools like `cookiecutter` can accelerate setup and promote best practices in project organization and testing. + +# What is a virtual enviroment and why is it important? + +A virtual environment is a self-contained directory that isolates the dependencies for a specific project, regardless of the programming language. It can house an interpreter (like Python) along with its associated libraries, but it can also manage dependencies for other languages and tools. This isolation ensures that the project's requirements don't conflict with those of other projects on the same system. + +When you create a virtual environment for each of your projects, it essentially creates a sandboxed environment where you can install packages and dependencies without affecting the global Python installation on your system. This isolation is crucial because different projects often require different versions of libraries or dependencies, and conflicts can arise if they share the same environment. + +Creating virtual environments is crucial for several reasons: + +- **Isolation:** Virtual environments allow you to isolate project dependencies, preventing conflicts between different projects that may require different versions of the same packages. This ensures that your projects remain stable and reproducible. + +- **Dependency Management:** By creating separate environments for each project, you can manage dependencies more effectively. You can install specific versions of packages for each project without affecting other projects or the system-wide installation. + +- **Experimentation:** Virtual environments provide a safe space for experimentation. You can try out new packages or versions without worrying about breaking existing projects or the system environment. + +- **Reproducibility:** Utilizing virtual environments not only streamlines collaboration but also enhances reproducibility in project workflows. By sharing environment configuration files such as environment.yml, collaborators ensure uniformity in dependencies and versions across all team members. This practice mitigates compatibility issues and fosters consistency, enabling seamless replication of results and facilitating smoother collaboration. + + +## Conda/Mamba +Conda is a package manager, environment manager, and dependency solver that can install and manage packages and their dependencies. Mamba is a fast, drop-in replacement for Conda that aims to provide faster package management operations. + +An agnostic language package manager is a tool that handles dependencies for software projects using multiple programming languages. Unlike traditional package managers tied to one language (like npm for JavaScript), agnostic managers work across languages. They simplify development for projects using various languages, offering features like dependency management and version control in a unified way. This helps maintain consistency and flexibility, especially in projects with mixed-language environments or complex architectures. + +### Installation: + + For Windows users, Anaconda may be a suitable choice, providing a comprehensive Python distribution along with Conda. For Linux and macOS users, Miniconda or Miniforge offers a lighter and more streamlined approach to managing environments and packages. You can download Miniforge from [here](https://github.com/conda-forge/miniforge?tab=readme-ov-file#downloadhere), which includes Miniconda, Conda Forge configuration, and Mamba. + +**Creating a Conda Enviroment** +To create a new Conda enviroment named `myenv`, open a terminal or command promt and use the following commands: + +```bash +$ conda create --name myenv +``` + +- On Windows: +```bash +$ activate myenv +``` + +- On Unix/ MacOs: +```bash +$ source activate myenv +``` + +### Conda-Forge: +Is a community-driven collection of recipes, build infrastructure, and distributions for the Conda package manager. It provides a vast repository of pre-built packages for various programming languages, including Python, R, C, C++, Rust, Go, Fortran, and more. Conda-Forge aims to offer high-quality, up-to-date packages that are well-integrated with Conda environments. + +Conda is not limited to managing Python packages; it can handle packages for various programming languages. This capability makes Conda a versatile tool for software development, allowing users to manage complex dependencies and libraries across different programming ecosystems. + +### Anaconda: + +Anaconda is a popular Python distribution that bundles the Python interpreter, Conda package manager, and a comprehensive set of pre-installed packages for scientific computing, data analysis, and machine learning. It includes tools like Jupyter Notebook, Spyder IDE, and many essential libraries for scientific computing, making it a convenient choice for data scientists and researchers. + +## Virtualenv +Virtualenv is a tool to create isolated Python environments. It's lightweight and widely used in the Python community. Here's how to set up Virtualenv: + +Installation: +- Ensure you have Python installed on your system. +- Install Virtualenv using pip (Python's package installer): + +```bash +$ pip install virtualenv +``` + +Create a new Virtualenv: +```bash +$ virtualenv myenv +``` + +Activate the enviroment: + +- On Windows: +```bash +$ myenv\Scripts\activate +``` + +- On Unix/MacOS: +```bash +$ source myenv/bin/activate +``` + +## Pipenv +Pipenv is a higher-level tool compared to Virtualenv. It aims to simplify and streamline the process of managing dependencies and environments for Python projects. Here's how to get started with Pipenv: + +**Installation:** + +Make sure you have Python installed on your system. +Install Pipenv using pip (Python's package installer): + +```bash +$ pip install pipenv +``` + +**Creating a new environment and managing dependencies:** + +Navigate to your project directory in the terminal. +Use Pipenv to create a new virtual environment and generate a Pipfile, which will manage your project's dependencies: + +```bash +$ pipenv --python 3.x +``` +Replace 3.x with your desired Python version. + +**Installing dependencies:** + +Use Pipenv to install packages for your project: + +```bash +$ pipenv install package-name +``` + +This will install the package and automatically update your Pipfile and Pipfile.lock. + +**Activating the environment:** + +Pipenv automatically activates the virtual environment when you enter the project directory. You'll see the name of the virtual environment displayed in your terminal prompt. + +**Deactivating the environment:** + +To deactivate the virtual environment and return to your global Python environment, simply use the exit command or close the terminal window. + +**Benefits of Pip** + +- *Dependency management:* Pipenv simplifies dependency management by automatically creating and managing a Pipfile and Pipfile.lock for each project. +- *Isolation:* Pipenv creates isolated environments for each project, preventing conflicts between dependencies. +- *Streamlined workflow:* Pipenv combines package installation, environment management, and dependency resolution into a single tool, streamlining the development process. + +## Pixi +Pixi, developed by prefix.dev, is a dynamic cross-platform package manager and workflow tool inspired by the Conda and Pypi ecosystems. It caters to developers seeking a unified experience across multiple programming languages, akin to renowned tools like Cargo or Yarn. Pixi's adaptability and robust feature set make it a valuable asset in modern software development environments. + +Key highlights of Pixi include: + +- **Multi-language Compatibility:** Pixi adeptly manages packages written in various languages including Python, C++, R, and more, offering versatility in development workflows. +- **Platform Agnosticism:** It seamlessly operates on Linux, Windows, macOS, and diverse hardware architectures, ensuring consistent performance across different environments. +- **Up-to-date Dependency Locking:** Pixi's dependency locking mechanism guarantees the stability of projects by maintaining consistent package versions across different development setups. +- **Intuitive Command-line Interface:** With a clean and user-friendly interface, Pixi enhances developer productivity and ease of use, promoting efficient workflow management. +- **Flexible Installation Options:** Pixi accommodates both per-project and system-wide installations, allowing developers to tailor its usage according to specific project requirements. + +For comprehensive information, detailed installation guidelines, and practical examples, visit the official [Pixi website](https://pixi.sh/latest). Explore Pixi today to streamline your development process across multiple languages with ease. + + +## Conclusion + +The proficiency in specific techniques and methodologies is crucial for anyone looking to make meaningful contributions to open-source projects. This article delineates the essential skills and practices required for effective participation, including but not limited to, adeptness with collaborative tools, version control systems, adherence to coding standards, and familiarity with contribution guidelines. Emphasizing the significance of tailored mentorship, accessible documentation, and active engagement within the community, the article serves as a comprehensive guide for enhancing the quality and impact of contributions. By adopting best practices in code review, project management, and fostering an inclusive dialogue, contributors can significantly elevate the collaborative dynamics and innovation within open-source endeavors. Thus, reading this article is instrumental for those aiming to navigate the complexities of open-source projects successfully and contribute to the advancement of collective scientific and technological objectives. diff --git a/pages/blog/fqlearn-ternary-plot/add_point.png b/pages/blog/fqlearn-ternary-plot/add_point.png new file mode 100644 index 000000000..a7897a417 Binary files /dev/null and b/pages/blog/fqlearn-ternary-plot/add_point.png differ diff --git a/pages/blog/fqlearn-ternary-plot/div_half.png b/pages/blog/fqlearn-ternary-plot/div_half.png new file mode 100644 index 000000000..252a04fce Binary files /dev/null and b/pages/blog/fqlearn-ternary-plot/div_half.png differ diff --git a/pages/blog/fqlearn-ternary-plot/eq_line.png b/pages/blog/fqlearn-ternary-plot/eq_line.png new file mode 100644 index 000000000..8d7eb6338 Binary files /dev/null and b/pages/blog/fqlearn-ternary-plot/eq_line.png differ diff --git a/pages/blog/fqlearn-ternary-plot/header.png b/pages/blog/fqlearn-ternary-plot/header.png new file mode 100644 index 000000000..1ff22a8d4 Binary files /dev/null and b/pages/blog/fqlearn-ternary-plot/header.png differ diff --git a/pages/blog/fqlearn-ternary-plot/index.md b/pages/blog/fqlearn-ternary-plot/index.md new file mode 100644 index 000000000..6e602da16 --- /dev/null +++ b/pages/blog/fqlearn-ternary-plot/index.md @@ -0,0 +1,514 @@ +--- +title: + "Plotting ternary phase diagrams for solving thermodynamics problems using + fqlearn" +slug: fqlearn-ternary-plot +date: 2024-05-29 +authors: ["Faith Njamiu Hunja"] +tags: [open science, thermodynamics, visualization, ternary phase diagram] +categories: [science, python, visualization] +description: | + An article on how to use the open source fqlearn library to plot three + phase diagrams used in thermodynamics, also known as ternary plots. + +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + +An article on how to use the open source Fqlearn library to plot three phase +diagrams used in thermodynamics, also known as ternary plots. + + + +## Introduction + +During the Open Science Labs Q1 2024 internship, I worked on the Fqlearn +project. [Fqlearn](https://github.com/osl-pocs/fqlearn) is an open source python +library, currently in development, which aims to facilitate the teaching of mass +transfer and thermodynamics. + +My main task involved developing methods to use a three phase diagram to solve +thermodynamics problems graphically. For this purpose, I wrote code for the +[`ThreeComponent.py`](https://github.com/osl-pocs/fqlearn/blob/main/src/fqlearn/ThreeComponent.py) +class, as well as corresponding +[tests](https://github.com/osl-pocs/fqlearn/blob/main/tests/test_three_component.py) +for the class. + +### Ternary phase diagram + +A ternary plot, ternary graph, triangle plot, simplex plot, or Gibbs triangle is +a barycentric plot on three variables which sum to a constant. It graphically +depicts the ratios of the three variables as positions in an equilateral +triangle. It is used in physical chemistry, petrology, mineralogy, metallurgy, +and other physical sciences to show the compositions of systems composed of +three species. Ternary plots are tools for analyzing compositional data in the +three-dimensional case [[1](https://en.wikipedia.org/wiki/Ternary_plot)]. + +![A ternary plot example, plotted using Fqlearn](plot.png) + +In a ternary plot, the values of the three variables a, b, and c must sum to +some constant, K. Usually, this constant is represented as 1.0 or 100%. Because +a + b + c = K for all substances being graphed, any one variable is not +independent of the others, so only two variables must be known to find a +sample's point on the graph: for instance, c must be equal to K − a − b. Because +the three numerical values cannot vary independently—there are only two degrees +of freedom—it is possible to graph the combinations of all three variables in +only two dimensions. + +The advantage of using a ternary plot for depicting chemical compositions is +that three variables can be conveniently plotted in a two-dimensional graph. +Ternary plots can also be used to create phase diagrams by outlining the +composition regions on the plot where different phases exist +[[1](https://en.wikipedia.org/wiki/Ternary_plot)]. + +## Methods + +To begin with, we import the libraries required for plotting ternary phase +diagrams. We used +[`python-ternary`](https://github.com/marcharper/python-ternary), a plotting +library that uses matplotlib to make ternary plots. Using this library, many +features could be added to the fqlearn library for various purposes, as +described in this article. + +```python +import matplotlib as plt +import numpy as np +import ternary +from scipy.interpolate import CubicSpline +``` + +Then we define our class, `ThreeComponent`, in which we create some functions, a +few of which will be explained in this article. To see how these functions work, +we create some variables, which are lists containing an unordered list of +tuples, each containing 3 values, representing the x, y and z values in the form +`[(x,y,z)]`. + +```python +right_eq_line = [(0.02, 0.02, 0.96), (0.025, 0.06, 0.915), (0.03, 0.1, 0.87), + (0.035, 0.16, 0.805), (0.04, 0.2, 0.76), (0.045, 0.25, 0.705), + (0.05, 0.3, 0.65), (0.07, 0.36, 0.57), (0.09, 0.4, 0.51), + (0.14, 0.48, 0.38), (0.33, 0.49, 0.18)] +left_eq_line = [(0.97, 0.01, 0.02), (0.95, 0.03, 0.02), (0.91, 0.06, 0.03), + (0.88, 0.09, 0.03), (0.83, 0.13, 0.04), (0.79, 0.17, 0.04), + (0.745, 0.2, 0.055), (0.68, 0.26, 0.06), (0.62, 0.3, 0.08), + (0.49, 0.4, 0.11), (0.33, 0.49, 0.18)] + +points = left_eq_line + right_eq_line +``` + +We also set the scale of our plot to 100 in the `__init__ function`. This is the +value that each tuple must sum up to. + +```python +self.scale = 100 +``` + +To start using the Three Component class, we can use the following code: + +```python +from fqlearn import ThreeComponent +model = ThreeComponent() +``` + +We can then call the functions as needed. We define a function `sort_points` +that sorts the values it receives as an argument. The points are added using the +`add_point` function, which ensures that the argument is not an empty list, +removes duplicate tuples, and multiplies each point in the tuple by the scale. + +```python +def add_point(self, points): + # Check if points is an empty list + if not points: + raise ValueError( + "The 'points' list cannot be empty. Please provide valid points." + ) + + # Remove duplicate points + points_to_plot = list(set(points)) + + # Multiply each point by the scale + points_to_plot = [ + (x * self.scale, y * self.scale, z * self.scale) + for x, y, z in points_to_plot + ] + + # Add the points to the plot + self.tax.scatter(points_to_plot, linewidth=1.0, marker="o", color="red") + return points_to_plot +``` + +The `sort_points` function sorts the tuples using the x value in each tuple, +then adds them to a new list. This allows us to have the tuples sorted in +ascending order along the x-axis. The function also ensures that all points in +the tuple(s) in the sorted list add up to the scale. + +```python +def sort_points(self, points): + points_to_plot = self.add_point(points) + # Sort the points in ascending order + xyz = [(x, y, z) for x, y, z in points_to_plot] + sorted_points = sorted(xyz, key=lambda m: m[0]) + + # New list to store sorted points + new_sorted_points = [] + + # Check if the points are in a list of lists or a single list + if isinstance( + sorted_points[0], (int, float) + ): # Check if the first element of points is a number + assert sorted_points[0] + sorted_points[1] + sorted_points[2] == self.scale + new_sorted_points.append(sorted_points) + else: + # If the points are in a list of lists + for sorted_point in sorted_points: + assert sorted_point[0] + sorted_point[1] + sorted_point[2] == self.scale + new_sorted_points.append(sorted_point) + + # Add the points to the plot + self.tax.scatter(new_sorted_points, linewidth=1.0, marker="o", color="red") + return new_sorted_points +``` + +If we print the returned values, we get the following output, where each tuple +is arranged in ascending order according to the x values: + +```console +[(2.0, 2.0, 96.0), (2.5, 6.0, 91.5), (3.0, 10.0, 87.0), (3.5000000000000004, 16.0, 80.5), (4.0, 20.0, 76.0), (4.5, 25.0, 70.5), (5.0, 30.0, 65.0), (7.000000000000001, 36.0, 56.99999999999999), (9.0, 40.0, 51.0), (14.000000000000002, 48.0, 38.0), (33.0, 49.0, 18.0), (49.0, 40.0, 11.0), (62.0, 30.0, 8.0), (68.0, 26.0, 6.0), (74.5, 20.0, 5.5), (79.0, 17.0, 4.0), (83.0, 13.0, 4.0), (88.0, 9.0, 3.0), (91.0, 6.0, 3.0), (95.0, 3.0, 2.0), (97.0, 1.0, 2.0)] +``` + +We can then call the `plot` function, to plot the ternary phase diagram in order +to visualize the plotted points. + +```python +def plot(self): + self.tax.clear_matplotlib_ticks() + self.tax.get_axes().axis("off") + self.tax.legend() + ternary.plt.show() +``` + +We obtain the ternary plot shown below: + +![Adding points to the ternary plot](add_point.png) + +We define the `composition_line` function which plots equilibrium lines joining +the tuples corresponding to the two compositions in each index in the list of +tuples. This function first multiplies each point in each tuple by the scale, +then sorts the list of the left composition in ascending order, and the list of +the right composition in descending order. For each tuple, the x, y and z values +are extracted, then joined using equilibrium lines. + +```python +def composition_line(self, left_eq_line, right_eq_line): + # Multiply each point by the scale + new_left_eq_line = [ + (x * self.scale, y * self.scale, z * self.scale) for x, y, z in left_eq_line + ] + new_right_eq_line = [ + (x * self.scale, y * self.scale, z * self.scale) + for x, y, z in right_eq_line + ] + + # Sort the left points in ascending order + xyz = [(x, y, z) for x, y, z in new_left_eq_line] + sorted_left_eq_line = sorted(xyz, key=lambda m: m[0]) + # Sort the right points in descending order + xyz = [(x, y, z) for x, y, z in new_right_eq_line] + sorted_right_eq_line = sorted(xyz, key=lambda m: m[0], reverse=True) + + for i in range(len(left_eq_line)): + # Ensure all points add up to the scale + pointA = sorted_left_eq_line[i] + assert sum(pointA) == self.scale + pointB = sorted_right_eq_line[i] + assert sum(pointB) == self.scale + + # Extract x and y coordinates of each point + xA, yA, zA = pointA + xB, yB, zB = pointB + + # Add the two points to the plot + self.tax.scatter([(xA, yA, zA), (xB, yB, zB)], marker="s", color="red") + # Plot a line connecting the two points + self.tax.plot( + [(xA, yA, zA), (xB, yB, zB)], + linewidth=1.0, + color="blue", + ) +``` + +We obtain the following ternary plot: + +![Equilibrium line joining two compositions](solute_points.png) + +We can calculate the slope of the equilibrium lines plotted above using the +function `eq_slope`. We loop through each tuple of each composition in each +index, extract the x and y values, and find the slope, by dividing the change in +y by the change in x for each index. The function returns the average slope. + +```python +def eq_slope(self, right_eq_line, left_eq_line): + # Multiply each point by the scale + right_eq_line = [ + (x * self.scale, y * self.scale, z * self.scale) + for x, y, z in right_eq_line + ] + left_eq_line = [ + (x * self.scale, y * self.scale, z * self.scale) for x, y, z in left_eq_line + ] + + # Sort the right points in ascending order + xyz = [(x, y, z) for x, y, z in right_eq_line] + right_eq = sorted(xyz, key=lambda m: m[0]) + # Sort the left points in descending order + xyz = [(x, y, z) for x, y, z in left_eq_line] + left_eq = sorted(xyz, key=lambda m: m[0], reverse=True) + + slopes = [] + + for i in range(len(right_eq_line)): + pointA = right_eq[i] + assert sum(pointA) == self.scale + pointB = left_eq[i] + assert sum(pointB) == self.scale + + # Extract x and y coordinates of each point + xA, yA, _ = pointA + xB, yB, _ = pointB + + # Calculate the slope of the line joining the points + if xA - xB != 0: # Check for vertical line + slope = (yA - yB) / (xA - xB) + slopes.append(slope) + else: + # For vertical lines, return None for slope + slopes.append(0) + print("Slope = ", slopes) + + # Calculate average of the slopes + avg_slope = sum(slopes) / len(slopes) + print("Average slope = ", avg_slope) + return avg_slope +``` + +We obtain the following output: + +```console +Slope = [-0.010526315789473684, -0.032432432432432434, -0.045454545454545456, -0.08284023668639054, -0.08860759493670886, -0.10738255033557047, -0.14388489208633093, -0.16393442622950818, -0.18867924528301888, -0.22857142857142856, 0] +Average slope = -0.09930124252776436 +``` + +We can also plot a ternary phase diagram with an equilibrium line joining all +the plotted points, like in a graph, by calling the `add_eq_line` function. + +```python +def add_eq_line(self, right_eq_line, left_eq_line): + # Add the points + self.right_eq_line = self.sort_points(right_eq_line) + self.left_eq_line = self.sort_points(left_eq_line) + eq_line = self.right_eq_line + self.left_eq_line + + # Remove duplicate points + eq_line_plot = list(set(eq_line)) + + # Sort the points in ascending order + xyz = [(x, y, z) for x, y, z in eq_line_plot] + sorted_eq = sorted(xyz, key=lambda m: m[0]) + + self.tax.plot(sorted_eq, linewidth=1.0, color="blue", label="Equilibrium line") +``` + +We get the ternary plot below: + +![Joining points with an equilibrium line](eq_line.png) + +However, the equilibrium line plotted above is not smooth. To generate a smooth +line, we use the `interpolate_points` function. + +We first sort the points using the `sort_points` function. Then we extract the x +and y values from the sorted points, ignoring the z values which will not be +used. Variable `x` becomes a list of all x values and variable `y` becomes a +list of all y values. After that, we perform cubic spline interpolation on the x +and y values using the CubicSpline function, imported from the scipy.interpolate +module of SciPy's library +[[2](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.CubicSpline.html)]. +`bc_type="natural"` specifies the natural boundary conditions, meaning the +second derivative of the spline at the boundaries will be set to zero. `x_cubic` +is set to a linearly spaced array of values ranging from 0 to 100 with 100 +number of points, which is the value of `self.scale`, and `y_cubic` contains the +corresponding y values interpolated using the cubic spline function `f`. Then we +filter out any points outside the specified range of 0 to 100 for both `x_cubic` +and `y_cubic`, and use the `np.column_stack` function to combine `x_cubic` and +`y_cubic` into a single 2D array, which is returned by the function as +`interpolated_points`. + +```python +def interpolate_points(self, points): + sorted_points = self.sort_points(points) + + # Cubic spline interpolation + x = [x for x, y, _ in sorted_points] + y = [y for x, y, _ in sorted_points] + + f = CubicSpline(x, y, bc_type="natural") + x_cubic = np.linspace(0, self.scale, self.scale) + y_cubic = f(x_cubic) + + # Remove negative points + interpolated_points = [ + [i, j] + for i, j in np.column_stack((x_cubic, y_cubic)) + if 0 <= i <= self.scale and 0 <= j <= self.scale + ] + + return interpolated_points +``` + +Printing the output of the function, we obtain the output below, showing the +interpolated points: + +```console +[[2.0202020202020203, 2.1691472640742586], [3.0303030303030303, 10.329514857514697], [4.040404040404041, 20.340775738329878], [5.050505050505051, 30.41604117022922], [6.0606060606060606, 34.9725244736696], [7.070707070707071, 36.0788150823154], [8.080808080808081, 37.866519430111914], [9.090909090909092, 40.207639450509895], [10.101010101010102, 42.33305618527275], [11.111111111111112, 44.15164951408806], [12.121212121212121, 45.70152886497335], [13.131313131313131, 47.02080366594621], [14.141414141414142, 48.147569717383064], [15.151515151515152, 49.11261947676193], [16.161616161616163, 49.927423194367556], [17.171717171717173, 50.600292249170636], [18.181818181818183, 51.13953802014185], [19.191919191919194, 51.55347188625187], [20.202020202020204, 51.850405226471395], [21.212121212121215, 52.038649419771076], [22.222222222222225, 52.12651584512162], [23.232323232323235, 52.122315881493684], [24.242424242424242, 52.03436090785797], [25.252525252525253, 51.87096230318516], [26.262626262626263, 51.640431446445916], [27.272727272727273, 51.35107971661092], [28.282828282828284, 51.011218492650855], [29.292929292929294, 50.62915915353641], [30.303030303030305, 50.213213078238255], [31.313131313131315, 49.771691645727074], [32.323232323232325, 49.31290623497355], [33.333333333333336, 48.84510804535748], [34.343434343434346, 48.37284930204433], [35.35353535353536, 47.89489752249601], [36.36363636363637, 47.409516570717145], [37.37373737373738, 46.91497031071236], [38.38383838383839, 46.40952260648627], [39.3939393939394, 45.891437322043494], [40.40404040404041, 45.358978321388655], [41.41414141414142, 44.81040946852637], [42.42424242424243, 44.24399462746127], [43.43434343434344, 43.65799766219796], [44.44444444444445, 43.050682436741056], [45.45454545454546, 42.4203128150952], [46.46464646464647, 41.765152661265006], [47.47474747474748, 41.083465839255076], [48.484848484848484, 40.373516213070054], [49.494949494949495, 39.63371670174959], [50.505050505050505, 38.86607499990182], [51.515151515151516, 38.076288591118626], [52.525252525252526, 37.270223020764256], [53.535353535353536, 36.45374383420295], [54.54545454545455, 35.63271657679892], [55.55555555555556, 34.81300679391643], [56.56565656565657, 34.000480030919704], [57.57575757575758, 33.201001833172974], [58.58585858585859, 32.42043774604049], [59.5959595959596, 31.664653314886465], [60.60606060606061, 30.93951408507516], [61.61616161616162, 30.250885601970786], [62.62626262626263, 29.60336029919871], [63.63636363636364, 28.983912044764498], [64.64646464646465, 28.366648419185424], [65.65656565656566, 27.72538388514391], [66.66666666666667, 27.0339329053224], [67.67676767676768, 26.26610994240331], [68.68686868686869, 25.39917799115036], [69.6969696969697, 24.44860975371087], [70.70707070707071, 23.453665293050822], [71.71717171717172, 22.45396405508463], [72.72727272727273, 21.489125485726685], [73.73737373737374, 20.59876903089141], [74.74747474747475, 19.822230508859366], [75.75757575757576, 19.162761793258028], [76.76767676767678, 18.552564414178864], [77.77777777777779, 17.915539652280298], [78.7878787878788, 17.175588788220747], [79.7979797979798, 16.27016258697005], [80.80808080808082, 15.240129979240486], [81.81818181818183, 14.174027140890017], [82.82828282828284, 13.160644754568583], [83.83838383838385, 12.27416074496895], [84.84848484848486, 11.4905826393484], [85.85858585858587, 10.745488901010873], [86.86868686868688, 9.974332435176901], [87.87878787878789, 9.112566147067007], [88.8888888888889, 8.11684009659671], [89.89898989898991, 7.065697936762742], [90.90909090909092, 6.081168542871885], [91.91919191919193, 5.257512388433542], [92.92929292929294, 4.543021889369125], [93.93939393939395, 3.8382841183777483], [94.94949494949496, 3.043859233178794], [95.95959595959597, 2.0885249765853326], [96.96969696969697, 1.0322241687602192]] +``` + +Next, we define a function, `div_half`, to divide an equilibrium line in half, +and thus dividing the interpolated points in the left side from those in the +right side. Before that, we define some helper functions, `derivative` and +`min_diff`. + +The `derivative` function extracts the x and y values, then calculates the n-th +discrete difference between these values using NumPy's np.diff +[[3](https://numpy.org/doc/stable/reference/generated/numpy.diff.html)]. The +first value of dydx is given by dydx[i] = (y[i+1] - y[i])/(x[i+1] - x[i]) along +the given axis and higher differences are calculated by using np.diff +recursively. + +```python +def derivative(self, points): + points_to_derive = self.interpolate_points(points) + + # Extract x and y values + x = [x for x, _ in points_to_derive] + y = [y for _, y in points_to_derive] + + # Calculate derivative + dydx = np.diff([y]) / np.diff([x]) + + return dydx +``` + +We can print out dydx to see the output: + +```console +[[ 8.07876392e+00 9.91114827e+00 9.97451278e+00 4.51091847e+00 + 1.09522770e+00 1.76982730e+00 2.31770882e+00 2.10416257e+00 + 1.80040740e+00 1.53438056e+00 1.30608205e+00 1.11549839e+00 + 9.55399262e-01 8.06655680e-01 6.66140364e-01 5.33853313e-01 + 4.09794527e-01 2.93964007e-01 1.86361751e-01 8.69877611e-02 + -4.15796399e-03 -8.70754239e-02 -1.61764619e-01 -2.28225548e-01 + -2.86458213e-01 -3.36462612e-01 -3.78238746e-01 -4.11786615e-01 + -4.37106218e-01 -4.54197557e-01 -4.63120208e-01 -4.67536156e-01 + -4.73172262e-01 -4.80527142e-01 -4.89600797e-01 -5.00393227e-01 + -5.12904432e-01 -5.27134411e-01 -5.43083164e-01 -5.60750693e-01 + -5.80136996e-01 -6.01242073e-01 -6.24065925e-01 -6.48608552e-01 + -6.74869954e-01 -7.02850130e-01 -7.32401516e-01 -7.59965285e-01 + -7.81888545e-01 -7.98004915e-01 -8.08314395e-01 -8.12816985e-01 + -8.11512685e-01 -8.04401495e-01 -7.91483416e-01 -7.72758446e-01 + -7.48226587e-01 -7.17887838e-01 -6.81742198e-01 -6.41050050e-01 + -6.13253772e-01 -6.11090989e-01 -6.34851889e-01 -6.84536470e-01 + -7.60144733e-01 -8.58262632e-01 -9.41062555e-01 -9.84995016e-01 + -9.89704226e-01 -9.55190184e-01 -8.81452890e-01 -7.68773137e-01 + -6.52874028e-01 -6.04095405e-01 -6.30654514e-01 -7.32551355e-01 + -8.96371939e-01 -1.01973228e+00 -1.05544181e+00 -1.00324856e+00 + -8.77619170e-01 -7.75742325e-01 -7.37642801e-01 -7.63444901e-01 + -8.53148625e-01 -9.85768790e-01 -1.04063074e+00 -9.74684100e-01 + -8.15419593e-01 -7.07345594e-01 -6.97690393e-01 -7.86480636e-01 + -9.45780914e-01 -1.04573780e+00]] +``` + +Then we use the `min_diff` function to find the index of the point that is at +the centre of the equilibrium line, which divides it into 2 halves. Starting +with an index value of zero and a minimum difference given by the difference +between the absolute of the first `dydx` value and the average slope, we iterate +over the indices of `dydx` to find the index of the `dydx` value which is +closest to the average slope `avg_slope`. + +```python +def min_diff(self, right_eq_line, left_eq_line): + self.points = right_eq_line + left_eq_line + dydx = self.derivative(self.points) + avg_slope = self.eq_slope(right_eq_line, left_eq_line) + + min_index = 0 + # Initialize min_diff_value with the first element difference + min_diff_value = abs(dydx[0][0] - avg_slope) + + # Iterate over indices of dydx + for index in range(0, dydx.size): + diff = abs(dydx[0][index] - avg_slope) + if diff < min_diff_value: + min_diff_value = diff + min_index = index + + return min_index +``` + +We then define the `div_half` function that divides the equilibrium line +precisely in half. We use the interpolated points from the `interpolate_points` +function, which ensures that the point of division is very precise. Then we use +the `min_diff` function to obtain the index of the point dividing the +equilibrium line in half. Using this index, we can halve the interpolated +points, and plot two equilibrium lines on the right and left side of the ternary +plot using these points. + +```python +def div_half(self, right_eq_line, left_eq_line): + # Add the points + self.points = right_eq_line + left_eq_line + interpolated_points = self.interpolate_points(self.points) + + # Use index to separate right and left side + index = self.min_diff(right_eq_line, left_eq_line) + self.interpolated_right_side = interpolated_points[index:] + self.interpolated_left_side = interpolated_points[: index + 1] + + # Plot the curve + self.tax.plot( + self.interpolated_right_side, + linewidth=1.0, + color="blue", + label="Right interpolated curve", + ) + self.tax.plot( + self.interpolated_left_side, + linewidth=1.0, + color="orange", + label="Left interpolated curve", + ) +``` + +We obtain the following ternary plot: + +![Dividing the interpolated points in half](div_half.png) + +## Acknowledgements + +I would like to thank the [Open Science Labs](https://opensciencelabs.org/) and +The Graph Network for giving me the opportunity to learn and gain experience in +open source through this internship. I also thank +[Ever Vino](https://github.com/EverVino) for his guidance and mentorship +throughout this internship program. If you would like to connect with me, you +can find me on [LinkedIn](https://www.linkedin.com/in/faithhunja), or check out +my [personal website](https://faithhunja.github.io/). + +## References + +[1] Ternary plots - Wikipedia: + +[2] scipy.interpolate.CubicSpline - SciPy v1.13.1 Manual: + + +[3] numpy.diff - NumPy v1.26 Manual: + diff --git a/pages/blog/fqlearn-ternary-plot/plot.png b/pages/blog/fqlearn-ternary-plot/plot.png new file mode 100644 index 000000000..362fb1753 Binary files /dev/null and b/pages/blog/fqlearn-ternary-plot/plot.png differ diff --git a/pages/blog/fqlearn-ternary-plot/solute_points.png b/pages/blog/fqlearn-ternary-plot/solute_points.png new file mode 100644 index 000000000..f41ff226c Binary files /dev/null and b/pages/blog/fqlearn-ternary-plot/solute_points.png differ diff --git a/pages/blog/fqlearn-visualizacion-datos/3ddiagram.png b/pages/blog/fqlearn-visualizacion-datos/3ddiagram.png new file mode 100644 index 000000000..6842e866d Binary files /dev/null and b/pages/blog/fqlearn-visualizacion-datos/3ddiagram.png differ diff --git a/pages/blog/fqlearn-visualizacion-datos/header.png b/pages/blog/fqlearn-visualizacion-datos/header.png new file mode 100644 index 000000000..1ff22a8d4 Binary files /dev/null and b/pages/blog/fqlearn-visualizacion-datos/header.png differ diff --git a/pages/blog/fqlearn-visualizacion-datos/index.md b/pages/blog/fqlearn-visualizacion-datos/index.md new file mode 100644 index 000000000..1ac96093d --- /dev/null +++ b/pages/blog/fqlearn-visualizacion-datos/index.md @@ -0,0 +1,450 @@ +--- +title: + "Explorando fqlearn: Potenciando el Análisis y Diseño de Procesos + Termodinámicos" +slug: fqlearn-visualizacion-datos +date: 2023-12-14 +authors: ["José María"] +tags: [quimica, fisica, datos, visualizacion, docencia] +categories: [ciencia, python, docencia, datos] +description: | + En este artículo se describe la utilidad que ofrece una visualización sencilla + de cálculos termodinámicos, útil para el manejo de docentes y el aprendizaje + por parte de los alumnos interesados en el tema. Usando las funciones disponibles + en las clases de McCabe-Thiele, y SteamTable. +thumbnail: "/header.png" +template: "blog-post.html" +--- + + + +En este artículo se describe la utilidad que ofrece una visualización sencilla +de cálculos termodinámicos, útil para el manejo de docentes y el aprendizaje por +parte de los alumnos interesados en el tema. Usando las funciones disponibles en +las clases de McCabe-Thiele, y SteamTable. + + + +# Explorando fqlearn: Potenciando el Análisis y Diseño de Procesos Termodinámicos + +En el apasionante mundo de la ingeniería química, la biblioteca `fqlearn` emerge +como una herramienta valiosa, ofreciendo capacidades significativas para el +análisis y diseño de procesos. Diseñada para mejorar la visualización de datos y +servir como una herramienta educativa, `fqlearn` se posiciona como un recurso +versátil para ingenieros y científicos en la industria química. + +## Implementación de la Clase McCabe-Thiele para Análisis Gráfico de Destilación Binaria en Python + +La clase `McCabeThiele` dentro de `fqlearn` brinda funcionalidades +especializadas para llevar a cabo cálculos de equilibrio líquido-vapor +utilizando el método de McCabe-Thiele. Este método es esencial en el diseño de +columnas de destilación, permitiendo determinar el número óptimo de etapas +necesarias para separar componentes en una mezcla. + +La clase McCabeThiele es una implementación en Python del método de +McCabe-Thiele, una técnica gráfica fundamental en el diseño de columnas de +destilación para procesos químicos. Este método proporciona una manera visual de +analizar y dimensionar sistemas de destilación binaria. A continuación, se +presenta una descripción detallada de la clase y sus principales componentes. + +# Ejemplo de uso de McCabeThiele en fqlearn + +```python +# Importar la clase McCabeThiele de la biblioteca fqlearn +from fqlearn.McCabeThiele import McCabeThiele + + +# Crear una instancia del modelo McCabeThiele +model = McCabeThiele() + +# Establecer los compuestos para el análisis (metanol y agua) +model.set_data(compound_a="methanol", compound_b="water") + +# Establecer las composiciones del destilado (xD) y del líquido (xW) +model.set_compositions(xD=0.94, xW=0.05) + +# Establecer los parámetros de alimentación (relación de calor q y composición xF) +model.set_feed(q=0.5, xF=0.5) + +# Resolver el sistema y calcular el número de etapas necesarias +model.solve() + +# Imprimir información relevante sobre el reflujo mínimo y la composición líquida de salida +model.describe() +``` + +## Función describe + +La función 'describe' imprime en pantalla información sobre cada etapa en el +proceso de McCabe-Thiele. + +- El reflujo mínimo es de: 0.7480780119884876 +- La composición líquida de salida: 0.05 + +### Composición de entrada y salida en cada etapa: + +- Etapa 1: Entrada = 0.9400, Salida = 0.9400 +- Etapa 2: Entrada = 0.8783, Salida = 0.9400 +- Etapa 3: Entrada = 0.8783, Salida = 0.9074 +- Etapa 4: Entrada = 0.7933, Salida = 0.9074 +- Etapa 5: Entrada = 0.7933, Salida = 0.8624 +- Etapa 6: Entrada = 0.6840, Salida = 0.8624 +- Etapa 7: Entrada = 0.6840, Salida = 0.8046 +- Etapa 8: Entrada = 0.5611, Salida = 0.8046 +- Etapa 9: Entrada = 0.5611, Salida = 0.7396 +- Etapa 10: Entrada = 0.4316, Salida = 0.7396 + +Número total de etapas: 9 + +```python +# Generar un gráfico que muestra las curvas de equilibrio, la línea de alimentación y las etapas del proceso +model.plot() +``` + +## Función plot + +La función plot de McCabe-Thiele le muestra al usuario la gráfica de destilación +binaria, con todas las etapas y demás información que el usuario pueda solicitar + +![ejemplo de mcabethiele](mccabethiele.png) + +**Ejes:** Los ejes X e Y representan la composición molar x y y respectivamente, +variando de 0 a 1. + +**Líneas:** + +- _Equilibrio (azul):_ Esta línea se extiende diagonalmente a través del gráfico + y representa el equilibrio entre las fases líquida y vapor de la mezcla. + +- _Intersección (roja):_ Esta línea marca un punto específico de intersección + entre las curvas ROP y SOP. + +- _ROP (naranja):_ Representa la línea de operación de rectificación, que es la + sección de la columna de destilación por encima del plato de alimentación. + +- _SOP (verde):_ Representa la línea de operación de agotamiento, que es la + sección de la columna de destilación por debajo del plato de alimentación. + +- _Pasos (púrpura):_ Estos indican los platos teóricos necesarios para la + separación. Cada paso representa un plato teórico en la columna de + destilación. + +Este gráfico es útil para determinar el número de platos teóricos necesarios en +una columna de destilación para separar una mezcla de metanol-agua. Los platos +teóricos son una medida de la eficiencia de la columna de destilación. Cuantos +más platos teóricos tenga una columna, más eficiente será la separación. + +**Importancia de la Destilación Binaria de McCabe-Thiele:** + +La destilación binaria de McCabe-Thiele es un método crucial en ingeniería +química y procesos de separación, utilizado para analizar y diseñar columnas de +destilación. A continuación, se detallan algunas de las razones clave por las +cuales la destilación binaria de McCabe-Thiele es importante: + +**Diseño Eficiente de Columnas de Destilación:** + +- Proporciona un enfoque sistemático y gráfico para el diseño de columnas de + destilación binarias, permitiendo determinar el número mínimo de etapas + requeridas para una separación específica. +- Facilita la comprensión de la eficiencia de una columna de destilación y la + relación entre el número de etapas teóricas y reales. + +**Optimización de Procesos de Separación:** + +- Permite optimizar los procesos de separación de mezclas binarias, como la + purificación de componentes en la industria química y petroquímica. +- Ayuda en la selección adecuada de condiciones operativas para lograr la + separación deseada de componentes. + +**Análisis Detallado de Comportamientos de Mezclas:** + +- Proporciona una representación visual y detallada de la composición de las + mezclas en cada etapa de la columna de destilación, lo que facilita el + análisis del comportamiento de los componentes. +- Permite identificar el reflujo mínimo necesario para una separación específica + y evaluar la eficiencia del proceso. + +**Entendimiento de Interacciones de Componentes:** + +- Ayuda a comprender las interacciones entre los componentes de la mezcla y cómo + influyen en el proceso de destilación. +- Permite evaluar la viabilidad y eficiencia de la separación de componentes + específicos en una mezcla binaria. + +**Herramienta Educativa y de Investigación:** + +- Se utiliza como herramienta educativa para estudiantes en ingeniería química y + campos relacionados para comprender los principios fundamentales de la + destilación. +- Es una herramienta valiosa para la investigación y desarrollo de procesos de + destilación más eficientes y sostenibles. + +**Análisis de Sistemas de Ingeniería de Procesos:** + +- Facilita el análisis de sistemas de ingeniería de procesos que involucran la + destilación de mezclas binarias, contribuyendo a la mejora continua y la + optimización de operaciones. + +## Implementación de la Clase SteamTable para una consulta eficáz de las tablas de vapor + +La clase SteamTable ofrece capacidades para gestionar y representar datos +termodinámicos asociados con las fases de vapor y líquido, centrándose +especialmente en tablas vapor. + +Esta función es valiosa en aplicaciones donde se requiere conocer propiedades +termodinámicas precisas para una temperatura específica, por ejemplo, en el +diseño y análisis de sistemas termodinámicos, procesos de ingeniería, o +cualquier escenario donde la temperatura es un parámetro crítico. Proporciona +una herramienta flexible y útil para obtener datos detallados en puntos +específicos de interés en la tabla termodinámica de vapor. + +# Ejemplo de uso de SteamTable en fqlearn + +```python +from fqlearn.SteamTable import SteamTable + +# Crea una instancia llamada sistema con SteamTable, y carga las tablas en la base de datos +sistema = SteamTable() + +# Imprime al usuario las tablas pre-cargadas en la base de datos +sistema.data() + +# Le muestra al usuario el gráfico solicitado +sistema.plot('PV') +sistema.plot('PT') +sistema.plot('TV') +sistema.plot3d() + +# Le da al usuario información disponible en las tablas con la temperatura proporcionada +sistema.point(t = 100) +``` + +## Función data + +La función 'data' tiene la capacidad de imprimir las tablas de vapor que están +cargadas en la base de datos, mostrándolas con incrementos de 20 en 20. Este +enfoque permite al usuario visualizar de manera rápida y eficiente la tabla, +facilitando así la realización de consultas de forma ágil. + +| t | p | rhoL | rhoV | hL | hV | delta_h | sL | sV | delta_s | vL | vV | +| ----- | --------- | ------ | --------- | ------ | ------ | ------- | -------- | ------ | ------- | ------- | ------- | +| 16.0 | 0.0018188 | 998.9 | 0.013 645 | 67.17 | 2530.2 | 2463.0 | 0.238 97 | 8.757 | 8.518 | 1.0011 | 73286.0 | +| 36.0 | 0.0059479 | 993.64 | 0.041 790 | 150.81 | 2566.3 | 2415.5 | 0.518 67 | 8.3321 | 7.8135 | 1.0064 | 23929.0 | +| 72.0 | 0.034 | 976.58 | 0.215 07 | 301.45 | 2629.5 | 2328.1 | 0.979 49 | 7.7246 | 6.7451 | 1.02398 | 4649.6 | +| 92.0 | 0.075684 | 963.94 | 0.454 91 | 385.46 | 2662.8 | 2277.3 | 1.2160 | 7.4526 | 6.2367 | 1.03741 | 2198.2 | +| 128.0 | 0.2545 | 936.52 | 1.4149 | 537.85 | 2717.3 | 2179.5 | 1.6135 | 7.0465 | 5.433 | 1.06778 | 706.75 | +| 148.0 | 0.45118 | 918.87 | 2.422 | 623.56 | 2743.5 | 2119.9 | 1.8214 | 6.8552 | 5.0337 | 1.0883 | 412.88 | +| 184.0 | 1.0985 | 882.69 | 5.6279 | 780.75 | 2780.6 | 1999.8 | 2.1779 | 6.5525 | 4.3746 | 1.1329 | 177.69 | +| 204.0 | 1.6893 | 859.95 | 8.5186 | 870.35 | 2794.3 | 1923.9 | 2.3683 | 6.4004 | 4.0322 | 1.16286 | 117.39 | +| 240.0 | 3.3469 | 813.37 | 16.749 | 1037.6 | 2803.0 | 1765.4 | 2.702 | 6.1423 | 3.4403 | 1.22946 | 59.705 | +| 260.0 | 4.6923 | 783.63 | 23.712 | 1135.0 | 2796.6 | 1661.6 | 2.8849 | 6.0016 | 3.1167 | 1.27612 | 42.173 | +| 296.0 | 8.1143 | 720.23 | 43.21 | 1322.8 | 2757.0 | 1434.2 | 3.2174 | 5.7373 | 2.5199 | 1.38845 | 23.143 | +| 316.0 | 10.699 | 676.81 | 60.361 | 1437.8 | 2712.3 | 1274.5 | 3.4097 | 5.5729 | 2.1632 | 1.47751 | 16.567 | +| 352.0 | 16.939 | 566.46 | 118.68 | 1687.5 | 2549.6 | 862.1 | 3.8039 | 5.1829 | 1.379 | 1.76536 | 8.4257 | +| 372.0 | 21.554 | 422.26 | 226.84 | 1935.3 | 2275.5 | 340.3 | 4.1785 | 4.7059 | 0.5274 | 2.3682 | 4.4084 | + +## Función plot + +### Diagrama Presión-Volumen (P-V): + +- **Concepto:** Muestra la relación entre la presión y el volumen de un sistema + termodinámico. +- **Eje X:** Volumen. +- **Eje Y:** Presión. +- **Características:** En un diagrama P-V, las curvas representan los procesos + termodinámicos del sistema. Puede mostrar procesos adiabáticos, isotérmicos, + isobáricos, etc. La pendiente de las curvas indica propiedades como la + compresibilidad del fluido. + +![diagrama pv](pvdiagram.png) + +### Diagrama Presión-Temperatura (P-T): + +- **Concepto:** Muestra la relación entre la presión y la temperatura de un + sistema termodinámico. +- **Eje X:** Temperatura. +- **Eje Y:** Presión. +- **Características:** Este diagrama revela cómo cambia la presión con la + temperatura bajo diversas condiciones. Puede mostrar regiones de fases (por + ejemplo, líquido, vapor, o ambos) y proporciona información sobre las + transiciones de fase. + +![diagrama pt](ptdiagram.png) + +### Diagrama Temperatura-Volumen (T-V): + +- **Concepto:** Muestra la relación entre la temperatura y el volumen de un + sistema termodinámico. +- **Eje X:** Volumen. +- **Eje Y:** Temperatura. +- **Características:** Este diagrama ayuda a visualizar cómo la temperatura se + relaciona con el volumen en diferentes procesos. Puede mostrar curvas de + saturación, isóbaras, entre otras. + +![diagrama tv](tvdiagram.png) + +Estos diagramas son herramientas esenciales en termodinámica y se utilizan +comúnmente para representar y analizar los ciclos termodinámicos, como el ciclo +de Carnot en máquinas térmicas. Además, en el caso de sustancias puras, los +diagramas P-V, P-T y T-V son útiles para entender las propiedades y +comportamientos de la sustancia en diferentes estados termodinámicos. Por +ejemplo, el diagrama P-V de una sustancia pura puede revelar información sobre +la expansión y la compresión durante un proceso termodinámico. + +## Función plot3d + +### Diagrama Tridimensional PVT: + +- **Ejes:** + + - **Eje X:** Volumen (V) + - **Eje Y:** Presión (P) + - **Eje Z:** Temperatura (T) + +- **Características:** + + - Este diagrama tridimensional proporciona una representación visual de cómo + la presión, el volumen y la temperatura interactúan en un sistema + termodinámico. + + - Permite observar las superficies de fases y regiones críticas en función de + los cambios en las variables P, V y T. + + - Se utiliza para estudiar propiedades como la expansión y contracción de + sustancias, cambios de fase y transiciones críticas. + + - Puede revelar información sobre la estabilidad de las fases y proporcionar + una comprensión detallada del comportamiento termodinámico de un fluido. + +- **Aplicaciones:** + + - Útil en la industria química y de petróleo para comprender el comportamiento + de sustancias en condiciones de presión y temperatura variables. + + - Permite visualizar las áreas de vapor, líquido y fase crítica en un solo + diagrama. + + - Ayuda en el diseño y optimización de procesos termodinámicos complejos. + +- **Importancia:** + + - Facilita la comprensión de las propiedades físicas de sustancias y su + respuesta a cambios en las condiciones ambientales. + + - Ayuda en la predicción de comportamientos críticos, como la formación de + fases y puntos críticos. + +Este tipo de diagrama es una herramienta valiosa para los ingenieros y +científicos que trabajan en el estudio y diseño de sistemas termodinámicos, +especialmente en áreas como la química, la ingeniería de procesos y la industria +del petróleo y gas. + +![diagrama 3d](3ddiagram.png) + +## Función point + +La función 'point' permite al usuario buscar valores en la tabla de vapor +introduciendo la temperatura deseada, esta regresa el valor correspondiende de +presión, densidad, entalpía, entropía y volumen + +### Datos del punto buscado + +- Temperatura: 100ºC +- Presión: 0.10142 MPa +- Densidad líquido (rhoL): 958.35 kg/m^3 +- Densidad vapor (rhoV): 0.59817 kg/m^3 +- Entalpía líquido (hL): 419.17 KJ/kg +- Entalpía vapor (hV): 2675.6 KJ/kg +- Cambio de entalpía (delta_h): 2256.4 KJ/kg +- Entropía líquido (sL): 1.3072 KJ/(kg·K) +- Entropía vapor (sV): 7.3541 KJ/(kg·K) +- Cambio de entropía (delta_s): 6.0469 KJ/(kg·K) +- Volumen líquido (vL): 1.04346 cm^3/g +- Volumen vapor (vV): 1671.8 cm^3/g + +**Importancia de las Tablas de Vapor en Termodinámica:** + +Las tablas de vapor son herramientas fundamentales en termodinámica para el +estudio y análisis de sustancias en estados gaseosos y líquidos, proporcionando +información crucial sobre las propiedades termodinámicas de las sustancias. A +continuación, se detallan algunas de las razones clave por las cuales las tablas +de vapor son esenciales: + +**Propiedades Termodinámicas Precisas:** + +- Las tablas de vapor contienen datos precisos y experimentales sobre + propiedades termodinámicas, como la presión, temperatura, entalpía, entropía, + volumen específico y otras. + +- Estos datos permiten realizar cálculos precisos en procesos termodinámicos y + determinar el comportamiento de las sustancias en diferentes condiciones. + +**Diseño y Análisis de Ciclos Termodinámicos:** + +- Son esenciales en el diseño y análisis de ciclos termodinámicos, como el ciclo + Rankine en plantas de energía, el ciclo de refrigeración por compresión de + vapor, y otros procesos de conversión de energía. + +- Facilitan la identificación de puntos críticos, condiciones de saturación, y + la comprensión de las fases involucradas en estos ciclos. + +**Predicción de Comportamientos en Procesos Térmicos:** + +- Permiten predecir cómo una sustancia se comportará bajo diversas condiciones + de temperatura y presión, facilitando la planificación y operación eficiente + de sistemas termodinámicos. + +- Ayudan en la identificación de transiciones de fase, como la vaporización y la + condensación, y proporcionan datos sobre las condiciones críticas. + +**Determinación de Propiedades en Ingeniería y Ciencias Aplicadas:** + +- En ingeniería química, mecánica y otras disciplinas, las tablas de vapor son + utilizadas para calcular y analizar procesos, desde la producción de energía + hasta el diseño de sistemas de climatización. + +- Facilitan la determinación de propiedades clave necesarias en el diseño y + operación de equipos y maquinaria. + +**Análisis de Problemas de Transferencia de Calor y Masa:** + +- Son esenciales para el análisis de problemas relacionados con la transferencia + de calor y masa, proporcionando datos para calcular tasas de evaporación, + coeficientes de transferencia de calor, y más. + +- Ayudan en la comprensión de fenómenos como la condensación y evaporación en + intercambiadores de calor. + +**Entendimiento de Comportamientos de Sustancias Puras:** + +- Para sustancias puras, las tablas de vapor son fundamentales para entender + cómo las propiedades termodinámicas varían en diferentes estados, lo que es + esencial para la investigación y el desarrollo de nuevos materiales y + procesos. + +En resumen, las tablas de vapor son una herramienta invaluable en la +termodinámica aplicada, proporcionando datos cruciales que permiten comprender, +diseñar y optimizar una amplia variedad de sistemas y procesos en ingeniería y +ciencia. + +# Conclusiones + +En este artículo, hemos explorado la utilidad y aplicaciones prácticas de las +funciones disponibles en las clases de McCabe-Thiele y SteamTable de fqlearn. La +capacidad de visualizar de manera sencilla cálculos termodinámicos demuestra ser +invaluable, especialmente para docentes que buscan simplificar la enseñanza y +para alumnos que desean comprender de manera efectiva los conceptos +termodinámicos. La combinación de estas herramientas en fqlearn proporciona una +plataforma integral que facilita tanto la instrucción como el aprendizaje en el +fascinante campo de la termodinámica. + +## Repositorio en GitHub + +No olvides que puedes consultar fqlearn en +[Github](https://github.com/osl-pocs/fqlearn) + +## Contácto + +El autor de este artículo se encuentra disponible en +[LinkedIn](https://www.linkedin.com/in/josé-maría-garcía-márquez-556a75199/), y +en [Github](https://github.com/JoseMariaGarciaMarquez). diff --git a/pages/blog/fqlearn-visualizacion-datos/mccabethiele.png b/pages/blog/fqlearn-visualizacion-datos/mccabethiele.png new file mode 100644 index 000000000..1d6892d87 Binary files /dev/null and b/pages/blog/fqlearn-visualizacion-datos/mccabethiele.png differ diff --git a/pages/blog/fqlearn-visualizacion-datos/ptdiagram.png b/pages/blog/fqlearn-visualizacion-datos/ptdiagram.png new file mode 100644 index 000000000..5bc30b6db Binary files /dev/null and b/pages/blog/fqlearn-visualizacion-datos/ptdiagram.png differ diff --git a/pages/blog/fqlearn-visualizacion-datos/pvdiagram.png b/pages/blog/fqlearn-visualizacion-datos/pvdiagram.png new file mode 100644 index 000000000..d79b5f50d Binary files /dev/null and b/pages/blog/fqlearn-visualizacion-datos/pvdiagram.png differ diff --git a/pages/blog/fqlearn-visualizacion-datos/tvdiagram.png b/pages/blog/fqlearn-visualizacion-datos/tvdiagram.png new file mode 100644 index 000000000..5d508d4d5 Binary files /dev/null and b/pages/blog/fqlearn-visualizacion-datos/tvdiagram.png differ diff --git a/content/blog/google-summer-of-code-week-4th-and-7th-midterm-evaluation/GSoC-Vertical.png b/pages/blog/google-summer-of-code-week-4th-and-7th-midterm-evaluation/GSoC-Vertical.png similarity index 100% rename from content/blog/google-summer-of-code-week-4th-and-7th-midterm-evaluation/GSoC-Vertical.png rename to pages/blog/google-summer-of-code-week-4th-and-7th-midterm-evaluation/GSoC-Vertical.png diff --git a/pages/blog/google-summer-of-code-week-4th-and-7th-midterm-evaluation/index.md b/pages/blog/google-summer-of-code-week-4th-and-7th-midterm-evaluation/index.md new file mode 100644 index 000000000..13b073b8c --- /dev/null +++ b/pages/blog/google-summer-of-code-week-4th-and-7th-midterm-evaluation/index.md @@ -0,0 +1,87 @@ +--- +title: "Google Summer of Code- Week 4th & 7th Midterm Evaluation" +slug: google-summer-of-code-week-4th-and-7th-midterm-evaluation +date: 2023-07-25 +authors: ["Ankit Kumar"] +tags: [google summer of code, gsoc, open-source open-sciencelab] +categories: [open-source, gsoc] +description: | + In this article, I will share the progress for Week 4th week to 7th week for my + contribution to Open-science labs as a part of Google Summer of Code 2023. +thumbnail: "/GSoC-Vertical.png" +--- + +## Google Summer of Code- Week 4th & 7th Midterm Evaluation + +In this article, I will share the progress for Week 4th week to 7th week for my +contribution to Open-science labs as a part of Google Summer of Code 2023. + + + +As my Google Summer of Code journey continued, I found myself faced with an +exciting yet daunting task: implementing a whole new build-system as an option +for templates in the esteemed Open-Science Lab. This endeavor demanded +meticulous planning, unwavering dedication, and the exploration of various +build-systems, including Maturin, Hatchling, Scikit-build, and `pybuild11`. + +In this period, I started working on to add support for `Maturin` build-system. + +### Maturin + +[**Maturin**]() was the first build-system I explored. Its unique approach of +building Python bindings for Rust libraries intrigued me, and I wondered if it +could provide a novel solution to the lab's needs. The seamless blending of +Python and Rust offered the potential for unparalleled performance and memory +efficiency in research projects. However, I faced a steep learning curve to +master the intricacies of Rust and its integration with Python. Overcoming these +challenges was a significant achievement, and I managed to create a functional +prototype that demonstrated Maturin's potential to revolutionize the +Open-Science Lab's workflow. My contribution to this issue is +[here](https://github.com/osl-incubator/scicookie/pull/152) + +After merging this pull request, I started to add support for `Hatchling` +build-system. + +### Hatchling + +[**Hatchling**]() known for its user-friendly nature, was my next target. It +promised to simplify the build and deployment processes, which could be +particularly beneficial for newcomers to the lab and projects with +straightforward requirements. Integrating Hatchling into the lab's ecosystem +required thorough documentation and integration tests to ensure its smooth +adoption. Overcoming initial hurdles, I was elated to see the positive response +from the lab's community as they began adopting Hatchling for their projects. My +contribution to this issue is +[here](https://github.com/osl-incubator/scicookie/pull/144) + +After completetion of this issue, I jumped to a task to add support for +`Scikit-Build-Core`. + +### Scikit-build-core + +[**Scikit-build-core**]() a cross-platform build-system, offered a robust option +for integrating CPython extensions. While challenging to implement, I recognized +its potential to support projects with complex native code dependencies. My +experience with Scikit-build exposed me to advanced build and packaging +concepts, and I was thrilled to see it complementing the existing build-systems +in the lab, catering to a broader range of projects. My contribution to this +issue is [here](https://github.com/osl-incubator/scicookie/pull/161) + +### Conclusions + +In conclusion, my Google Summer of Code experience with implementing new +build-systems for the Open-Science Lab was a transformative journey. Overcoming +hurdles with Maturin, embracing user-friendliness with Hatchling, exploring the +potential of Scikit-build.I realized the importance of innovation and +adaptability in the world of open-source development. This experience has not +only enriched my technical skills but also instilled in me a passion for +contributing to projects that drive positive change in the world of scientific +research. As I look to the future, I am excited to continue this journey, +collaborating with the open-source community to create solutions that empower +researchers and advance the boundaries of knowledge. + +You can read my previous blog [here](https://medium.com/@ayeankit) + +If want to connect with me on LinkedIn +[here](https://www.linkedin.com/in/ayeankit/). Github +[here](https://github.com/ayeankit). diff --git a/pages/blog/index.md b/pages/blog/index.md new file mode 100644 index 000000000..74ba514de --- /dev/null +++ b/pages/blog/index.md @@ -0,0 +1,6 @@ +--- +title: "Blog" +date: 2019-01-01 +--- + +{{ blog_content }} diff --git a/pages/blog/internship-call-2-2024/header.jpg b/pages/blog/internship-call-2-2024/header.jpg new file mode 100644 index 000000000..1ef5a9f04 Binary files /dev/null and b/pages/blog/internship-call-2-2024/header.jpg differ diff --git a/pages/blog/internship-call-2-2024/index.md b/pages/blog/internship-call-2-2024/index.md new file mode 100644 index 000000000..082952d53 --- /dev/null +++ b/pages/blog/internship-call-2-2024/index.md @@ -0,0 +1,282 @@ +--- +title: "Call for Interns 2024-02" +slug: internship-call-2-2024 +date: 2024-04-20 +authors: + - Ever Vino +tags: + - community + - internship + - OpenScienceLabs +categories: + - internship + - community + - Technological Collaboration + - Open Source + - Mentors + - Technology Students +description: > + The Open Science Labs (OSL) has announced its Internship and Learning Program + for the second cycle of 2024, in collaboration with The GRAPH Network. +thumbnail: "/header.jpg" +template: "blog-post.html" +--- + + + + + +This program presents valuable opportunities for both mentors and +student/collaborators to engage and grow, despite being an unpaid initiative. + +## Summary of steps to got into internship program + +- Choose a project of your interest. Please read the project ideas document and + see if yout meet the prerequisites or the stack required (normally the mentor + rejects applicants if they do not meet the stack required) +- Contact to the project mentor through email with the following info. + - Curriculum Vitae + - The project name + - Project idea name + - Motivation for wanting to collaborate on that specific project. +- The mentor will assign you a minor issue to solve. (This step is required to + verify if the applicant is able to solve the project tasks.) +- After solving the issue The mentor will ask you to fill a form via google + forms. +- The selected applicant will be contacted via email on May 20. + +Candidates should have a basic understanding of Git and how to contribute. For +guidance, we recommend reading this +[blog post](https://opensciencelabs.org/blog/first-time-contributors/) designed +for first-time contributors. Additionally, to stay informed about announcements +related to the Internship Program, candidates are encouraged to join the +[OSL Discord](https://opensciencelabs.org/discord). + +Please keep in mind about the timeline, and if you have any more questions do +not hesitate to contact us at team@opensciencelabs.org. + +## Timeline + +The following is the timeline for the OSL Internship Program Cycle 2024-02: + +- **April 22**: Call for Interns opens. +- **May 13**: Deadline for Interns applications. +- **May 20**: Announcement of approved Interns and start of the bonding period +- **May 27**: Official Start Date of Internship Period; an alternative for + projects not selected by GSoC to run under the OSL Internship Program with The + Graph Network support. +- **July 8**: Mid-term Evaluation. +- **August 26**: Final Evaluation. +- **September 3**: Official End Date; Certification process begins. + +## Info about participating Projects + +--- + +Below is the list of projects participating in the current internship cycle. +Each entry provides key details to assist candidates in understanding the scope +and requirements of the projects. + +### ArtBox + +- **Description:** ArtBox is a tool set for handling multimedia files with a + bunch of useful functions. +- **Category:** Multimedia Processing. +- **Organization/Project Webpage URL:** + [https://mediatoolbox-org.github.io/artbox/](https://mediatoolbox-org.github.io/artbox/) +- **Contact:** Ivan Ogasawara + [ivan.ogasawara@gmail.com](mailto:ivan.ogasawara@gmail.com) +- **Project Ideas URL:** + https://github.com/osl-incubator/artbox/wiki/OSL-Internship-%E2%80%90-2024-%E2%80%90-2nd-Cycle + +### ArxLang/ASTx + +- **Description:** ASTx is an agnostic expression structure for AST. It is + agnostic because it is not specific to any language, neither to the ArxLang + project, although its main focus is to provide all needed feature for ArxLang. +- **Categories:** AST, Compiler +- **Organization/Project Webpage URL:** + [https://astx.arxlang.org/](https://astx.arxlang.org/) +- **Contact:** Ivan Ogasawara + [ivan.ogasawara@gmail.com](mailto:ivan.ogasawara@gmail.com) +- **Project Ideas URL:** + + +### Envers + +- **Description:** Envers is a command-line tool (CLI) designed to manage and + version environment variables for different deployment stages such as staging, + development, and production. It provides a secure and organized way to handle + environment-specific configurations. +- **Categories:** DevOps, Environment Management +- **Organization/Project Webpage URL:** + [https://osl-incubator.github.io/envers/](https://osl-incubator.github.io/envers/) +- **Contact:** Ivan Ogasawara + [ivan.ogasawara@gmail.com](mailto:ivan.ogasawara@gmail.com) +- **Project Ideas URL:** + + +### fqlearn + +- **Description:** This Project aims to facilitate the teaching of unit + operations and thermodynamics. +- **Categories:** Mathematical Modeling, Educational +- **Organization/Project Webpage URL:** + [https://osl-pocs.github.io/fqlearn/](https://osl-pocs.github.io/fqlearn/) +- **Contact:** John Ever Vino Duran + [evervino00@gmail.com](mailto:evervino00@gmail.com) +- **Project Idea 1 URL**: +- **Project Idea 2 URL**: + +### pymedx + +- **Description**: This Project aims to fetch scientific papers metadata +- **Categories:** scrapping, educational, python, api +- **Organization/Project Webpage URL**: +- **Contact**: John Ever Vino Duran (evervino00@gmail.com) +- **Project Ideas 1 URL**: +- **Project Ideas 2 URL**: +- **Project Ideas 3 URL**: + +### Makim + +- **Description:** Makim (or makim) is based on make and focus on improve the + way to define targets and dependencies. Instead of using the Makefile format, + it uses yaml format. +- **Categories:** DevOps, Automation +- **Organization/Project Webpage URL:** + [https://osl-incubator.github.io/makim/](https://osl-incubator.github.io/makim/) +- **Contact:** Ivan Ogasawara + [ivan.ogasawara@gmail.com](mailto:ivan.ogasawara@gmail.com) +- **Project Ideas URL:** + + +### noWorkflow + +- **Description:** The noWorkflow project aims at allowing scientists to benefit + from provenance data analysis even when they don't use a workflow system. It + transparently collects provenance from Python scripts and notebooks and + provide tools to support the analysis and management of the provenance. +- **Categories:** Provenance, Software Engineering +- **Organization/Project Webpage URL:** + [https://gems-uff.github.io/noworkflow/](https://gems-uff.github.io/noworkflow/) +- **Contact:** João Felipe Nicolaci Pimentel + [joaofelipenp@gmail.com](mailto:joaofelipenp@gmail.com) +- **Project Ideas URL (only project idea 2 available):** + [https://gist.github.com/JoaoFelipe/ce4cb232deb2c71d4f39afc5cbeefe2b](https://gist.github.com/JoaoFelipe/ce4cb232deb2c71d4f39afc5cbeefe2b) + +### SciCookie + +- **Description:** SciCookie is a template developed by + [OpenScienceLabs](https://opensciencelabs.org/) that creates projects from + project templates. +- **Category:** Project Templates, Scientific Software +- **Organization/Project Webpage URL:** + [https://osl-incubator.github.io/scicookie](https://osl-incubator.github.io/scicookie) +- **Contact:** Ivan Ogasawara + [ivan.ogasawara@gmail.com](mailto:ivan.ogasawara@gmail.com) +- **Project Ideas URL:** + + +### Sugar + +- **Description:** Sugar aims to organize your stack of containers, gathering + some useful scripts and keeping this information centralized in a + configuration file. So the command line would be very simple. +- **Categories:** DevOps, Container Management +- **Organization/Project Webpage URL:** + [https://osl-incubator.github.io/sugar/e](https://osl-incubator.github.io/sugar/) +- **Contact:** Ivan Ogasawara + [ivan.ogasawara@gmail.com](mailto:ivan.ogasawara@gmail.com) +- **Project Ideas URL:** + + +### ES-Journals + +- **Description**: An ElasticSearch instance for serving scientific journals + metadata. Currently, it has support for biorXiv and medrXiv. +- **Categories:** Servers, api +- **Organization/Project Webpage URL**: + +- **Contact**: Ivan Ogasawara (ivan.ogasawara@gmail.com) +- **Project Ideas URL**: + + +### Growth-Forge + +- **Description**: GrowthForge is a simplified feedback exchange platform + designed to facilitate periodic feedback between individuals within specific + projects. It aims to streamline communication and insights sharing, enhancing + project collaboration and personal development. +- **Categories:** web development, backend, frontend, python +- **Organization/Project Webpage URL**: + +- **Contact**: Ivan Ogasawara (ivan.ogasawara@gmail.com) +- **Project Ideas URL**: + + +### Useful Materials and Courses + +--- + +- **First Time Contributors:** In this + [blog post](https://opensciencelabs.org/blog/first-time-contributors/) you + will find useful information about how to do your first contribution in + projects. +- **Software Carpentry Lessons:** Offering tutorials on Git, Bash, Python, R, + and more, these lessons are invaluable for building a strong foundation in + software development. Access the lessons at Software Carpentry. +- **Udacity CS212 - Design of Computer Programs:** This course, taught by Peter + Norvig, delves into advanced programming topics and is an excellent way to + deepen your understanding of computer programs. Enroll in the course at + Udacity CS212. +- **The GRAPH Network Courses:** Explore a range of courses offered by The GRAPH + Network, tailored to various aspects of data analysis. Find the courses at The + GRAPH Network Courses. These resources provide a great opportunity to prepare + effectively for the Internship Program and to develop a broad skill set in + software development and data analysis. diff --git a/pages/blog/language-server-protocol-lsp-how-editors-speak-code/header.png b/pages/blog/language-server-protocol-lsp-how-editors-speak-code/header.png new file mode 100644 index 000000000..69d9df2f1 Binary files /dev/null and b/pages/blog/language-server-protocol-lsp-how-editors-speak-code/header.png differ diff --git a/pages/blog/language-server-protocol-lsp-how-editors-speak-code/index.md b/pages/blog/language-server-protocol-lsp-how-editors-speak-code/index.md new file mode 100644 index 000000000..d5771b0fe --- /dev/null +++ b/pages/blog/language-server-protocol-lsp-how-editors-speak-code/index.md @@ -0,0 +1,107 @@ +--- +title: "Language Server Protocol (LSP): How Editors Speak Code" +slug: "language-server-protocol-lsp-how-editors-speak-code" +date: 2025-08-15 +authors: ["Ansh Arora"] +tags: ["Makim", "Automation", "Developer Experience"] +categories: ["Devops", "Dev Tools"] +description: | + The Language Server Protocol (LSP) powers modern code editors like VS Code by + enabling real-time autocompletion, hover info, diagnostics, and more. +thumbnail: "/header.png" +template: "blog-post.html" +--- + +# Language Server Protocol (LSP): How Editors Speak Code + +When you open a code file in VS Code and get real-time suggestions, hover +tooltips, or error squiggles, have you ever wondered **how** your editor +understands the language you’re writing in? + +This magic isn’t hardcoded per-language into the editor. Instead, it’s often +powered by something called the **Language Server Protocol (LSP)**. + +Let’s dive into what LSP is, why it exists, and how it powers modern development +environments. + +## What is the Language Server Protocol? + +The **Language Server Protocol (LSP)** is a standardized way for development +tools (like VS Code, Vim, or Emacs) to communicate with language-specific +services (called language servers). + +Instead of writing new editor plugins for every language and every editor, **LSP +decouples the logic**: + +- The **editor (client)** handles the UI and editor behavior. +- The **language server** handles parsing, validation, completions, and other + language-specific logic. + +They talk to each other via a common JSON-RPC protocol over standard +input/output, TCP, or WebSockets. + +## Why was LSP created? + +Before LSP, supporting multiple languages across editors was a mess: + +- Each editor needed custom plugins. +- Each language had to build and maintain these plugins. + +This was inefficient and hard to maintain. + +**Microsoft introduced LSP in 2016**, alongside VS Code, to fix this +fragmentation. Now, language authors can focus on building a single LSP server, +and editors can plug into it easily. + +![LSP Languages and Editors](https://code.visualstudio.com/assets/api/language-extensions/language-server-extension-guide/lsp-languages-editors.png) + +## Core Features of LSP + +Here are some features LSP enables out-of-the-box: + +- Autocompletion +- Go to Definition +- Hover Information +- Diagnostics (errors/warnings) +- Formatting +- Find References +- Rename Symbol +- Signature Help + +These features work **consistently across any editor** that supports! + +## How Does It Work? + +Here's a simplified lifecycle of how an editor (client) talks to a language +server: + +1. **Editor launches the language server.** +2. **Sends an `initialize` request** to begin communication. +3. As you edit: + + - Sends `textDocument/didOpen`, `didChange`, or `didSave`. + - Receives back diagnostics or suggestions. + +4. On hover, completion, or definition jumps: + + - Sends `textDocument/hover`, `completion`, or `definition` requests. + - Displays server responses in the UI. + +All of this happens over a well-defined set of JSON-RPC messages. + +### Anatomy of a Language Server + +A language server is just a **program** that: + +- Parses the user’s code (possibly building an AST or symbol table). +- Responds to LSP method calls. +- Tracks open files and their versions. + +## Final Thoughts + +The Language Server Protocol has quietly become the **backbone of modern +developer tooling**. Whether you’re building an IDE, a DSL, or a configuration +tool, LSP lets you ship a polished editing experience with far less effort. + +If you're working on your own language, plugin, or platform, building an LSP +server is one of the smartest investments you can make. diff --git a/pages/blog/makim-efficient-workflows-with-makims-working-directory/.makim.yaml b/pages/blog/makim-efficient-workflows-with-makims-working-directory/.makim.yaml new file mode 100644 index 000000000..07d995297 --- /dev/null +++ b/pages/blog/makim-efficient-workflows-with-makims-working-directory/.makim.yaml @@ -0,0 +1,52 @@ +version: 1.0 +working-directory: "/tmp/multi_language_project" +groups: + backend_python: + working-directory: "backend/python" + targets: + test: + run: | + echo "Running Python backend tests..." + # Add commands to run Python backend tests + lint: + run: | + echo "Linting Python code..." + # Add commands for linting Python code + + backend_java: + working-directory: "backend/java" + targets: + test: + working-directory: "src" + run: | + echo "Running Java backend tests..." + # Add commands to run Java backend tests + build: + run: | + echo "Building Java artifacts..." + # Add commands for building Java artifacts + + frontend_react: + working-directory: "frontend/react" + targets: + test: + run: | + echo "Running React frontend tests..." + # Add commands to run React frontend tests + build: + run: | + echo "Building React frontend..." + # Add commands for building React frontend + + frontend_vue: + working-directory: "frontend/vue" + targets: + test: + run: | + echo "Running Vue.js frontend tests..." + # Add commands to run Vue.js frontend tests + build: + working-directory: "src" + run: | + echo "Building Vue.js frontend..." + # Add commands for building Vue.js frontend diff --git a/pages/blog/makim-efficient-workflows-with-makims-working-directory/header.jpg b/pages/blog/makim-efficient-workflows-with-makims-working-directory/header.jpg new file mode 100644 index 000000000..e977a20be Binary files /dev/null and b/pages/blog/makim-efficient-workflows-with-makims-working-directory/header.jpg differ diff --git a/pages/blog/makim-efficient-workflows-with-makims-working-directory/index.ipynb b/pages/blog/makim-efficient-workflows-with-makims-working-directory/index.ipynb new file mode 100644 index 000000000..dc6caf35d --- /dev/null +++ b/pages/blog/makim-efficient-workflows-with-makims-working-directory/index.ipynb @@ -0,0 +1,324 @@ +{ + "cells": [ + { + "cell_type": "raw", + "id": "d4447f2e", + "metadata": {}, + "source": [ + "---\n", + "title: \"Efficent Workflows with Makim's Working Directory\"\n", + "slug: \"makim-efficient-workflows-with-makims-working-directory\"\n", + "date: 2023-12-10\n", + "authors: [\"Abhijeet Saroha\"]\n", + "tags: [\"makim\", \"automation\", \"working-directory\", \"devops\", \"open-source\"]\n", + "categories: [\"devops\", \"automation\", \"python\"]\n", + "description: |\n", + " In this blog post, we'll explore the Working Directory feature, understand \n", + " its syntax, and witness its power in action through real-world examples. Whether\n", + " you're a Makim veteran or a newcomer, this feature is designed to make your\n", + " command-line experience more flexible and tailored to your project's needs.\n", + " Let's dive into the details and unleash the potential of Makim's Working Directory\n", + " feature!\n", + "thumbnail: \"/header.jpg\"\n", + "template: \"blog-post.html\"\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "39d4fdb7-8441-4060-8048-3fc389f37cbd", + "metadata": {}, + "source": [ + "# **Efficent Workflows with Makim's Working Directory**" + ] + }, + { + "cell_type": "markdown", + "id": "eca10ec0-50fe-4ef2-a80f-75ab15beb60c", + "metadata": {}, + "source": [ + "Welcome to the world of [Makim](https://github.com/osl-incubator/makim), your go-to command-line companion for project automation. In our ongoing effort to enhance Makim's capabilities, we've introduced an exciting new feature—the Working Directory. This feature brings a new level of control and flexibility to your project workflows.\n", + "\n", + "In this blog post, we'll explore the Working Directory feature, understand its syntax, and witness its power in action through real-world examples. Whether you're a Makim veteran or a newcomer, this feature is designed to make your command-line experience more flexible and tailored to your project's needs. Let's dive into the details and unleash the potential of Makim's Working Directory feature!" + ] + }, + { + "cell_type": "markdown", + "id": "a445f2d9-e743-4b24-9b47-2f00455898de", + "metadata": {}, + "source": [ + "## Unveiling the attribute: working-directory" + ] + }, + { + "cell_type": "markdown", + "id": "1f75b9ef-ce06-4003-ac8f-308b853a27f5", + "metadata": {}, + "source": [ + "In the bustling realm of project management, one of the key challenges is orchestrating a seamless workflow while ensuring command executions are precisely where they need to be. This is where Makim's **Working Directory** steps into the spotlight, offering a robust solution for organizing, customizing, and optimizing your project commands." + ] + }, + { + "cell_type": "markdown", + "id": "1a214ca5-810a-4ef9-84d6-93b3c37e1882", + "metadata": {}, + "source": [ + "## Syntax and Scopes" + ] + }, + { + "cell_type": "markdown", + "id": "56c3a561-48b0-4047-b155-db00bf11eb07", + "metadata": {}, + "source": [ + "The Working Directory feature in Makim operates across three distinct scopes: Global, Group, and Target.\n", + "1. **Global Scope**\n", + " \n", + " At the global scope, setting the working directory impacts all targets and groups within the Makim configuration. It provides a top-level directive to establish a standardized execution environment.\n", + "```yaml\n", + "version: 1.0\n", + "working-directory: /path/to/global/directory\n", + "\n", + "# ... other configuration ...\n", + "```\n", + "\n", + "2. **Group Scope**\n", + " \n", + " Moving a level deeper, the group scope allows you to tailor the working directory for all targets within a specific group.\n", + "```yaml\n", + "version: 1.0\n", + "\n", + "groups:\n", + " my-group:\n", + " working-directory: /path/to/group/directory\n", + " targets:\n", + " target-1:\n", + " run: |\n", + " # This target operates within the /path/to/group/directory\n", + "```\n", + "3. **Target Scope**\n", + " \n", + " For fine-grained control over individual targets, the working directory can be specified at the target scope.\n", + "```yaml\n", + "version: 1.0\n", + "\n", + "groups:\n", + " my-group:\n", + " targets:\n", + " my-target:\n", + " working-directory: /path/to/target/directory\n", + " run: |\n", + " # This target operates within the /path/to/target/directory\n", + "```\n", + "\n", + "The flexibility provided by these scopes ensures that your commands are executed in precisely the right context, maintaining a clean and organized project structure." + ] + }, + { + "cell_type": "markdown", + "id": "05c11ec2-7749-4db0-832b-0738d63c22c0", + "metadata": {}, + "source": [ + "## Why is it helpful?" + ] + }, + { + "cell_type": "markdown", + "id": "ae7bdee0-f8e5-4844-9dbd-1dafb0622b4d", + "metadata": {}, + "source": [ + "Embracing the Working Directory feature in Makim brings forth a multitude of advantages, enhancing the overall project management experience. Let's delve into why this feature is a game-changer for your Makim configurations:\n", + "1. **Isolation of Commands:**\n", + " Users can isolate commands within specific directories, avoiding potential conflicts and ensuring that commands run in the expected environment.\n", + "\n", + "2. **Flexibility in Configuration:**\n", + " Different targets or groups may require different execution environments. The working-directory attribute provides the flexibility to customize these environments, tailoring them to the unique needs of each segment of your project.\n", + "\n", + "3. **Ease of Use:**\n", + " Users can easily understand and manage the execution context of commands within the Makim configuration. This makes the configuration more readable and maintainable, especially when dealing with complex project structures.\n", + "\n", + "4. **Support for Absolute and Relative Paths:**\n", + " The feature supports both absolute and relative paths, allowing users to specify directories based on their requirements. This flexibility ensures compatibility with diverse project structures and simplifies the configuration process." + ] + }, + { + "cell_type": "markdown", + "id": "35312475-67f7-4108-a328-7235b032cc8c", + "metadata": {}, + "source": [ + "## Real-Life Example" + ] + }, + { + "cell_type": "markdown", + "id": "e5dbbc1a-59d1-4028-9575-d21f2e2e12ef", + "metadata": {}, + "source": [ + "Consider a scenario where a development team is working on a project that involves multiple programming languages and technologies. The project structure looks like this:" + ] + }, + { + "cell_type": "markdown", + "id": "edeab9cc-5fa2-44ac-b1fb-5570c5f5753c", + "metadata": {}, + "source": [ + "```\n", + "multi_language_project/\n", + "│\n", + "├── backend/\n", + "│ ├── python/\n", + "│ │ └── src/\n", + "│ └── java/\n", + "│ └── src/\n", + "│\n", + "└── frontend/\n", + " ├── react/\n", + " │ └── src/\n", + " └── vue/\n", + " └── src/\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "5dcf2f8e-d41c-4684-b305-16c382af2216", + "metadata": {}, + "source": [ + "The project consists of a backend with components implemented in both Python and Java, and a frontend with components using React and Vue.js. To efficiently manage and run tasks for each language or framework, the Working Directory feature proves invaluable.\n", + "\n", + "Let's create a Makim configuration file *(.makim.yaml)* that showcases the flexibility of the Working Directory feature in managing tasks for different languages." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "726bcf5a-7cc5-4448-af62-0564e2cbe1a1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overwriting .makim.yaml\n" + ] + } + ], + "source": [ + "%%writefile .makim.yaml\n", + "version: 1.0\n", + "working-directory: \"/tmp/multi_language_project\"\n", + "groups:\n", + " backend_python:\n", + " working-directory: \"backend/python\"\n", + " targets:\n", + " test:\n", + " run: |\n", + " echo \"Running Python backend tests...\"\n", + " # Add commands to run Python backend tests\n", + " lint:\n", + " run: |\n", + " echo \"Linting Python code...\"\n", + " # Add commands for linting Python code\n", + "\n", + " backend_java:\n", + " working-directory: \"backend/java\"\n", + " targets:\n", + " test:\n", + " working-directory: \"src\"\n", + " run: |\n", + " echo \"Running Java backend tests...\"\n", + " # Add commands to run Java backend tests\n", + " build:\n", + " run: |\n", + " echo \"Building Java artifacts...\"\n", + " # Add commands for building Java artifacts\n", + "\n", + " frontend_react:\n", + " working-directory: \"frontend/react\"\n", + " targets:\n", + " test:\n", + " run: |\n", + " echo \"Running React frontend tests...\"\n", + " # Add commands to run React frontend tests\n", + " build:\n", + " run: |\n", + " echo \"Building React frontend...\"\n", + " # Add commands for building React frontend\n", + "\n", + " frontend_vue:\n", + " working-directory: \"frontend/vue\"\n", + " targets:\n", + " test:\n", + " run: |\n", + " echo \"Running Vue.js frontend tests...\"\n", + " # Add commands to run Vue.js frontend tests\n", + " build:\n", + " working-directory: \"src\"\n", + " run: |\n", + " echo \"Building Vue.js frontend...\"\n", + " # Add commands for building Vue.js frontend" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "af7432d1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Linting Python code...\n", + "Running Java backend tests...\n", + "Running React frontend tests...\n", + "Building Vue.js frontend...\n" + ] + } + ], + "source": [ + "!makim --makim-file ./.makim.yaml backend_python.lint\n", + "!makim --makim-file ./.makim.yaml backend_java.test\n", + "!makim --makim-file ./.makim.yaml frontend_react.test\n", + "!makim --makim-file ./.makim.yaml frontend_vue.build" + ] + }, + { + "cell_type": "markdown", + "id": "184db134", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "In conclusion, Makim's working-directory feature empowers users with a flexible and efficient approach to project management. Throughout this blog, we explored how this feature, applied at the global, group, and target scopes, provides unparalleled customization and control over the execution environment.\n", + "\n", + "By isolating commands, offering flexibility in configuration, and ensuring ease of use, Makim's working-directory feature becomes an invaluable asset in your toolkit. It not only streamlines the execution of commands but also enhances the overall organization and maintainability of your projects.\n", + "\n", + "Harness the power of working directories in Makim to elevate your project management game. As you integrate this tool into your workflow, you'll discover a newfound simplicity and clarity in your command execution. Enjoy the benefits of an organized and optimized project environment, courtesy of Makim's innovative features.\n", + "\n", + "Start optimizing your projects with Makim today!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pages/blog/makim-efficient-workflows-with-makims-working-directory/index.md b/pages/blog/makim-efficient-workflows-with-makims-working-directory/index.md new file mode 100644 index 000000000..b3256e332 --- /dev/null +++ b/pages/blog/makim-efficient-workflows-with-makims-working-directory/index.md @@ -0,0 +1,213 @@ +--- +title: "Efficent Workflows with Makim's Working Directory" +slug: "makim-efficient-workflows-with-makims-working-directory" +date: 2023-12-10 +authors: ["Abhijeet Saroha"] +tags: ["makim", "automation", "working-directory", "devops", "open-source"] +categories: ["devops", "automation", "python"] +description: | + In this blog post, we'll explore the Working Directory feature, understand + its syntax, and witness its power in action through real-world examples. Whether + you're a Makim veteran or a newcomer, this feature is designed to make your + command-line experience more flexible and tailored to your project's needs. + Let's dive into the details and unleash the potential of Makim's Working Directory + feature! +thumbnail: "/header.jpg" +template: "blog-post.html" +--- +# **Efficent Workflows with Makim's Working Directory** + +Welcome to the world of [Makim](https://github.com/osl-incubator/makim), your go-to command-line companion for project automation. In our ongoing effort to enhance Makim's capabilities, we've introduced an exciting new feature—the Working Directory. This feature brings a new level of control and flexibility to your project workflows. + +In this blog post, we'll explore the Working Directory feature, understand its syntax, and witness its power in action through real-world examples. Whether you're a Makim veteran or a newcomer, this feature is designed to make your command-line experience more flexible and tailored to your project's needs. Let's dive into the details and unleash the potential of Makim's Working Directory feature! + +## Unveiling the attribute: working-directory + +In the bustling realm of project management, one of the key challenges is orchestrating a seamless workflow while ensuring command executions are precisely where they need to be. This is where Makim's **Working Directory** steps into the spotlight, offering a robust solution for organizing, customizing, and optimizing your project commands. + +## Syntax and Scopes + +The Working Directory feature in Makim operates across three distinct scopes: Global, Group, and Target. +1. **Global Scope** + + At the global scope, setting the working directory impacts all targets and groups within the Makim configuration. It provides a top-level directive to establish a standardized execution environment. +```yaml +version: 1.0 +working-directory: /path/to/global/directory + +# ... other configuration ... +``` + +2. **Group Scope** + + Moving a level deeper, the group scope allows you to tailor the working directory for all targets within a specific group. +```yaml +version: 1.0 + +groups: + my-group: + working-directory: /path/to/group/directory + targets: + target-1: + run: | + # This target operates within the /path/to/group/directory +``` +3. **Target Scope** + + For fine-grained control over individual targets, the working directory can be specified at the target scope. +```yaml +version: 1.0 + +groups: + my-group: + targets: + my-target: + working-directory: /path/to/target/directory + run: | + # This target operates within the /path/to/target/directory +``` + +The flexibility provided by these scopes ensures that your commands are executed in precisely the right context, maintaining a clean and organized project structure. + +## Why is it helpful? + +Embracing the Working Directory feature in Makim brings forth a multitude of advantages, enhancing the overall project management experience. Let's delve into why this feature is a game-changer for your Makim configurations: +1. **Isolation of Commands:** + Users can isolate commands within specific directories, avoiding potential conflicts and ensuring that commands run in the expected environment. + +2. **Flexibility in Configuration:** + Different targets or groups may require different execution environments. The working-directory attribute provides the flexibility to customize these environments, tailoring them to the unique needs of each segment of your project. + +3. **Ease of Use:** + Users can easily understand and manage the execution context of commands within the Makim configuration. This makes the configuration more readable and maintainable, especially when dealing with complex project structures. + +4. **Support for Absolute and Relative Paths:** + The feature supports both absolute and relative paths, allowing users to specify directories based on their requirements. This flexibility ensures compatibility with diverse project structures and simplifies the configuration process. + +## Real-Life Example + +Consider a scenario where a development team is working on a project that involves multiple programming languages and technologies. The project structure looks like this: + +``` +multi_language_project/ +│ +├── backend/ +│ ├── python/ +│ │ └── src/ +│ └── java/ +│ └── src/ +│ +└── frontend/ + ├── react/ + │ └── src/ + └── vue/ + └── src/ +``` + +The project consists of a backend with components implemented in both Python and Java, and a frontend with components using React and Vue.js. To efficiently manage and run tasks for each language or framework, the Working Directory feature proves invaluable. + +Let's create a Makim configuration file *(.makim.yaml)* that showcases the flexibility of the Working Directory feature in managing tasks for different languages. + + +```python +%%writefile .makim.yaml +version: 1.0 +working-directory: "/tmp/multi_language_project" +groups: + backend_python: + working-directory: "backend/python" + targets: + test: + run: | + echo "Running Python backend tests..." + # Add commands to run Python backend tests + lint: + run: | + echo "Linting Python code..." + # Add commands for linting Python code + + backend_java: + working-directory: "backend/java" + targets: + test: + working-directory: "src" + run: | + echo "Running Java backend tests..." + # Add commands to run Java backend tests + build: + run: | + echo "Building Java artifacts..." + # Add commands for building Java artifacts + + frontend_react: + working-directory: "frontend/react" + targets: + test: + run: | + echo "Running React frontend tests..." + # Add commands to run React frontend tests + build: + run: | + echo "Building React frontend..." + # Add commands for building React frontend + + frontend_vue: + working-directory: "frontend/vue" + targets: + test: + run: | + echo "Running Vue.js frontend tests..." + # Add commands to run Vue.js frontend tests + build: + working-directory: "src" + run: | + echo "Building Vue.js frontend..." + # Add commands for building Vue.js frontend +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Overwriting .makim.yaml
    +
    +
    +
    +
    + + +```python +!makim --makim-file ./.makim.yaml backend_python.lint +!makim --makim-file ./.makim.yaml backend_java.test +!makim --makim-file ./.makim.yaml frontend_react.test +!makim --makim-file ./.makim.yaml frontend_vue.build +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Linting Python code...
    +Running Java backend tests...
    +Running React frontend tests...
    +Building Vue.js frontend...
    +
    +
    +
    +
    + +## Conclusion + +In conclusion, Makim's working-directory feature empowers users with a flexible and efficient approach to project management. Throughout this blog, we explored how this feature, applied at the global, group, and target scopes, provides unparalleled customization and control over the execution environment. + +By isolating commands, offering flexibility in configuration, and ensuring ease of use, Makim's working-directory feature becomes an invaluable asset in your toolkit. It not only streamlines the execution of commands but also enhances the overall organization and maintainability of your projects. + +Harness the power of working directories in Makim to elevate your project management game. As you integrate this tool into your workflow, you'll discover a newfound simplicity and clarity in your command execution. Enjoy the benefits of an organized and optimized project environment, courtesy of Makim's innovative features. + +Start optimizing your projects with Makim today! diff --git a/pages/blog/my-google-summer-of-code-journey/graph.png b/pages/blog/my-google-summer-of-code-journey/graph.png new file mode 100644 index 000000000..9320d65b2 Binary files /dev/null and b/pages/blog/my-google-summer-of-code-journey/graph.png differ diff --git a/pages/blog/my-google-summer-of-code-journey/header.png b/pages/blog/my-google-summer-of-code-journey/header.png new file mode 100644 index 000000000..4d314c5b8 Binary files /dev/null and b/pages/blog/my-google-summer-of-code-journey/header.png differ diff --git a/pages/blog/my-google-summer-of-code-journey/index.md b/pages/blog/my-google-summer-of-code-journey/index.md new file mode 100644 index 000000000..b2c146054 --- /dev/null +++ b/pages/blog/my-google-summer-of-code-journey/index.md @@ -0,0 +1,238 @@ +--- +title: "My Google Summer of Code Journey" +slug: "my-google-summer-of-code-journey" +date: 2024-08-10 +authors: ["Kishan Ved"] +tags: ["Google Summer of Code", "GSoC", "Summer internship"] +categories: ["Google Summer of Code", "GSoC"] +description: "This blog post summarizes my open source experience, right from my very first open source contribution to getting selected for GSoC and completing my Google Summer of Code project!" +thumbnail: "/header.png" +template: "blog-post.html" +--- + +# About Me +I am [Kishan Ved](https://github.com/Kishan-Ved), an undergraduate student at the Indian Institute of Technology Gandhinagar (IIT Gandhinagar), India, in the department of Computer Science and Engineering. I spent the summer after my second year doing my Google Summer of Code 2024 project with the NumFOCUS organization (which serves as an umbrella organization for open source projects), which had Open Science Labs as a sub organization. The project I worked on is: [PyDataStructs](https://github.com/codezonediitj/pydatastructs). + +# About PyDataStructs + +[PyDataStructs](https://github.com/codezonediitj/pydatastructs) aims to be a Python package for various data structures in computer science. It also contains several algorithms including their parallel implementations. Everything is just a few calls away, and users don't need to write any code from scratch. The APIs provided are consistent with each other, clean and easy to use. All implementations are well tested, 99% lines of code have already been tested by developers. PyDataStructs is the first well-designed library/package which covers most of the data structures and algorithms, with different backends like Python and C++. + +## My first contribution to open source +I began contributing to open source in December 2023, when I connected to a senior student at my university who had also done GSoC in 2023, with PyDataStructs. I was interested in the project that she did and hence I started exploring the codebase. + +### Finding a good first issue +I went to the issues tab on the repository's github page and searched for good first issues. I noticed an issue that seemed doable: [Implement Introsort](https://github.com/codezonediitj/pydatastructs/issues/545). This involved implementing the sorting algorithm: Introsort in the Python backend. I had learned this as a part of my academic cousework, and hence, I was able to code this. + +### My first Pull Request +I started reading the README file and set up the repository locally and created the conda environment. Then I got to work. In a day, I was able to successfully create a PR (pull request) and open it on GitHub: [Implemented Introsort](https://github.com/codezonediitj/pydatastructs/pull/549). This PR was reviewed and changes were requested. Once I had done all of them and all the CI checks passed, it was merged. And that's my first open souce contribution! + +## Pre-GSoC Phase + +Next, I connected to the maintainer, [Gagandeep Singh](https://github.com/czgdp1807), and expressed my interest for contributing. He suggested that I contribute to more organizations, like: [LFortran](https://github.com/lfortran/lfortran) and [LPython](https://github.com/lcompilers/lpython) to maximize my chances for GSoC. These organizations also had Gagandeep Sir as the core maintainer and developer. + +### The amazing open source community +I found the open source community amazing, everyone was ready to help me with every doubt I had, patiently guide me with differnt git commands to resolve conflicts and review my PRs and give valueable advice. I made new friends, who were almost of the same age as me, who had been contributing since quite a while. They made things easier for me and helped me contribute. + +### More open source contributions +I spent the next 3 months contributing to these organizations, and I had 10 merged PRs in the LFortran repository and 5 merged PRs in the LPython repository. Here's a link to these: + +- [LFortran contributions](https://github.com/lfortran/lfortran/pulls?q=is%3Apr+author%3AKishan-Ved+is%3Amerged) + +- [LPython contributions](https://github.com/lcompilers/lpython/pulls?q=is%3Apr+author%3AKishan-Ved+is%3Amerged) + +These made me well versed with various git commands, the skill of handling a large and dynamic codebase and communicating effectively with the community to incorporate suggestions and solve issues. + +### Drafting my GSoC proposal +Next, it was time to submit proposals for GSoC projects. By then, I had been contributing to open source for nearly 3 months. I requested a meeting with Gagandeep Sir to help me decide my proposal. He kindly agreed and we set up an online meeting, where we discussed potential GSoC ideas and the timeline that was best suited for me. + +I submitted 2 proposals, to LPython (Python Software Foundation) and PyDataStructs (NumFOCUS): + +- [NumFOCUS - Open Science Labs: PyDataStructs: Add C++ Backend for all trees](https://drive.google.com/file/d/1khpreH4pVJSj26VGJOf2v_XDCrOlo8qP/view?usp=sharing) + +- [Python Software Foundation - LPython: Implement modules from the Python Standard Library](https://drive.google.com/file/d/1to69uW9rb9vAE6pJCooamQo-Q1f_BYBt/view?usp=sharing) + +The proposals should have personal information, details about previous open source contributions made to the organization's repository, and detailed information about the project that you wish to take up, with a structured plan about your goals. In addition to this, it must contain an expected timeline that you will follow. It's a good practice to set a large number of small goals and plan tasks before starting the project. + +### Continuing open source contributions +It's a good practice to remain active in the organizations by contributing even after submitting GSoC proposals, this makes the developers believe that you are genuinely interested in the project and enthusiastic to contribute. This amplifies chances for getting selected for Google Summer of Code! + +## GSoC Phase +I got my acceptance letter at 11:32 pm IST on May 1, 2024. It was 2 minutes past the result declaration time and I was at the edge of my seat. I was overjoyed to get the mail saying I was accepted as a Google Summer of Code contributor for NumFOCUS! Here's my project: **[Open Science Labs: PyDataStructs: Add a C++ Backend for tree data structures and their algorithms](https://summerofcode.withgoogle.com/programs/2024/projects/2nrxEFTg)** + +### My GSoC project goals + +My project involved adding a C++ backend for all tree data structures in **[PyDataStructs](https://github.com/codezonediitj/pydatastructs)**, a Python package for advanced data structures and algorithms. The user has an option to select either the Python backend or the C++ backend. + + +```python +tree = RedBlackTree(backend=Backend.CPP) +``` + + +For any data structure, the Python backend is developed first, and once completely tested and ready, its C++ backend is developed. Both the backends share full functionality and are completely compatible. The C++ backend is extremely fast, it executes codes 8-10 times faster. This enhances the computation speed, making it extremely valuable for scientific computing and high-performance applications. + +### The community bonding period +I'll be honest, it was difficult at the start. I found the project a little more difficult than I had anticipated, and realized that it demanded a little more that my current skillset. My mentor, Gagandeep Sir, adviced me to read the documentation and first learn about Python-C API, which was something totally new for me. I spent the first week doing this, and I could barely write any code. However, I soon realized the importance of reading the documentation and how smoothly things went following that. Within a week, I became well versed with all the new technology and started coding up my first PR. + +### Coding phase + +I started working from the community bonding period itself, and this gave me a good headstart and allowed me to complete the project in 12 weeks. Here's an outline of all the work I did: + +#### Pre GSoC Work + +| PR Description | +|------------------| +| **[Added Introsort algorithm](https://github.com/codezonediitj/pydatastructs/pull/549)** | +| **[Fixed version related bugs](https://github.com/codezonediitj/pydatastructs/pull/553)** | + +#### Community Bonding Period + +| PR Description | +|------------------| +| **[C++ backend for Node, TreeNode, ArrayForTrees, BinaryTree and BinarySearchTree and all tree traversals implemented](https://github.com/codezonediitj/pydatastructs/pull/556)** | + +#### Coding Phase 1 + +| PR Description | +|------------------| +| **[C++ backend for Self Balancing Binary Tree](https://github.com/codezonediitj/pydatastructs/pull/559)** | +| **[C++ backend for Red Black Trees](https://github.com/codezonediitj/pydatastructs/pull/560)** | +| **[C++ backend for Binary Indexed Trees](https://github.com/codezonediitj/pydatastructs/pull/561)** | +| **[C++ backend for Splay Trees](https://github.com/codezonediitj/pydatastructs/pull/562)** | + +#### Coding Phase 2 + +| PR Description | +|------------------| +| **[C++ backend for AVL Trees](https://github.com/codezonediitj/pydatastructs/pull/564)** | +| **[C++ backend for Cartesian Trees](https://github.com/codezonediitj/pydatastructs/pull/567)** | +| **[C++ backend for Treap](https://github.com/codezonediitj/pydatastructs/pull/568)** | +| **[C++ backend for all trees in `binary_trees.py` file complete](https://github.com/codezonediitj/pydatastructs/pull/569)** | +| **[Updated Documentation](https://github.com/codezonediitj/pydatastructs/pull/570)** | + +--- + + +### Contribution Stats: + +Lines added: **+4,721** (#2 contributor in terms of lines added) + +Commits made: 12 + +Total merged Pull Requests : 12 + +Here's a complete list of all my **[merged PRs](https://github.com/codezonediitj/pydatastructs/pulls?q=is%3Apr+is%3Amerged+author%3AKishan-Ved)** + +### Speed results + +
    + Click to see a benchmark code + + To run this code, you need PyDataStructs installed with the following imports: + + ```python + import timeit, functools, os, pytest + from pydatastructs.trees.binary_trees import (BinarySearchTree, RedBlackTree) + from pydatastructs.utils.misc_util import Backend + ``` + + ```python + def test_BinarySearchTree(**kwargs): + cpp = Backend.CPP + repeat = 1 + number = 1 + + size = int(os.environ.get("PYDATASTRUCTS_BENCHMARK_SIZE", "1000")) + size = kwargs.get("size", size) + + BST = BinarySearchTree + b1 = BST(backend=Backend.PYTHON) + b2 = BST(backend=Backend.CPP) + + def f(backend, tree): + for node in range(-1000,1000): + tree.insert(node, node) + def g(backend, tree): + for node in range(-1000, 1000): + tree.search(node) + def h(backend, tree): + for node in range(2000): + tree.delete(node) + + kwds_dict_PY = {"backend": Backend.PYTHON, "tree":b1} + kwds_dict_CPP = {"backend": Backend.CPP, "tree":b2} + + timer_python = timeit.Timer(functools.partial(f, **kwds_dict_PY)) + python_insert = min(timer_python.repeat(repeat, number)) + + timer_cpp = timeit.Timer(functools.partial(f, **kwds_dict_CPP)) + cpp_insert = min(timer_cpp.repeat(repeat, number)) + assert cpp_insert < python_insert + + timer_python = timeit.Timer(functools.partial(g, **kwds_dict_PY)) + python_search = min(timer_python.repeat(repeat, number)) + + timer_cpp = timeit.Timer(functools.partial(g, **kwds_dict_CPP)) + cpp_search = min(timer_cpp.repeat(repeat, number)) + assert cpp_search < python_search + + timer_python = timeit.Timer(functools.partial(h, **kwds_dict_PY)) + python_delete = min(timer_python.repeat(repeat, number)) + + timer_cpp = timeit.Timer(functools.partial(h, **kwds_dict_CPP)) + cpp_delete = min(timer_cpp.repeat(repeat, number)) + assert cpp_delete < python_delete + + print("Python Time:") + print("insert(): ",python_insert,"s") + print("search(): ",python_search,"s") + print("delete(): ",python_delete,"s") + python_total = python_insert+python_search+python_delete + print("Total Python time: ", python_total,"s\n") + + print("C++ Time:") + print("insert(): ",cpp_insert,"s") + print("search(): ",cpp_search,"s") + print("delete(): ",cpp_delete,"s") + cpp_total = cpp_insert+cpp_search+cpp_delete + print("Total C++ time: ", cpp_total,"s\n") + + print("C++ backend is",round(python_total/cpp_total),"times faster!") + + test_BinarySearchTree() + ``` +
    + +Time taken for methods of Binary Search Tree class to execute in different backends: +

    + Centered Image +

    + +The picture clearly indicates the utility of the C++ backend. It makes code execution much faster. This is helpful for high-performance computing. + + +### Weekly reports + +My Google Summer of Code blogs are available on my website: **[https://kishanved.tech/blog/](https://kishanved.tech/blog/)** + +### Final Report + +My final report for Google Summer of Code 2024 is available here: **[Google Summer of Code 2024 Report](https://gist.github.com/Kishan-Ved/ebe0a971220d67517ae815e4f92d2459)** + +### Future work + +My project is complete, the C++ backend for all trees is fully functional. Some (non-critical) issues have been opened, these need to be addressed. For upcoming plans (and major goals), refer **[PyDataStructs Wiki](https://github.com/codezonediitj/pydatastructs/wiki/Google-Summer-of-Code-Project-Ideas)** on GitHub. + +### Learnings + +**Tech**: Mastered the art of linking a Python code to a C++ backend by using the Python-C API to improve speeds greatly. Polished my C++ and Python coding skills. + +**GitHub**: Learned various new commands, resolution of conflicts and merging branches for collaborative work. + +**Perseverance**: GSoC taught me to read the documentation, be calm and perseverant. It's difficult at the start but smoother ahead! + +--- + +And that's my entire open source story, from my first contribution to getting selected for Google Summer of Code! I hope this helps you to navigate through the amazing world of open source software! + +Thanks to my mentor **[Gagandeep Singh](https://github.com/czgdp1807)** for his support and guidance. Thanks to **[Ivan Ogasawara](https://github.com/xmnlab)** and the team at Open Science Labs and NumFOCUS. \ No newline at end of file diff --git a/pages/blog/my-opensciencelabs-internship-journey/header.png b/pages/blog/my-opensciencelabs-internship-journey/header.png new file mode 100644 index 000000000..b36a6cadf Binary files /dev/null and b/pages/blog/my-opensciencelabs-internship-journey/header.png differ diff --git a/pages/blog/my-opensciencelabs-internship-journey/index.md b/pages/blog/my-opensciencelabs-internship-journey/index.md new file mode 100644 index 000000000..45572245b --- /dev/null +++ b/pages/blog/my-opensciencelabs-internship-journey/index.md @@ -0,0 +1,82 @@ +--- +title: "My Open Science Labs Internship Journey" +slug: "my-opensciencelabs-internship-journey" +date: 2025-01-30 +authors: ["Mfonobong Uyah"] +tags: ["OpenScienceLabs", "OSL", "internship"] +categories: ["Internship", "Backend"] +description: "This blog post summarizes my internship in backend development at Open Science Labs with Ivan Ogasawara as my mentor and supervisor!" +thumbnail: "/header.png" +template: "blog-post.html" +--- + +# About Me + +I am [Mfonobong Uyah](https://www.linkedin.com/in/mfonobong-uyah-26901620a/), a graduate of Electrical and Electronics Engineering (EEE) from the Federal University of Technology, Akure (FUTA). In June 2024, I was privileged to be accepted for an internship at Open Science Labs. This program was mentored by [Ivan Ogasawara](https://github.com/xmnlab), the founder of Open Science Labs and a seasoned professional with over 10 years of experience in open-source and 22 years of experience in software development. + +# The Focus of My Internship Program + +My internship at Open Science Labs was designed to be comprehensive. As such, I was introduced to:
    +• software development project work
    +• coding challenges
    +• project/code reviews
    +• open-source events
    +• weekly open study group sessions
    +• Relevant online courses
    +• personal study sessions
    + +# My First Contribution to Open Source + +My first open-source contribution was a bug fix for an issue pointed out by the linter in the Growth Forge repository. Here is a link to the PR: https://github.com/osl-incubator/growth-forge/pull/9 + +As a pre-requirement for participating in the OSL internship, potential candidates are to make, at least, one simple contribution. My mentor directed me to the open ‘linter’ issue on the Growth Forge repo, informing me that it was simple enough to start with. I took a look at the issue and was able to run pre-commit hooks to fix the linter problem. + +# About My Internship + +During my internship program, I worked on some of the most amazing incubated and affiliated projects under the OSL umbrella. Here’s a list of the repositories I engaged with and some of my activities. + +## Project Work +[Growth Forge:](https://github.com/osl-incubator/growth-forge) +My contribution to the Growth Forge repository involved creating test codes for the project’s views and models and running the respective tests, as well as recording the results. + +[OSL Website:](https://www.opensciencelabs.org) +For the OSL website repository, I engaged in backend updates of several pages, including the home, team, events, and blogs pages. I also added a few new pages such as the career page, and worked to implement a website-wide search feature. + +[Artbox:](https://github.com/osl-incubator/artbox) +I utilized the Artbox text-to-speech feature to generate audio summaries of the monthly newsletter. These audios were applied to the OSL podcast. + +Aside from coding activities and project work, I also contributed by identifying and raising issues, particularly in the Artbox repository. + +## Contribution Stats +Two statistics that define my internship contribution are: 21 merged pull requests and Python being the dominant programming language. + +## OSL and Advent of Code Challenges +I attempted several challenges from the OSL Challenge repo including the train, padlock-secret, and money-calculation challenges. I also participated in solving Advent of Code 2024 challenges themed around finding a missing Santa using sketchy direction clues. + +## Course Completions +Continuous learning is at the core of the OSL internship program. As such, I undertook several online courses, to enhance my understanding of coding concepts and learn new things altogether. Some of the courses I undertook during my internship were: Version Control with Git (available on [Software Carpentry](https://swcarpentry.github.io/git-novice/)), Docker Training Course for the Absolute Beginner (available on [KodeKloud](https://learn.kodekloud.com/courses/docker-training-course-for-the-absolute-beginner)), and Python for Everyone (available on [Runestone Academy](https://runestone.academy/ns/books/published/py4e-int/index.html)). + +## Open Source Events +Finding and participating in open-source events was another highlight of my internship journey. In October, I applied and received a scholarship to participate in the maiden edition of the [pyOpenSci Fall Festival](https://www.pyopensci.org/events/pyopensci-2024-fall-festival.html). This event featured interactive sessions on writing modular, clean code, building a Python package, and creating reproducible reports and presentations with Quarto and Great Tables. + +## Open Study Calls +My mentor, Ivan Ogasawara, invited me to join the LiteRev-sponsored Open Study Calls every Thursday. Here, I came across several new concepts/tools such as Retrieval-Augumented Generation (RAG), JupyterLabs, etc. + +After participating in more than 20 Open Study Calls, I built a culture of learning, was exposed to expert suggestions and reviews, and came across relevant courses and resources on coding and software development in general. + +## Impact of the Open Source and Open Science Community # + +Support from the open-source and open-science community proved handy throughout my internship at Open Science Labs. The OSL Discord server was a place where I could throw questions and get prompt and helpful responses from a number of experts. This significantly lightened the burden of finding my footing as a beginner in software development. + +## Lessons Learnt # + +There are numerous lessons to be learnt from an impactful internship like the one I had at Open Science Labs (OSL). I’ll share them with you. + +• Be Open to Corrections: +Seek corrections. At the beginning, it might be difficult or overwhelming. However, with time, you will be grateful for it. Having someone to correct you will only make your learning process easy as you can quickly move on from mistakes and avoid them in the future. + +• Be Upfront about Challenges: +The Open Science Labs internship is designed to be safe, warm, and welcoming. If you happen to have challenges during the program, it is okay to speak up about it. In fact, you should speak up about it. This will help your mentor/program coordinator make necessary adjustments, enabling your continued participation and progress. + +• Put Your Mind In the Work: +If you like your work, it becomes easier. One notable way to build this liking is to put your mind to it. Your focus will easily translate into an interest, improving the quality of your participation and your output in general. \ No newline at end of file diff --git a/pages/blog/newsletter-first-edition/header.jpg b/pages/blog/newsletter-first-edition/header.jpg new file mode 100644 index 000000000..d9ab475b9 Binary files /dev/null and b/pages/blog/newsletter-first-edition/header.jpg differ diff --git a/pages/blog/newsletter-first-edition/index.md b/pages/blog/newsletter-first-edition/index.md new file mode 100644 index 000000000..fd5f723a7 --- /dev/null +++ b/pages/blog/newsletter-first-edition/index.md @@ -0,0 +1,142 @@ +--- +title: "Newsletter First Edition" +slug: "newsletter-first-edition" +date: 2024-10-19 +authors: ["Mfonobong Uyah"] +tags: ["Newsletter", "OSL", "First Edition"] +categories: ["Newsletter"] +description: | + The OSL newsletter is launching soon! Our first edition has been repurposed + for this blog post, but you can subscribe to receive future releases directly + in your inbox. +thumbnail: "/header.jpg" +template: "blog-post.html" +--- + +**Highlights:** + +- **OSL Grant News** +- **pyOpenSci’s Upcoming Fall Festival Event** +- **OSL Projects Development Report** +- **Open Study Group** + +## News: OSL Receives PSF Grant for MAKIM and ASTx Projects + +We're thrilled to announce that the Python Software Foundation (PSF) has granted +funding to two of our key projects: **MAKIM** and **ASTx**. This support will +help accelerate development and enhance the capabilities of these tools. Read on +to learn more about these projects and the impact of the PSF grant. + +### About the Python Software Foundation + +Founded in March 2001, the Python Software Foundation (PSF) is a nonprofit +organization dedicated to advancing and promoting the Python programming +language. The PSF supports a wide range of open-source Python projects, +fostering a vibrant and inclusive community. + +## Are You a Pythonista? Join the pyOpenSci Fall Festival 2024 + +Mark your calendars! Our partner is hosting a one-of-a-kind event. The +**pyOpenSci Fall Festival 2024** is an inaugural online meeting of Python, Open +Science, and Open Source enthusiasts set to take place from October 28 to +November 1, 2024. + +The event promises to feature insightful talks, essential hands-on workshops, +and office hours with numerous industry experts exchanging ideas and sharing +experiences. +[Go here](https://www.pyopensci.org/events/pyopensci-2024-fall-festival.html) to +learn more. + +## OSL Projects Development Report + +### MAKIM Improvements + +**MAKIM** is a YAML-based task automation tool inspired by Make. It offers +structured definitions for tasks and dependencies, supporting conditionals, +arguments, grouping, variables, Jinja2 templating, and environment file +integration. + +Makim team has made several recent updates to the project, including the +addition of new features supported by the PSF grant. + +- Added support for checking the .makim.yaml structure with a schema definition. +- Added support for matrix variables for tasks. +- Changed from dependencies support to hooks with pre and post run support. +- Fixed text problems and issues in the continuous integration jobs. +- Introduced support for interactive arguments, allowing for more dynamic user + input. +- Refactored the attribute "shell" to "backend," improving code clarity. +- Updated the configuration for MyPy to ensure better type-checking practices. + +Read more about MAKIM +[here](https://dev.to/opensciencelabs/streamlining-project-automation-with-makim-21nc). + +### ASTx Improvements + +**ASTx** is a language-agnostic expression structure designed primarily for the +ArxLang project. However, it can be utilized by any programming language or +parser to create high-level representations of Abstract Syntax Trees (AST). + +ArxLang team has made several developmental improvements to ASTx, including the +addition of new features supported by the PSF grant: + +- Added a new import statement feature for improved module management. +- Implemented runtime type checking using Typeguard. +- Enhanced type safety and reliability. +- Improved the development configuration structure, and dependencies. +- Added a transpiler from astx to python +- Added support to complex32 and complex64 +- Added support to float16, and float64 +- Added support to uint8, uint16, unit32, uint64, uint128 + +If you would like to read more on ASTx, +[go here](https://opensciencelabs.org/blog/console-based-representation-in-astx/). + +### Sugar and SciCookie Both Have New Updates + +**Sugar** and **SciCookie** projects are also receiving updates. The latest PRs on the Sugar repository include: + +- Added support for checking the .sugar.yaml structure with a schema definition. +- A fix for the Jinja2 template. +- A refactor of the interface for plugins/extensions that moves the main command + to the compose group. + +On the SciCookie project, SciCookie team has added some feature and +improvements: + +- Improved tests and infrastructure. +- Added support to pixi with pyproject. +- Added support to circleci. + +## What’s Next? How to Get Started Learning About OSL Projects and Activities + +- **Tour Our Website:** Explore our mission, vision, contribution guidelines, + and more on the [OSL website](https://www.opensciencelabs.org). +- **Become a Member:** Join our + [OSL Discord server](https://www.opensciencelabs.org/discord) to connect with + like-minded individuals, contribute to discussions, and collaborate to project + under OSL umbrella. Whether you have a technical background or are a new + enthusiast, everyone is welcome! + +- **Stay Connected:** Follow us on + [LinkedIn](https://www.linkedin.com/company/opensciencelabs) and + [X](https://twitter.com/opensciencelabs) to get updates about published + articles and events before they hit your email. + +- **Explore Our Projects and Ideas:** Visit our + [YouTube channel](https://www.youtube.com/@opensciencelabs/videos). With 12 + insightful videos already available and many more rolling out soon, you can + learn how to install and use our most popular tools, as well as gain knowledge + on programming languages, coding best practices, and past events. + +### Open Study Group + +Join our Open Study Group! Everyone is welcome to participate in our dedicated +one-hour sessions designed to support your personal studies. Use this online +meeting space to focus on your work, ask questions, and share updates about your +progress. Whether you're tackling a new project, learning a new skill, or simply +seeking a quiet time to study, our study group provides a supportive and +collaborative environment to help you achieve your goals. Come connect with +fellow learners and make the most of your study time together! + +Ask for more information on our [Discord](https://www.opensciencelabs.org/discord). diff --git a/pages/blog/newsletter-first-edition/study.jpeg b/pages/blog/newsletter-first-edition/study.jpeg new file mode 100644 index 000000000..3162436fd Binary files /dev/null and b/pages/blog/newsletter-first-edition/study.jpeg differ diff --git a/pages/blog/newsletter-second-edition/header.jpg b/pages/blog/newsletter-second-edition/header.jpg new file mode 100644 index 000000000..30a821e52 Binary files /dev/null and b/pages/blog/newsletter-second-edition/header.jpg differ diff --git a/pages/blog/newsletter-second-edition/index.md b/pages/blog/newsletter-second-edition/index.md new file mode 100644 index 000000000..d09d597d2 --- /dev/null +++ b/pages/blog/newsletter-second-edition/index.md @@ -0,0 +1,98 @@ +--- +title: "Newsletter Second Edition" +slug: "newsletter-second-edition" +date: 2024-12-11 +authors: ["Mfonobong Uyah"] +tags: ["Newsletter", "OSL", "Second Edition"] +categories: ["Newsletter"] +description: | + The second edition of the OSL newsletter is here. Catch up on the latest updates from within and outside our organisation. Don't forget to share this resource with your network. +thumbnail: "/header.jpg" +template: "blog-post.html" +--- + +**Highlights:** + +- **Review of pyOpenSci Fall Festival 2024** +- **ArxLang/ASTx talk at PyConLadies2024** +- **Did You Know?** +- **What’s New in Software Development?** +- **More on MAKIM and ArxLang/ASTx Developments** +- **Open Study Group** + +## Review: pyOpenSci Fall Festival 2024 in A Few Sentences + +Our partner, pyOpenSci, just concluded the maiden edition of its Fall Festival. The highly anticipated event ran from October 28 to November 1, 2024, exposing participants to coding best practices, exciting sample projects, new tools and products, and games like Roast My Repo. The entire event was hosted on Spatial Chat. + +If you were unable to attend this event, we got you covered. Here’s a brief summary of each day’s activities: + +- Day 1: Keynote talks from Eric Ma, Melissa Medoca, and Rowan Cockett. These experts spoke on Open Science in Relation to biomedicine and LLMs, the impact of Open Source on Open Science, and how Markdown catalyses scientific computations through MySTMd. + +- Day 2: A three-part session on formatting code, modularising code, and finally, testing code. + +- Day 3: Insightful package creation tutorial using a template designed and owned by the pyOpenSci community. + +- Day 4: Tips and tricks to effectively sharing a code. How to publish your package on TestPyPI, and add a DOI to your GitHub repo using Zenodo. + +- Day 5: Reproducible reports with Quarto (interactive Python and R in your browser). Speech by George Stagg and demo by James Balamuta. + +## News: ArxLang/ASTx talk at PyConLadies2024 + +Ana Krelling, an impeccable contributor to the OSL community, gave a talk tiled “ASTx: Empowering Language Processing Through Custom Abstract Syntax Trees” at the recently concluded PyConLadies 2024 event. + +You can watch Ana's insightful session [here](https://www.youtube.com/watch?v=azVNQTFmuhA). + +## Did You Know? + +You can convert a Jupyter notebook to a script in the terminal +Once you have the terminal open, you can use it to run Jupyter notebooks as scripts by running: + +```jupyter nbconvert --to script .ipynb``` + +This converts the notebook into a Python script, which can then be executed directly from the terminal. You can also replace 'script' with any of the following; 'asciidoc', 'custom', 'html', 'latex', 'markdown', 'notebook', 'pdf', 'python', 'qtpdf', 'qtpng', 'rst', 'slides', or 'webpdf'. + +## What’s New in Software Development + +**Linux Kernel 6.12 Has Been Released.** +The new update is intended to receive Long-Term Support (LTS), up until 2026. It reportedly comes packed with features such as real-time computing with PREEMPT_RT, hardware enhancements for AMD, Intel, and NVIDIA, and network improvements for DMTCP, IPv6 IOAM6, and PTP Timestamps. + +Other pecks of the Linux Kernel 6.12 are driver updates, thermal core testing, file-backed mount support, guest PMU support, ARM permission overlay support, android guest support, and more. You can read more on this [here](https://www.developer-tech.com/news/linux-kernel-6-12-real-time-capabilities-hardware-boosts-and-more/). + +## Updates: Recent Implementations from the Makim and ArxLang/ASTx teams + +### Makim team + +The updates introduce support for SSH-based command execution, along with a fix for the validate_config function name. It also includes the addition of initial infrastructure for SSH-related tests and a fix for the xonsh version. On the continuous integration (CI) side, the linter job was fixed, and a matrix strategy was added to improve testing coverage. + +### ArxLang/ASTx team + +The update adds the IfExpr and WhileExpr classes, while also fixing the argument type in the FunctionCall class. Additionally, the output for the ForRangeLoopExpr was improved, and support for boolean operators was added to the transpiler. The linter issues were also addressed and fixed. + +## What’s Next? How to Get Started Learning About OSL Projects and Activities + +- **Tour Our Website:** Explore our mission, vision, contribution guidelines, + and more on the [OSL website](https://www.opensciencelabs.org). +- **Become a Member:** Join our + [OSL Discord server](https://www.opensciencelabs.org/discord) to connect with + like-minded individuals, contribute to discussions, and collaborate to project + under OSL umbrella. Whether you have a technical background or are a new + enthusiast, everyone is welcome! + +- **Stay Connected:** Follow us on + [LinkedIn](https://www.linkedin.com/company/opensciencelabs) and + [X](https://twitter.com/opensciencelabs) to get updates about published + articles and events before they hit your email. + +- **Explore Our Projects and Ideas:** Visit our + [YouTube channel](https://www.youtube.com/@opensciencelabs/videos). With 12 + insightful videos already available and many more rolling out soon, you can + learn how to install and use our most popular tools, as well as gain knowledge + on programming languages, coding best practices, and past events. + +### Open Study Group + +Join our Open Study Group! Everyone is welcome to participate in our dedicated one-hour sessions designed to support your personal studies. Use this online meeting space to focus on your work, ask questions, and share updates about your progress. Whether you're tackling a new project, learning a new skill, or simply seeking a quiet time to study, our study group provides a supportive and collaborative environment to help you achieve your goals. Come connect with fellow learners and make the most of your study time together! + +This study group is sponsored by [LiteRev](https://literev.unige.ch/)! + +Ask for more information on our [Discord](https://www.opensciencelabs.org/discord). diff --git a/pages/blog/open-science-labs-participating-google-summer-of-code-2025-mentoring-organization/gsoc_osl.png b/pages/blog/open-science-labs-participating-google-summer-of-code-2025-mentoring-organization/gsoc_osl.png new file mode 100644 index 000000000..a55193788 Binary files /dev/null and b/pages/blog/open-science-labs-participating-google-summer-of-code-2025-mentoring-organization/gsoc_osl.png differ diff --git a/pages/blog/open-science-labs-participating-google-summer-of-code-2025-mentoring-organization/index.md b/pages/blog/open-science-labs-participating-google-summer-of-code-2025-mentoring-organization/index.md new file mode 100644 index 000000000..3b934fde0 --- /dev/null +++ b/pages/blog/open-science-labs-participating-google-summer-of-code-2025-mentoring-organization/index.md @@ -0,0 +1,40 @@ +--- +title: "Open Science Labs is participating in the Google Summer of Code 2025 as a Mentoring Organization!" +slug: open-science-labs-participating-google-summer-of-code-2025-mentoring-organization +date: 2025-03-01 +authors: ["Open Science Labs Team"] +tags: [google summer of code, gsoc, open-source, open-science] +categories: [open-source, gsoc] +description: | + Open Science Labs (OSL) is participating as a mentoring organization in Google Summer of Code (GSoC) 2025 for the first time. Students and newcomers can join open-source projects, connect with mentors, and apply via the GSoC website. Visit the official page of OSL or Discord for details. +thumbnail: "/gsoc_osl.png" +--- + +## Open Science Labs is participating in the Google Summer of Code 2025 as a Mentoring Organization! + +![Google Summer of Code 2025 with Open Science Labs](gsoc_osl.png) + +We are thrilled to announce that Open Science Labs (OSL) has been selected as one of the 185 mentoring organizations for Google Summer of Code (GSoC) 2025. This is an exceptional opportunity for our community, our projects and sub-organizations, and new contributors to engage in open source software development. As an independent organization participating for the first time in GSoC, we are thrilled to welcome students and newcomers to collaborate on meaningful projects under the guidance of experienced mentors. + +### Participating Projects and Sub-Organizations + +You can check it in the [Open Science Labs Official page](https://opensciencelabs.org/opportunities/gsoc/project-ideas/), where each organization has its own set of project ideas and mentors. Feel free to reach out to the mentors directly for inquiries or join our [Discord server](https://opensciencelabs.org/discord) for discussions. + +### How to Participate + +#### For Students and Contributors + +If you are a student or newcomer eager to contribute to open source projects, here is how you can get involved: + +1. Explore Project Ideas: Check out the list [here](https://opensciencelabs.org/opportunities/gsoc/project-ideas/). +2. Introduce Yourself: Reach out to the organization or project mentors you are interested in working with. +3. Review Guidelines: Read our Contributor Guide and the official GSoC [Student Instructions](https://summerofcode.withgoogle.com/). +4. Apply: Submit your application through the GSoC website once the application period opens. + +For the latest project ideas and detailed submission guidelines, check out our official page or other communication channels. + +### Get Involved! + +- **For inquiries**: Email us at . +- **Join the conversation**: Connect with us on [Discord](https://opensciencelabs.org/discord). +- **Learn more about GSoC**: Visit the official [GSoC website](https://summerofcode.withgoogle.com/). diff --git a/images/logo.png b/pages/blog/osl-2-0/header.png similarity index 100% rename from images/logo.png rename to pages/blog/osl-2-0/header.png diff --git a/pages/blog/osl-2-0/index.md b/pages/blog/osl-2-0/index.md new file mode 100644 index 000000000..6d39510fb --- /dev/null +++ b/pages/blog/osl-2-0/index.md @@ -0,0 +1,159 @@ +--- +title: "OSL 2.0" +slug: osl-2-0 +date: 2026-01-19 +authors: ["Ivan Ogasawara"] +tags: [osl] +categories: [osl] +description: | + OSL 2.0 is a new chapter—and an open invitation. If you believe in Growth, Collaboration, and Impact, there's a place for you here: to learn in public, contribute to real projects, and grow into a leader who helps others do the same. Whether you're a student, a researcher, a maintainer, or simply someone who cares about open source and open science, we'd love to meet you. Read our mission, join the conversation, and take your first step with us—one small contribution can become a life-changing journey. +thumbnail: "/header.png" +--- + +## OSL 2.0 + +Open Science Labs (OSL) was born in 2015, when I was working at a transportation +engineering lab. The idea was simple: help researchers bring open science into +their daily work. + +After a few months, life took me in other directions, and OSL went on pause. + +In 2018, a few friends were looking for their first jobs in tech. I decided to +reactivate OSL (back then called _Open Data Science Labs_) to support them with +mentoring and internships, and to connect them to open source projects in +research settings. + +Through this initiative, my friends **Sandro Loch** and **Elton Santana** +started contributing to a scientific project I had previously worked on: +**Alerta Dengue**, led by professor **Flavio Coelho**. A few months later, both +of them were hired. + +That was the real beginning of OSL. It matched what moves me most: helping +people grow while helping open source projects move forward. + +--- + +### Growing together + +From there, OSL started many kinds of activities: mentoring, open source +incubation, internships, translations, webinars, and more. + +We received support from wonderful people and friends like **Francisco Palm**, +**Mariangela Petrizzo**, **Ever Vino**, **Eunice Rodas**, **Luis Gago**, +**Agustina Pesce**, **Sandro Loch**, and many others. + +New interns joined too, such as **Luã Bida**, **Anavelyz Perez**, and **Yurely +Camacho**, who helped keep many internal projects moving. Later, Anavelyz also +helped coordinate our activities related to **Google Summer of Code (GSoC)**. + +And speaking of GSoC, we are deeply grateful to **Gagandeep Singh** for his +guidance and support over the years. + +--- + +### Our partners along the way + +OSL also received direct and indirect support from several partners, including: +**Alerta Dengue**, **The GRAPH Network**, **The GRAPH Courses**, **pyOpenSci**, +**LiteRev**, and **IGDORE**. + +A big thank you to **Olivia Keiser**, **Sara Botero**, **Flavio Coelho**, +**Aziza**, **Erol Orel**, and many others for the opportunities and trust. + +We are also very grateful to the **Python Software Foundation**, which supported +us with three grants to help maintain three affiliated projects: **SciCookie**, +**Makim**, and **ASTx**. + +These grants allowed us to hire amazing former interns like **Anavelyz**, +**Yurely**, **Abhijeet**, and **Ana Paula**. + +--- + +### The game changer: Google Summer of Code + +A big turning point for our community was joining the **Google Summer of Code** +program. + +In the first two years, we joined GSoC under the umbrella of **NumFOCUS**, who +opened the doors for us. Later, in 2025, OSL was accepted as an official **GSoC +Mentoring Organization**. + +GSoC put us “on the map” for newcomers, which has always been one of our main +audiences. Many new people started reaching out to participate in GSoC with OSL. +This was beautiful—but also challenging. + +We were not fully prepared for such a large number of candidates. It was hard to +manage, and we learned a lot in the process. + +GSoC 2026 has not yet been announced, and we are already receiving messages from +new candidates. This is one of the reasons we felt the need to pause, look at +ourselves, and clarify our mission, motivation, and purpose. + +We want to make these clear and public so that people join us because they +connect with our values, not only because of GSoC. Otherwise, many might feel +disappointed, since only a few can be selected each year. + +You can read more about our mission, motivation, and purpose [here](/about). +Below is a short summary. + +--- + +### Our core: Growth, Collaboration, Impact + +The three core values that represent our community are: + +- **Growth** +- **Collaboration** +- **Impact** + +We are building a community where anyone who shares these values has a space to: + +- Learn and grow +- Contribute to real projects +- Create a positive impact in the world + +We truly believe that open source is a powerful way to connect people who want +experience with maintainers who need contributors. + +Today, only a small fraction of students manage to work in the field they +studied after finishing university. That's the gap OSL is trying to help fill. + +--- + +### We don't want followers, we want leaders + +The focus of OSL is not to create followers, but to help people become +**leaders**. + +We want people in our community who feel our projects as **their** projects, +with the same love and passion that we put into them. + +Of course, each person grows at their own pace. It can take time to understand +the architecture, roadmap, and purpose of a project. It can also take time +before you feel confident to contribute independently or receive an invitation +to become a maintainer. + +That's normal. Don't give up. + +Keep moving forward. Ask for feedback. Use every step to grow. + +As **Jim Kwik** says in his _Super Brain_ course: + +> “Practice doesn't make perfect. Practice makes progress.” + +--- + +### Thank you 💚 + +Before closing, I want to say a special thank you to some amazing collaborators +who have helped us more actively in different projects and initiatives: **Sandro +Loch**, **Ever Vino**, **Felipe Paes**, **Satarupa Deb**, **Yuvi Mittal**, +**Aniket Kumar**, **Abhijeet**, and all our interns, mentors, former steering +council members, and partners. + +Thank you all for being part of our lives and our journey. Together, we are +building a welcoming place where people can grow, contribute, and make a real +difference. + +OSL 2.0 is not just a new phase of a project. It is a new chapter in a community +of people who care. diff --git a/pages/blog/packaging-a-vs-code-extension-using-pnpm-and-vsce/header.png b/pages/blog/packaging-a-vs-code-extension-using-pnpm-and-vsce/header.png new file mode 100644 index 000000000..b6fe431fd Binary files /dev/null and b/pages/blog/packaging-a-vs-code-extension-using-pnpm-and-vsce/header.png differ diff --git a/pages/blog/packaging-a-vs-code-extension-using-pnpm-and-vsce/index.md b/pages/blog/packaging-a-vs-code-extension-using-pnpm-and-vsce/index.md new file mode 100644 index 000000000..9933b6d43 --- /dev/null +++ b/pages/blog/packaging-a-vs-code-extension-using-pnpm-and-vsce/index.md @@ -0,0 +1,103 @@ +--- +title: "Packaging a VS Code Extension Using pnpm and VSCE" +slug: "packaging-a-vs-code-extension-using-pnpm-and-vsce" +date: 2025-08-31 +authors: ["Ansh Arora"] +tags: ["Makim", "Automation", "VSCode", "pnpm", "esbuild"] +categories: ["Packaging", "Node", "Extensions"] +description: | + A step-by-step guide to packaging and publishing VS Code extensions with pnpm and vsce, + covering how to avoid dependency resolution issues. +thumbnail: "/header.png" +template: "blog-post.html" +--- + +# Packaging a VS Code Extension Using pnpm and VSCE + +VS Code’s `vsce` tool doesn't play nicely with `pnpm` out of the box; here’s a +proven workaround using bundling and the `--no-dependencies` flag to get things +running smoothly. + +--- + +## Why pnpm + vsce can be problematic + +`vsce` relies on `npm list --production --parseable --depth=99999`, which fails +under pnpm's symlink-based dependency management, often throwing +`npm ERR! missing:` errors. +([github.com](https://github.com/microsoft/vscode-vsce/issues/421), +[daydreamer-riri.me](https://daydreamer-riri.me/posts/compatibility-issues-between-vsce-and-pnpm/)) + +--- + +## Solution Overview + +1. **Bundle your extension** using a bundler such as **esbuild** or **Webpack** +2. **Use `--no-dependencies`** when running `vsce package` and `vsce publish` + +Because all dependencies are bundled, `vsce` no longer needs to resolve them +from `node_modules`. + +--- + +## Step-by-Step Setup + +### 1. Install Tools + +```bash +pnpm add -D @vscode/vsce esbuild +``` + +@vscode/vsce` is the CLI for packaging and publishing VSCode extensions. Recent +versions (e.g., v3.6.0) support npm (≥6) and Yarn (1.x), but don't officially +support pnpm. + +### 2\. Configure `package.json` + +Scripts Add build and packaging commands: jsonc Copy code + +```json +{ + "scripts": { + "vscode:prepublish": "pnpm run bundle", + "bundle": "esbuild ./src/extension.ts --bundle --outfile=out/main.js --external:vscode --format=cjs --platform=node --minify", + "package": "pnpm vsce package --no-dependencies", + "publish": "pnpm vsce publish --no-dependencies" + } +} +``` + +- `vscode:prepublish`: runs before packaging; bundles source using esbuild +- `bundle`: compiles `extension.ts` into `out/main.js` and excludes the `vscode` + module +- `package` / `publish`: calls VSCE via pnpm, skipping dependency resolution + +### 3\. Why It Works + +By bundling dependencies manually, `vsce` doesn’t need to resolve them during +packaging or publishing. The `--no-dependencies` option avoids pnpm’s symlink +issues entirely. + +## Sample `package.json` Snippet + +```json +{ + "devDependencies": { + "@vscode/vsce": "^3.6.0", + "esbuild": "^0.XX.X" + }, + "scripts": { + "vscode:prepublish": "pnpm run bundle", + "bundle": "esbuild ./src/extension.ts --bundle --outfile=out/main.js --external:vscode --format=cjs --platform=node --minify", + "package": "pnpm vsce package --no-dependencies", + "publish": "pnpm vsce publish --no-dependencies" + } +} +``` + +### **Wrap-Up** + +Using **pnpm** with VS Code extensions involves a few extra steps because `vsce` +doesn’t support pnpm’s dependency structure directly. The ideal workflow: _ +**Bundle your extension first**, then _ **Use `--no-dependencies`** to package +and publish safely. diff --git a/content/blog/psf-scicookie/header.svg b/pages/blog/psf-funding-open-source-projects-development-scicookie/header.svg similarity index 100% rename from content/blog/psf-scicookie/header.svg rename to pages/blog/psf-funding-open-source-projects-development-scicookie/header.svg diff --git a/pages/blog/psf-funding-open-source-projects-development-scicookie/index-en.md b/pages/blog/psf-funding-open-source-projects-development-scicookie/index-en.md new file mode 100644 index 000000000..235039a17 --- /dev/null +++ b/pages/blog/psf-funding-open-source-projects-development-scicookie/index-en.md @@ -0,0 +1,224 @@ +--- +title: "PSF funding open source projects development: SciCookie" +slug: psf-funding-open-source-projects-development-scicookie +date: 2023-09-22 +authors: ["Anavelyz Perez", "Yurely Camacho"] +tags: [psf, osl, scicookie, grant, community, collaboration, development] +categories: [open source, software development, python] +description: | + In this article, we will share our experience in applying for and + executing a Python Software Foundation (PSF) grant on behalf of Open + Science Labs (OSL), submitted between January and February 2023. The + proposal was submitted to contribute to the development and maintenance + of SciCookie, a Python tool within the [OSL incubation + projects](/projects/incubation/). +thumbnail: "/header.svg" +template: "blog-post.html" +--- + + + + +In this article, we will share our experience in applying for and executing a +Python Software Foundation (PSF) grant on behalf of Open Science Labs (OSL), +submitted between January and February 2023. The proposal was submitted to +contribute to the development and maintenance of SciCookie, a Python tool within +the [OSL incubation projects](/projects/incubation/). + +We'll begin by introducing SciCookie, highlighting its key features and aspects +that might interest you. Then, we'll go over the grant application process and +share our reflections on the experience, along with the lessons we learned. + +## What is SciCookie? + +As we mentioned at the beginning, SciCookie is a Python tool designed to provide +a Python project template. Its main goals are to simplify the process of +creating your projects and save you a considerable amount of time because, +according to your needs and planning, it gives you a starting point for the +configuration of your project. SciCookie provides several tools that are as +up-to-date as possible and adheres to community standards. + +SciCookie is mainly based on PyOpenSci recommendations regarding the tools, +libraries, best practices and workflows employed by the significant Python +scientific groups. The elements we mention are listed as options, which means +that you can adapt various approaches in your project, through a text interface +(TUI) provided by SciCookie. + +SciCookie is available from [PyPI](https://pypi.org/project/scicookie/) and +[conda](https://anaconda.org/conda-forge/scicookie). You can also visit its +repository at [GitHub](https://github.com/osl-incubator/scicookie). + +Now that you know a bit about this project, let's tell you about PSF and how it +supports the Python community. + +## What is PSF and how does it support the Python community? + +The Python Software Foundation (PSF) is an organization dedicated to the +advancement and improvement of open source technologies. Its mission is to +promote, protect and advance the Python programming language. In addition, it +supports and facilitates the development/growth of the Python developers +community; a diverse and international community. + +Among the programs that PSF promotes to achieve its mission, there is a _Grants +Program_, where proposals for projects related to the development of Python, +technologies associated with this programming language and educational +resources, are welcome. Since the creation of the program, PSF has supported +several interesting projects, you can click +[here](https://www.python.org/psf/records/board/resolutions/) to see the list or +have a clearer notion of the proposals, and maybe you will be encouraged to +apply with new projects or ideas. + +You should know that the PSF in the grants program evaluates a number of aspects +in each proposal, including the usefulness of the project and the impact on the +Python community. In case you want to know more, we recommend you visit the +space that PSF has on its website for the +[grants program](https://www.python.org/psf/grants/). + +So far, we have given you a brief overview of the main aspects of the two +parties involved: SciCookie and PSF. We will continue by telling you about the +grant application, what motivated us, the arranging and assigning tasks. + +## What was the grant application process like? + +The PSF grant application process was a long and challenging, but also very +rewarding. It began with careful planning and research. We studied the needs of +the scientific community and found a project that could help meet those needs. +In other words, we build on a strong case for the grant. + +We were studying the different projects within the Open Science Labs incubation +program; where there are a series of approaches and technologies implemented, +including Python projects associated with DevOps, Data Science, and scientific +projects. The option that was best suited to apply for the grant in our case was +SciCookie; because it is a very useful tool and is focused on helping the Python +community. + +After completing the planning and research, we began the formal application +process. This included completing an online form and submitting a detailed +proposal. The proposal contains a project description, timeline, budget and +impact section. In our case and in order to review each aspect carefully, we +produced a +[file with the responses](https://github.com/OpenScienceLabs/grant-proposals/blob/96263f736e7f36eb22a3dd1baa16376fd1782e98/psf_proposal.md) +[1] and filled in the budget scheme (template provided by the PSF). This process +was done under the advice of the OSL Steering Council. + +In addition to the above, a series of issues were created and edited in the +project repository, in order to be clear about the activities to be carried out +and the time it would take to develop them in case the proposal was approved. + +Once we had submitted our proposal, we had to wait some months for a decision. +It was a period of great uncertainty, but finally we received the news that our +proposal had been accepted! + +## How was the workflow? + +With the PSF grant, we were able to start developing and maintaining SciCookie +part-time. We worked with some community developers to add new features, improve +documentation and fix bugs. This included the creation of a +[user guide](https://github.com/osl-incubator/scicookie/blob/main/docs/guide.md) +to help enthusiasts and developers to use SciCookie. + +In terms of task specification, as we described in the previous section, a +series of issues were generated in the project repository, and each one of us +handled some of the issues on a weekly basis via Pull Requests (PRs). These were +approved by members of the Open Science Labs team, who were also on hand +throughout the execution of the proposal. + +Being a bit more specific about the follow-up, we had from an initial meeting +where we discussed the fundamental aspects of the project and set up what was +necessary to carry it out, to weekly meetings to present our progress, to check +if we had any obstacles or doubts that did not allow us to move forward. +Likewise, each PR was reviewed and if there were any observations, we had +feedback on this. + +In summary, we can tell you that it was quite a dynamic workflow, where a +friendly space was built and allowed us to learn a lot. + +![Flujo de trabajo](workflow.png) + +> We would like to take this opportunity to thank +> [Ivan Ogasawara](https://github.com/xmnlab) and to +> [Ever Vino](https://github.com/EverVino), for their time and dedication. Both +> are active members of OSL and members of the steering council; they were there +> to support us and clarify our questions. + +Here we tell you about our experience and the collaboration phase. + +## How was our learning process? + +SciCookie provided us, for the first time, with the opportunity to make such a +significant contribution to an open science and open source project. It also +allowed us to acquire new knowledge about some aspects and technologies linked +to the Python programming language, since at that time, our knowledge was more +oriented to the use of libraries, objects, loops, among others. + +About this learning process we can tell you that we did not know many things and +it was necessary to learn along the way, sometimes this was a bit challenging +but, in general, very profitable. Among the anecdotes that we rescued is that, a +couple of times, we "exploded" the code and we didn't know why; the cause was +that we didn't know the exact use of single or double quotes, double braces, +spaces or tabs within the template. But then we were able to move forward and we +even made improvements in the workflow of the project. + +Regarding the latter, we can certainly tell you that learning curves are always +steep. At the beginning you see everything uphill, but when you are familiar +with the technology and the tools, everything becomes easier. Daring is always +the first step. + +On the other hand, if you are interested in collaborating on open source +projects, it is vital to have basic knowledge of Git and GitHub version control +tools, and to understand their essential commands such as git pull, git push, +git rebase, git log, git stash, among others. You may also need knowledge of +conda and poetry. We also learned a bit of jinja2 and make, and reviewed +knowledge of function creation, conditional evaluation, GitHub workflow, +documentation aspects and some of the technologies associated with it. + +In summary, the experience of applying for and executing a PSF grant was a +valuable experience. We learned a lot about the process, how to develop and +maintain a Python tool, what structure a Python library or package project +should have, and how to build a community around an open source project. We are +also grateful for the support of the PSF, which has allowed us to make a +contribution to SciCookie. We feel satisfied with the work we have done and are +excited about the future of this tool. + +To all that we have told you, we add an invitation to collaborate on open source +or open science projects and, if you have already done so, we encourage you to +continue to do so. We were often motivated by seeing our PRs being approved, we +shared feelings of achievement and new challenges and, most importantly, we were +applying what open source promotes: small collaborations make big changes and +add to the projects, achieving good and useful results. + +After all this, you may wonder about the barriers to collaboration. We dedicate +the following lines to describe what we rescued from our experience. + +## Can you find barriers to collaboration? + +The progress of your contributions depends on you. It is vital to ask questions +and not get bogged down by doubts. Often there is someone who can show you that +the problem you thought was big was simply a small one, perhaps the code didn't +work because it was single quotes instead of double quotes, for example. + +From the OSL community we can highlight that it focuses on creating friendly, +opportunity-filled spaces where you can share and acquire new knowledge, +eliminating barriers and discrimination. Perhaps you can find these same +characteristics in other open science and/or open source projects. + +That's why we want to invite you again to support and join the diverse Python +and open source community. It's an excellent experience and the fact of +contributing to something that can be useful to other people is quite +satisfying. + +In general, collaborating on open source projects is a great way to improve your +programming skills, you also have the opportunity to work with other developers +and learn from them, get feedback on your work. If you want to support or boost +your project, the first thing to do is to get started. Many communities are open +to new contributions and innovative ideas. + +Leave us your comments if you want to know more about what we have told you in +this space :D + +[1] **Additional note**: SciCookie originally went by the name of +cookiecutter-python and then renamed to osl-python-template. + +Graphic elements of the cover were extracted from +[Work illustrations by Storyset](https://storyset.com/work), and then edited to +conform to the article. diff --git a/content/blog/psf-scicookie/index.md b/pages/blog/psf-funding-open-source-projects-development-scicookie/index.md similarity index 88% rename from content/blog/psf-scicookie/index.md rename to pages/blog/psf-funding-open-source-projects-development-scicookie/index.md index 8dd5a8ed2..6814680c5 100644 --- a/content/blog/psf-scicookie/index.md +++ b/pages/blog/psf-funding-open-source-projects-development-scicookie/index.md @@ -1,18 +1,22 @@ --- title: "PSF financiando el desarrollo de proyectos open source: SciCookie" -slug: psf-financiando-el-desarrollo-de-proyectos-open-source-scicookie +slug: psf-funding-open-source-projects-development-scicookie date: 2023-09-02 -author: Anavelyz Perez, Yurely Camacho -tags: [psf, osl, scicookie, subvención, grant, comunidad, colaboración, desarrollo] +author: ["Anavelyz Perez", "Yurely Camacho"] +tags: + [psf, osl, scicookie, subvención, grant, comunidad, colaboración, desarrollo] categories: [código abierto, desarrollo de software, python] - -draft: false -usePageBundles: true +description: | + En este artículo, compartiremos nuestra experiencia en la solicitud y ejecución + de una subvención de la Python Software Foundation (PSF) a nombre de Open + Science Labs (OSL) que fue enviada entre enero y febrero de 2023. La propuesta + se hizo con la finalidad de contribuir con el desarrollo y mantenimiento de + SciCookie, una herramienta de Python que se encuentra dentro de los + [proyectos de incubación de OSL](/projects/incubation/). thumbnail: "/header.svg" -featureImage: "/header.svg" +template: "blog-post.html" --- - @@ -20,8 +24,8 @@ En este artículo, compartiremos nuestra experiencia en la solicitud y ejecució de una subvención de la Python Software Foundation (PSF) a nombre de Open Science Labs (OSL) que fue enviada entre enero y febrero de 2023. La propuesta se hizo con la finalidad de contribuir con el desarrollo y mantenimiento de -SciCookie, una herramienta de Python que se encuentra dentro de los [proyectos -de incubación de OSL](https://opensciencelabs.org/programs/incubator/). +SciCookie, una herramienta de Python que se encuentra dentro de los +[proyectos de incubación de OSL](/projects/incubation/). Comenzaremos con una breve introducción a SciCookie, algunas de sus características clave y aspectos de interés. Luego, discutiremos el proceso de @@ -72,8 +76,8 @@ nuevos proyectos o ideas. Continuando con el programa de subvenciones, debes conocer que la PSF evalúa una serie de aspectos en cada propuesta, entre ellos la utilidad del proyecto y el impacto en la comunidad Python. En caso de que desees conocer más, te -recomendamos visitar el espacio que tiene PSF en su página web para el [grants -Program](https://www.python.org/psf/grants/ ). +recomendamos visitar el espacio que tiene PSF en su página web para el +[grants Program](https://www.python.org/psf/grants/). Hasta ahora y de manera resumida, te hemos relatado los principales aspectos sobre las dos partes involucradas: SciCookie y PSF. Proseguiremos contándote @@ -99,8 +103,8 @@ Después de completar la planificación y la investigación, comenzamos el proce de solicitud formal. Esto incluyó completar un formulario en línea y presentar una propuesta detallada. La propuesta contiene una descripción del proyecto, un cronograma, un presupuesto y una sección de impacto. En nuestro caso y para -revisar con detenimiento cada aspecto elaboramos un [archivo con las -respuestas](https://github.com/OpenScienceLabs/grant-proposals/blob/96263f736e7f36eb22a3dd1baa16376fd1782e98/psf_proposal.md) +revisar con detenimiento cada aspecto elaboramos un +[archivo con las respuestas](https://github.com/OpenScienceLabs/grant-proposals/blob/96263f736e7f36eb22a3dd1baa16376fd1782e98/psf_proposal.md) [1] y llenamos el esquema del presupuesto (plantilla proporcionada por la PSF). Este proceso se hizo bajo la asesoría del Steering Council de OSL. @@ -118,8 +122,8 @@ había sido ¡aceptada! Con la subvención de la PSF, pudimos comenzar a desarrollar y mantener SciCookie a medio tiempo. Trabajamos con algunos desarrolladores de la comunidad para agregar nuevas funcionalidades, mejorar la documentación y corregir errores o -bugs. Entre esto destacamos la creación de una [guía de -usuario](https://github.com/osl-incubator/scicookie/blob/main/docs/guide.md) +bugs. Entre esto destacamos la creación de una +[guía de usuario](https://github.com/osl-incubator/scicookie/blob/main/docs/guide.md) para ayudar a los entusiastas y desarrolladores a aprender a utilizar SciCookie. En cuanto la especificación de las tareas, como te mencionamos en la sección @@ -141,11 +145,11 @@ donde se construyó un espacio amigable y nos permitió aprender bastante. ![Flujo de trabajo](workflow.png) -> Aprovechamos este espacio para agradecer a [Ivan -> Ogasawara](https://github.com/xmnlab) y a [Ever -> Vino](https://github.com/EverVino), por su tiempo y dedicación. Ambos son -> miembros activos de OSL y parte del steering council; estuvieron apoyándonos y -> aclarando nuestras dudas. +> Aprovechamos este espacio para agradecer a +> [Ivan Ogasawara](https://github.com/xmnlab) y a +> [Ever Vino](https://github.com/EverVino), por su tiempo y dedicación. Ambos +> son miembros activos de OSL y parte del steering council; estuvieron +> apoyándonos y aclarando nuestras dudas. A continuación te contamos sobre nuestra experiencia y la etapa de colaboración. @@ -233,6 +237,6 @@ contado en este espacio :D [1] **Nota adicional**: SciCookie originalmente llevaba por nombre cookiecutter-python y luego pasó a ser osl-python-template. -Elementos gráficos de la portada fueron extraídos de [Work illustrations by -Storyset](https://storyset.com/work), y luego editados para adaptarlos al -artículo. +Elementos gráficos de la portada fueron extraídos de +[Work illustrations by Storyset](https://storyset.com/work), y luego editados +para adaptarlos al artículo. diff --git a/content/blog/psf-scicookie/workflow.png b/pages/blog/psf-funding-open-source-projects-development-scicookie/workflow.png similarity index 100% rename from content/blog/psf-scicookie/workflow.png rename to pages/blog/psf-funding-open-source-projects-development-scicookie/workflow.png diff --git a/pages/blog/scaling-machine-learning-projects-with-dask/image.png b/pages/blog/scaling-machine-learning-projects-with-dask/image.png new file mode 100644 index 000000000..60f4c6e5b Binary files /dev/null and b/pages/blog/scaling-machine-learning-projects-with-dask/image.png differ diff --git a/pages/blog/scaling-machine-learning-projects-with-dask/index.ipynb b/pages/blog/scaling-machine-learning-projects-with-dask/index.ipynb new file mode 100644 index 000000000..f44c83861 --- /dev/null +++ b/pages/blog/scaling-machine-learning-projects-with-dask/index.ipynb @@ -0,0 +1,338 @@ +{ + "cells": [ + { + "cell_type": "raw", + "id": "3b2f4318-ba2d-40ae-9783-47a934627807", + "metadata": {}, + "source": [ + "---\n", + "title: Scaling Machine Learning Projects with Dask\n", + "slug: scaling-machine-learning-projects-with-dask\n", + "date: 2024-01-30\n", + "authors:\n", + " - Satarupa Deb\n", + "tags:\n", + " - open-source\n", + " - Machine Learning\n", + " - Dask\n", + " - python\n", + "categories:\n", + " - Python\n", + " - Machine Learning\n", + " - Parallel computing\n", + "description: |\n", + " This blog explores the usability of Dask in handling significant\n", + " challenges related to scaling models with large datasets, training and testing\n", + " of models, and implementing parallel computing functionalities. It also\n", + " provides a brief overview of the basic features of Dask.\n", + "thumbnail: /image.png\n", + "template: blog-post.html\n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "d900c1a1-1613-4910-9e10-96c39fabf8dc", + "metadata": {}, + "source": [ + "# Scaling Python Data Analysis with Dask\n", + "\n", + "As the volume of digital data continues to expand, coupled with the emergence of new machine learning models each day, companies are increasingly dependent on data analysis to inform business decisions. To effectively test and train these models with large datasets, scaling becomes a significant challenge, particularly in connecting Python analysts to distributed hardware. This challenge is particularly pronounced in the realm of data science and machine learning workloads. The complexities in this process often result in discrepancies that can lead to flawed training of data and consequently, inaccurate results.\n", + "\n", + "In this blog, we will suggest an effective solution to address the challenges discussed above. Imagine how much easier the scaling process would be with a Python library that could perform on both parallel and distributed computing. This is precisely what **Dask** does!\n", + "\n", + "## What is Dask?\n", + "\n", + "**Dask** is an open-source, parallel and distributed computing library in Python that facilitates efficient and scalable processing of large datasets. It is designed to seamlessly integrate with existing Python libraries and tools, providing a familiar interface for users already comfortable with Python and its libraries like NumPy, Pandas, Jupyter, Scikit-Learn, and others but want to scale those workloads across a cluster. Dask is particularly useful for working with larger-than-memory datasets, parallelizing computations, and handling distributed computing.\n", + "\n", + "## Setting Up Dask\n", + "\n", + "Installing Dask is straightforward and can be done using Conda or Pip. For Anaconda users, Dask comes pre-installed, highlighting its popularity in the data science community. Alternatively, you can install Dask via Pip, ensuring to include the complete extension to install all required dependencies automatically.\n", + "\n", + "```bash\n", + "#install using conda\n", + "conda install dask\n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "1269bbbf-a5e4-43b8-af7e-a2ad8a97c732", + "metadata": {}, + "outputs": [], + "source": [ + "#install using conda\n", + "!pip install \"dask[complete]\" -q" + ] + }, + { + "cell_type": "markdown", + "id": "f139ceb9-73e5-40f6-a978-038e89917c3b", + "metadata": {}, + "source": [ + "## Basic Concepts of Dask\n", + "\n", + "At its core, Dask extends the capabilities of traditional tools like pandas, NumPy, and Spark to handle larger-than-memory datasets. It achieves this by breaking large objects like arrays and dataframes into smaller, manageable chunks or partitions. This approach allows Dask to distribute computations efficiently across all available cores on your machine.\n", + "\n", + "## Dask DataFrames\n", + "\n", + "One of the standout features of Dask is its ability to handle large datasets effortlessly. With Dask DataFrames, you can seamlessly work with datasets exceeding 1 GB in size. By breaking the dataset into smaller chunks, Dask ensures efficient processing while maintaining the familiar interface of pandas DataFrames.\n", + "\n", + "## Features of Dask:\n", + "\n", + "1. **Parallel and Distributed Computing:**\n", + " Dask enables parallel and distributed computing, making it a go-to solution for handling datasets that exceed the available memory of a single machine. It breaks down computations into smaller tasks, allowing for concurrent execution and optimal resource utilization." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "11414276-66ff-4bba-a8e0-e8315d49038f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 9986.14978723 10073.19700192 9985.6576724 ... 9923.550924\n", + " 9978.70237439 9990.8504103 ]\n" + ] + } + ], + "source": [ + "#demonstrating parallel and distributed computing using Dask\n", + "import dask.array as da\n", + "\n", + "# Create a large random array\n", + "x = da.random.random((10000, 10000), chunks=(1000, 1000)) # 10,000 x 10,000 array\n", + "\n", + "# Perform element-wise computation\n", + "y = x * 2\n", + "\n", + "# Compute the sum along one axis\n", + "z = y.sum(axis=0)\n", + "\n", + "# Compute the result in parallel across multiple cores or distributed across a cluster\n", + "result = z.compute()\n", + "\n", + "print(result)\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ef1efce-6001-4895-8ae1-395f8a199c3f", + "metadata": {}, + "source": [ + "2. **Dask Collections:**\n", + " Dask provides high-level abstractions known as Dask collections, which are parallel and distributed counterparts to familiar Python data structures. These include `dask.array` for parallel arrays, `dask.bag` for parallel bags, and `dask.dataframe` for parallel dataframes, seamlessly integrating with existing Python libraries." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "0e29dd78-875c-4aea-91fb-19f2aaf1cb4a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.0\n" + ] + } + ], + "source": [ + "#Using dask collections\n", + "import dask.array as da\n", + "\n", + "# Creating a dummy dataset using Dask\n", + "x = da.ones((100, 100), chunks=(10, 10)) # Creating a 100x100 array of ones with chunks of 10x10\n", + "y = x + x.T # Adding the transpose of x to itself\n", + "result = y.mean() # Calculating the mean of y\n", + "\n", + "# Computing the result\n", + "print(result.compute()) # Outputting the computed result\n" + ] + }, + { + "cell_type": "markdown", + "id": "89052ee6-ca13-47d2-bb7d-c415e42a9a17", + "metadata": {}, + "source": [ + "3. **Lazy Evaluation:**\n", + " One of Dask's core principles is lazy evaluation. Instead of immediately computing results, Dask builds a task graph representing the computation. The actual computation occurs only when the results are explicitly requested. This approach enhances efficiency and allows for optimizations in resource usage.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "137b40a2-9c56-4834-bc14-c8cd5c89a244", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.5112260135512784\n" + ] + } + ], + "source": [ + "#Lazy Evalution with dask\n", + "import dask.dataframe as dd\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "# Creating a dummy dataset\n", + "num_rows = 100 # Number of rows\n", + "data = {\n", + " 'column': np.random.randint(0, 100, size=num_rows),\n", + " 'value': np.random.rand(num_rows)\n", + "}\n", + "\n", + "# Creating a Pandas DataFrame\n", + "df_pandas = pd.DataFrame(data)\n", + "\n", + "# Saving the Pandas DataFrame to a CSV file\n", + "df_pandas.to_csv('your_dataset.csv', index=False)\n", + "\n", + "# Reading the CSV file into a Dask DataFrame\n", + "df = dd.read_csv('your_dataset.csv')\n", + "\n", + "# Filtering the Dask DataFrame\n", + "filtered_df = df[df['column'] > 10]\n", + "\n", + "# Calculating the mean of the filtered DataFrame\n", + "mean_result = filtered_df['value'].mean()\n", + "\n", + "# No computation happens until explicitly requested\n", + "print(mean_result.compute()) # Outputting the computed result\n" + ] + }, + { + "cell_type": "markdown", + "id": "2d2800b0-5ac3-429b-8e15-bec442f45df3", + "metadata": {}, + "source": [ + "4. **Integration with Existing Libraries:**\n", + " Dask is designed to integrate seamlessly with popular Python libraries, such as NumPy, Pandas, and scikit-learn. This means that you can often replace existing code with Dask equivalents without significant modifications." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c3e4cc2e-f84f-4033-af96-f5d68bf0d5c1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1.40940907 1.32044698 1.48172367 ... 1.4266846 0.84142743 0.33577001]\n", + " [1.32044698 1.02252065 1.17250384 ... 0.40216939 1.58544767 1.12049071]\n", + " [1.48172367 1.17250384 1.98886224 ... 0.86271956 1.27977778 0.95136532]\n", + " ...\n", + " [1.4266846 0.40216939 0.86271956 ... 1.44980096 1.38712404 0.75331149]\n", + " [0.84142743 1.58544767 1.27977778 ... 1.38712404 1.50814693 1.01719649]\n", + " [0.33577001 1.12049071 0.95136532 ... 0.75331149 1.01719649 1.47050452]]\n" + ] + } + ], + "source": [ + "# Integration with NumPy\n", + "import dask.array as da\n", + "import numpy as np\n", + "\n", + "# Generating a random NumPy array\n", + "x_np = np.random.random((100, 100))\n", + "\n", + "# Converting the NumPy array to a Dask array\n", + "x_dask = da.from_array(x_np, chunks=(10, 10))\n", + "\n", + "# Performing operations on the Dask array\n", + "y_dask = x_dask + x_dask.T\n", + "\n", + "# Computing the result\n", + "print(y_dask.compute())\n" + ] + }, + { + "cell_type": "markdown", + "id": "a6bfffe1-fa8f-46fd-b734-248fd1631df6", + "metadata": {}, + "source": [ + "5. **Task Scheduling:**\n", + " Dask dynamically schedules the execution of tasks, optimizing the computation based on available resources. This makes it well-suited for handling larger-than-memory datasets efficiently. Dask is a powerful tool for data scientists and engineers working with large-scale data processing tasks, providing a convenient way to scale computations without requiring a complete rewrite of existing code.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "2356c4a1-2c78-426d-9019-127cd754ec62", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1, 4, 9, 16, 25, 36, 49, 64, 81)\n" + ] + } + ], + "source": [ + "# Dynamic task scheduling with Dask\n", + "import dask\n", + "\n", + "\n", + "@dask.delayed\n", + "def square(x):\n", + " return x * x\n", + "\n", + "data = [1, 2, 3, 4, 5, 6, 7, 8, 9]\n", + "results = []\n", + "\n", + "for value in data:\n", + " result = square(value)\n", + " results.append(result)\n", + "\n", + "final_result = dask.compute(*results)\n", + "print(final_result)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "6dbaf782-33c5-4956-a332-2620a49bd554", + "metadata": {}, + "source": [ + "## Conclusion:\n", + "\n", + "**Dask** stands as a powerful tool in the Python ecosystem, addressing the challenges posed by the ever-increasing scale of data. Its ability to seamlessly integrate with existing libraries, support lazy evaluation, and provide parallel and distributed computing makes it a valuable asset for data scientists and engineers tackling large-scale data processing tasks. Whether you're working on a single machine with moderately sized datasets or dealing with big data challenges that require distributed computing, Dask offers a flexible and efficient solution. As we continue to navigate the era of big data, Dask proves to be a key player in unlocking the full potential of Python for scalable and parallelized data processing. Start harnessing the power of Dask today and supercharge your data processing workflows!\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pages/blog/scaling-machine-learning-projects-with-dask/index.md b/pages/blog/scaling-machine-learning-projects-with-dask/index.md new file mode 100644 index 000000000..209f930ae --- /dev/null +++ b/pages/blog/scaling-machine-learning-projects-with-dask/index.md @@ -0,0 +1,267 @@ +--- +title: Scaling Machine Learning Projects with Dask +slug: scaling-machine-learning-projects-with-dask +date: 2024-01-30 +authors: + - Satarupa Deb +tags: + - open-source + - Machine Learning + - Dask + - python +categories: + - Python + - Machine Learning + - Parallel computing +description: | + This blog explores the usability of Dask in handling significant + challenges related to scaling models with large datasets, training and testing + of models, and implementing parallel computing functionalities. It also + provides a brief overview of the basic features of Dask. +thumbnail: /image.png +template: blog-post.html + +--- +# Scaling Python Data Analysis with Dask + +As the volume of digital data continues to expand, coupled with the emergence of new machine learning models each day, companies are increasingly dependent on data analysis to inform business decisions. To effectively test and train these models with large datasets, scaling becomes a significant challenge, particularly in connecting Python analysts to distributed hardware. This challenge is particularly pronounced in the realm of data science and machine learning workloads. The complexities in this process often result in discrepancies that can lead to flawed training of data and consequently, inaccurate results. + +In this blog, we will suggest an effective solution to address the challenges discussed above. Imagine how much easier the scaling process would be with a Python library that could perform on both parallel and distributed computing. This is precisely what **Dask** does! + +## What is Dask? + +**Dask** is an open-source, parallel and distributed computing library in Python that facilitates efficient and scalable processing of large datasets. It is designed to seamlessly integrate with existing Python libraries and tools, providing a familiar interface for users already comfortable with Python and its libraries like NumPy, Pandas, Jupyter, Scikit-Learn, and others but want to scale those workloads across a cluster. Dask is particularly useful for working with larger-than-memory datasets, parallelizing computations, and handling distributed computing. + +## Setting Up Dask + +Installing Dask is straightforward and can be done using Conda or Pip. For Anaconda users, Dask comes pre-installed, highlighting its popularity in the data science community. Alternatively, you can install Dask via Pip, ensuring to include the complete extension to install all required dependencies automatically. + +```bash +#install using conda +conda install dask +``` + + + +```python +#install using conda +!pip install "dask[complete]" -q +``` + +## Basic Concepts of Dask + +At its core, Dask extends the capabilities of traditional tools like pandas, NumPy, and Spark to handle larger-than-memory datasets. It achieves this by breaking large objects like arrays and dataframes into smaller, manageable chunks or partitions. This approach allows Dask to distribute computations efficiently across all available cores on your machine. + +## Dask DataFrames + +One of the standout features of Dask is its ability to handle large datasets effortlessly. With Dask DataFrames, you can seamlessly work with datasets exceeding 1 GB in size. By breaking the dataset into smaller chunks, Dask ensures efficient processing while maintaining the familiar interface of pandas DataFrames. + +## Features of Dask: + +1. **Parallel and Distributed Computing:** + Dask enables parallel and distributed computing, making it a go-to solution for handling datasets that exceed the available memory of a single machine. It breaks down computations into smaller tasks, allowing for concurrent execution and optimal resource utilization. + + +```python +#demonstrating parallel and distributed computing using Dask +import dask.array as da + +# Create a large random array +x = da.random.random((10000, 10000), chunks=(1000, 1000)) # 10,000 x 10,000 array + +# Perform element-wise computation +y = x * 2 + +# Compute the sum along one axis +z = y.sum(axis=0) + +# Compute the result in parallel across multiple cores or distributed across a cluster +result = z.compute() + +print(result) + +``` + +
    +

    + OUTPUT + +

    +
    +  
    +[ 9986.14978723 10073.19700192  9985.6576724  ...  9923.550924
    +9978.70237439  9990.8504103 ]
    +
    +
    +
    +
    + +2. **Dask Collections:** + Dask provides high-level abstractions known as Dask collections, which are parallel and distributed counterparts to familiar Python data structures. These include `dask.array` for parallel arrays, `dask.bag` for parallel bags, and `dask.dataframe` for parallel dataframes, seamlessly integrating with existing Python libraries. + + +```python +#Using dask collections +import dask.array as da + +# Creating a dummy dataset using Dask +x = da.ones((100, 100), chunks=(10, 10)) # Creating a 100x100 array of ones with chunks of 10x10 +y = x + x.T # Adding the transpose of x to itself +result = y.mean() # Calculating the mean of y + +# Computing the result +print(result.compute()) # Outputting the computed result + +``` + +
    +

    + OUTPUT + +

    +
    +  
    +2.0
    +
    +
    +
    +
    + +3. **Lazy Evaluation:** + One of Dask's core principles is lazy evaluation. Instead of immediately computing results, Dask builds a task graph representing the computation. The actual computation occurs only when the results are explicitly requested. This approach enhances efficiency and allows for optimizations in resource usage. + + + + +```python +#Lazy Evalution with dask +import dask.dataframe as dd +import numpy as np +import pandas as pd + +# Creating a dummy dataset +num_rows = 100 # Number of rows +data = { + 'column': np.random.randint(0, 100, size=num_rows), + 'value': np.random.rand(num_rows) +} + +# Creating a Pandas DataFrame +df_pandas = pd.DataFrame(data) + +# Saving the Pandas DataFrame to a CSV file +df_pandas.to_csv('your_dataset.csv', index=False) + +# Reading the CSV file into a Dask DataFrame +df = dd.read_csv('your_dataset.csv') + +# Filtering the Dask DataFrame +filtered_df = df[df['column'] > 10] + +# Calculating the mean of the filtered DataFrame +mean_result = filtered_df['value'].mean() + +# No computation happens until explicitly requested +print(mean_result.compute()) # Outputting the computed result + +``` + +
    +

    + OUTPUT + +

    +
    +  
    +0.5112260135512784
    +
    +
    +
    +
    + +4. **Integration with Existing Libraries:** + Dask is designed to integrate seamlessly with popular Python libraries, such as NumPy, Pandas, and scikit-learn. This means that you can often replace existing code with Dask equivalents without significant modifications. + + +```python +# Integration with NumPy +import dask.array as da +import numpy as np + +# Generating a random NumPy array +x_np = np.random.random((100, 100)) + +# Converting the NumPy array to a Dask array +x_dask = da.from_array(x_np, chunks=(10, 10)) + +# Performing operations on the Dask array +y_dask = x_dask + x_dask.T + +# Computing the result +print(y_dask.compute()) + +``` + +
    +

    + OUTPUT + +

    +
    +  
    +[[1.40940907 1.32044698 1.48172367 ... 1.4266846  0.84142743 0.33577001]
    +[1.32044698 1.02252065 1.17250384 ... 0.40216939 1.58544767 1.12049071]
    +[1.48172367 1.17250384 1.98886224 ... 0.86271956 1.27977778 0.95136532]
    +...
    +[1.4266846  0.40216939 0.86271956 ... 1.44980096 1.38712404 0.75331149]
    +[0.84142743 1.58544767 1.27977778 ... 1.38712404 1.50814693 1.01719649]
    +[0.33577001 1.12049071 0.95136532 ... 0.75331149 1.01719649 1.47050452]]
    +
    +
    +
    +
    + +5. **Task Scheduling:** + Dask dynamically schedules the execution of tasks, optimizing the computation based on available resources. This makes it well-suited for handling larger-than-memory datasets efficiently. Dask is a powerful tool for data scientists and engineers working with large-scale data processing tasks, providing a convenient way to scale computations without requiring a complete rewrite of existing code. + + + +```python +# Dynamic task scheduling with Dask +import dask + + +@dask.delayed +def square(x): + return x * x + +data = [1, 2, 3, 4, 5, 6, 7, 8, 9] +results = [] + +for value in data: + result = square(value) + results.append(result) + +final_result = dask.compute(*results) +print(final_result) + + +``` + +
    +

    + OUTPUT + +

    +
    +  
    +(1, 4, 9, 16, 25, 36, 49, 64, 81)
    +
    +
    +
    +
    + +## Conclusion: + +**Dask** stands as a powerful tool in the Python ecosystem, addressing the challenges posed by the ever-increasing scale of data. Its ability to seamlessly integrate with existing libraries, support lazy evaluation, and provide parallel and distributed computing makes it a valuable asset for data scientists and engineers tackling large-scale data processing tasks. Whether you're working on a single machine with moderately sized datasets or dealing with big data challenges that require distributed computing, Dask offers a flexible and efficient solution. As we continue to navigate the era of big data, Dask proves to be a key player in unlocking the full potential of Python for scalable and parallelized data processing. Start harnessing the power of Dask today and supercharge your data processing workflows! + diff --git a/pages/blog/scicookie-collaborating-and-learning/header.jpeg b/pages/blog/scicookie-collaborating-and-learning/header.jpeg new file mode 100644 index 000000000..5f6e958af Binary files /dev/null and b/pages/blog/scicookie-collaborating-and-learning/header.jpeg differ diff --git a/pages/blog/scicookie-collaborating-and-learning/index.ipynb b/pages/blog/scicookie-collaborating-and-learning/index.ipynb new file mode 100644 index 000000000..ffaad51ed --- /dev/null +++ b/pages/blog/scicookie-collaborating-and-learning/index.ipynb @@ -0,0 +1,96 @@ +{ + "cells": [ + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "---\n", + "title: \"Collaborating and learning from SciCookie\"\n", + "slug: scicookie-collaborating-and-learning\n", + "date: 2024-02-03\n", + "authors: [\"Daniela Iglesias Rocabado\"]\n", + "tags: [open-source, open-science, python, proyects]\n", + "categories: [python]\n", + "description: |\n", + " The SciCookie template, developed by Open Science Labs, is a Python package based on the Cookieninja A Cookiecutter Fork\n", + " command-line utility. Serving as a versatile boilerplate, it simplifies project creation for both beginners and experienced\n", + " developers, saving significant time. Derived from ongoing research on scientific Python tools and best practices, SciCookie\n", + " aligns with PyOpenSci recommendations, providing a standardized starting point for projects that can be easily customized\n", + " while adhering to industry standards.\n", + "thumbnail: \"/header.jpeg\"\n", + "template: \"blog-post.html\"\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# SciCookie\n", + "\n", + "The SciCookie template, developed by Open Science Labs, is a project template tool package, that uses Cookieninja as a backend, a Cookiecutter fork. Functioning as a versatile boilerplate, it facilitates project creation for both beginners and experienced developers, streamlining the process and saving considerable time. SciCookie provides an initial project layout with recommended tools, workflows, and structure. Additionally, it incorporates features like automatic documentation generation, automated testing, and project-specific configuration to enhance the development workflow. The template is aligned with PyOpenSci recommendations, derived from ongoing research on tools, libraries, best practices, and workflows in scientific Python. As a result, SciCookie offers authors a standardized starting point for projects that can be easily adjusted to meet specific requirements while maintaining industry standards.\n", + "\n", + "\n", + "## Benefits of using SciCookie\n", + "\n", + "- **Organized Workflow:** Utilizing the SciCookie template allows for maintaining an organized workflow. By configuring elements such as project design, build system, command-line interface, and documentation engine, the development process is streamlined, ensuring a coherent and organized framework for the project.\n", + "- **Enhanced Project Tools:** SciCookie provides the flexibility to choose from various tools that can enhance the project. These tools automate tasks, ensure consistent code formatting, and identify errors and vulnerabilities.\n", + "- **DevOps Integration:** Another significant benefit is the seamless integration of the Python project with DevOps tools. These tools automate and optimize the development process, from code status to completion and maintenance." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## How to use SciCookie?\n", + "\n", + "### Quickstart\n", + "\n", + ">**Note:**\n", + "Navigate to the folder where you want to create your project.\n", + "\n", + "\n", + "```bash\n", + "$ pip install scicookie\n", + "```\n", + "\n", + "Once you have entered your folder, you need to generate a Python package project:\n", + "\n", + "```bash\n", + "$ scicookie\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## SciCookie profiles\n", + "\n", + "SciCookie enables the community to create different profiles within SciCookie's platform tailored to the standards and preferences of each group or working community. Currently, only the OSL profile is available, but it is open to the community to submit pull requests with specific profiles. Each profile offers different configuration options to choose required tools, define titles for specific messages, and also set titles for documentation and help URLs.\n", + "\n", + "```bash\n", + "$ scicookie --profile osl\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Demo Video\n", + "\n", + "For a better explanation, please watch a demonstrative video of the installation of SciCookie and the creation of a project using the OSL profile.\n", + "\n", + "\n" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/pages/blog/scicookie-collaborating-and-learning/index.md b/pages/blog/scicookie-collaborating-and-learning/index.md new file mode 100644 index 000000000..31d4d4565 --- /dev/null +++ b/pages/blog/scicookie-collaborating-and-learning/index.md @@ -0,0 +1,59 @@ +--- +title: "Collaborating and learning from SciCookie" +slug: scicookie-collaborating-and-learning +date: 2024-02-03 +authors: ["Daniela Iglesias Rocabado"] +tags: [open-source, open-science, python, proyects] +categories: [python] +description: | + The SciCookie template, developed by Open Science Labs, is a Python package based on the Cookieninja A Cookiecutter Fork + command-line utility. Serving as a versatile boilerplate, it simplifies project creation for both beginners and experienced + developers, saving significant time. Derived from ongoing research on scientific Python tools and best practices, SciCookie + aligns with PyOpenSci recommendations, providing a standardized starting point for projects that can be easily customized + while adhering to industry standards. +thumbnail: "/header.jpeg" +template: "blog-post.html" +--- +# SciCookie + +The SciCookie template, developed by Open Science Labs, is a project template tool package, that uses Cookieninja as a backend, a Cookiecutter fork. Functioning as a versatile boilerplate, it facilitates project creation for both beginners and experienced developers, streamlining the process and saving considerable time. SciCookie provides an initial project layout with recommended tools, workflows, and structure. Additionally, it incorporates features like automatic documentation generation, automated testing, and project-specific configuration to enhance the development workflow. The template is aligned with PyOpenSci recommendations, derived from ongoing research on tools, libraries, best practices, and workflows in scientific Python. As a result, SciCookie offers authors a standardized starting point for projects that can be easily adjusted to meet specific requirements while maintaining industry standards. + + +## Benefits of using SciCookie + +- **Organized Workflow:** Utilizing the SciCookie template allows for maintaining an organized workflow. By configuring elements such as project design, build system, command-line interface, and documentation engine, the development process is streamlined, ensuring a coherent and organized framework for the project. +- **Enhanced Project Tools:** SciCookie provides the flexibility to choose from various tools that can enhance the project. These tools automate tasks, ensure consistent code formatting, and identify errors and vulnerabilities. +- **DevOps Integration:** Another significant benefit is the seamless integration of the Python project with DevOps tools. These tools automate and optimize the development process, from code status to completion and maintenance. + +## How to use SciCookie? + +### Quickstart + +>**Note:** +Navigate to the folder where you want to create your project. + + +```bash +$ pip install scicookie +``` + +Once you have entered your folder, you need to generate a Python package project: + +```bash +$ scicookie +``` + +## SciCookie profiles + +SciCookie enables the community to create different profiles within SciCookie's platform tailored to the standards and preferences of each group or working community. Currently, only the OSL profile is available, but it is open to the community to submit pull requests with specific profiles. Each profile offers different configuration options to choose required tools, define titles for specific messages, and also set titles for documentation and help URLs. + +```bash +$ scicookie --profile osl +``` + +### Demo Video + +For a better explanation, please watch a demonstrative video of the installation of SciCookie and the creation of a project using the OSL profile. + + + diff --git a/pages/blog/scicookie-recibe-nueva-subvencion-de-psf-para-mejoras-crecimiento/header.svg b/pages/blog/scicookie-recibe-nueva-subvencion-de-psf-para-mejoras-crecimiento/header.svg new file mode 100644 index 000000000..e6f371b2a --- /dev/null +++ b/pages/blog/scicookie-recibe-nueva-subvencion-de-psf-para-mejoras-crecimiento/header.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pages/blog/scicookie-recibe-nueva-subvencion-de-psf-para-mejoras-crecimiento/index.md b/pages/blog/scicookie-recibe-nueva-subvencion-de-psf-para-mejoras-crecimiento/index.md new file mode 100644 index 000000000..bf2c2c179 --- /dev/null +++ b/pages/blog/scicookie-recibe-nueva-subvencion-de-psf-para-mejoras-crecimiento/index.md @@ -0,0 +1,50 @@ +--- +title: "SciCookie recibe nueva subvención de PSF para mejoras y crecimiento" +slug: scicookie-recibe-nueva-subvencion-de-psf-para-mejoras-crecimiento +date: 2024-03-01 +authors: ["Anavelyz Perez", "Yurely Camacho"] +tags: + [psf, osl, scicookie, subvención, grant, comunidad, colaboración, desarrollo] +categories: [código abierto, desarrollo de software, python] +description: | + ¡Nos complace anunciar que SciCookie ha recibido una nueva subvención + de la Python Software Foundation (PSF)! +thumbnail: "/header.svg" +template: "blog-post.html" +--- + + + + +¡Nos complace anunciar que SciCookie ha recibido una nueva subvención de la +Python Software Foundation (PSF)! + +En Enero de 2024 la PSF aprobó una nueva subvención para SciCookie, la propuesta +fue enviada a finales de diciembre de 2023, se estará ejecutando entre Febrero y +Abril de 2024, durante este tiempo estaremos realizando las siguientes tareas: + +- Mejorar la documentación de la herramienta: para que sea más clara, completa y +accesible para nuevos usuarios. +- Mejorar aspectos de configuración: para facilitar la instalación y uso de + SciCookie. +- Incorporar y/o actualizar bibliotecas y otras herramientas: para ampliar las + funcionalidades. +- Mejorar la estructura de los archivos: para que el código sea más organizado y +fácil de mantener. +- Aplicar a la revisión por pares de pyOpenSci: para obtener la certificación de +calidad de la herramienta. + + En general, las mejoras que se realizarán con esta nueva subvención permitirán +que SciCookie sea una herramienta aún más poderosa y útil para la comunidad +científica. Esperamos que esto contribuya a que más investigadores y científicos +puedan utilizar SciCookie para sus proyectos, lo que a su vez impulsará el +avance de la ciencia y el código abierto. Estamos muy entusiasmadas con esta +nueva etapa de SciCookie y esperamos poder compartir con ustedes los avances en +próximos posts. Agradecemos a la PSF por su apoyo y a toda la comunidad por su +colaboración. + +Si deseas, puedes echar un vistazo en el repositorio de SciCookie en GitHub +haciendo clic [>aquí<](https://github.com/osl-incubator/scicookie). + +Elementos gráficos de la portada fueron extraídos de +[Work illustrations by Storyset](https://storyset.com/work). diff --git a/pages/blog/streamlining-project-automation-with-makim/.makim.yaml b/pages/blog/streamlining-project-automation-with-makim/.makim.yaml new file mode 100644 index 000000000..eb8c73772 --- /dev/null +++ b/pages/blog/streamlining-project-automation-with-makim/.makim.yaml @@ -0,0 +1,12 @@ +version: 1.0 +working-directory: "/tmp" + +groups: + check-wd: + targets: + is-tmp: + help: Test if working directory is `tmp` + run: | + import os + print(os.getcwd()) + assert os.getcwd() == "/tmp" diff --git a/pages/blog/streamlining-project-automation-with-makim/header.png b/pages/blog/streamlining-project-automation-with-makim/header.png new file mode 100644 index 000000000..31f11b414 Binary files /dev/null and b/pages/blog/streamlining-project-automation-with-makim/header.png differ diff --git a/pages/blog/streamlining-project-automation-with-makim/index.ipynb b/pages/blog/streamlining-project-automation-with-makim/index.ipynb new file mode 100644 index 000000000..dbca96736 --- /dev/null +++ b/pages/blog/streamlining-project-automation-with-makim/index.ipynb @@ -0,0 +1,1016 @@ +{ + "cells": [ + { + "cell_type": "raw", + "id": "14c8a840-5020-486d-a007-f2d4769dfc69", + "metadata": {}, + "source": [ + "---\n", + "title: \"Streamlining Project Automation with Makim\"\n", + "slug: \"streamlining-project-automation-with-makim\"\n", + "date: 2024-03-18\n", + "authors: [\"Ivan Ogasawara\"]\n", + "tags: [\"makim\", \"automation\", \"devops\", \"open-source\"]\n", + "categories: [\"devops\", \"automation\", \"python\"]\n", + "description: |\n", + " In software development, where efficiency, consistency, and reliability are paramount,\n", + " automation tools play a crucial role. Makim, an innovative open-source tool, steps\n", + " into the spotlight to improve automation workflows. It simplifies script execution,\n", + " environment management, and task dependencies, positioning itself as a great asset in\n", + " modern development environments.\n", + " environment.\n", + "thumbnail: \"/header.png\"\n", + "template: \"blog-post.html\"\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "232d0e08-2248-40d7-a1f9-c52bff1b357a", + "metadata": {}, + "source": [ + "# Streamlining Project Automation with Makim\n", + "\n", + "In software development, where efficiency, consistency, and reliability are paramount, automation tools play a crucial role. Makim, an innovative open-source tool, steps into the spotlight to improve automation workflows. It simplifies script execution, environment management, and task dependencies, positioning itself as a great asset in modern development environments.\n", + "\n", + "## Introducing Makim\n", + "\n", + "`Makim` elevates project automation by offering a structured, yet flexible approach to manage routine tasks, complex task dependencies, and environment configurations. Its design is centered around the `.makim.yaml` configuration file, allowing developers to orchestrate their workflows with precision and ease. Unlike traditional script execution tools, Makim's Python-based architecture and support for multiple programming languages and shells enhance its versatility and applicability across diverse projects.\n", + "\n", + "Especially suited for DevOps Engineers and Software Developers, Makim eliminates redundancy in automation tasks. Its core functionality extends beyond simple script execution, encompassing:\n", + "\n", + "- Argument definition for scripts\n", + "- Organization of tasks into groups\n", + "- Advanced dependency management between tasks\n", + "- Utilization of environment variables and custom variables\n", + "- Dynamic content generation with Jinja2 templates\n", + "- Specification of working directories for tasks\n", + "- Execution flexibility through support for multiple interpreters or shells\n", + "\n", + "Despite its broad capabilities, Makim currently lacks support for Windows but plans to extend its compatibility in future versions.\n", + "\n", + "## Getting Started with Makim\n", + "\n", + "### Installation\n", + "\n", + "Makim can be installed via `pip` or `conda`, catering to different setup preferences:\n", + "\n", + "- To install `Makim` using `pip`, run:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "761586e2-98ef-4fc1-a73b-7d9d4e1c8e7e", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install -q \"makim==1.14.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "b0af5f25-4807-4637-9036-62fa6f894bef", + "metadata": {}, + "source": [ + "- For those who prefer `conda`, execute:\n", + "\n", + " ```\n", + " conda install \"makim=1.14.0\"\n", + " ```\n", + "\n", + "Given Makim's active development, pinning to a specific version is recommended to ensure consistency.\n", + "\n", + "For this tutorial, we will disable the output color feature provided by typer, the command-line interface engine used by **Makim**." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e6f6a633-79e3-4690-928b-4e74b725c83c", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "os.environ[\"NO_COLOR\"] = \"1\"" + ] + }, + { + "cell_type": "markdown", + "id": "4ff221f5-e18b-4b0b-bbb5-4cd8547bf35a", + "metadata": {}, + "source": [ + "### Configuring `.makim.yaml`\n", + "\n", + "The `.makim.yaml` file is the foundation of your Makim configuration. Here's how to start:\n", + "\n", + "1. **Create the `.makim.yaml` File**: Place this file at the root of your project directory.\n", + " \n", + "2. **Define Your Automation Tasks**: Configure your tasks, specifying actions, arguments, and dependencies. For example:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "dd79bbd0-73db-4d25-ae06-a143aef3b8e1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overwriting .makim.yaml\n" + ] + } + ], + "source": [ + "%%writefile .makim.yaml\n", + "version: 1.0.0\n", + "groups:\n", + " clean:\n", + " env-file: .env\n", + " targets:\n", + " tmp:\n", + " help: Use this target to clean up temporary files\n", + " run: |\n", + " echo \"Cleaning up...\"\n", + " tests:\n", + " targets:\n", + " unit:\n", + " help: Build the program\n", + " args:\n", + " clean:\n", + " type: bool\n", + " action: store_true\n", + " help: if not set, the clean dependency will not be triggered.\n", + " dependencies:\n", + " - target: clean.tmp\n", + " if: ${{ args.clean == true }}\n", + " run: |\n", + " echo \"Runnint unit tests...\"" + ] + }, + { + "cell_type": "markdown", + "id": "7bb49d00-0f25-4679-97ce-2bd2ecfa6e3c", + "metadata": {}, + "source": [ + "This setup demonstrates Makim's ability to manage tasks with conditional logic and dependencies.\n", + "\n", + "### Exploring Makim's CLI\n", + "\n", + "Makim's CLI provides insights into available commands, arguments, and configurations through the auto-generated help menu:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "5e17c7ab-a183-40d9-bc1a-96ff8be6a91b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m \u001b[0m\n", + "\u001b[1m \u001b[0m\u001b[1mUsage: \u001b[0m\u001b[1mmakim [OPTIONS] COMMAND [ARGS]...\u001b[0m\u001b[1m \u001b[0m\u001b[1m \u001b[0m\n", + "\u001b[1m \u001b[0m\n", + " Makim is a tool that helps you to organize and simplify your helper commands. \n", + " \n", + "\u001b[2m╭─\u001b[0m\u001b[2m Options \u001b[0m\u001b[2m───────────────────────────────────────────────────────────────────\u001b[0m\u001b[2m─╮\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1m-\u001b[0m\u001b[1m-version\u001b[0m \u001b[1m-v\u001b[0m \u001b[1m \u001b[0m Show the version and exit \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1m-\u001b[0m\u001b[1m-file\u001b[0m \u001b[1mTEXT\u001b[0m Makim config file \u001b[2m[default: .makim.yaml]\u001b[0m \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1m-\u001b[0m\u001b[1m-dry\u001b[0m\u001b[1m-run\u001b[0m \u001b[1m \u001b[0m Execute the command in dry mode \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1m-\u001b[0m\u001b[1m-verbose\u001b[0m \u001b[1m \u001b[0m Execute the command in verbose mode \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1m-\u001b[0m\u001b[1m-install\u001b[0m\u001b[1m-completion\u001b[0m \u001b[1m \u001b[0m Install completion for the current \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m shell. \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1m-\u001b[0m\u001b[1m-show\u001b[0m\u001b[1m-completion\u001b[0m \u001b[1m \u001b[0m Show completion for the current shell, \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m to copy it or customize the \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m installation. \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1m-\u001b[0m\u001b[1m-help\u001b[0m \u001b[1m \u001b[0m Show this message and exit. \u001b[2m│\u001b[0m\n", + "\u001b[2m╰──────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n", + "\u001b[2m╭─\u001b[0m\u001b[2m Commands \u001b[0m\u001b[2m──────────────────────────────────────────────────────────────────\u001b[0m\u001b[2m─╮\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1mclean.tmp \u001b[0m\u001b[1m \u001b[0m Use this target to clean up temporary files \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1mtests.unit \u001b[0m\u001b[1m \u001b[0m Build the program \u001b[2m│\u001b[0m\n", + "\u001b[2m╰──────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n", + " \n", + " If you have any problem, open an issue at: \n", + " https://github.com/osl-incubator/makim \n", + " \n", + "\n" + ] + } + ], + "source": [ + "!makim --help" + ] + }, + { + "cell_type": "markdown", + "id": "be6b96d3-79f8-48e2-8e9e-edeb38a4dc58", + "metadata": {}, + "source": [ + "This feature facilitates easy access to Makim's functionalities, enhancing usability and understanding of the tool.\n", + "\n", + "### Executing Your First Commands\n", + "\n", + "With your `.makim.yaml` file set up, you can begin to use `makim`:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "535b89a1-cb6c-48ce-b4d3-2a9296c97f2b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Makim file: .makim.yaml\n", + "Cleaning up...\n" + ] + } + ], + "source": [ + "!makim clean.tmp" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "6c997aeb-eed5-4801-8bfb-dad26bb72dcb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Makim file: .makim.yaml\n", + "Runnint unit tests...\n" + ] + } + ], + "source": [ + "!makim tests.unit" + ] + }, + { + "cell_type": "markdown", + "id": "48ed3970-3854-49cb-8109-53a38a72d8d4", + "metadata": {}, + "source": [ + "In the case you type your command wrong, **Makim** will suggest you some alternative:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "800ad2a4-0c45-4b1a-b4ef-927ab1230e60", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Usage: makim [OPTIONS] COMMAND [ARGS]...\n", + "\u001b[2mTry \u001b[0m\u001b[2m'makim \u001b[0m\u001b[1;2m-\u001b[0m\u001b[1;2m-help\u001b[0m\u001b[2m'\u001b[0m\u001b[2m for help.\u001b[0m\n", + "╭─ Error ──────────────────────────────────────────────────────────────────────╮\n", + "│ No such command 'tests.unittest'. │\n", + "╰──────────────────────────────────────────────────────────────────────────────╯\n", + "\u001b[31mCommand tests.unittest not found. Did you mean tests.unit'?\u001b[0m\n" + ] + } + ], + "source": [ + "!makim tests.unittest" + ] + }, + { + "cell_type": "markdown", + "id": "aae58d63-d028-47b1-a57e-fb21fc3f9216", + "metadata": {}, + "source": [ + "**Makim** CLI is empowered by **Typer**, and it allows us to have auto-completion for Makim groups and targets! If you want to install, you can run the following command:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "5839d8fb-0a4c-43bf-8b11-1a1ab36cc178", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[32mbash completion installed in /home/xmn/.bash_completions/makim.sh\u001b[0m\n", + "Completion will take effect once you restart the terminal\n" + ] + } + ], + "source": [ + "!makim --install-completion " + ] + }, + { + "cell_type": "markdown", + "id": "962a1698-31b4-4223-b08d-e065d5463bd9", + "metadata": {}, + "source": [ + "After this command you will need to restart the terminal in order to use this auto-completion feature." + ] + }, + { + "cell_type": "markdown", + "id": "2cc6ebb1-304b-4aab-b5f8-ca72289e1815", + "metadata": {}, + "source": [ + "## Advanced Features and Examples\n", + "\n", + "Makim's adaptability is showcased through various features and practical examples:\n", + "\n", + "- **Conditional Dependencies and Arguments**: Define complex task dependencies with conditional execution based on passed arguments.\n", + "- **Dynamic Configuration with Jinja2**: Leverage Jinja2 templates for advanced scripting and dynamic content generation.\n", + "- **Environment and Custom Variable Management**: Organize and utilize variables effectively across different scopes of your project.\n", + "- **Specifying Working Directories**: Control the execution context of your tasks by setting working directories.\n", + "\n", + "These examples underscore Makim's capability to accommodate intricate automation scenarios, streamlining development workflows.\n", + "\n", + "## Exploring Makim Through Examples\n", + "\n", + "### Utilizing Various Interpreters\n", + "\n", + "Makim extends its functionality beyond conventional script execution by supporting various interpreters and shell languages, facilitating a versatile development environment. While **xonsh** is the default interpreter - blending the capabilities of Bash and Python for an enriched command-line experience - Makim's architecture allows for seamless integration with other environments. For developers seeking to leverage this feature, a foundational understanding of **xonsh** can be beneficial. Comprehensive details and usage guidelines are available in the [official xonsh documentation](https://xon.sh/).\n", + "\n", + "This section demonstrates executing straightforward commands across multiple interpreters, showcasing Makim's adaptability to diverse programming contexts." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "0d942c28-d13a-4131-b5e4-113667a69c3e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overwriting .env\n" + ] + } + ], + "source": [ + "%%writefile .env\n", + "MSG_PREFIX=\"Running Makim: Hello, World,\"" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "f68e8008-f0f1-4ead-a42e-4e524fc03c22", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overwriting .makim.yaml\n" + ] + } + ], + "source": [ + "%%writefile .makim.yaml\n", + "version: 1.0\n", + "env-file: .env\n", + "groups:\n", + " tests:\n", + " targets:\n", + " node:\n", + " help: Test using nodejs\n", + " shell: node\n", + " run: console.log(\"${{ env.MSG_PREFIX }} from NodeJS!\");\n", + " perl:\n", + " help: Test using perl\n", + " shell: perl\n", + " run: print \"${{ env.MSG_PREFIX }} from Perl!\\n\";\n", + "\n", + " python:\n", + " help: Test using php\n", + " shell: python\n", + " run: print(\"${{ env.MSG_PREFIX }} from Python!\")\n", + "\n", + " r:\n", + " help: Test using R\n", + " shell: Rscript\n", + " run: print(\"${{ env.MSG_PREFIX }} from R!\")\n", + "\n", + " sh:\n", + " help: Test using sh\n", + " shell: sh\n", + " run: echo \"${{ env.MSG_PREFIX }} from sh!\"\n", + "\n", + " run-all:\n", + " help: Run tests for all the other targets\n", + " dependencies:\n", + " - target: node\n", + " - target: perl\n", + " - target: python\n", + " - target: r\n", + " - target: sh" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "ce809dd8-7db4-4c56-8622-ec3411bad4cf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m \u001b[0m\n", + "\u001b[1m \u001b[0m\u001b[1mUsage: \u001b[0m\u001b[1mmakim [OPTIONS] COMMAND [ARGS]...\u001b[0m\u001b[1m \u001b[0m\u001b[1m \u001b[0m\n", + "\u001b[1m \u001b[0m\n", + " Makim is a tool that helps you to organize and simplify your helper commands. \n", + " \n", + "\u001b[2m╭─\u001b[0m\u001b[2m Options \u001b[0m\u001b[2m───────────────────────────────────────────────────────────────────\u001b[0m\u001b[2m─╮\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1m-\u001b[0m\u001b[1m-version\u001b[0m \u001b[1m-v\u001b[0m \u001b[1m \u001b[0m Show the version and exit \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1m-\u001b[0m\u001b[1m-file\u001b[0m \u001b[1mTEXT\u001b[0m Makim config file \u001b[2m[default: .makim.yaml]\u001b[0m \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1m-\u001b[0m\u001b[1m-dry\u001b[0m\u001b[1m-run\u001b[0m \u001b[1m \u001b[0m Execute the command in dry mode \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1m-\u001b[0m\u001b[1m-verbose\u001b[0m \u001b[1m \u001b[0m Execute the command in verbose mode \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1m-\u001b[0m\u001b[1m-install\u001b[0m\u001b[1m-completion\u001b[0m \u001b[1m \u001b[0m Install completion for the current \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m shell. \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1m-\u001b[0m\u001b[1m-show\u001b[0m\u001b[1m-completion\u001b[0m \u001b[1m \u001b[0m Show completion for the current shell, \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m to copy it or customize the \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m installation. \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1m-\u001b[0m\u001b[1m-help\u001b[0m \u001b[1m \u001b[0m Show this message and exit. \u001b[2m│\u001b[0m\n", + "\u001b[2m╰──────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n", + "\u001b[2m╭─\u001b[0m\u001b[2m Commands \u001b[0m\u001b[2m──────────────────────────────────────────────────────────────────\u001b[0m\u001b[2m─╮\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1mtests.node \u001b[0m\u001b[1m \u001b[0m Test using nodejs \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1mtests.perl \u001b[0m\u001b[1m \u001b[0m Test using perl \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1mtests.python \u001b[0m\u001b[1m \u001b[0m Test using php \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1mtests.r \u001b[0m\u001b[1m \u001b[0m Test using R \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1mtests.run-all \u001b[0m\u001b[1m \u001b[0m Run tests for all the other targets \u001b[2m│\u001b[0m\n", + "\u001b[2m│\u001b[0m \u001b[1mtests.sh \u001b[0m\u001b[1m \u001b[0m Test using sh \u001b[2m│\u001b[0m\n", + "\u001b[2m╰──────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n", + " \n", + " If you have any problem, open an issue at: \n", + " https://github.com/osl-incubator/makim \n", + " \n", + "\n" + ] + } + ], + "source": [ + "!makim --help" + ] + }, + { + "cell_type": "markdown", + "id": "14ed7f09-9bea-490d-ad3d-629ea4ee971f", + "metadata": {}, + "source": [ + "Prior to executing these targets, it is necessary to install the required dependencies:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "defb03d3-404d-489b-9990-ed66552aa341", + "metadata": {}, + "outputs": [], + "source": [ + "!mamba install -q -y perl nodejs r-base sh " + ] + }, + { + "cell_type": "markdown", + "id": "402bf345-9a18-403f-be99-e428e7c78b97", + "metadata": {}, + "source": [ + "Proceed to execute all defined targets by invoking the run-all target, which encapsulates all other targets as its dependencies for a sequential execution process:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "8f4e23ef-0238-4393-9747-8f945de40f79", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Makim file: .makim.yaml\n", + "Running Makim: Hello, World, from NodeJS!\n", + "(node:1634785) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n", + "(Use `node --trace-warnings ...` to show where the warning was created)\n", + "Running Makim: Hello, World, from Perl!\n", + "Running Makim: Hello, World, from Python!\n", + "[1] \"Running Makim: Hello, World, from R!\"\n", + "Running Makim: Hello, World, from sh!\n" + ] + } + ], + "source": [ + "!makim tests.run-all" + ] + }, + { + "cell_type": "markdown", + "id": "d57e524f-9ddd-4e1e-9d90-e47154c0950d", + "metadata": {}, + "source": [ + "In scenarios where your chosen interpreter supports debugging - such as Python or Xonsh through the use of `breakpoint()` - you can introduce a breakpoint within your code. This enables the debugging of your **Makim** target, allowing for an interactive examination of the execution flow and variable states." + ] + }, + { + "cell_type": "markdown", + "id": "43d8808a-6b75-4e54-a193-4ba148de913a", + "metadata": {}, + "source": [ + "### Using Variables (vars)\n", + "\n", + "**Makim** facilitates the definition of variables within the `.makim.yaml` configuration, supporting all the **YAML** data types, including strings, lists, and dictionaries. This feature enhances script configurability and reusability across different tasks and environments.\n", + "\n", + "Consider reviewing the provided example to understand how to effectively leverage variables in your **Makim** configurations:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "ff7b4903-8caf-454b-828f-4ab6cf57d8fa", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overwriting .makim.yaml\n" + ] + } + ], + "source": [ + "%%writefile .makim.yaml\n", + "version: 1.0\n", + "\n", + "vars:\n", + " project-name: \"my-project\"\n", + " dependencies:\n", + " \"dep1\": \"v1\"\n", + " \"dep2\": \"v1.1\"\n", + " \"dep3\": \"v2.3\"\n", + " authorized-users:\n", + " - admin1\n", + " - admin2\n", + " - admin3\n", + "\n", + "groups:\n", + " staging:\n", + " vars:\n", + " env-name: \"staging\"\n", + " staging-dependencies:\n", + " \"dep4\": \"v4.3\"\n", + " \"dep5\": \"v1.1.1\"\n", + " staging-authorized-users:\n", + " - staging1\n", + " - staging2\n", + " - staging3\n", + " targets:\n", + " create-users:\n", + " help: Create users for staging, this example uses jinja2 for loop.\n", + " # each target can also specify their `vars`, but it will not be used in this example\n", + " run: |\n", + " def create_user(username):\n", + " print(f\">>> creating user: {username} ... DONE!\")\n", + " \n", + " print(\"create admin users:\")\n", + " {% for user in vars.authorized_users %}\n", + " create_user(\"${{ user }}\")\n", + " {% endfor %}\n", + "\n", + " print(\"\\ncreate staging users:\")\n", + " {% for user in vars.staging_authorized_users %}\n", + " create_user(\"${{ user }}\")\n", + " {% endfor %}\n", + "\n", + " install:\n", + " help: install deps for staging using native xonsh `for` loop (it could work with Python as well)\n", + " # each target can also specify their `vars`, but it will not be used in this example\n", + " run: |\n", + " def install(package, version):\n", + " print(f\">>> installing: {package}@{version} ... DONE!\")\n", + " \n", + " print(\"install global dependencies:\")\n", + " for package, version in ${{ vars.dependencies | safe }}.items():\n", + " install(package, version)\n", + "\n", + " print(\"\\ninstall staging dependencies:\")\n", + " for package, version in ${{ vars.staging_dependencies | safe }}.items():\n", + " install(package, version)" + ] + }, + { + "cell_type": "markdown", + "id": "2b67905e-2e5b-4d54-bee8-eadcfe12cd66", + "metadata": {}, + "source": [ + "Now, let's proceed to create users within the staging environment:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "89f4ea8e-b58e-4da3-9097-61deaf5e6c70", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Makim file: .makim.yaml\n", + "create admin users:\n", + ">>> creating user: admin1 ... DONE!\n", + ">>> creating user: admin2 ... DONE!\n", + ">>> creating user: admin3 ... DONE!\n", + "\n", + "create staging users:\n", + ">>> creating user: staging1 ... DONE!\n", + ">>> creating user: staging2 ... DONE!\n", + ">>> creating user: staging3 ... DONE!\n" + ] + } + ], + "source": [ + "!makim staging.create-users" + ] + }, + { + "cell_type": "markdown", + "id": "cd07e3af-4527-4530-952e-01848701e185", + "metadata": {}, + "source": [ + "Last but not least, let's run the install target:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "2eb7291c-610a-427c-a970-bb923b17678e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Makim file: .makim.yaml\n", + "install global dependencies:\n", + ">>> installing: dep1@v1 ... DONE!\n", + ">>> installing: dep2@v1.1 ... DONE!\n", + ">>> installing: dep3@v2.3 ... DONE!\n", + "\n", + "install staging dependencies:\n", + ">>> installing: dep4@v4.3 ... DONE!\n", + ">>> installing: dep5@v1.1.1 ... DONE!\n" + ] + } + ], + "source": [ + "!makim staging.install" + ] + }, + { + "cell_type": "markdown", + "id": "fcfc9258-a97d-4378-9cbb-e1be2678c801", + "metadata": {}, + "source": [ + "### Defining Arguments\n", + "\n", + "**Makim** enhances script flexibility by allowing the use of arguments. It enables not only the definition of arguments for tasks but also the passing of arguments to dependencies and the specification of conditions for those dependencies.\n", + "\n", + "Explore this functionality through this example:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "cb5c198b-4644-4e92-b1a4-cc66c55fc29d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overwriting .makim.yaml\n" + ] + } + ], + "source": [ + "%%writefile .makim.yaml\n", + "version: 1.0.0\n", + "groups:\n", + " print:\n", + " env-file: .env\n", + " targets:\n", + " name:\n", + " help: Print given name\n", + " args:\n", + " name:\n", + " type: str\n", + " required: true\n", + " run: print(\"${{ args.name }}\")\n", + " list:\n", + " help: Build the program\n", + " args:\n", + " i-am-sure:\n", + " type: bool\n", + " dependencies:\n", + " - target: print.name\n", + " if: ${{ args.i_am_sure == true }}\n", + " args:\n", + " name: Mary\n", + " - target: print.name\n", + " if: ${{ args.i_am_sure == true }}\n", + " args:\n", + " name: John\n", + " - target: print.name\n", + " if: ${{ args.i_am_sure == true }}\n", + " args:\n", + " name: Ellen\n", + " - target: print.name\n", + " if: ${{ args.i_am_sure == true }}\n", + " args:\n", + " name: Marc" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "551d69e9-d074-4b70-b868-f7e9fa6faba6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Makim file: .makim.yaml\n" + ] + } + ], + "source": [ + "!makim print.list" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "dfe7b8ba-f438-4f62-88fc-e99e11a15bee", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Makim file: .makim.yaml\n", + "Mary\n", + "John\n", + "Ellen\n", + "Marc\n" + ] + } + ], + "source": [ + "!makim print.list --i-am-sure" + ] + }, + { + "cell_type": "markdown", + "id": "5f7c72db-31d6-47f5-a8aa-932f3e5bf2a7", + "metadata": {}, + "source": [ + "### Utilizing Environment Variables\n", + "\n", + "The previous sections demonstrated the use of environment variables. Here, we'll delve into their application in more detail.\n", + "\n", + "**Makim** permits the incorporation of environment variables from `.env` files or directly within the `.makim.yaml` file, applicable at global, group, and target levels.\n", + "\n", + "Examine an example to understand the implementation:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "6e0c4c5a-ef21-43e0-ac18-40672850b93a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overwriting .env\n" + ] + } + ], + "source": [ + "%%writefile .env\n", + "ENV=dev" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "678192e5-7af3-4862-bc76-4beecf030bd2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overwriting .makim.yaml\n" + ] + } + ], + "source": [ + "%%writefile .makim.yaml\n", + "version: 1.0\n", + "env-file: .env\n", + "env:\n", + " GLOBAL_VAR: \"1\"\n", + "groups:\n", + " global-scope:\n", + " env:\n", + " GROUP_VAR: \"2\"\n", + " targets:\n", + " test-var-env-file:\n", + " help: Test env variable defined in the global scope from env-file\n", + " run: |\n", + " import os\n", + " assert str(os.getenv(\"ENV\")) == \"dev\"\n", + "\n", + " test-var-env:\n", + " help: Test env variable defined in the global scope in `env` section\n", + " env:\n", + " TARGET_VAR: \"3\"\n", + " run: |\n", + " import os\n", + " # you can get an environment variable directly with xonsh/python\n", + " assert str(os.getenv(\"GLOBAL_VAR\")) == \"1\"\n", + " # or you can get an environment variable using jinja2 tag\n", + " assert \"${{ env.GROUP_VAR }}\" == \"2\"\n", + " assert \"${{ env.get(\"TARGET_VAR\") }}\" == \"3\"\n", + " assert \"${{ env.get(\"UNKNOWN_TARGET_VAR\", \"4\") }}\" == \"4\"" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "6221cfec-19b5-450e-853e-737ce0ed024f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Makim file: .makim.yaml\n" + ] + } + ], + "source": [ + "!makim global-scope.test-var-env-file" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "548a68cf-b597-4eb9-8438-eb97729dcb46", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Makim file: .makim.yaml\n" + ] + } + ], + "source": [ + "!makim global-scope.test-var-env" + ] + }, + { + "cell_type": "markdown", + "id": "ce5e09d7-bf8b-4b0e-9127-48958ee79601", + "metadata": {}, + "source": [ + "### Specifying the Working Directory\n", + "\n", + "Makim provides the capability to set a specific working directory for tasks at any scope: global, group, or target.\n", + "\n", + "Review a straightforward example to learn how to apply this feature:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "65335daf-ac06-497c-a0f8-6dbb9f5a570b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overwriting .makim.yaml\n" + ] + } + ], + "source": [ + "%%writefile .makim.yaml\n", + "version: 1.0\n", + "working-directory: \"/tmp\"\n", + "\n", + "groups:\n", + " check-wd:\n", + " targets:\n", + " is-tmp:\n", + " help: Test if working directory is `tmp`\n", + " run: |\n", + " import os\n", + " print(os.getcwd())\n", + " assert os.getcwd() == \"/tmp\"" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "0938bcee-26fb-4028-82f6-bbed8453eba7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Makim file: .makim.yaml\n", + "/tmp\n" + ] + } + ], + "source": [ + "!makim check-wd.is-tmp" + ] + }, + { + "cell_type": "markdown", + "id": "ae987426-9ead-4375-bddf-b5ded48aeb1a", + "metadata": {}, + "source": [ + "This tutorial concludes with a showcase of Makim's key features. While this overview covers the essentials, diving deeper into **Makim** will reveal more advanced and intriguing ways to leverage its capabilities." + ] + }, + { + "cell_type": "markdown", + "id": "a5f5fb97-503f-4a3b-92a7-8ecef4d9687c", + "metadata": {}, + "source": [ + "## Contributing to Makim\n", + "\n", + "Makim's growth is propelled by its community. Contributions, whether through code, documentation, or feedback, are welcome. Explore the [GitHub repository](https://github.com/osl-incubator/makim) and consider contributing to foster Makim's development." + ] + }, + { + "cell_type": "markdown", + "id": "822a5ed4-6941-4761-9a7b-9910dd075849", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "Makim stands out as a transformative tool in project automation, bridging the gap between simplicity and complexity. Its comprehensive feature set, coupled with the flexibility of its configuration, makes Makim a quintessential tool for developers and DevOps engineers alike. As you incorporate Makim into your projects, its impact on enhancing productivity and consistency will become evident, marking it as an indispensable part of your development toolkit.\n", + "\n", + "Dive deeper into Makim's functionalities by visiting the [official documentation](https://github.com/osl-incubator/makim). Try it and let us know your thoughts about it!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pages/blog/streamlining-project-automation-with-makim/index.md b/pages/blog/streamlining-project-automation-with-makim/index.md new file mode 100644 index 000000000..03f6868fc --- /dev/null +++ b/pages/blog/streamlining-project-automation-with-makim/index.md @@ -0,0 +1,842 @@ +--- +title: "Streamlining Project Automation with Makim" +slug: "streamlining-project-automation-with-makim" +date: 2024-03-18 +authors: ["Ivan Ogasawara"] +tags: ["makim", "automation", "devops", "open-source"] +categories: ["devops", "automation", "python"] +description: | + In software development, where efficiency, consistency, and reliability are paramount, + automation tools play a crucial role. Makim, an innovative open-source tool, steps + into the spotlight to improve automation workflows. It simplifies script execution, + environment management, and task dependencies, positioning itself as a great asset in + modern development environments. + environment. +thumbnail: "/header.png" +template: "blog-post.html" +--- +# Streamlining Project Automation with Makim + +In software development, where efficiency, consistency, and reliability are paramount, automation tools play a crucial role. Makim, an innovative open-source tool, steps into the spotlight to improve automation workflows. It simplifies script execution, environment management, and task dependencies, positioning itself as a great asset in modern development environments. + +## Introducing Makim + +`Makim` elevates project automation by offering a structured, yet flexible approach to manage routine tasks, complex task dependencies, and environment configurations. Its design is centered around the `.makim.yaml` configuration file, allowing developers to orchestrate their workflows with precision and ease. Unlike traditional script execution tools, Makim's Python-based architecture and support for multiple programming languages and shells enhance its versatility and applicability across diverse projects. + +Especially suited for DevOps Engineers and Software Developers, Makim eliminates redundancy in automation tasks. Its core functionality extends beyond simple script execution, encompassing: + +- Argument definition for scripts +- Organization of tasks into groups +- Advanced dependency management between tasks +- Utilization of environment variables and custom variables +- Dynamic content generation with Jinja2 templates +- Specification of working directories for tasks +- Execution flexibility through support for multiple interpreters or shells + +Despite its broad capabilities, Makim currently lacks support for Windows but plans to extend its compatibility in future versions. + +## Getting Started with Makim + +### Installation + +Makim can be installed via `pip` or `conda`, catering to different setup preferences: + +- To install `Makim` using `pip`, run: + + +```python +!pip install -q "makim==1.14.0" +``` + +- For those who prefer `conda`, execute: + + ``` + conda install "makim=1.14.0" + ``` + +Given Makim's active development, pinning to a specific version is recommended to ensure consistency. + +For this tutorial, we will disable the output color feature provided by typer, the command-line interface engine used by **Makim**. + + +```python +import os + +os.environ["NO_COLOR"] = "1" +``` + +### Configuring `.makim.yaml` + +The `.makim.yaml` file is the foundation of your Makim configuration. Here's how to start: + +1. **Create the `.makim.yaml` File**: Place this file at the root of your project directory. + +2. **Define Your Automation Tasks**: Configure your tasks, specifying actions, arguments, and dependencies. For example: + + +```python +%%writefile .makim.yaml +version: 1.0.0 +groups: + clean: + env-file: .env + targets: + tmp: + help: Use this target to clean up temporary files + run: | + echo "Cleaning up..." + tests: + targets: + unit: + help: Build the program + args: + clean: + type: bool + action: store_true + help: if not set, the clean dependency will not be triggered. + dependencies: + - target: clean.tmp + if: ${{ args.clean == true }} + run: | + echo "Runnint unit tests..." +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Overwriting .makim.yaml
    +
    +
    +
    +
    + +This setup demonstrates Makim's ability to manage tasks with conditional logic and dependencies. + +### Exploring Makim's CLI + +Makim's CLI provides insights into available commands, arguments, and configurations through the auto-generated help menu: + + +```python +!makim --help +``` + +
    +

    + OUTPUT + +

    +
    +  
    +                                                                                
    + Usage: makim [OPTIONS] COMMAND [ARGS]...                                       
    +                                                                                
    +Makim is a tool that helps you to organize and simplify your helper commands.
    +
    +╭─ Options ────────────────────────────────────────────────────────────────────╮
    +│ --version             -v            Show the version and exit                │
    +│ --file                        TEXT  Makim config file [default: .makim.yaml] │
    +│ --dry-run                           Execute the command in dry mode          │
    +│ --verbose                           Execute the command in verbose mode      │
    +│ --install-completion                Install completion for the current       │
    +│                                     shell.                                   │
    +│ --show-completion                   Show completion for the current shell,   │
    +│                                     to copy it or customize the              │
    +│                                     installation.                            │
    +│ --help                              Show this message and exit.              │
    +╰──────────────────────────────────────────────────────────────────────────────╯
    +╭─ Commands ───────────────────────────────────────────────────────────────────╮
    +│ clean.tmp        Use this target to clean up temporary files                 │
    +│ tests.unit       Build the program                                           │
    +╰──────────────────────────────────────────────────────────────────────────────╯
    +
    +If you have any problem, open an issue at:
    +https://github.com/osl-incubator/makim
    +
    +
    +
    +
    +
    +
    + +This feature facilitates easy access to Makim's functionalities, enhancing usability and understanding of the tool. + +### Executing Your First Commands + +With your `.makim.yaml` file set up, you can begin to use `makim`: + + +```python +!makim clean.tmp +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Makim file: .makim.yaml
    +Cleaning up...
    +
    +
    +
    +
    + + +```python +!makim tests.unit +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Makim file: .makim.yaml
    +Runnint unit tests...
    +
    +
    +
    +
    + +In the case you type your command wrong, **Makim** will suggest you some alternative: + + +```python +!makim tests.unittest +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Usage: makim [OPTIONS] COMMAND [ARGS]...
    +Try 'makim --help' for help.
    +╭─ Error ──────────────────────────────────────────────────────────────────────╮
    +│ No such command 'tests.unittest'.                                            │
    +╰──────────────────────────────────────────────────────────────────────────────╯
    +Command tests.unittest not found. Did you mean tests.unit'?
    +
    +
    +
    +
    + +**Makim** CLI is empowered by **Typer**, and it allows us to have auto-completion for Makim groups and targets! If you want to install, you can run the following command: + + +```python +!makim --install-completion +``` + +
    +

    + OUTPUT + +

    +
    +  
    +bash completion installed in /home/xmn/.bash_completions/makim.sh
    +Completion will take effect once you restart the terminal
    +
    +
    +
    +
    + +After this command you will need to restart the terminal in order to use this auto-completion feature. + +## Advanced Features and Examples + +Makim's adaptability is showcased through various features and practical examples: + +- **Conditional Dependencies and Arguments**: Define complex task dependencies with conditional execution based on passed arguments. +- **Dynamic Configuration with Jinja2**: Leverage Jinja2 templates for advanced scripting and dynamic content generation. +- **Environment and Custom Variable Management**: Organize and utilize variables effectively across different scopes of your project. +- **Specifying Working Directories**: Control the execution context of your tasks by setting working directories. + +These examples underscore Makim's capability to accommodate intricate automation scenarios, streamlining development workflows. + +## Exploring Makim Through Examples + +### Utilizing Various Interpreters + +Makim extends its functionality beyond conventional script execution by supporting various interpreters and shell languages, facilitating a versatile development environment. While **xonsh** is the default interpreter - blending the capabilities of Bash and Python for an enriched command-line experience - Makim's architecture allows for seamless integration with other environments. For developers seeking to leverage this feature, a foundational understanding of **xonsh** can be beneficial. Comprehensive details and usage guidelines are available in the [official xonsh documentation](https://xon.sh/). + +This section demonstrates executing straightforward commands across multiple interpreters, showcasing Makim's adaptability to diverse programming contexts. + + +```python +%%writefile .env +MSG_PREFIX="Running Makim: Hello, World," +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Overwriting .env
    +
    +
    +
    +
    + + +```python +%%writefile .makim.yaml +version: 1.0 +env-file: .env +groups: + tests: + targets: + node: + help: Test using nodejs + shell: node + run: console.log("${{ env.MSG_PREFIX }} from NodeJS!"); + perl: + help: Test using perl + shell: perl + run: print "${{ env.MSG_PREFIX }} from Perl!\n"; + + python: + help: Test using php + shell: python + run: print("${{ env.MSG_PREFIX }} from Python!") + + r: + help: Test using R + shell: Rscript + run: print("${{ env.MSG_PREFIX }} from R!") + + sh: + help: Test using sh + shell: sh + run: echo "${{ env.MSG_PREFIX }} from sh!" + + run-all: + help: Run tests for all the other targets + dependencies: + - target: node + - target: perl + - target: python + - target: r + - target: sh +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Overwriting .makim.yaml
    +
    +
    +
    +
    + + +```python +!makim --help +``` + +
    +

    + OUTPUT + +

    +
    +  
    +                                                                                
    + Usage: makim [OPTIONS] COMMAND [ARGS]...                                       
    +                                                                                
    +Makim is a tool that helps you to organize and simplify your helper commands.
    +
    +╭─ Options ────────────────────────────────────────────────────────────────────╮
    +│ --version             -v            Show the version and exit                │
    +│ --file                        TEXT  Makim config file [default: .makim.yaml] │
    +│ --dry-run                           Execute the command in dry mode          │
    +│ --verbose                           Execute the command in verbose mode      │
    +│ --install-completion                Install completion for the current       │
    +│                                     shell.                                   │
    +│ --show-completion                   Show completion for the current shell,   │
    +│                                     to copy it or customize the              │
    +│                                     installation.                            │
    +│ --help                              Show this message and exit.              │
    +╰──────────────────────────────────────────────────────────────────────────────╯
    +╭─ Commands ───────────────────────────────────────────────────────────────────╮
    +│ tests.node             Test using nodejs                                     │
    +│ tests.perl             Test using perl                                       │
    +│ tests.python           Test using php                                        │
    +│ tests.r                Test using R                                          │
    +│ tests.run-all          Run tests for all the other targets                   │
    +│ tests.sh               Test using sh                                         │
    +╰──────────────────────────────────────────────────────────────────────────────╯
    +
    +If you have any problem, open an issue at:
    +https://github.com/osl-incubator/makim
    +
    +
    +
    +
    +
    +
    + +Prior to executing these targets, it is necessary to install the required dependencies: + + +```python +!mamba install -q -y perl nodejs r-base sh +``` + +Proceed to execute all defined targets by invoking the run-all target, which encapsulates all other targets as its dependencies for a sequential execution process: + + +```python +!makim tests.run-all +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Makim file: .makim.yaml
    +Running Makim: Hello, World, from NodeJS!
    +(node:1634785) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
    +(Use `node --trace-warnings ...` to show where the warning was created)
    +Running Makim: Hello, World, from Perl!
    +Running Makim: Hello, World, from Python!
    +[1] "Running Makim: Hello, World, from R!"
    +Running Makim: Hello, World, from sh!
    +
    +
    +
    +
    + +In scenarios where your chosen interpreter supports debugging - such as Python or Xonsh through the use of `breakpoint()` - you can introduce a breakpoint within your code. This enables the debugging of your **Makim** target, allowing for an interactive examination of the execution flow and variable states. + +### Using Variables (vars) + +**Makim** facilitates the definition of variables within the `.makim.yaml` configuration, supporting all the **YAML** data types, including strings, lists, and dictionaries. This feature enhances script configurability and reusability across different tasks and environments. + +Consider reviewing the provided example to understand how to effectively leverage variables in your **Makim** configurations: + + +```python +%%writefile .makim.yaml +version: 1.0 + +vars: + project-name: "my-project" + dependencies: + "dep1": "v1" + "dep2": "v1.1" + "dep3": "v2.3" + authorized-users: + - admin1 + - admin2 + - admin3 + +groups: + staging: + vars: + env-name: "staging" + staging-dependencies: + "dep4": "v4.3" + "dep5": "v1.1.1" + staging-authorized-users: + - staging1 + - staging2 + - staging3 + targets: + create-users: + help: Create users for staging, this example uses jinja2 for loop. + # each target can also specify their `vars`, but it will not be used in this example + run: | + def create_user(username): + print(f">>> creating user: {username} ... DONE!") + + print("create admin users:") + {% for user in vars.authorized_users %} + create_user("${{ user }}") + {% endfor %} + + print("\ncreate staging users:") + {% for user in vars.staging_authorized_users %} + create_user("${{ user }}") + {% endfor %} + + install: + help: install deps for staging using native xonsh `for` loop (it could work with Python as well) + # each target can also specify their `vars`, but it will not be used in this example + run: | + def install(package, version): + print(f">>> installing: {package}@{version} ... DONE!") + + print("install global dependencies:") + for package, version in ${{ vars.dependencies | safe }}.items(): + install(package, version) + + print("\ninstall staging dependencies:") + for package, version in ${{ vars.staging_dependencies | safe }}.items(): + install(package, version) +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Overwriting .makim.yaml
    +
    +
    +
    +
    + +Now, let's proceed to create users within the staging environment: + + +```python +!makim staging.create-users +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Makim file: .makim.yaml
    +create admin users:
    +>>> creating user: admin1 ... DONE!
    +>>> creating user: admin2 ... DONE!
    +>>> creating user: admin3 ... DONE!
    +
    +create staging users:
    +>>> creating user: staging1 ... DONE!
    +>>> creating user: staging2 ... DONE!
    +>>> creating user: staging3 ... DONE!
    +
    +
    +
    +
    + +Last but not least, let's run the install target: + + +```python +!makim staging.install +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Makim file: .makim.yaml
    +install global dependencies:
    +>>> installing: dep1@v1 ... DONE!
    +>>> installing: dep2@v1.1 ... DONE!
    +>>> installing: dep3@v2.3 ... DONE!
    +
    +install staging dependencies:
    +>>> installing: dep4@v4.3 ... DONE!
    +>>> installing: dep5@v1.1.1 ... DONE!
    +
    +
    +
    +
    + +### Defining Arguments + +**Makim** enhances script flexibility by allowing the use of arguments. It enables not only the definition of arguments for tasks but also the passing of arguments to dependencies and the specification of conditions for those dependencies. + +Explore this functionality through this example: + + +```python +%%writefile .makim.yaml +version: 1.0.0 +groups: + print: + env-file: .env + targets: + name: + help: Print given name + args: + name: + type: str + required: true + run: print("${{ args.name }}") + list: + help: Build the program + args: + i-am-sure: + type: bool + dependencies: + - target: print.name + if: ${{ args.i_am_sure == true }} + args: + name: Mary + - target: print.name + if: ${{ args.i_am_sure == true }} + args: + name: John + - target: print.name + if: ${{ args.i_am_sure == true }} + args: + name: Ellen + - target: print.name + if: ${{ args.i_am_sure == true }} + args: + name: Marc +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Overwriting .makim.yaml
    +
    +
    +
    +
    + + +```python +!makim print.list +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Makim file: .makim.yaml
    +
    +
    +
    +
    + + +```python +!makim print.list --i-am-sure +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Makim file: .makim.yaml
    +Mary
    +John
    +Ellen
    +Marc
    +
    +
    +
    +
    + +### Utilizing Environment Variables + +The previous sections demonstrated the use of environment variables. Here, we'll delve into their application in more detail. + +**Makim** permits the incorporation of environment variables from `.env` files or directly within the `.makim.yaml` file, applicable at global, group, and target levels. + +Examine an example to understand the implementation: + + +```python +%%writefile .env +ENV=dev +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Overwriting .env
    +
    +
    +
    +
    + + +```python +%%writefile .makim.yaml +version: 1.0 +env-file: .env +env: + GLOBAL_VAR: "1" +groups: + global-scope: + env: + GROUP_VAR: "2" + targets: + test-var-env-file: + help: Test env variable defined in the global scope from env-file + run: | + import os + assert str(os.getenv("ENV")) == "dev" + + test-var-env: + help: Test env variable defined in the global scope in `env` section + env: + TARGET_VAR: "3" + run: | + import os + # you can get an environment variable directly with xonsh/python + assert str(os.getenv("GLOBAL_VAR")) == "1" + # or you can get an environment variable using jinja2 tag + assert "${{ env.GROUP_VAR }}" == "2" + assert "${{ env.get("TARGET_VAR") }}" == "3" + assert "${{ env.get("UNKNOWN_TARGET_VAR", "4") }}" == "4" +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Overwriting .makim.yaml
    +
    +
    +
    +
    + + +```python +!makim global-scope.test-var-env-file +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Makim file: .makim.yaml
    +
    +
    +
    +
    + + +```python +!makim global-scope.test-var-env +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Makim file: .makim.yaml
    +
    +
    +
    +
    + +### Specifying the Working Directory + +Makim provides the capability to set a specific working directory for tasks at any scope: global, group, or target. + +Review a straightforward example to learn how to apply this feature: + + +```python +%%writefile .makim.yaml +version: 1.0 +working-directory: "/tmp" + +groups: + check-wd: + targets: + is-tmp: + help: Test if working directory is `tmp` + run: | + import os + print(os.getcwd()) + assert os.getcwd() == "/tmp" +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Overwriting .makim.yaml
    +
    +
    +
    +
    + + +```python +!makim check-wd.is-tmp +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Makim file: .makim.yaml
    +/tmp
    +
    +
    +
    +
    + +This tutorial concludes with a showcase of Makim's key features. While this overview covers the essentials, diving deeper into **Makim** will reveal more advanced and intriguing ways to leverage its capabilities. + +## Contributing to Makim + +Makim's growth is propelled by its community. Contributions, whether through code, documentation, or feedback, are welcome. Explore the [GitHub repository](https://github.com/osl-incubator/makim) and consider contributing to foster Makim's development. + +## Conclusion + +Makim stands out as a transformative tool in project automation, bridging the gap between simplicity and complexity. Its comprehensive feature set, coupled with the flexibility of its configuration, makes Makim a quintessential tool for developers and DevOps engineers alike. As you incorporate Makim into your projects, its impact on enhancing productivity and consistency will become evident, marking it as an indispensable part of your development toolkit. + +Dive deeper into Makim's functionalities by visiting the [official documentation](https://github.com/osl-incubator/makim). Try it and let us know your thoughts about it! diff --git a/pages/blog/three-years-with-google-summer-of-code-what-ive-learned/header.png b/pages/blog/three-years-with-google-summer-of-code-what-ive-learned/header.png new file mode 100644 index 000000000..326694750 Binary files /dev/null and b/pages/blog/three-years-with-google-summer-of-code-what-ive-learned/header.png differ diff --git a/pages/blog/three-years-with-google-summer-of-code-what-ive-learned/index.md b/pages/blog/three-years-with-google-summer-of-code-what-ive-learned/index.md new file mode 100644 index 000000000..040314330 --- /dev/null +++ b/pages/blog/three-years-with-google-summer-of-code-what-ive-learned/index.md @@ -0,0 +1,145 @@ +--- +title: "Three Years with Google Summer of Code: What I've Learned" +slug: three-years-with-google-summer-of-code-what-ive-learned +date: 2025-11-02 +authors: ["Ivan Ogasawara"] +tags: [open-source, gsoc, mentoring] +categories: [gsoc] +description: | + Three years in GSoC taught us one thing: mentoring matters more than code. + As a 2025 mentoring org (with AlphaOneLabs, Extralit, Makim, Sugar), our + playbook is simple—balance mentors, set explicit contribution rules, meet + regularly; and for contributors: communicate publicly and ship small, + tested PRs. +thumbnail: "/header.png" +template: "blog-post.html" +--- + +# Three Years with Google Summer of Code: What I've Learned + +Mentoring is at the heart of Open Science Labs (OSL). It's why we joined Google +Summer of Code (GSoC) in the first place. We started as a sub-organization under +the NumFOCUS umbrella for two years, and in 2025 we were accepted as a +**Mentoring Organization**. Huge thanks to **Anavelyz Pérez** for keeping us on +track. We’re pleased to have secured four contributor slots for 2025 with +**AlphaOneLabs**, **Extralit**, **Makim**, and **Sugar**. + +We're incredibly proud of the contributors and mentors who made GSoC 2025 a +success. We were also, honestly, a bit heartbroken—many strong applicants did +real work and still didn't get in. On a personal note, attending the **GSoC +Summit** was a highlight: I met inspiring people and learned a lot from their +experiences. + +Below are the lessons that stood out across these three years and practical +recommendations for organizers, mentors, and contributors. + +--- + +## The Big Lesson + +**GSoC isn't just about code—it's about mentoring.** Code is the artifact; +mentoring is the engine. The best summers happen when we design for learning, +clarity, and care. Everything else follows. + +--- + +## Recommendations for Organizers + +- **Confirm your slot count early.** The number of slots you _realistically_ + expect should shape how many projects you onboard and how you scope them. + +- **Balance mentors as well as projects.** When allocating slots, distribute + contributors across both projects _and_ mentors. Avoid situations where one + mentor has two contributors while another has none—burnout and uneven support + help no one. + +--- + +## Recommendations for Mentors + +- **Limit the number of projects per mentor.** The pre-selection phase is + intense. If you're stretched across multiple proposals, candidates won't get + the guidance they deserve. One well-mentored project beats three + under-mentored ones. + +- **Codify contribution rules up front.** Document expectations clearly and link + them everywhere: + + - Max PR size (e.g., “prefer ≤300 lines; split larger changes”). + - Stale PR policy (e.g., “no updates for 10 days → close or draft”). + - Code style, linting, and formatting rules. + - Clear stance on AI-generated code (allowed or not, and under what + conditions). + +- **Keep your CONTRIBUTING.md and PR template current.** Treat them as living + documents. If you change the rules mid-summer, call it out in a pinned + message. + +- **Equip contributors to grow.** Share starter issues, architecture diagrams, + walkthrough videos, and links to docs or talks. Provide “good first PR” + examples. + +- **Meet regularly.** Short weekly 1:1s or cohort calls work wonders. Use + agendas. End with explicit next steps. + +- **Nurture community, not competition.** Encourage contributors to help each + other, co-review PRs, and pair on debugging. A supportive, respectful culture + is non-negotiable. + +- **Have a Plan B for great applicants who aren't selected.** If you have + bandwidth, offer an internship track, micro-grants, or + “fellows-without-funding” with mentorship and recognition. It keeps momentum + and grows your contributor base. + +--- + +## Recommendations for Contributors + +- **Default to public communication.** Ask questions in the project's public + channels. It helps others learn and shows the team how you collaborate. + +- **If a mentor is unresponsive, switch projects.** They're likely overloaded; + repeated pings won't help. Find a project with responsive maintainers and + bandwidth for new contributors. + +- **Avoid giant PRs.** Huge changes are hard to review and often get stuck. Ship + small, focused PRs that follow the project's style and tests. + +- **Show you understand the project's culture.** Read the docs. Match coding + style. Follow the templates. Keep commits scoped and messages clear. + +- **Be careful with AI-generated code.** Don't paste blindly. Understand the + problem, explain your choices, remove unnecessary comments, and **never** + include emojis in code comments. + +- **Discuss big changes before you implement them.** Don't refactor core + components or alter architecture without buy-in. Open an issue, propose a + design, gather feedback. + +- **Ship tests and pass CI.** If you fix a bug or add a feature, include tests. + Make sure CI is green before asking for review. + +- **Submit up to three proposals to multiple orgs.** Each org has limited slots, + so contributing and applying across organizations can improve your chances—but + focus on quality! Note: only one proposal can be accepted per contributor. + ([developers.google.com][can_i_submit_more_than_one_proposal]) + +* **Write a crisp proposal.** Be clear, specific, and concise (≤10 pages). + Demonstrate understanding of the project and outline concrete steps, + milestones, and risks. Ask maintainers for early feedback so you have time to + refine. + +--- + +## Looking Ahead + +I'm excited to keep participating in GSoC in the coming years and to keep +welcoming new contributors into open-source communities. Thank you to the GSoC +team for running this program year after year—it raises the visibility of +projects, gives newcomers a safe place to learn from experts, and strengthens +the open-source ecosystem. For hundreds of students and first-time contributors, +GSoC isn't just a summer; it's a beginning. + +[can_i_submit_more_than_one_proposal]: + https://developers.google.com/open-source/gsoc/faq#can_i_submit_more_than_one_proposal + "Frequently Asked Questions | Google Summer of Code" diff --git a/pages/blog/typer-a-python-library-for-building-cli-applications/ecommerce.py b/pages/blog/typer-a-python-library-for-building-cli-applications/ecommerce.py new file mode 100644 index 000000000..639e04d9f --- /dev/null +++ b/pages/blog/typer-a-python-library-for-building-cli-applications/ecommerce.py @@ -0,0 +1,70 @@ +"""E-commerce module.""" + +import typer + +from typer import Context, Option + +app = typer.Typer(help="Operations for e-commerce.") +app_user = typer.Typer(help="Operations for user model.") +app_product = typer.Typer(help="Operations for product model.") + +app.add_typer(app_user, name="user") +app.add_typer(app_product, name="product") + + +@app.callback(invoke_without_command=True) +def main( + ctx: Context, + version: bool = Option( + None, + "--version", + "-v", + is_flag=True, + help="Show the version and exit.", + ), +) -> None: + """Process envers for specific flags, otherwise show the help menu.""" + if version: + __version__ = "0.1.0" + typer.echo(f"Version: {__version__}") + raise typer.Exit() + + if ctx.invoked_subcommand is None: + typer.echo(ctx.get_help()) + raise typer.Exit(0) + + +@app_user.command("create") +def user_create( + name: str = typer.Argument(..., help="Name of the user to create."), +) -> None: + """Create a new user with the given name.""" + print(f"Creating user: {name} - Done") + + +@app_user.command("update") +def user_update( + name: str = typer.Argument(..., help="Name of the user to update."), +) -> None: + """Update user data with the given name.""" + print(f"Updating user: {name} - Done") + + +@app_product.command("create") +def product_create( + name: str = typer.Argument(..., help="Name of the product to create."), +) -> None: + """Create a new product with the given name.""" + print(f"Creating product: {name} - Done") + + +@app_product.command("update") +def product_update( + name: str = typer.Argument(..., help="Name of the product to update."), +) -> None: + """Update a product with the given name.""" + print(f"Updating product: {name} - Done") + + +if __name__ == "__main__": + app() diff --git a/pages/blog/typer-a-python-library-for-building-cli-applications/greet.py b/pages/blog/typer-a-python-library-for-building-cli-applications/greet.py new file mode 100644 index 000000000..569d0beb4 --- /dev/null +++ b/pages/blog/typer-a-python-library-for-building-cli-applications/greet.py @@ -0,0 +1,19 @@ +"""Greeting module.""" + +import typer + +app = typer.Typer() + + +@app.command() +def greet( + name: str = typer.Option( + ..., "--name", help="The name of the person to greet." + ), +) -> None: + """Greets the user by name.""" + typer.echo(f"Hello {name}!") + + +if __name__ == "__main__": + app() diff --git a/pages/blog/typer-a-python-library-for-building-cli-applications/header.svg b/pages/blog/typer-a-python-library-for-building-cli-applications/header.svg new file mode 100644 index 000000000..815a4e77f --- /dev/null +++ b/pages/blog/typer-a-python-library-for-building-cli-applications/header.svg @@ -0,0 +1,88 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/pages/blog/typer-a-python-library-for-building-cli-applications/index.ipynb b/pages/blog/typer-a-python-library-for-building-cli-applications/index.ipynb new file mode 100644 index 000000000..1a17103ac --- /dev/null +++ b/pages/blog/typer-a-python-library-for-building-cli-applications/index.ipynb @@ -0,0 +1,487 @@ +{ + "cells": [ + { + "cell_type": "raw", + "id": "20d00ff3-2b98-43d3-87b3-2b8142356054", + "metadata": {}, + "source": [ + "---\n", + "title: \"Typer: A Python Library for Building CLI Applications\"\n", + "slug: typer-a-python-library-for-building-cli-applications\n", + "date: 2024-01-11\n", + "authors: [\"Ivan Ogasawara\"]\n", + "tags: [open-source, cli, python]\n", + "categories: [python]\n", + "description: |\n", + " Typer is an exciting library for Python developers, designed to make the creation of\n", + " command-line interface (CLI) applications not just easier, but also more enjoyable.\n", + " Built on top of the well-known Click library, Typer leverages Python 3.6+ features,\n", + " like type hints, to define CLI commands in a straightforward and intuitive way.\n", + "thumbnail: \"/header.svg\"\n", + "template: \"blog-post.html\"\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "24d656a5-38e6-4ed0-bf15-b8854b96b475", + "metadata": {}, + "source": [ + "# Typer: A Python Library for Building CLI Applications\n", + "\n", + "## What is Typer?\n", + "\n", + "Typer is an exciting library for Python developers, designed to make the creation of command-line interface (CLI) applications not just easier, but also more enjoyable. Built on top of the well-known Click library, Typer leverages Python 3.6+ features, like type hints, to define CLI commands in a straightforward and intuitive way.\n", + "\n", + "## Why Choose Typer?\n", + "\n", + "- **Simplicity**: With Typer, you can create powerful CLI applications using minimal code.\n", + "- **Type Hints**: Leverages Python's type hints for parameter declaration, reducing errors and improving code clarity.\n", + "- **Automatic Help**: Generates help text and error messages based on your code.\n", + "- **Subcommands**: Supports nested commands, allowing complex CLI applications.\n", + "\n", + "## Getting Started with Typer\n", + "\n", + "### Installation\n", + "\n", + "To begin using Typer, you first need to install it. You can easily do this using pip:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "df3d4252-6fc3-46c0-93a2-009b29a06950", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install typer -q" + ] + }, + { + "cell_type": "markdown", + "id": "29687fe2-1c91-4193-8090-948d8f0e7f01", + "metadata": {}, + "source": [ + "### Creating Your First Typer Application\n", + "\n", + "Let's start with a simple example. We'll create an application that greets a user.\n", + "\n", + "First, import Typer and create an instance of it:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1978b4e0-0fb0-4206-951b-30b59d3932c7", + "metadata": {}, + "outputs": [], + "source": [ + "import typer\n", + "\n", + "app = typer.Typer()" + ] + }, + { + "cell_type": "markdown", + "id": "6ca9ee46-01b3-45a1-a8d2-4cc6572469d0", + "metadata": {}, + "source": [ + "Now, define a function that will act as your command. Use type hints for function arguments:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ed5cbac1-0d88-423e-a89a-13269674f8e5", + "metadata": {}, + "outputs": [], + "source": [ + "@app.command()\n", + "def greet(\n", + " name: str = typer.Option(\n", + " \"--name\",\n", + " \"-n\",\n", + " help=\"The name of the person to greet.\"\n", + " )\n", + ") -> None:\n", + " \"\"\"Greets the user by name.\"\"\"\n", + " typer.echo(f\"Hello {name}!\")" + ] + }, + { + "cell_type": "markdown", + "id": "7d3e5fa5-89eb-452f-bff3-0db5c27a6e14", + "metadata": {}, + "source": [ + "To run this application, use the following code block at the end of your script:" + ] + }, + { + "cell_type": "markdown", + "id": "f3f1a6c8-f1e2-45aa-8bfc-de265508b1f2", + "metadata": {}, + "source": [ + "```python\n", + "if __name__ == \"__main__\":\n", + " app()\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "ade80555-11b1-41fe-9f52-05c025c905ec", + "metadata": {}, + "source": [ + "### Running the Application\n", + "\n", + "Save the script as `greet.py` and run it from the command line:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "e2dc5366-aacc-4fcf-a35c-37a44c07e4a1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overwriting greet.py\n" + ] + } + ], + "source": [ + "%%writefile greet.py\n", + "\n", + "import typer\n", + "\n", + "app = typer.Typer()\n", + "\n", + "@app.command()\n", + "def greet(\n", + " name: str = typer.Option(\n", + " ..., \n", + " \"--name\",\n", + " help=\"The name of the person to greet.\"\n", + " )\n", + ") -> None:\n", + " \"\"\"Greets the user by name.\"\"\"\n", + " typer.echo(f\"Hello {name}!\")\n", + "\n", + "if __name__ == \"__main__\":\n", + " app()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ffbab51f-316b-45ae-ae0f-89ae4f2fb091", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello Alice!\n" + ] + } + ], + "source": [ + "!python greet.py --name Alice" + ] + }, + { + "cell_type": "markdown", + "id": "888efccd-2376-4ae2-b5f7-9f9bb533a061", + "metadata": {}, + "source": [ + "### Help Documentation\n", + "\n", + "Typer automatically generates help documentation for your application. Try running:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "df751231-f505-4325-b866-d1aca5c8ea1e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Usage: greet.py [OPTIONS]\n", + "\n", + " Greets the user by name.\n", + "\n", + "Options:\n", + " --name TEXT The name of the person to greet. [required]\n", + " --install-completion [bash|zsh|fish|powershell|pwsh]\n", + " Install completion for the specified shell.\n", + " --show-completion [bash|zsh|fish|powershell|pwsh]\n", + " Show completion for the specified shell, to\n", + " copy it or customize the installation.\n", + " --help Show this message and exit.\n" + ] + } + ], + "source": [ + "!python greet.py --help" + ] + }, + { + "cell_type": "markdown", + "id": "32c3a083-7758-4ccf-a284-b3c746bcdfc9", + "metadata": {}, + "source": [ + "You'll get a detailed description of how to use the command, including available options.\n", + "\n", + "## Working with Subcommands\n", + "\n", + "Typer supports subcommands, allowing you to build more complex applications. In the following example, the script is structured around a main Typer application (app) and two sub-applications (app_user and app_product). This hierarchical structure is a hallmark of Typer, allowing for the organization of commands into distinct categories – in this case, user-related and product-related operations. Such an approach not only enhances the readability and maintainability of the code but also provides a more intuitive interface for the end users. They can easily navigate through the different functionalities of the application, whether it's creating or updating users, or handling product information." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "f65b9abc-3ec4-403f-baea-0fc900dde19d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overwriting ecommerce.py\n" + ] + } + ], + "source": [ + "%%writefile ecommerce.py\n", + "import typer\n", + "\n", + "from typer import Context, Option\n", + "\n", + "\n", + "app = typer.Typer(help=\"Operations for e-commerce.\")\n", + "app_user = typer.Typer(help=\"Operations for user model.\")\n", + "app_product = typer.Typer(help=\"Operations for product model.\")\n", + "\n", + "app.add_typer(app_user, name=\"user\")\n", + "app.add_typer(app_product, name=\"product\")\n", + "\n", + "@app.callback(invoke_without_command=True)\n", + "def main(\n", + " ctx: Context,\n", + " version: bool = Option(\n", + " None,\n", + " \"--version\",\n", + " \"-v\",\n", + " is_flag=True,\n", + " help=\"Show the version and exit.\",\n", + " ),\n", + ") -> None:\n", + " \"\"\"Process envers for specific flags, otherwise show the help menu.\"\"\"\n", + " if version:\n", + " __version__ = \"0.1.0\"\n", + " typer.echo(f\"Version: {__version__}\")\n", + " raise typer.Exit()\n", + "\n", + " if ctx.invoked_subcommand is None:\n", + " typer.echo(ctx.get_help())\n", + " raise typer.Exit(0)\n", + "\n", + "@app_user.command(\"create\")\n", + "def user_create(name: str = typer.Argument(..., help=\"Name of the user to create.\")) -> None:\n", + " \"\"\"Create a new user with the given name.\"\"\"\n", + " print(f\"Creating user: {name} - Done\")\n", + "\n", + "\n", + "@app_user.command(\"update\")\n", + "def user_update(name: str = typer.Argument(..., help=\"Name of the user to update.\")) -> None:\n", + " \"\"\"Update user data with the given name.\"\"\"\n", + " print(f\"Updating user: {name} - Done\")\n", + "\n", + "@app_product.command(\"create\")\n", + "def product_create(name: str = typer.Argument(..., help=\"Name of the product to create.\")) -> None:\n", + " \"\"\"Create a new product with the given name.\"\"\"\n", + " print(f\"Creating product: {name} - Done\")\n", + "\n", + "\n", + "@app_product.command(\"update\")\n", + "def product_update(name: str = typer.Argument(..., help=\"Name of the product to update.\")) -> None:\n", + " \"\"\"Update a product with the given name.\"\"\"\n", + " print(f\"Updating product: {name} - Done\")\n", + "\n", + "\n", + "if __name__ == \"__main__\":\n", + " app()" + ] + }, + { + "cell_type": "markdown", + "id": "5e4b18ac-db76-4428-a6e9-46d68aa4b80b", + "metadata": {}, + "source": [ + "A key feature demonstrated in the script is the use of the callback function with the invoke_without_command=True parameter. This setup enables the execution of specific code (like displaying the version or help text) before any subcommands are processed. It's a powerful tool for handling pre-command logic or global options that apply to the entire CLI application.\n", + "\n", + "Moreover, the script showcases the simplicity and elegance of defining commands in Typer. Each operation, such as creating or updating users and products, is defined as a function, with parameters automatically translated into command-line options or arguments. This approach not only makes the code more readable but also leverages Python's type hints to ensure that the command-line arguments are correctly interpreted, providing a seamless and error-free user experience." + ] + }, + { + "cell_type": "markdown", + "id": "d5a36362-e9dd-4653-a72b-41e54ee88717", + "metadata": {}, + "source": [ + "In the following lines, there are some examples of the CLI call with different parameters." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "5edf02bf-631b-482c-8e58-f272ce837669", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Usage: ecommerce.py [OPTIONS] COMMAND [ARGS]...\n", + "\n", + " Operations for e-commerce.\n", + "\n", + "Options:\n", + " -v, --version Show the version and exit.\n", + " --install-completion [bash|zsh|fish|powershell|pwsh]\n", + " Install completion for the specified shell.\n", + " --show-completion [bash|zsh|fish|powershell|pwsh]\n", + " Show completion for the specified shell, to\n", + " copy it or customize the installation.\n", + " --help Show this message and exit.\n", + "\n", + "Commands:\n", + " product Operations for product model.\n", + " user Operations for user model.\n" + ] + } + ], + "source": [ + "!python ecommerce.py --help" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "39f172a1-7a30-4c66-a1db-771711efa3ca", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Version: 0.1.0\n" + ] + } + ], + "source": [ + "!python ecommerce.py --version" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "70d3db3d-1333-4a97-8b3b-8a2afc0e186d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Usage: ecommerce.py user [OPTIONS] COMMAND [ARGS]...\n", + "\n", + " Operations for user model.\n", + "\n", + "Options:\n", + " --help Show this message and exit.\n", + "\n", + "Commands:\n", + " create Create a new user with the given name.\n", + " update Update user data with the given name.\n" + ] + } + ], + "source": [ + "!python ecommerce.py user --help" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "707cebd3-bc21-4b52-885e-b72e0923e391", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Usage: ecommerce.py user create [OPTIONS] NAME\n", + "\n", + " Create a new user with the given name.\n", + "\n", + "Arguments:\n", + " NAME Name of the user to create. [required]\n", + "\n", + "Options:\n", + " --help Show this message and exit.\n" + ] + } + ], + "source": [ + "!python ecommerce.py user create --help" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4a6ff744-17fb-44eb-a80c-86f97b4f960a", + "metadata": {}, + "outputs": [], + "source": [ + "!python ecommerce.py product --help" + ] + }, + { + "cell_type": "markdown", + "id": "c636a291-3240-4b45-bcd2-93e25b442fe0", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "Typer is a powerful yet straightforward tool for building CLI applications in Python. By leveraging Python's type hints, it offers an intuitive way to define commands and parameters, automatically handles help documentation, and supports complex command structures with subcommands. Whether you're a beginner or an experienced Python developer, Typer can significantly enhance your productivity in CLI development.\n", + "\n", + "Happy coding with Typer! 🐍✨" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pages/blog/typer-a-python-library-for-building-cli-applications/index.md b/pages/blog/typer-a-python-library-for-building-cli-applications/index.md new file mode 100644 index 000000000..1989e7e00 --- /dev/null +++ b/pages/blog/typer-a-python-library-for-building-cli-applications/index.md @@ -0,0 +1,368 @@ +--- +title: "Typer: A Python Library for Building CLI Applications" +slug: typer-a-python-library-for-building-cli-applications +date: 2024-01-11 +authors: ["Ivan Ogasawara"] +tags: [open-source, cli, python] +categories: [python] +description: | + Typer is an exciting library for Python developers, designed to make the creation of + command-line interface (CLI) applications not just easier, but also more enjoyable. + Built on top of the well-known Click library, Typer leverages Python 3.6+ features, + like type hints, to define CLI commands in a straightforward and intuitive way. +thumbnail: "/header.svg" +template: "blog-post.html" +--- +# Typer: A Python Library for Building CLI Applications + +## What is Typer? + +Typer is an exciting library for Python developers, designed to make the creation of command-line interface (CLI) applications not just easier, but also more enjoyable. Built on top of the well-known Click library, Typer leverages Python 3.6+ features, like type hints, to define CLI commands in a straightforward and intuitive way. + +## Why Choose Typer? + +- **Simplicity**: With Typer, you can create powerful CLI applications using minimal code. +- **Type Hints**: Leverages Python's type hints for parameter declaration, reducing errors and improving code clarity. +- **Automatic Help**: Generates help text and error messages based on your code. +- **Subcommands**: Supports nested commands, allowing complex CLI applications. + +## Getting Started with Typer + +### Installation + +To begin using Typer, you first need to install it. You can easily do this using pip: + + +```python +!pip install typer -q +``` + +### Creating Your First Typer Application + +Let's start with a simple example. We'll create an application that greets a user. + +First, import Typer and create an instance of it: + + +```python +import typer + +app = typer.Typer() +``` + +Now, define a function that will act as your command. Use type hints for function arguments: + + +```python +@app.command() +def greet( + name: str = typer.Option( + "--name", + "-n", + help="The name of the person to greet." + ) +) -> None: + """Greets the user by name.""" + typer.echo(f"Hello {name}!") +``` + +To run this application, use the following code block at the end of your script: + +```python +if __name__ == "__main__": + app() +``` + +### Running the Application + +Save the script as `greet.py` and run it from the command line: + + +```python +%%writefile greet.py + +import typer + +app = typer.Typer() + +@app.command() +def greet( + name: str = typer.Option( + ..., + "--name", + help="The name of the person to greet." + ) +) -> None: + """Greets the user by name.""" + typer.echo(f"Hello {name}!") + +if __name__ == "__main__": + app() +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Overwriting greet.py
    +
    +
    +
    +
    + + +```python +!python greet.py --name Alice +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Hello Alice!
    +
    +
    +
    +
    + +### Help Documentation + +Typer automatically generates help documentation for your application. Try running: + + +```python +!python greet.py --help +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Usage: greet.py [OPTIONS]
    +
    +Greets the user by name.
    +
    +Options:
    +--name TEXT                     The name of the person to greet.  [required]
    +--install-completion [bash|zsh|fish|powershell|pwsh]
    +Install completion for the specified shell.
    +--show-completion [bash|zsh|fish|powershell|pwsh]
    +Show completion for the specified shell, to
    +copy it or customize the installation.
    +--help                          Show this message and exit.
    +
    +
    +
    +
    + +You'll get a detailed description of how to use the command, including available options. + +## Working with Subcommands + +Typer supports subcommands, allowing you to build more complex applications. In the following example, the script is structured around a main Typer application (app) and two sub-applications (app_user and app_product). This hierarchical structure is a hallmark of Typer, allowing for the organization of commands into distinct categories – in this case, user-related and product-related operations. Such an approach not only enhances the readability and maintainability of the code but also provides a more intuitive interface for the end users. They can easily navigate through the different functionalities of the application, whether it's creating or updating users, or handling product information. + + +```python +%%writefile ecommerce.py +import typer + +from typer import Context, Option + + +app = typer.Typer(help="Operations for e-commerce.") +app_user = typer.Typer(help="Operations for user model.") +app_product = typer.Typer(help="Operations for product model.") + +app.add_typer(app_user, name="user") +app.add_typer(app_product, name="product") + +@app.callback(invoke_without_command=True) +def main( + ctx: Context, + version: bool = Option( + None, + "--version", + "-v", + is_flag=True, + help="Show the version and exit.", + ), +) -> None: + """Process envers for specific flags, otherwise show the help menu.""" + if version: + __version__ = "0.1.0" + typer.echo(f"Version: {__version__}") + raise typer.Exit() + + if ctx.invoked_subcommand is None: + typer.echo(ctx.get_help()) + raise typer.Exit(0) + +@app_user.command("create") +def user_create(name: str = typer.Argument(..., help="Name of the user to create.")) -> None: + """Create a new user with the given name.""" + print(f"Creating user: {name} - Done") + + +@app_user.command("update") +def user_update(name: str = typer.Argument(..., help="Name of the user to update.")) -> None: + """Update user data with the given name.""" + print(f"Updating user: {name} - Done") + +@app_product.command("create") +def product_create(name: str = typer.Argument(..., help="Name of the product to create.")) -> None: + """Create a new product with the given name.""" + print(f"Creating product: {name} - Done") + + +@app_product.command("update") +def product_update(name: str = typer.Argument(..., help="Name of the product to update.")) -> None: + """Update a product with the given name.""" + print(f"Updating product: {name} - Done") + + +if __name__ == "__main__": + app() +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Overwriting ecommerce.py
    +
    +
    +
    +
    + +A key feature demonstrated in the script is the use of the callback function with the invoke_without_command=True parameter. This setup enables the execution of specific code (like displaying the version or help text) before any subcommands are processed. It's a powerful tool for handling pre-command logic or global options that apply to the entire CLI application. + +Moreover, the script showcases the simplicity and elegance of defining commands in Typer. Each operation, such as creating or updating users and products, is defined as a function, with parameters automatically translated into command-line options or arguments. This approach not only makes the code more readable but also leverages Python's type hints to ensure that the command-line arguments are correctly interpreted, providing a seamless and error-free user experience. + +In the following lines, there are some examples of the CLI call with different parameters. + + +```python +!python ecommerce.py --help +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Usage: ecommerce.py [OPTIONS] COMMAND [ARGS]...
    +
    +Operations for e-commerce.
    +
    +Options:
    +-v, --version                   Show the version and exit.
    +--install-completion [bash|zsh|fish|powershell|pwsh]
    +Install completion for the specified shell.
    +--show-completion [bash|zsh|fish|powershell|pwsh]
    +Show completion for the specified shell, to
    +copy it or customize the installation.
    +--help                          Show this message and exit.
    +
    +Commands:
    +product  Operations for product model.
    +user     Operations for user model.
    +
    +
    +
    +
    + + +```python +!python ecommerce.py --version +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Version: 0.1.0
    +
    +
    +
    +
    + + +```python +!python ecommerce.py user --help +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Usage: ecommerce.py user [OPTIONS] COMMAND [ARGS]...
    +
    +Operations for user model.
    +
    +Options:
    +--help  Show this message and exit.
    +
    +Commands:
    +create  Create a new user with the given name.
    +update  Update user data with the given name.
    +
    +
    +
    +
    + + +```python +!python ecommerce.py user create --help +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Usage: ecommerce.py user create [OPTIONS] NAME
    +
    +Create a new user with the given name.
    +
    +Arguments:
    +NAME  Name of the user to create.  [required]
    +
    +Options:
    +--help  Show this message and exit.
    +
    +
    +
    +
    + + +```python +!python ecommerce.py product --help +``` + +## Conclusion + +Typer is a powerful yet straightforward tool for building CLI applications in Python. By leveraging Python's type hints, it offers an intuitive way to define commands and parameters, automatically handles help documentation, and supports complex command structures with subcommands. Whether you're a beginner or an experienced Python developer, Typer can significantly enhance your productivity in CLI development. + +Happy coding with Typer! 🐍✨ diff --git a/pages/blog/unlocking-the-power-of-multiple-dispatch-in-python-with-plum-dispatch/header.png b/pages/blog/unlocking-the-power-of-multiple-dispatch-in-python-with-plum-dispatch/header.png new file mode 100644 index 000000000..bbcca2fd1 Binary files /dev/null and b/pages/blog/unlocking-the-power-of-multiple-dispatch-in-python-with-plum-dispatch/header.png differ diff --git a/pages/blog/unlocking-the-power-of-multiple-dispatch-in-python-with-plum-dispatch/index.ipynb b/pages/blog/unlocking-the-power-of-multiple-dispatch-in-python-with-plum-dispatch/index.ipynb new file mode 100644 index 000000000..b201f1fd0 --- /dev/null +++ b/pages/blog/unlocking-the-power-of-multiple-dispatch-in-python-with-plum-dispatch/index.ipynb @@ -0,0 +1,216 @@ +{ + "cells": [ + { + "cell_type": "raw", + "id": "f170f83a-7776-4ed8-b295-4eb57b5d0219", + "metadata": {}, + "source": [ + "---\n", + "title: \"Unlocking the Power of Multiple Dispatch in Python with Plum-Dispatch\"\n", + "slug: unlocking-the-power-of-multiple-dispatch-in-python-with-plum-dispatch\n", + "date: 2024-01-05\n", + "authors: [\"Ivan Ogasawara\"]\n", + "tags: [open-source, multiple-dispatch, python]\n", + "categories: [python]\n", + "description: |\n", + " Python, known for its simplicity and readability, sometimes requires a bit of\n", + " creativity when it comes to implementing certain programming paradigms. One such\n", + " paradigm is multiple dispatch (or multimethods), which allows functions to behave\n", + " differently based on the type of their arguments. This is where plum-dispatch\n", + " comes into play.\n", + "thumbnail: \"/header.png\"\n", + "template: \"blog-post.html\"\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "46aadcef-e7c2-480a-bf3a-bbe20d09cc3b", + "metadata": {}, + "source": [ + "Python, known for its simplicity and readability, sometimes requires a bit of creativity when it comes to implementing certain programming paradigms. One such paradigm is multiple dispatch (or multimethods), which allows functions to behave differently based on the type of their arguments. While not natively supported in Python, this feature can be incredibly powerful, particularly in complex applications such as mathematical computations, data processing, or when working with abstract syntax trees (ASTs). This is where `plum-dispatch` comes into play.\n", + "\n", + "## What is Multiple Dispatch?\n", + "\n", + "Multiple dispatch is a feature where the function to be executed is determined by the types of multiple arguments. This is different from single dispatch (which Python supports natively via the `functools.singledispatch` decorator), where the function called depends only on the type of the first argument.\n", + "\n", + "## Introducing Plum-Dispatch\n", + "\n", + "`plum-dispatch` is a Python library that provides an efficient and easy-to-use implementation of multiple dispatch. It allows you to define multiple versions of a function, each tailored to different types of input arguments.\n", + "\n", + "### Installation\n", + "\n", + "First things first, let's install `plum-dispatch`:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "5d233782-8974-4758-aac8-0a6cfe757376", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install plum-dispatch -q" + ] + }, + { + "cell_type": "markdown", + "id": "84a8444d-6f2b-442e-8ab8-44f92c645c01", + "metadata": {}, + "source": [ + "### Basic Usage\n", + "\n", + "To demonstrate the basic usage of `plum-dispatch`, let's start with a simple example. Suppose we have a function that needs to behave differently when passed an integer versus when it's passed a string." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8a1320a3-4531-4d60-80af-4c8ae6301ad4", + "metadata": {}, + "outputs": [], + "source": [ + "from plum import dispatch\n", + "\n", + "\n", + "class Processor:\n", + " @dispatch\n", + " def process(self, data: int):\n", + " return f\"Processing integer: {data}\"\n", + "\n", + " @dispatch\n", + " def process(self, data: str):\n", + " return f\"Processing string: {data}\"" + ] + }, + { + "cell_type": "markdown", + "id": "b396547c-3601-4d32-b6b3-25eba3c13be0", + "metadata": {}, + "source": [ + "In this example, `Processor` has two `process` methods, one for integers and one for strings. `plum-dispatch` takes care of determining which method to call based on the type of `data`." + ] + }, + { + "cell_type": "markdown", + "id": "6f2f654d-c142-408b-981c-ea0f4875a36d", + "metadata": {}, + "source": [ + "### Advanced Example: Working with ASTs\n", + "\n", + "`plum-dispatch` shines in more complex scenarios, such as when working with different types of nodes in an abstract syntax tree. Let's create a simple AST representation with different node types and a visitor class to process these nodes." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "4314c83a-8c69-41e7-be27-7738cd1003a9", + "metadata": {}, + "outputs": [], + "source": [ + "class StringNode:\n", + " def __init__(self, value):\n", + " self.value = value\n", + "\n", + "class NumberNode:\n", + " def __init__(self, value):\n", + " self.value = value\n", + "\n", + "class BaseASTVisitor:\n", + " @dispatch\n", + " def visit(self, node: StringNode):\n", + " raise Exception(\"Not implemented yet.\")\n", + "\n", + " @dispatch\n", + " def visit(self, node: NumberNode):\n", + " raise Exception(\"Not implemented yet.\")\n", + "\n", + "class ASTVisitor(BaseASTVisitor):\n", + " @dispatch\n", + " def visit(self, node: StringNode):\n", + " return f\"Visited StringNode with value: {node.value}\"\n", + "\n", + " @dispatch\n", + " def visit(self, node: NumberNode):\n", + " return f\"Visited NumberNode with value: {node.value}\"" + ] + }, + { + "cell_type": "markdown", + "id": "d04e9401-e2a3-415a-9b85-0d1e0bf459e6", + "metadata": {}, + "source": [ + "With `plum-dispatch`, our `ASTVisitor` can have a single `visit` method that behaves differently depending on whether it's visiting a `StringNode` or a `NumberNode`." + ] + }, + { + "cell_type": "markdown", + "id": "312c3a2f-27b4-4abc-ab0d-ab6cd531066d", + "metadata": {}, + "source": [ + "### Putting It All Together\n", + "Now, let's see `plum-dispatch` in action:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "a321b28b-25ab-47a7-bd28-bbed52107952", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Processing integer: 123\n", + "Processing string: abc\n", + "Visited StringNode with value: Hello\n", + "Visited NumberNode with value: 456\n" + ] + } + ], + "source": [ + "processor = Processor()\n", + "print(processor.process(123)) # \"Processing integer: 123\"\n", + "print(processor.process(\"abc\")) # \"Processing string: abc\"\n", + "\n", + "visitor = ASTVisitor()\n", + "print(visitor.visit(StringNode(\"Hello\"))) # \"Visited StringNode with value: Hello\"\n", + "print(visitor.visit(NumberNode(456))) # \"Visited NumberNode with value: 456\"" + ] + }, + { + "cell_type": "markdown", + "id": "1045a8fa-87ca-44fa-86ea-425429377ee1", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "`plum-dispatch` offers a neat and powerful way to implement multiple dispatch in Python, making your code more modular, readable, and elegant. Whether you're dealing with simple data types or complex structures like ASTs, `plum-dispatch` can help you write more efficient and maintainable code.\n", + "\n", + "For more complex examples and advanced usage, check out the [plum-dispatch documentation](https://github.com/wesselb/plum)." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pages/blog/unlocking-the-power-of-multiple-dispatch-in-python-with-plum-dispatch/index.md b/pages/blog/unlocking-the-power-of-multiple-dispatch-in-python-with-plum-dispatch/index.md new file mode 100644 index 000000000..609ce5fb9 --- /dev/null +++ b/pages/blog/unlocking-the-power-of-multiple-dispatch-in-python-with-plum-dispatch/index.md @@ -0,0 +1,126 @@ +--- +title: "Unlocking the Power of Multiple Dispatch in Python with Plum-Dispatch" +slug: unlocking-the-power-of-multiple-dispatch-in-python-with-plum-dispatch +date: 2024-01-05 +authors: ["Ivan Ogasawara"] +tags: [open-source, multiple-dispatch, python] +categories: [python] +description: | + Python, known for its simplicity and readability, sometimes requires a bit of + creativity when it comes to implementing certain programming paradigms. One such + paradigm is multiple dispatch (or multimethods), which allows functions to behave + differently based on the type of their arguments. This is where plum-dispatch + comes into play. +thumbnail: "/header.png" +template: "blog-post.html" +--- +Python, known for its simplicity and readability, sometimes requires a bit of creativity when it comes to implementing certain programming paradigms. One such paradigm is multiple dispatch (or multimethods), which allows functions to behave differently based on the type of their arguments. While not natively supported in Python, this feature can be incredibly powerful, particularly in complex applications such as mathematical computations, data processing, or when working with abstract syntax trees (ASTs). This is where `plum-dispatch` comes into play. + +## What is Multiple Dispatch? + +Multiple dispatch is a feature where the function to be executed is determined by the types of multiple arguments. This is different from single dispatch (which Python supports natively via the `functools.singledispatch` decorator), where the function called depends only on the type of the first argument. + +## Introducing Plum-Dispatch + +`plum-dispatch` is a Python library that provides an efficient and easy-to-use implementation of multiple dispatch. It allows you to define multiple versions of a function, each tailored to different types of input arguments. + +### Installation + +First things first, let's install `plum-dispatch`: + + +```python +!pip install plum-dispatch -q +``` + +### Basic Usage + +To demonstrate the basic usage of `plum-dispatch`, let's start with a simple example. Suppose we have a function that needs to behave differently when passed an integer versus when it's passed a string. + + +```python +from plum import dispatch + + +class Processor: + @dispatch + def process(self, data: int): + return f"Processing integer: {data}" + + @dispatch + def process(self, data: str): + return f"Processing string: {data}" +``` + +In this example, `Processor` has two `process` methods, one for integers and one for strings. `plum-dispatch` takes care of determining which method to call based on the type of `data`. + +### Advanced Example: Working with ASTs + +`plum-dispatch` shines in more complex scenarios, such as when working with different types of nodes in an abstract syntax tree. Let's create a simple AST representation with different node types and a visitor class to process these nodes. + + +```python +class StringNode: + def __init__(self, value): + self.value = value + +class NumberNode: + def __init__(self, value): + self.value = value + +class BaseASTVisitor: + @dispatch + def visit(self, node: StringNode): + raise Exception("Not implemented yet.") + + @dispatch + def visit(self, node: NumberNode): + raise Exception("Not implemented yet.") + +class ASTVisitor(BaseASTVisitor): + @dispatch + def visit(self, node: StringNode): + return f"Visited StringNode with value: {node.value}" + + @dispatch + def visit(self, node: NumberNode): + return f"Visited NumberNode with value: {node.value}" +``` + +With `plum-dispatch`, our `ASTVisitor` can have a single `visit` method that behaves differently depending on whether it's visiting a `StringNode` or a `NumberNode`. + +### Putting It All Together +Now, let's see `plum-dispatch` in action: + + +```python +processor = Processor() +print(processor.process(123)) # "Processing integer: 123" +print(processor.process("abc")) # "Processing string: abc" + +visitor = ASTVisitor() +print(visitor.visit(StringNode("Hello"))) # "Visited StringNode with value: Hello" +print(visitor.visit(NumberNode(456))) # "Visited NumberNode with value: 456" +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Processing integer: 123
    +Processing string: abc
    +Visited StringNode with value: Hello
    +Visited NumberNode with value: 456
    +
    +
    +
    +
    + +## Conclusion + +`plum-dispatch` offers a neat and powerful way to implement multiple dispatch in Python, making your code more modular, readable, and elegant. Whether you're dealing with simple data types or complex structures like ASTs, `plum-dispatch` can help you write more efficient and maintainable code. + +For more complex examples and advanced usage, check out the [plum-dispatch documentation](https://github.com/wesselb/plum). diff --git a/pages/blog/working-with-boolean-expressions-in-python/header.png b/pages/blog/working-with-boolean-expressions-in-python/header.png new file mode 100644 index 000000000..6492aebd1 Binary files /dev/null and b/pages/blog/working-with-boolean-expressions-in-python/header.png differ diff --git a/pages/blog/working-with-boolean-expressions-in-python/index.ipynb b/pages/blog/working-with-boolean-expressions-in-python/index.ipynb new file mode 100644 index 000000000..f39017259 --- /dev/null +++ b/pages/blog/working-with-boolean-expressions-in-python/index.ipynb @@ -0,0 +1,397 @@ +{ + "cells": [ + { + "cell_type": "raw", + "id": "4a31e70a-75c7-47aa-8793-b44efeaaa0b1", + "metadata": {}, + "source": [ + "---\n", + "title: \"Working with Boolean Expressions in Python\"\n", + "slug: \"working-with-boolean-expressions-in-python\"\n", + "date: 2024-01-31\n", + "authors: [\"Ivan Ogasawara\"]\n", + "tags: [\"boolean expressions\", \"boolean\", \"python\"]\n", + "categories: [\"devops\", \"automation\", \"python\"]\n", + "description: |\n", + " Boolean logic is a crucial component in many programming tasks, especially\n", + " in searching and querying data. In this tutorial, we'll explore how to use boolean.py,\n", + " a Python library, for handling Boolean expressions. \n", + " We'll apply it to medical symptom data as an illustrative example.\n", + "thumbnail: \"/header.png\"\n", + "template: \"blog-post.html\"\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "458e17dc-2853-49cd-9ad3-ecd0c617019c", + "metadata": {}, + "source": [ + "# Working with Boolean Expressions in Python\n", + "\n", + "Boolean logic is a crucial component in many programming tasks, especially in searching and querying data. In this tutorial, we'll explore how to use `boolean.py`, a Python library, for handling Boolean expressions. We'll apply it to medical symptom data as an illustrative example.\n", + "\n", + "## Introduction to `boolean.py`\n", + "\n", + "`boolean.py` is a Python library for creating, manipulating, and evaluating Boolean expressions. It's particularly useful in scenarios where you need to parse and evaluate expressions that represent conditions or filters, such as searching for specific symptoms in a medical database.\n", + "\n", + "## Installation\n", + "\n", + "First and foremost, you need to have `boolean.py` installed in your Python environment. You can easily install it using pip. Run the following command:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "d231485b-1aef-45b6-99b6-f4d850238e16", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install -q boolean.py" + ] + }, + { + "cell_type": "markdown", + "id": "fefb2dd4-bfa3-4603-96e0-fd520c11d2da", + "metadata": {}, + "source": [ + "## Basic Usage\n", + "\n", + "We begin with basic Boolean operations, which are the foundation of working with this library.\n", + "\n", + "### Creating Boolean Variables" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "ab358eda-ea90-4635-b6cc-ab8ece1a6439", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(Symbol('fever'), Symbol('cough'))" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import boolean\n", + "\n", + "from boolean.boolean import BooleanAlgebra\n", + "\n", + "# Create a Boolean algebra system\n", + "algebra = BooleanAlgebra()\n", + "\n", + "# Define some symptoms as variables\n", + "fever = algebra.Symbol('fever')\n", + "cough = algebra.Symbol('cough')\n", + "\n", + "fever, cough" + ] + }, + { + "cell_type": "markdown", + "id": "0225585b-5fdc-466b-806c-bb9f266d12b6", + "metadata": {}, + "source": [ + "In this code, we import `BooleanAlgebra` from `boolean.py` and create an instance of it. We then define Boolean variables (symbols) for common symptoms. These symbols act as the basic units for our Boolean expressions.\n" + ] + }, + { + "cell_type": "markdown", + "id": "47e97f30-9bfa-4cf2-9ead-829c7f75cb3b", + "metadata": {}, + "source": [ + "### Basic Boolean Operations" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "84a63a66-72e4-430f-b8c1-b27a472c8e02", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "fever&cough\n", + "fever|cough\n", + "~fever\n" + ] + } + ], + "source": [ + "# AND operation\n", + "symptoms_and = fever & cough\n", + "print(symptoms_and)\n", + "\n", + "# OR operation\n", + "symptoms_or = fever | cough\n", + "print(symptoms_or)\n", + "\n", + "# NOT operation\n", + "no_fever = ~fever\n", + "print(no_fever)" + ] + }, + { + "cell_type": "markdown", + "id": "8e68c8b3-fae1-4ffc-8bd8-2682f522ce8b", + "metadata": {}, + "source": [ + "Here, we demonstrate basic Boolean operations: AND, OR, and NOT. These operations are essential in constructing more complex Boolean expressions. For example, `symptoms_and` represents a scenario where a patient has both fever and cough." + ] + }, + { + "cell_type": "markdown", + "id": "183fe7e0-acb6-48dc-b0be-020f7dc51aee", + "metadata": {}, + "source": [ + "## Advanced Expressions\n", + "\n", + "Now, let's create more complex expressions that could simulate queries for medical symptoms.\n", + "\n", + "### Complex Expressions" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "a777a904-405d-45cd-8323-bad8fb398c58", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "((fever|cough)&~headache)&fatigue\n" + ] + } + ], + "source": [ + "headache = algebra.Symbol('headache')\n", + "fatigue = algebra.Symbol('fatigue')\n", + "\n", + "# Complex expression\n", + "complex_symptoms = (fever | cough) & ~headache & fatigue\n", + "print(complex_symptoms)" + ] + }, + { + "cell_type": "markdown", + "id": "931725d2-c48c-4c6c-974d-f9bb229ee12c", + "metadata": {}, + "source": [ + "This complex expression can represent a more specific medical query. For instance, it could be used to find patients who have either fever or cough, do not have a headache, but are experiencing fatigue." + ] + }, + { + "cell_type": "markdown", + "id": "724132e3-b4a1-44ee-ba6b-4c388685f3ce", + "metadata": {}, + "source": [ + "### Evaluating Expressions\n", + "\n", + "We can evaluate these expressions with specific values to simulate checking a patient's symptoms against our criteria." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "9a28ae95-012b-4c77-8329-5dcde7410bb2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Does the patient match the criteria? (((1)|(0))&(~(0)))&(1) = True\n" + ] + } + ], + "source": [ + "# Define truthy and falsy symbols\n", + "true = algebra.TRUE\n", + "false = algebra.FALSE\n", + "\n", + "# Define complex expression\n", + "complex_symptoms = (fever | cough) & ~headache & fatigue\n", + "\n", + "# Define a patient's symptoms using truthy and falsy symbols\n", + "patient_symptoms = {fever: true, cough: false, headache: false, fatigue: true}\n", + "\n", + "# Substitute symbols in the expression with the corresponding patient symptoms\n", + "substituted_expression = complex_symptoms.subs(patient_symptoms)\n", + "\n", + "# Evaluate the expression\n", + "# The expression itself is the result since boolean.py does not evaluate to Python booleans\n", + "result = substituted_expression\n", + "\n", + "print(\"Does the patient match the criteria?\", result, \"=\", result.simplify() == true)\n" + ] + }, + { + "cell_type": "markdown", + "id": "2e5d3c70-2750-4aa9-bdd2-a60a4203671b", + "metadata": {}, + "source": [ + "In this example, we demonstrate how to evaluate a Boolean expression against a set of patient symptoms. We use `.subs()` to replace each symbol in our expression with the corresponding value (symptom presence) from `patient_symptoms`. The `.simplify()` method then evaluates this substituted expression to a Boolean value, indicating whether the patient's symptoms match our query criteria.\n" + ] + }, + { + "cell_type": "markdown", + "id": "d2972b0a-635a-49cb-9527-1d265b43d2bd", + "metadata": {}, + "source": [ + "## Parsing Expressions from Strings\n", + "\n", + "Lastly, we explore parsing Boolean expressions from strings, a powerful feature for dynamic expression construction.\n", + "\n", + "### Parsing Example" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "ff5f2bfb-05cb-4cf5-8b13-23e0ad6de5e8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "parsed expression: (fever|cough)&~headache&fatigue\n", + "Does the patient match the criteria? True\n" + ] + } + ], + "source": [ + "expression_string = \"(fever | cough) & ~headache & fatigue\"\n", + "\n", + "# Parse the expression from string\n", + "parsed_expression = algebra.parse(expression_string)\n", + "\n", + "# Display the parsed expression\n", + "print(\"parsed expression:\", parsed_expression)\n", + "\n", + "# Evaluate with the same patient symptoms\n", + "result = parsed_expression.subs(patient_symptoms)\n", + "print(f\"Does the patient match the criteria? {result.simplify() == true}\")" + ] + }, + { + "cell_type": "markdown", + "id": "618bb340-10f6-44ea-82b1-869a7c090da0", + "metadata": {}, + "source": [ + "Parsing expressions from strings is extremely useful when you need to construct Boolean expressions dynamically, such as from user inputs or configuration files. In this example, we parse a string representing a Boolean expression and then evaluate it as before." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "d452b111-c9fc-4566-8af8-bf552b7184f3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[EE] Unknown token for token: \"\"\" at position: 9\n" + ] + } + ], + "source": [ + "expression_string = '(fever | \"blood cough\") & ~headache & fatigue'\n", + "\n", + "# Parse the expression from string\n", + "try:\n", + " parsed_expression = algebra.parse(expression_string)\n", + "except boolean.ParseError as e:\n", + " print(\"[EE]\", str(e))" + ] + }, + { + "cell_type": "markdown", + "id": "4f042b9c-18f6-4955-9dcf-acb7ef9e3197", + "metadata": {}, + "source": [ + "The string parser doesn't work with complex strings directly, but creating a manual symbol for the disease works fine." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "ff396a7c-f69d-4058-a219-c196d8c4936a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "================================================================================\n", + "patient without fever\n", + "Does the patient match the criteria? False\n", + "================================================================================\n", + "patient with all symptoms\n", + "Does the patient match the criteria? True\n" + ] + } + ], + "source": [ + "blood_cough = boolean.Symbol(\"blood cough\")\n", + "\n", + "chest_infection = blood_cough & fever\n", + "\n", + "print(\"=\" * 80)\n", + "print(\"patient without fever\")\n", + "chest_infection_patient_symptoms = {blood_cough: true, fever: false}\n", + "result = chest_infection.subs(chest_infection_patient_symptoms)\n", + "print(f\"Does the patient match the criteria? {result.simplify() == true}\")\n", + "\n", + "print(\"=\" * 80)\n", + "print(\"patient with all symptoms\")\n", + "chest_infection_patient_symptoms = {blood_cough: true, fever: true}\n", + "result = chest_infection.subs(chest_infection_patient_symptoms)\n", + "print(f\"Does the patient match the criteria? {result.simplify() == true}\")" + ] + }, + { + "cell_type": "markdown", + "id": "85dd008d-61ca-408c-9928-7cee4029b654", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "Throughout this tutorial, we have explored how to use `boolean.py` for handling and evaluating Boolean expressions in Python. By starting from basic operations and moving to parsing expressions from strings, we've covered a range of functionalities provided by this library. While we focused on a medical context, the principles and methods are broadly applicable across different domains." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pages/blog/working-with-boolean-expressions-in-python/index.md b/pages/blog/working-with-boolean-expressions-in-python/index.md new file mode 100644 index 000000000..9001e500a --- /dev/null +++ b/pages/blog/working-with-boolean-expressions-in-python/index.md @@ -0,0 +1,285 @@ +--- +title: "Working with Boolean Expressions in Python" +slug: "working-with-boolean-expressions-in-python" +date: 2024-01-31 +authors: ["Ivan Ogasawara"] +tags: ["boolean expressions", "boolean", "python"] +categories: ["devops", "automation", "python"] +description: | + Boolean logic is a crucial component in many programming tasks, especially + in searching and querying data. In this tutorial, we'll explore how to use boolean.py, + a Python library, for handling Boolean expressions. + We'll apply it to medical symptom data as an illustrative example. +thumbnail: "/header.png" +template: "blog-post.html" +--- +# Working with Boolean Expressions in Python + +Boolean logic is a crucial component in many programming tasks, especially in searching and querying data. In this tutorial, we'll explore how to use `boolean.py`, a Python library, for handling Boolean expressions. We'll apply it to medical symptom data as an illustrative example. + +## Introduction to `boolean.py` + +`boolean.py` is a Python library for creating, manipulating, and evaluating Boolean expressions. It's particularly useful in scenarios where you need to parse and evaluate expressions that represent conditions or filters, such as searching for specific symptoms in a medical database. + +## Installation + +First and foremost, you need to have `boolean.py` installed in your Python environment. You can easily install it using pip. Run the following command: + + +```python +!pip install -q boolean.py +``` + +## Basic Usage + +We begin with basic Boolean operations, which are the foundation of working with this library. + +### Creating Boolean Variables + + +```python +import boolean + +from boolean.boolean import BooleanAlgebra + +# Create a Boolean algebra system +algebra = BooleanAlgebra() + +# Define some symptoms as variables +fever = algebra.Symbol('fever') +cough = algebra.Symbol('cough') + +fever, cough +``` + + + + +
    +

    + OUTPUT + +

    +
    +  
    +(Symbol('fever'), Symbol('cough'))
    +
    +
    +
    + + + +In this code, we import `BooleanAlgebra` from `boolean.py` and create an instance of it. We then define Boolean variables (symbols) for common symptoms. These symbols act as the basic units for our Boolean expressions. + + +### Basic Boolean Operations + + +```python +# AND operation +symptoms_and = fever & cough +print(symptoms_and) + +# OR operation +symptoms_or = fever | cough +print(symptoms_or) + +# NOT operation +no_fever = ~fever +print(no_fever) +``` + +
    +

    + OUTPUT + +

    +
    +  
    +fever&cough
    +fever|cough
    +~fever
    +
    +
    +
    +
    + +Here, we demonstrate basic Boolean operations: AND, OR, and NOT. These operations are essential in constructing more complex Boolean expressions. For example, `symptoms_and` represents a scenario where a patient has both fever and cough. + +## Advanced Expressions + +Now, let's create more complex expressions that could simulate queries for medical symptoms. + +### Complex Expressions + + +```python +headache = algebra.Symbol('headache') +fatigue = algebra.Symbol('fatigue') + +# Complex expression +complex_symptoms = (fever | cough) & ~headache & fatigue +print(complex_symptoms) +``` + +
    +

    + OUTPUT + +

    +
    +  
    +((fever|cough)&~headache)&fatigue
    +
    +
    +
    +
    + +This complex expression can represent a more specific medical query. For instance, it could be used to find patients who have either fever or cough, do not have a headache, but are experiencing fatigue. + +### Evaluating Expressions + +We can evaluate these expressions with specific values to simulate checking a patient's symptoms against our criteria. + + +```python +# Define truthy and falsy symbols +true = algebra.TRUE +false = algebra.FALSE + +# Define complex expression +complex_symptoms = (fever | cough) & ~headache & fatigue + +# Define a patient's symptoms using truthy and falsy symbols +patient_symptoms = {fever: true, cough: false, headache: false, fatigue: true} + +# Substitute symbols in the expression with the corresponding patient symptoms +substituted_expression = complex_symptoms.subs(patient_symptoms) + +# Evaluate the expression +# The expression itself is the result since boolean.py does not evaluate to Python booleans +result = substituted_expression + +print("Does the patient match the criteria?", result, "=", result.simplify() == true) + +``` + +
    +

    + OUTPUT + +

    +
    +  
    +Does the patient match the criteria? (((1)|(0))&(~(0)))&(1) = True
    +
    +
    +
    +
    + +In this example, we demonstrate how to evaluate a Boolean expression against a set of patient symptoms. We use `.subs()` to replace each symbol in our expression with the corresponding value (symptom presence) from `patient_symptoms`. The `.simplify()` method then evaluates this substituted expression to a Boolean value, indicating whether the patient's symptoms match our query criteria. + + +## Parsing Expressions from Strings + +Lastly, we explore parsing Boolean expressions from strings, a powerful feature for dynamic expression construction. + +### Parsing Example + + +```python +expression_string = "(fever | cough) & ~headache & fatigue" + +# Parse the expression from string +parsed_expression = algebra.parse(expression_string) + +# Display the parsed expression +print("parsed expression:", parsed_expression) + +# Evaluate with the same patient symptoms +result = parsed_expression.subs(patient_symptoms) +print(f"Does the patient match the criteria? {result.simplify() == true}") +``` + +
    +

    + OUTPUT + +

    +
    +  
    +parsed expression: (fever|cough)&~headache&fatigue
    +Does the patient match the criteria? True
    +
    +
    +
    +
    + +Parsing expressions from strings is extremely useful when you need to construct Boolean expressions dynamically, such as from user inputs or configuration files. In this example, we parse a string representing a Boolean expression and then evaluate it as before. + + +```python +expression_string = '(fever | "blood cough") & ~headache & fatigue' + +# Parse the expression from string +try: + parsed_expression = algebra.parse(expression_string) +except boolean.ParseError as e: + print("[EE]", str(e)) +``` + +
    +

    + OUTPUT + +

    +
    +  
    +[EE] Unknown token for token: """ at position: 9
    +
    +
    +
    +
    + +The string parser doesn't work with complex strings directly, but creating a manual symbol for the disease works fine. + + +```python +blood_cough = boolean.Symbol("blood cough") + +chest_infection = blood_cough & fever + +print("=" * 80) +print("patient without fever") +chest_infection_patient_symptoms = {blood_cough: true, fever: false} +result = chest_infection.subs(chest_infection_patient_symptoms) +print(f"Does the patient match the criteria? {result.simplify() == true}") + +print("=" * 80) +print("patient with all symptoms") +chest_infection_patient_symptoms = {blood_cough: true, fever: true} +result = chest_infection.subs(chest_infection_patient_symptoms) +print(f"Does the patient match the criteria? {result.simplify() == true}") +``` + +
    +

    + OUTPUT + +

    +
    +  
    +================================================================================
    +patient without fever
    +Does the patient match the criteria? False
    +================================================================================
    +patient with all symptoms
    +Does the patient match the criteria? True
    +
    +
    +
    +
    + +## Conclusion + +Throughout this tutorial, we have explored how to use `boolean.py` for handling and evaluating Boolean expressions in Python. By starting from basic operations and moving to parsing expressions from strings, we've covered a range of functionalities provided by this library. While we focused on a medical context, the principles and methods are broadly applicable across different domains. diff --git a/pages/calendar/index.md b/pages/calendar/index.md new file mode 100644 index 000000000..0ccfc74ca --- /dev/null +++ b/pages/calendar/index.md @@ -0,0 +1,11 @@ +--- +title: "Open Science Labs Public Google Calendar" +description: "Open Science Labs, sharing knowledge" +date: "2019-02-28" +authors: ["OSL Team"] +template: main.html +--- + + diff --git a/pages/discord/index.md b/pages/discord/index.md new file mode 100644 index 000000000..3fd61802a --- /dev/null +++ b/pages/discord/index.md @@ -0,0 +1,11 @@ +--- +title: "Discord" +description: "Open Science Labs, sharing knowledge" +date: "2019-02-28" +authors: ["OSL Team"] +template: main.html +--- + + diff --git a/pages/donate/index.md b/pages/donate/index.md new file mode 100644 index 000000000..a9c981f9f --- /dev/null +++ b/pages/donate/index.md @@ -0,0 +1,52 @@ +--- +title: "Support Open Science Labs: Donate Today" +template: main.html +--- + +
    + +## How to Donate + +Open Science Labs accepts donations through Open Collective. Every contribution, +no matter the size, makes a difference. Together, we can continue to build an +open, inclusive, and innovative future for science and technology. Thank you for +considering a donation to Open Science Labs. + + + + + +## Support Open Science Labs: Donate Today + +At Open Science Labs, we're dedicated to fostering innovation, collaboration, +and openness in science and technology. Your donation can make a significant +impact, enabling us to support and expand our community-driven initiatives. +Here's why your contribution matters: + +### Empowerment Through Education + +Your support helps us offer workshops, courses, and mentorship programs, +empowering individuals with the skills and knowledge to contribute to open +science and technology. We focus on creating accessible learning opportunities +for all, regardless of background or experience. + +### Advancing Open Source Projects + +Donations fuel our Incubator and Internship programs, providing vital resources +to open source projects that are the backbone of scientific research and +innovation. With your help, we can offer more projects the support they need to +grow, thrive, and contribute to the open science ecosystem. + +### Building a Collaborative Community + +Your contribution aids in the development of a supportive, collaborative +environment where individuals can share ideas, collaborate on projects, and make +meaningful connections. This community spirit accelerates the progress of open +science and technology, leading to advancements that benefit society as a whole. + +### Impacting Society + +Open Science Labs is committed to using open science principles to tackle +real-world problems. Your donation supports projects with the potential to make +significant societal impacts, from environmental conservation to public health +advancements. diff --git a/pages/facebook/index.md b/pages/facebook/index.md new file mode 100644 index 000000000..afdbd977a --- /dev/null +++ b/pages/facebook/index.md @@ -0,0 +1,11 @@ +--- +title: "Open Science Labs Facebook" +description: "Open Science Labs, sharing knowledge" +date: "2019-02-28" +authors: ["OSL Team"] +template: main.html +--- + + diff --git a/pages/funding.json b/pages/funding.json new file mode 100644 index 000000000..2e4900277 --- /dev/null +++ b/pages/funding.json @@ -0,0 +1,148 @@ +{ + "version": "v1.1.0", + "entity": { + "type": "organisation", + "role": "owner", + "name": "Open Science Labs", + "email": "team@opensciencelabs.org", + "description": "Open Science Labs (OSL) is a non-profit organisation dedicated to creating and sustaining innovative FOSS projects.", + "webpageUrl": { + "url": "https://opensciencelabs.org" + } + }, + "projects": [ + { + "guid": "irx", + "name": "IRx", + "description": "IRx is a Python library that serves as the LLVM backend for ARXLang, enabling high-level ASTx programs to be compiled into executable machine code.", + "webpageUrl": { + "url": "https://irx.arxlang.org/" + }, + "repositoryUrl": { + "url": "https://github.com/arxlang/irx" + }, + "licenses": ["spdx:BSD-3-Clause"], + "tags": ["developer-tools", "programming", "software-engineering"] + }, + { + "guid": "sciarx", + "name": "SciArx", + "description": "SciArx is a scientific computing library written in ArxLang, with native Apache Arrow datatype support.", + "webpageUrl": { + "url": "https://arxlang.org/" + }, + "repositoryUrl": { + "url": "https://github.com/arxlang/sciarx" + }, + "licenses": ["spdx:BSD-3-Clause"], + "tags": ["science", "scientific-computing", "programming"] + }, + { + "guid": "arx", + "name": "ARx", + "description": "ARx is a programming language that targets multi-architecture native code and integrates directly with Apache Arrow through LLVM-based code generation.", + "webpageUrl": { + "url": "https://arxlang.org/" + }, + "repositoryUrl": { + "url": "https://github.com/arxlang/arx" + }, + "licenses": ["spdx:Apache-2.0"], + "tags": ["programming", "developer-tools", "scientific-computing"] + }, + { + "guid": "sugar", + "name": "Sugar", + "description": "Sugar simplifies the usage of containers and container stacks for reproducible development workflows.", + "webpageUrl": { + "url": "https://sugar-org.github.io/sugar/" + }, + "repositoryUrl": { + "url": "https://github.com/sugar-org/sugar" + }, + "licenses": ["spdx:BSD-3-Clause"], + "tags": ["devops", "cloud", "developer-tools"] + }, + { + "guid": "makim", + "name": "Makim", + "description": "Makim is a YAML-based task automation tool focused on task definition, dependencies, and conditional execution.", + "webpageUrl": { + "url": "http://docs.makim.org/" + }, + "repositoryUrl": { + "url": "https://github.com/makim-org/makim" + }, + "licenses": ["spdx:BSD-3-Clause"], + "tags": ["developer-tools", "devops", "development"] + }, + { + "guid": "scicookie", + "name": "SciCookie", + "description": "SciCookie is a Cookiecutter-based template that helps teams bootstrap Python projects from reusable project templates.", + "webpageUrl": { + "url": "https://osl-incubator.github.io/scicookie" + }, + "repositoryUrl": { + "url": "https://github.com/osl-incubator/scicookie" + }, + "licenses": ["spdx:BSD-3-Clause"], + "tags": ["developer-tools", "software-engineering", "programming"] + }, + { + "guid": "artbox", + "name": "ArtBox", + "description": "ArtBox processes multimedia files, including speech-to-text, text-to-speech, and other media workflows.", + "webpageUrl": { + "url": "https://mediatoolbox-org.github.io/artbox/" + }, + "repositoryUrl": { + "url": "https://github.com/mediatoolbox-org/artbox" + }, + "licenses": ["spdx:BSD-3-Clause"], + "tags": ["audio", "developer-tools", "productivity"] + } + ], + "funding": { + "channels": [ + { + "guid": "opencollective", + "type": "payment-provider", + "address": "https://opencollective.com/osl", + "description": "We use Open Collective for receiving funds." + } + ], + "plans": [ + { + "guid": "hosting-monthly", + "status": "active", + "name": "Hosting support", + "description": "This covers infrastructure and hosting costs for OSL projects.", + "amount": 0, + "currency": "USD", + "frequency": "monthly", + "channels": ["opencollective"] + }, + { + "guid": "developer-time", + "status": "active", + "name": "Developer support", + "description": "This supports part-time developer time across OSL projects.", + "amount": 0, + "currency": "USD", + "frequency": "monthly", + "channels": ["opencollective"] + }, + { + "guid": "angel-plan", + "status": "active", + "name": "Goodwill plan", + "description": "Give any amount to support OSL and its projects.", + "amount": 0, + "currency": "USD", + "frequency": "one-time", + "channels": ["opencollective"] + } + ] + } +} diff --git a/pages/index.md b/pages/index.md new file mode 100644 index 000000000..a5e80da58 --- /dev/null +++ b/pages/index.md @@ -0,0 +1,321 @@ +--- +title: Open Science Labs +authors: + - Ivan Ogasawara + - Ever Vino +date: 2023-10-30 +template: home.html +partners: + - name: The GRAPH Network + url: https://thegraphnetwork.org + logo: https://thegraphnetwork.org/wp-content/uploads/2021/07/Research_GRAPH_logo-2-1-1-2-3-150x150.png + + - name: The GRAPH Courses + url: https://thegraphcourses.org/ + logo: /images/partners/graph_courses_logo.png + + - name: AlertaDengue + url: https://info.dengue.mat.br/ + logo: /images/partners/info-dengue.png + + - name: EpiGraphHub + url: https://epigraphhub.org/ + logo: /images/partners/epigraphhub.png + + - name: LiteRev + url: https://literev.unige.ch/ + logo: /images/partners/literev.png + + - name: ArxLang + url: https://arxlang.org/ + logo: /images/partners/arx.png + + - name: pyOpenSci + url: https://www.pyopensci.org/ + logo: /images/partners/pyopensci.png + + - name: IGDORE + url: https://igdore.org/ + logo: /images/partners/IGDORE-logo-200pxx200px.png + + - name: Data Umbrella + url: https://dataumbrella.org/ + logo: /images/partners/dataumbrella.jpg + + - name: TeleHealthCareAI + url: https://telehealthcareai.org/ + logo: /images/partners/thcai.png + +initiatives: + - title: Community + description: | + Whether you're here to learn, share, or contribute, you'll find + a supportive space to explore open science and technology. + action: + url: https://opensciencelabs.org/discord + text: Join us now + color-type: success +--- + + +
    +
    +
    +

    + + Welcome to the + + + Open Science Labs + +

    +

    + + Fostering innovation and collaboration with open science and open + source. + +

    +
    +
    +
    + +
    +
    +
    +
    +

    Our Mission

    +

    + At Open Science Labs (OSL), we are dedicated to advancing the + scientific research through collaboration, innovation, and education. + Our mission is to create a more inclusive, transparent, and accessible + scientific community. +

    +
    +
    +

    Our Goals

    +

    + To empower researchers, educators, and students by providing + resources, tools, and a collaborative platform for sharing knowledge + and advancing open science initiatives. +

    +
    +
    +
    +
    + +
    +
    +

    Our Main Initiatives

    +

    + Discover Our Main Initiatives at Open Science Labs, where we champion + the advancement of scientific research and technology through a + variety of comprehensive programs. Each initiative is designed to + foster collaboration, innovation, and learning within our community. + From incubating groundbreaking projects to facilitating meaningful + partnerships and empowering individuals through our internship and + OpenHub programs, we're dedicated to creating opportunities that + enrich both the scientific community and the broader world. Explore + these initiatives to see how you can engage, contribute, and grow with + us. +

    +
    +
    +
    +
    +
    Community
    +

    + Whether you're here to learn, share, or contribute, you'll find + a supportive space to explore open science and technology. +

    +
    + +
    +
    +
    +
    +
    +
    Internship Program
    +

    + Offering hands-on experience in open source projects, fostering + learning, and contributing to the community. +

    +
    + +
    +
    +
    +
    +
    +
    Project Affiliation
    +

    + Supporting and promoting open source projects aligned with our + mission, providing visibility and resources. +

    +
    + +
    +
    +
    +
    +
    +
    Incubator Program
    +

    + Nurturing innovative open source projects, providing the support + and resources needed to evolve ideas into impactful solutions + for the global research community. +

    +
    + +
    +
    +
    +
    +
    +
    Study Groups
    +

    + Join Open Science Labs study groups to engage, learn, and + collaborate on diverse topics around open science and + technologies. +

    +
    + +
    +
    +
    +
    +
    +
    Blog
    +

    + Our blog features contributions from our community, + showcasing project updates, innovative research findings, and + expert opinions to inspire and inform. +

    +
    + +
    +
    +
    +
    +
    + +
    +
    +

    Our Formula

    +

    + At Open Science Labs, our formula for success is built on a foundation + of collaboration, innovation, and openness. We believe in empowering + our community by providing the tools, resources, and support needed to + advance science and technology in an open and accessible manner. Our + commitment to these principles guides our initiatives, programs, and + partnerships, ensuring that together, we can make a lasting impact on + the world. Join us in our mission to create a future where knowledge + is shared freely and collaboratively. +

    + +
    +
    + +
    +
    +

    Project Affiliation

    +

    + The Project Affiliation program at Open Science Labs is designed to + foster collaboration and growth among open science and open source + projects. By becoming an affiliated project, you gain access to a + wealth of resources, including participation in our Internship + Program, eligibility for future Grant opportunities, and enhanced + visibility through our social networks and events. Our goal is to + support your project's development and impact, aligning with our + mission to promote open, transparent, and ethical advancements in + science and technology. Discover how affiliating with OSL can elevate + your project and connect with a global community dedicated to open + innovation. +

    + +
    +
    + +
    +
    +

    Get Involved

    +

    + Join our community of innovators, thinkers, and creators. Whether + you're a researcher, student, or open science enthusiast, there's a + place for you at OSL. Explore our programs, participate in our events, + and contribute to making science open and accessible to all. +

    + +
    +
    + +
    +
    +

    Partnership

    +
    +

    + The Partner Program at Open Science Labs is designed to forge + meaningful collaborations with organizations and projects committed + to the advancement of open science. By joining us as a partner, + you'll have the opportunity to connect with a vibrant community, + share knowledge, and collaborate on projects that drive innovation + and accessibility in research and development. We invite + organizations passionate about making a difference to become part of + our mission. Together, we can work towards a more open, transparent, + and inclusive scientific ecosystem. Join us in our journey to + empower open science initiatives worldwide. +

    +

    + If you want to be our partner, please send us an email to + team@opensciencelabs.org. +

    + +
    +
    +
    diff --git a/pages/learning/events/index.md b/pages/learning/events/index.md new file mode 100644 index 000000000..bedc78e88 --- /dev/null +++ b/pages/learning/events/index.md @@ -0,0 +1,61 @@ +--- +title: Events +date: 2024-02-24 +authors: ["OSL Team"] +template: events.html +events: + past_events: + - name: "OSL-PyCafe 3" + description: | + The OSL-PyCafe 3 event featured YouTube Live Sessions with David Ochoa presenting on "Use of Sympy in Engineering Education" and Fransico Palm presenting on "Intro to Scikit-risk". + thumbnail: /images/logos/logo.png + url: https://www.youtube.com/watch?v=SkaXPIzolPs + date_start: August 29th, 2024 + date_end: August 29th, 2024 + + - name: "OpenVerse'24 Hackathon" + description: | + OpenVerse'24 is a beginner-friendly hackathon + designed to welcome newcomers to the open-source + development community. Our mission is to provide a supportive + environment for learning and contributing to open-source projects, with a strong focus on education and practical experience. + thumbnail: /images/events/openverse24.png + date_start: February 29th, 2024 + date_end: March 1st, 2024 + + - name: + "Collaborative localization of documentation: Scikit-Learn and + Matplotlib Cases" + description: | + Mariangela Petrizzo made an insightful presentation in this event, speaking about collaborative work, internationlization vs localization, why translate documentation, and more. + thumbnail: /images/logos/logo.png + url: https://www.youtube.com/watch?v=hsrIDxiHkVk + date_start: September 23rd, 2022 + date_end: September 23rd, 2022 + + - name: "OSL-PyCafe 2" + description: | + The OSL-PyCafe 2 was lush with educative YouTube Live Sessions. Ivan Ogaswara made a presentation titled "Introduction to Semantic Releases". In the same event, Raniere Silva made a presentation on "Everything you need to know about GitLab CI in 10 minutes" and Pablo Navarro narrated the "Reconstruction of Iberian ceramics using generative networks". + thumbnail: /images/logos/logo.png + url: https://www.youtube.com/watch?v=h4XeorBiV18 + date_start: August 25th, 2022 + date_end: August 25th, 2022 + + - name: "OSL-PyCafe 1" + description: | + OSL-PyCafe maiden edition was nothing short of remarkable. The event featured three YouTube Live presentations from Rafael Villca, Alex de Siqueira, and Fransisco Palm who spoke on "How to Speed Up Your Python Code?", "An Overview of Scikit-image", and "Spreadsheets, Databases and Dataframes" respectively. + thumbnail: /images/logos/logo.png + urls: https://www.youtube.com/watch?v=lPsOB8dEiNI&t=134s + date_start: August 5th, 2022 + date_end: August 5th, 2022 +--- + +# Events + +Welcome to the Events page of Open Science Labs! Here, we showcase a curated +list of upcoming and past events designed to engage, educate, and inspire our +community. From workshops and hackathons to conferences and webinars, our events +serve as a platform for collaboration, learning, and sharing of ideas within the +realms of open science and technology. Explore our event listings to discover +opportunities to connect with like-minded individuals, enhance your skills, and +contribute to the growing field of science, and technology. diff --git a/pages/learning/index.md b/pages/learning/index.md new file mode 100644 index 000000000..ed8d659e7 --- /dev/null +++ b/pages/learning/index.md @@ -0,0 +1,50 @@ +--- +title: Learning +date: 2025-02-02 +authors: ["OSL Team"] +--- + +# Learning at Open Science Labs + +Welcome to the Learning section of Open Science Labs, where we are committed to +fostering an environment of continuous education and community engagement. This +section of our website is dedicated to providing resources, organizing study +groups, and hosting events that enhance learning opportunities in the fields of +open science and technology. + +## Events + +Our **Events** page is your gateway to both past and upcoming events organized +by Open Science Labs. From workshops to seminars and webinars, you can find +information on a variety of gatherings that aim to educate and inspire. Whether +you're looking to attend your first open-source workshop or a seasoned +professional eager to engage with new ideas, our events cater to all levels of +expertise. + +Check out our [Events](/learning/events) page for more details on how you can +participate. + +## Study Groups + +Study Groups at Open Science Labs offer participants a unique opportunity to +learn collaboratively in a supportive environment. Moderated by experienced +members of the community, these groups cover a wide range of topics, from coding +challenges to data science research. Each study group aims to enhance +problem-solving skills and deepen understanding of specific subjects. + +Learn more and join a study group by visiting our +[Study Groups](/learning/study-groups) page. + +## Resources (Coming Soon) + +We are also working on curating a comprehensive list of **Resources** that will +be beneficial for your learning journey. This will include tutorials, course +materials, recommended readings, and more, all accessible through our website. +This new section will support your learning needs by providing trusted, +high-quality educational materials. + +Stay tuned for updates on the Resources page, which we will launch soon. + +Whether you're looking to deepen your knowledge, share your expertise, or find +new ways to engage with the community, the Learning section of Open Science Labs +is here to support your growth and exploration in open science and technology. diff --git a/pages/learning/study-groups/index.md b/pages/learning/study-groups/index.md new file mode 100644 index 000000000..9502c426e --- /dev/null +++ b/pages/learning/study-groups/index.md @@ -0,0 +1,128 @@ +--- +title: Study Groups +date: 2025-02-02 +authors: ["OSL Team"] +--- + +# Study Groups at Open Science Labs + +## About Our Study Groups + +At Open Science Labs, we encourage the formation of study groups to create a +collaborative environment where members can learn and share knowledge on various +topics. Whether you're looking to improve your problem-solving skills or dive +into new technological realms, our study groups offer a place to grow alongside +peers under the guidance of experienced moderators. + +## Current Study Groups + +### Advent of Code + +Currently, sponsored by LiteRev, we host a study group focused on enhancing +problem-solving skills through the +[**Advent of Code challenges**](https://adventofcode.com/). This initiative +provides an engaging way to tackle interesting programming problems and improve +your coding proficiency. + +- **Moderator**: _Ivan Ogasawara_ +- **Level**: _Advanced_ +- **Language**: _English_ +- **Programming Language**: _Any_ +- **Discord Channel**: _stdy-advent-of-code_ + () +- **Schedule**: _Every Wednesday at 12:00PM (GMT-4)_ +- **Video Call Link**: +- **Challenge link**: https://adventofcode.com/ + +### Python 101 Challenges + +For those just stepping into the world of Python, we're excited to announce the +upcoming "Python 101 Challenges" study group. This beginner-level group is +designed to help you tackle fundamental Python problems, making it an ideal +starting point for those new to coding. + +- **Moderator**: _Sandro Loch_ +- **Level**: _Beginner_ +- **Language**: _English_ +- **Programming Language**: _Python_ +- **Discord Channel**: _stdy-python-101_ () +- **Start Date**: _February 20, 2025_ +- **Schedule**: _Every Thursday at 12:00PM (GMT-3)_ +- **Video Call**: On discord (voice channel _stdy-python-101_) +- **Challenge link**: + [101 Computing Python Challenges](https://www.101computing.net/python-challenges-for-beginners/) + +### Creative Coding + +Our group will explore coding as a creative process rather than just a technical +skill. Many beginners find programming intimidating and miss out on the +enjoyment it can offer. By using code to create graphics, we can make learning +more approachable and visually rewarding. This study group will center around +programming with P5.js, an open-source JavaScript framework designed for +creative coding. + +- **Moderator**: _Jigyasu_ +- **Level**: _Beginner_ +- **Language**: _English_ +- **Programming Language**: _JS_ +- **Discord Channel**: _stdy-creative-coding_ + () +- **Start Date**: _March 15, 2025_ +- **Schedule**: _Alternate Saturday at 10:00 PM (GMT+5:30)_ +- **Video Call**: [Google Meet](https://calendar.app.google/x2BLjFu6J55jCoHq5) +- **Challenge link**: [p5.js tutorials](https://p5js.org/tutorials/) + +### Neuronauts: The AI Expedition + +A study group focused on exploring the fundamentals of Artificial Intelligence, +Machine Learning, and Deep Learning. In this group, members dive into both the +theory and practical applications of AI, moving beyond surface-level use of APIs +and automated tools. Participants will engage in discussions, work on projects, +and tackle exercises that help build a solid understanding of the underlying +principles of AI. + +- **Moderator**: _Chirag_ +- **Level**: _Beginner_ +- **Language**: _English_ +- **Programming Language**: _Python_ +- **Focus**: _Artificial Intelligence (AI), Machine Learning (ML), Deep Learning + (DL)_ +- **Discord Channel**: _stdy-neuronauts_ () +- **Start Date**: _March 21, 2025_ +- **Schedule**: _Every Friday at 11:30 PM (GMT+5:30)_ +- **Duration**: _1 hour_ +- **Frequency**: _Once a week_ +- **Video Call Link**: [Google Meet](https://meet.google.com/fpp-saum-qhg) +- **Google Calendar Link**: + [Add to Calendar](https://calendar.google.com/calendar/event?action=TEMPLATE&tmeid=N3FkdHZrMDFrMTVxYzY0ZDMzYmcyOWpjcjlfMjAyNTAzMTRUMTgwMDAwWiBmMjAyMTIxNzlAZ29hLmJpdHMtcGlsYW5pLmFjLmlu&tmsrc=f20212179%40goa.bits-pilani.ac.in&scp=ALL) + +## Join a Study Group + +Interested in joining one of our active study groups? Connect with us on +[Discord](https://opensciencelabs.org/discord), click on **"Browse Channels"**, +and select the **study-groups** category to see all available groups. + +## Start Your Own Study Group + +If you're interested in starting a new study group, we would love to support +you! Please send an email to +[team@opensciencelabs.org](mailto:team@opensciencelabs.org) with the following +information: + +- **Moderator Details:** Name, email, and Discord username. +- **Group Name:** What will your study group be called? +- **Description:** What will your group focus on? +- **Target Audience:** Who should join your group? +- **Language:** Which language(s) will your group operate in? +- **Schedule:** Date, time, timezone, duration, and frequency of meetings. +- **Video Call Link:** Where will your meetings take place? (e.g., Google Meet, + Zoom, or a dedicated Discord video call room). +- **Google Calendar Link:** (Optional) If you have a public Google Calendar, + include a link for easy scheduling. + +For assistance setting up a video call room on Discord or any other inquiries, +don't hesitate to reach out to us! + +Join us on Discord diff --git a/pages/linkedin/index.md b/pages/linkedin/index.md new file mode 100644 index 000000000..1867f7547 --- /dev/null +++ b/pages/linkedin/index.md @@ -0,0 +1,11 @@ +--- +title: "Open Science Labs LinkedIn" +description: "Open Science Labs, sharing knowledge" +date: "2019-02-28" +authors: ["OSL Team"] +template: main.html +--- + + diff --git a/pages/opportunities/gsoc/guides/contributor/index.md b/pages/opportunities/gsoc/guides/contributor/index.md new file mode 100644 index 000000000..e9031cd7e --- /dev/null +++ b/pages/opportunities/gsoc/guides/contributor/index.md @@ -0,0 +1,101 @@ +# Google Summer of Code (GSoC) Contributor Guide + +This guide is intended for both prospective and accepted candidates of the GSoC +program with Open Science Labs. It provides detailed, objective instructions to +help navigate the application process, engage with mentors, and succeed during +the program period. The guide covers project selection, initial contributions, +proposal development, and expectations for approved contributors. + +## Candidates' Guide + +This section outlines the steps candidates should follow to apply effectively. + +### How to Apply + +#### Selecting a Sub-Organization/Project + +Candidates should begin by reviewing the list of available sub-organizations +under Open Science Labs and their projects. It is important to choose a project +that aligns with individual interests and skills. + +#### Initiating Contact with Projects and Mentors + +Candidates are advised to contact project mentors using the recommended +communication platform (discord, slack, email, etc). A brief introduction, +expression of interest, and any initial questions about the project or mentoring +process should be included. Each project or sub-organizations should specify the +recommended platform for all the communications with candidates. + +#### Making an Initial Contribution + +Demonstrating commitment early on is valuable. Candidates are encouraged to +contribute a small but meaningful improvement—such as fixing a minor bug or +implementing small features suggested by the mentor. + +#### Crafting a Proposal with Mentor Support + +Under mentor guidance, candidates should develop a detailed proposal that +outlines: + +- **Milestones and Timeline:** Specific tasks and expected outcomes within the + program period. +- **Contribution Impact:** How the work will further the project’s goals. +- **Language and Style:** Clear, informative, and objective language; concise + and focused content without unnecessary filler or marketing-style phrasing. + +Candidates should also ensure that proposals do not exhibit signs of complete AI +generation, such as excessive buzzwords or generic phrasing. While AI tools may +be used to enhance clarity, the proposal must reflect the candidate’s own work. + +It is essential to review the +[contributor rules](https://summerofcode.withgoogle.com/rules) for the program +and follow the proposal template provided +[here](/opportunities/gsoc/templates/contributor-proposal). + +## Review Process + +Mentors will evaluate proposals to determine if candidates meet the fundamental +requirements for effective contribution. Transparent feedback will be provided, +and candidates may be guided to consider alternative projects if a better fit is +identified. When a proposal is ready for review, candidates should send a direct +message to the mentors via the recommended communication channel (e.g., Discord, +Slack, or email). For all other communications, public channels are preferred. +Candidates should remain patient as mentors manage a high volume of messages, +issues, pull requests, and reviews. + +## Approved Contributors + +For accepted candidates, the following guidelines serve as a roadmap for +successful collaboration during the GSoC program with Open Science Labs. + +### Effective Workflow and Proactivity + +- **Establish a Regular Workflow:** Work closely with your mentor to set clear + weekly objectives. +- **Proactive Engagement:** Actively seek tasks, ask clarifying questions, and + schedule regular check-ins to monitor progress. + +### Communication Best Practices + +- **Timely Updates:** Keep mentors informed about progress, challenges, and any + required assistance. +- **Use Designated Channels:** Communicate via the project’s preferred platforms + to ensure transparency and prompt feedback. + +### Programming Best Practices + +- **Adherence to Standards:** Follow the coding standards and best practices + outlined by your mentor and project guidelines. +- **Maintainable Code:** Write clean, well-documented, and maintainable code. +- **Constructive Feedback:** Embrace code reviews as opportunities to learn and + improve your technical skills. + +## Proposal Resources + +Candidates are encouraged to consult the +[GSoC Student Guide](https://google.github.io/gsocguides/student/) for +comprehensive details on the application process and proposal preparation. +Additional recommendations can be found +[here](https://developers.google.com/open-source/gsoc/help/student-advice). For +further guidance, refer to the suggested proposal template available +[here](/opportunities/gsoc/templates/contributor-proposal). diff --git a/pages/opportunities/gsoc/index.md b/pages/opportunities/gsoc/index.md new file mode 100644 index 000000000..87e9dc5fd --- /dev/null +++ b/pages/opportunities/gsoc/index.md @@ -0,0 +1,64 @@ +--- +title: "Google Summer of Code with Open Science Labs" +description: "Google Summer of Code with Open Science Labs" +date: "2025-02-01" +authors: ["OSL Team"] +template: single-sidebar.html +--- + +# Google Summer of Code (GSoC) at Open Science Labs + +Open Science Labs plans to apply for GSoC 2026. Stay tuned! + +## About Google Summer of Code + +Google Summer of Code offers students worldwide the chance to contribute to open +source projects over the summer. This initiative is not only about coding; it's +about learning the open source culture, understanding project maintenance, and +improving software alongside experienced mentors. + +For more information about GSoC, check out its official web page at +. + +### Why Participate with OSL? + +OSL has participated in GSoC since 2023: in 2023 and 2024 as a NumFOCUS +sub-organization, and in 2025 as an independent Mentoring Organization. + +OSL provides robust support to budding open-source enthusiasts through +structured projects that enhance both learning and contribution. + +### Project Ideas Submission + +Mentors play a crucial role at GSoC, providing guidance and expertise to help +shape the next generation of open source contributors. If you have a project +that could use enhancements or require tricky bug fixes, please propose your +ideas. We welcome initial drafts, and if accepted, there will be time to refine +these ideas further. + +The current list of project ideas can be found +[here](/opportunities/gsoc/project-ideas). + +If you are considering submitting your project idea to OSL, please send your +project by email to by January 31, 2026. Check out +our project idea template for more insights: +. + +Additionally, all discussions about OSL participation in GSoC will happen on our +Discord server at . + +### For Potential Contributors + +If you're a student or a newcomer eager to get involved in open source through +GSoC, stay tuned to this page for updates on project ideas and submission +guidelines. Check out our +[Contributor Guide](/opportunities/gsoc/guides/contributor) for more details on +how to prepare for your application and stay updated with our project idea pages +to check which projects are applying with us to GSoC. + +### Reach Out for More Information + +For any inquiries or to discuss project ideas, feel free to reach out at +`team@opensciencelabs.org`. Also, join us on our Discord server at +, where all discussions with mentors and +contributors will take place. diff --git a/pages/opportunities/gsoc/project-ideas/index.md b/pages/opportunities/gsoc/project-ideas/index.md new file mode 100644 index 000000000..0be986f21 --- /dev/null +++ b/pages/opportunities/gsoc/project-ideas/index.md @@ -0,0 +1,97 @@ +--- +title: "GSoC Project Ideas" +description: "GSoC Project Ideas" +date: "2025-02-01" +authors: ["OSL Team"] +template: single-sidebar.html +--- + +# OSL Project Ideas for GSoC 2026 + +> - **Note 1:** This is the list of projects we intend to propose for **GSoC +> 2026** (subject to change). +> - **Note 2:** The **GSoC 2026 Mentoring Organization** application has not +> opened yet. **Stay tuned!** + +Welcome to the Open Science Labs (OSL) project ideas page for Google Summer of +Code 2026. As an umbrella organization, OSL hosts links to the ideas pages of +each member organization. You can explore these projects here. + +At OSL, we've assembled a selection of project ideas that not only embody our +mission but also provide enriching experiences for student and newcomers +open-source developpers. These projects cover a variety of topics and +technologies, catering to diverse interests. Below, we've outlined some +potential project ideas we're considering for GSoC. We believe these projects +provide students with a valuable chance to engage with open-source efforts and +develop their skills under the mentorship of seasoned professionals. + +This page details the sub-organizations available for GSoC 2026 participants. +Applicants are welcome to reach out to us on our +[Discord](https://opensciencelabs.org/discord). + +## Sub-Organizations + +_Note: Each organization includes a designated list of mentors. Please get in +touch with them directly if you have any inquiries._ + +### Alpha One Labs + +- **Description**: Alpha One Labs is an education platform designed to + facilitate both learning and teaching. The platform provides a comprehensive + environment where educators can create and manage courses, while students can + learn, collaborate, and engage with peers. With features like study groups, + peer connections, and discussion forums, we aim to create a collaborative + learning environment that goes beyond traditional online education. +- **Project WEB Page**: +- **Repository**: +- **Communication channel**: + [Slack](https://join.slack.com/t/alphaonelabs/shared_invite/zt-7dvtocfr-1dYWOL0XZwEEPUeWXxrB1A) +- **Project Ideas**: + [link](https://github.com/alphaonelabs/alphaonelabs-education-website/wiki/GSOC-2026-Ideas) + +### ArxLang/IRx + +- **Description**: IRx aims to provide a translator to LLVM-IR from ASTx + objects. IRx uses llvmlite in order to generate LLVM-IR source and binary + generation. +- **Project WEB Page**: +- **Repository**: +- **Communication channel**: [Discord](https://arxlang.org/discord) +- **Project Ideas**: [link](https://github.com/arxlang/irx/wiki/Project-Ideas) + +### Hiperhealth + +- **Description**: Hiperhealth provides a set of tools and libraries for health + care services empowered by AI. It includes screening, diagnosis, treatments, + prescriptions, clinical records, etc. +- **Project WEB Page**: +- **Repository**: +- **Communication channel**: [Discord](https://discord.gg/Nu4MdGj9jB) +- **Project Ideas**: [link](https://github.com/sdx-org/sdx/wiki/Project-Ideas) + +### Sugar (swarm-external-secrets) + +- **Description**: swarm-external-secrets is a Docker plugin that bridges + external secrets management systems with Docker Swarm's native secrets + infrastructure. +- **Project WEB Page**: +- **Repository**: +- **Communication channel**: [Discord](https://discord.gg/4NYdBu7bZy) +- **Project Ideas**: + [link](https://github.com/sugar-org/swarm-external-secrets/wiki/Project-Ideas) + + diff --git a/pages/opportunities/gsoc/templates/contributor-proposal.md b/pages/opportunities/gsoc/templates/contributor-proposal.md new file mode 100644 index 000000000..4dd320096 --- /dev/null +++ b/pages/opportunities/gsoc/templates/contributor-proposal.md @@ -0,0 +1,117 @@ +--- +title: "TEMPLATE: GSoC Contributor Project Proposal" +description: "TEMPLATE: GSoC Contributor Project Proposal" +date: "2024-01-09" +authors: ["OSL Team"] +template: single-sidebar.html +--- + +# GSoC Contributor Project Proposal + + + +```md +# {{ Project Proposal Name }} + +## Candidate Info + +- **Name:** {{ Candidate's Name }} +- **GitHub:** {{ Candidate's GitHub URL }} +- **Email:** {{ Candidate's Email }} +- **Twitter/X:** {{ Candidate's Twitter/X URL }} +- **University Course:** {{ Current or Last University Course Name }} +- **University:** {{ Current or Last University Name }} +- **Time Zone:** {{ Candidate's Current Timezone }} + +**Bio:** + +{{ Provide a one or two-paragraph bio of the candidate. }} + +## Project Overview + +- **Project:** {{ Desired Project Name }} +- **Project Idea/Plan:** {{ Desired Project Idea }} +- **Expected Time (hours):** {{ Total Time Dedicated Over 3 Months }} + +### Abstract + +{{ Provide a brief abstract of the project idea/plan. }} + +### Mentors + +{{ List the mentors for this project proposal. }} + +### Technical Details + +{{ Detail each task, providing technical specifics, relevant reference links, and +preliminary solution ideas. Include findings from any preliminary research +undertaken to address the issue, along with links to the specific segments of +code slated for modification or improvement. }} + +### Benefits to the Community + +{{ Explain how the project will benefit the community or users. }} + +## Deliverables and Timeline + +## Timeline + +{{ Outline a comprehensive timeline for this project, specifying crucial +milestones, deliverables, and tasks. Incorporate the Community Bonding Period, +development of new features, resolution of bugs, enhancements to documentation, +creation of tutorials, and preparation of blog posts. Break down each task to +ensure clarity. It is mandatory for collaborators to write regular blog posts. +Highly encouraged is the creation of individual blog posts for each significant +feature developed, bug fixed, or any notable progress made. }} + +| Dates | Deliverables/Tasks | +| :---- | :----------------- | +| | | + +## Previous Contributions to the Project + +{{ Summarize your contributions to the project, including the number of merged +PRs, resolved issues, or types of contributions. }} + +### Pull Requests + +{{ List all contributed PRs with titles, numbers, links, and their status. }} + +| Pull Request Title/Number | Status | +| :------------------------ | :----- | +| | | + +## Why This Project? + +{{ Explain your motivation for choosing this project. }} + +## Availability + +{{ Confirm your availability during the GSoC period, including weekly hours, other +commitments, and a plan for catching up if behind schedule. }} + +## Post-GSoC + +{{ Outline any plans for continuing contributions to the project post GSoC. }} +``` diff --git a/pages/opportunities/gsoc/templates/project-ideas.md b/pages/opportunities/gsoc/templates/project-ideas.md new file mode 100644 index 000000000..03f3f7331 --- /dev/null +++ b/pages/opportunities/gsoc/templates/project-ideas.md @@ -0,0 +1,81 @@ +--- +title: "TEMPLATE: GSoC Project Idea" +description: "TEMPLATE: GSoC Project Idea" +date: "2025-02-01" +authors: ["OSL Team"] +template: single-sidebar.html +--- + +# GSoC Project Idea Template + + + +```md +# {{ PROJECT/LIBRARY/TOOL NAME }} + +## Project Idea {{ PROJECT NUMBER }}: {{ TITLE }} + +### Abstract + +{{ ABSTRACT }} + +### License + +{{ LICENSE NAME }}: {{ LINK TO THE LICENSE FILE }} + +### Code of Conduct + +{{ LINK TO THE CODE OF CONDUCT }} + +### Current State + +- {{ BRIEF EXPLANATION ABOUT THE CURRENT STATE OF THE PROJECT }} + +### Tasks + +- {{ LIST OF THE GITHUB/GITLAB ISSUES }} + +### Expected Outcomes + +- {{ LIST OF THE EXPECTED OUTCOMES }} + +### Details + +- Prerequisites: + - {{ LIST OF ALL HARD AND SOFT SKILLS NECESSARY FOR WORKING ON THE TASKS }} +- Duration: {{ 90, 175 or 350 }} hours +- Complexity: {{ Low, Medium, or High }} +- Potential Mentor(s): {{ MENTOR NAME 1 }}, {{ MENTOR NAME 2 }}, ... + +### References + +- {{ LIST OF REFERENCES, SUCH AS LINKS TO MAIN TECHNOLOGIES, ETC }} + +--- + +{{ IF THERE ARE MORE PROJECTS IDEAS, PLEASE ADD THEM HERE }} +``` diff --git a/pages/opportunities/guides/contribution/index.md b/pages/opportunities/guides/contribution/index.md new file mode 100644 index 000000000..99b08085e --- /dev/null +++ b/pages/opportunities/guides/contribution/index.md @@ -0,0 +1,70 @@ +--- +title: "Contribution Guidelines" +description: "Contribution Guidelines" +date: "2025-03-23" +authors: ["OSL Team"] +template: single-sidebar.html +--- + +# Contribution Guidelines + +These recommendations are general guidelines from Open Science Labs. Each +project may have its own specific set of recommendations and rules; contributors +should review those for each project. + +## Community Engagement + +- **Communication Platforms:** Each project may use its preferred communication + platform for discussions, such as code repository platforms (GitHub, GitLab, + etc.) or chat-based platforms (Discord, Slack, etc.). Contributors should + verify with the community and mentors which platform is recommended for + seeking assistance, discussing ideas, and requesting reviews. + +- **Collaboration and Support:** Contributors are encouraged to assist others + when possible, as everyone is here to learn and support one another. + +- **Respect and Inclusivity:** Contributors should communicate with kindness and + respect, particularly when interacting with beginners or colleagues for whom + English may not be their first language. Instead of engaging in arguments, + they should offer constructive feedback and encouragement to help others + improve both their language and technical skills. + +- **Channel Usage:** If the primary discussion channel is not the code + repository platform, contributors should use the designated platform to draw + attention to pull requests or issues. Initiating a discussion there prior to + opening issues or pull requests is also expected. + +## Contributions + +- **Task Coordination:** Contributors should avoid duplicating work by verifying + whether someone else is already addressing a task or if the task remains + relevant before beginning work. + +- **Managing Stale Contributions:** Project maintainers may implement mechanisms + to label and close stale issues and pull requests. Some contributors open pull + requests without following up or addressing review recommendations, which can + impede progress. + +- **Branch Management:** When updating a branch, contributors should follow the + project's preferred approach, whether that involves using a **rebase** or a + **merge commit**. + +- If your PR is not ready yet for review, please keep it in **draft mode**. + +## Coding Tips + +- Ensure that `pre-commit` is applied to your branch before opening a pull + request. Run `pre-commit install` to enable pre-commit hooks, ensuring they + are applied automatically before every commit. +- Avoid excessive nesting. Try to keep nesting levels to **four or fewer** for + better readability and maintainability. +- Follow the project's specific coding guidelines. Review them regularly to + ensure consistency across contributions. +- Remove any unnecessary comments. In most cases, if you need to explain what + your code does, it may indicate that the code is unclear or overly complex. + This is also often a sign of code generated by Generative AI. +- Do not use emojis in comments. This is typically seen as a red flag and may + suggest improper use of AI-generated content. +- Ensure there is an empty line at the end of each file. GitHub highlights + missing end-of-file newlines with a red icon. Configure your IDE to + automatically add this final newline. diff --git a/pages/opportunities/index.md b/pages/opportunities/index.md new file mode 100644 index 000000000..a0e5f5c69 --- /dev/null +++ b/pages/opportunities/index.md @@ -0,0 +1,77 @@ +--- +title: "Opportunities" +description: "Opportunities with Open Science Labs" +date: "2024-08-17" +authors: ["OSL Team"] +--- + +## Open Source Software (OSS) Internships + +Open Science Labs (OSL) provides a valuable opportunity for newcomers to +open-source software development through its internship program. This program is +designed to deepen participants' understanding of open-source tools and best +practices in a real-world setting. We invite candidates to seize this chance to +enhance their skills and contribute to real projects. + +Interns typically work on an unpaid basis, helping to advance these projects +while gaining practical experience. Where available, project maintainers can +compensate interns through our fiscal host, +[Open Source Collective](https://opencollective.com/osl). Mentors are expected +to commit at least 5 hours per week, with daily reviews recommended to monitor +progress and provide feedback. + +Learn more +here + +## Open Source Software (OSS) Research Seed Internships + +Open Source Software (OSS) Research Seed Program is a new initiative at Open +Science Labs designed to help researchers start open source projects from +scratch. The program requires researchers to provide clear documentation, +detailed GitHub issues, and a structured project plan for a 3–6 month internship +period, with all projects released under an open source license. + +Interns typically work on an unpaid basis, helping to advance these projects +while gaining practical experience. Where available, project maintainers can +compensate interns through our fiscal host, +[Open Source Collective](https://opencollective.com/osl). Mentors are expected +to commit at least 5 hours per week, with daily reviews recommended to monitor +progress and provide feedback. + +Overall, the program supports early-stage project development through +collaboration between interns and experienced mentors, helping new projects +integrate into the broader open source community. + +Learn +more here + +## Google Summer of Code + +Open Science Labs has participated in the Google Summer of Code under the +NumFOCUS umbrella in 2023 and 2024. If you are interested in contributing to +projects under the OSL umbrella for Google Summer of Code 2025, please click on +the following link: + +Learn more here + +For updates about our 2025 participation, please join our community on Discord: +[https://opensciencelabs.org/discord](https://opensciencelabs.org/discord). + +## Data Science Internships + +Open Science Labs (OSL) is excited to announce the upcoming launch of a new +internship program dedicated to Data Science projects. This initiative will +provide hands-on experience in real-world data science applications. + +Interns typically work on an unpaid basis, helping to advance these projects +while gaining practical experience. Where available, project maintainers can +compensate interns through our fiscal host, +[Open Source Collective](https://opencollective.com/osl). Mentors are expected +to commit at least 5 hours per week, with daily reviews recommended to monitor +progress and provide feedback. + +For those interested in participating, we invite you to join our community on +Discord for the latest updates and launch details: + +Join OSL +on Discord diff --git a/pages/opportunities/internships/guides/index.md b/pages/opportunities/internships/guides/index.md new file mode 100644 index 000000000..d185ba1e1 --- /dev/null +++ b/pages/opportunities/internships/guides/index.md @@ -0,0 +1,7 @@ +--- +title: "OSL Internship Program Guideline" +description: "Internship Program Guideline" +date: "2023-10-30" +authors: ["OSL Team"] +template: single-sidebar.html +--- diff --git a/pages/opportunities/internships/guides/interns/index.md b/pages/opportunities/internships/guides/interns/index.md new file mode 100644 index 000000000..8e63dd985 --- /dev/null +++ b/pages/opportunities/internships/guides/interns/index.md @@ -0,0 +1,93 @@ +--- +title: "OSL Internship Program Guideline" +description: "Internship Program Guideline" +date: "2023-10-30" +authors: ["OSL Team"] +template: single-sidebar.html +--- + +# Open Science Labs Interns Guide + +Welcome to the Open Science Labs Internship Program Guide. This comprehensive +document is your gateway to engaging with a network of professionals and peers +dedicated to the advancement of open science and open source. Whether you're +considering applying to our program or you've already been accepted, this guide +is designed to facilitate a smooth transition into our collaborative +environment. You'll find detailed instructions on how to apply, connect with +sub-organizations, and make the most of your internship once you're on board. +It's more than just an internship—it's a chance to contribute to a global +movement and develop skills that will serve you throughout your career. Let's +embark on this exciting journey together. + +## Part I: Prospective Candidates + +Embarking on the journey to become an intern with Open Science Labs is a step +towards significant personal and professional development. This part of the +guide is tailored to assist you in navigating the application process +seamlessly. It provides insights on how to identify and select a project that +resonates with your passion, how to engage with mentors proactively, and how to +make preliminary contributions that will set you apart. Let's get started on a +path that leads to growth and exciting opportunities in open science and +technology. + +### 1. How to Apply + +#### 1.1. Choosing a Sub-Organization and Project + +Begin by exploring the list of available sub-organizations and their projects. +Look for one that aligns with your interests and skills. + +#### 1.2. Initiating Contact with Projects and Mentors + +Reach out to the project mentors via the contact information provided. Introduce +yourself, express your interest, and ask any initial questions you may have +about the project or the mentoring process. + +#### 1.3. Making a Small Contribution + +Demonstrate your commitment by making a small contribution to the project. This +could be fixing a minor bug, improving documentation, or any other task as +suggested by the mentor. + +#### 1.4. Crafting a Proposal with Mentor Support + +With your mentor's guidance, develop a detailed proposal outlining what you aim +to achieve during the internship. This should include specific milestones, a +timeline, and how your work will contribute to the project's goals. + +**Note on Mentor Evaluation**: Mentors will assess if candidates possess the +basic requirements to contribute effectively to the project. Transparent +feedback will be provided, allowing candidates to shift to another project if +necessary to ensure a suitable fit. + +## Part II: Approved Interns + +Congratulations on being selected as an intern! This part of the guide will +serve as a roadmap to your success in the Open Science Labs program. It outlines +the expectations for your collaboration with mentors, the importance of +communication, and the coding standards you should follow. You will find tips on +how to maintain an effective workflow, stay proactive, and ensure that your +contribution leaves a lasting impact. Welcome to the team — your proactive +journey starts here. + +### Effective Workflow and Proactivity + +Once accepted, establish a regular workflow with your mentor. Be proactive: seek +out tasks, ask questions, and push beyond the basics. Set up frequent check-ins +and be clear about what you aim to accomplish each week. + +### Communication Best Practices + +Clear and timely communication is essential. Keep your mentor updated on your +progress, challenges, and any assistance you may require. Use the communication +tools preferred by the project for all discussions. + +### Programming Best Practices + +Adhere to the programming standards and best practices recommended by your +mentor and the project. Write clean, well-documented, and maintainable code. Be +open to code reviews and feedback, as they are learning opportunities. + +By following these guidelines, both candidates and approved interns can maximize +their growth, contributions, and overall experience within the Open Science Labs +Internship Program. diff --git a/pages/opportunities/internships/oss-research-seed/index.md b/pages/opportunities/internships/oss-research-seed/index.md new file mode 100644 index 000000000..4c67403be --- /dev/null +++ b/pages/opportunities/internships/oss-research-seed/index.md @@ -0,0 +1,97 @@ +--- +title: "OSL Open Source Research Seed Internship Program" +description: "Internship Research Seed Internship Program" +date: "2023-11-03" +authors: ["OSL Team"] +template: single-sidebar.html +--- + +# Open Source Software (OSS) Research Seed Internship Program + +This document provides guidelines for both open-source research project +maintainers and internship candidates for the OSS Research Seed Internship +Program at Open Science Labs (OSL). + +## Overview + +The OSS Research Seed Internship Program is designed to support research +projects that deliver open source software. At OSL, we are committed to bridging +the gap between academic research and practical software development by helping +researchers launch new projects from scratch. + +The program emphasizes creating a viable open-source deliverable through the +collaboration of interns and active mentorship from the project's author. This +initiative operates in partnership with The GRAPH Network, ensuring a structured +and supportive environment for project development. + +## Program Structure + +Modeled after initiatives like Google Summer of Code, the program includes: + +- **Open Participation:** Applications are welcome from students, researchers, + and professionals interested in transforming research ideas into functional + open-source research projects. Applicants should submit their project + proposals directly to designated mentors. +- **Flexible Commitment:** Participants are expected to commit a minimum of 20 + hours per week for a period of 3 to 6 months, depending on the project’s scope + and the candidate's availability. +- **Rolling Applications:** Candidates may apply at any time, ensuring + continuous access to the program without the constraints of fixed cycles. +- **Mentorship and Support:** Each project is paired with a mentor who commits + at least 5 hours per week to provide daily feedback and support via a public + communication channel (e.g., Discord). +- **Continuous Reporting:** Interns are expected to document their progress in a + blog post (on OSL Blog) through periodic blog posts (every one or two weeks), + detailing the tasks completed during that period. We recommend breaking down + tasks into small, manageable pull requests to facilitate frequent updates. +- **Compensation Options:** Although the internship is primarily unpaid, project + maintainers may choose to offer compensation through our fiscal host, the + [Open Source Collective](https://opencollective.com/osl), if funding is + available. + +## Requirements for Internship Candidates + +Candidates should meet the following criteria: + +- **English Proficiency:** Effective communication in English is required for + collaboration. +- **Age Requirement:** Applicants must be at least 18 years old. +- **Time Commitment:** A minimum of 20 hours per week is required during the + internship period. +- **Opportunity Nature:** This is primarily an unpaid internship designed to + provide practical experience and build professional networks. If any + compensation is available, it will be specified by the mentors in the + internship announcement. +- **Initial Contribution:** Candidates must demonstrate commitment by making a + preliminary contribution to their chosen project, allowing mentors to assess + their skills and dedication. +- **Project Criteria:** Proposals must include a detailed description, a set of + initial GitHub issues, and a structured project plan for the internship + period. All projects must be licensed under an OSI-approved open source + license. Please check our template + [here](/opportunities/internships/templates/candidate-proposal). + +## Guidelines for Open-Source Research Project Author + +If you are the author of an open-source research project, you can submit your +project for affiliation with OSL and eligibility for this internship program. +Please send a link to your project proposal to `team@opensciencelabs.org` using +the template provided +[here](/opportunities/internships/templates/projects-ideas). + +Although pre-existing code is not required to apply for this program, each +project must have an open repository (e.g., on GitHub or GitLab) with open +issues detailing the planned activities and documentation outlining the project +idea (for example, on the project wiki). The project idea should include a +detailed description, a set of initial GitHub issues, and a structured project +plan for the internship period. All projects must be licensed under an +OSI-approved open source license. + +Affiliated projects will benefit from intern contributions, receive community +support, and, where available, secure funding to support further development. + +--- + +This program offers a pathway for individuals to turn research ideas into +tangible open-source projects. If you meet the requirements and are passionate +about contributing to the open science community, we encourage you to apply. diff --git a/pages/opportunities/internships/oss-research-seed/project-ideas/index.md b/pages/opportunities/internships/oss-research-seed/project-ideas/index.md new file mode 100644 index 000000000..428a3d88f --- /dev/null +++ b/pages/opportunities/internships/oss-research-seed/project-ideas/index.md @@ -0,0 +1,9 @@ +--- +title: "Open Source Software (OSS) Research Seed Project Ideas" +description: "Open Source Software (OSS) Research Seed Project Ideas" +date: "2025-03-16" +authors: ["OSL Team"] +template: single-sidebar.html +--- + + diff --git a/pages/opportunities/internships/oss/index.md b/pages/opportunities/internships/oss/index.md new file mode 100644 index 000000000..c21090793 --- /dev/null +++ b/pages/opportunities/internships/oss/index.md @@ -0,0 +1,88 @@ +--- +title: "OSL Open Source Internship Program" +description: "Internship Program details" +date: "2023-11-03" +authors: ["OSL Team"] +template: single-sidebar.html +--- + +# Open Source Internship Program + +This document provides guidelines for both open-source project maintainers and +internship candidates at Open Science Labs (OSL). + +## Overview + +OSL is committed to fostering innovation and growth within the open science and +open source communities. This internship program embodies that commitment by +providing a dynamic and supportive environment for contributors at all +levels—from students just stepping into the world of open-source to +professionals looking to refine their skills. + +This program operates in partnership with +[The GRAPH Network](https://thegraphnetwork.org), enhancing our reach and impact +across the scientific community. + +## Program Structure + +Modeled after Google Summer of Code, our program offers the following key +features: + +- **Open Participation**: Open to everyone from students to professionals, we + embrace diversity in knowledge and experience. Applicants should submit their + project ideas directly to the mentors via email. +- **Flexible Commitment**: Participants are expected to contribute a minimum of + 20 hours per week, allowing for substantial contribution while accommodating + personal schedules. +- **Rolling Applications**: We accept applications on a rolling basis, providing + flexibility to accommodate participants' timing and availability. This ensures + opportunities are accessible year-round, allowing you to engage when it suits + you best. +- **Final Presentation**: Participants will present their projects at the + program's conclusion, enhancing their public speaking and technical + communication skills. +- **Non-Monetary Rewards**: While the internship does not provide financial + compensation, it offers invaluable experience, mentorship, networking + opportunities, and the satisfaction of contributing to significant open-source + projects. + +## For Intern Candidates + +### Requirements + +Prospective interns must meet the following criteria: + +- **English Proficiency**: Effective communication in English is required for + collaboration within the program. +- **Age Requirement**: Applicants must be at least 18 years old at the time of + application. +- **Time Commitment**: A minimum of 20 hours per week is required during the + 3-month internship period. +- **Opportunity Nature:** This is primarily an unpaid internship designed to + provide practical experience and build professional networks. If any + compensation is available, it will be specified by the mentors in the + internship announcement. +- **Initial Contribution**: Candidates must make a preliminary contribution to + their chosen project, allowing mentors to evaluate their skills and + commitment. + +This program is perfect for those passionate about open science and eager to +contribute to our projects. If you meet these requirements and are ready to +engage with innovative projects, we encourage you to apply. + +For a full list of projects under the OSL umbrella, visit +[here](/projects/list/). To learn more, please contact the project maintainer +directly. + +## For Open-Source Project Contributors + +If you are a maintainer or core contributor of an open-source project, you can +submit your project for affiliation with OSL, making it eligible for our +Internship Program. + +For more information on affiliation, please visit +[Projects Affiliation](/projects/affiliation/). + +If your project is already affiliated with OSL, you can submit your project idea +proposal to `team@opensciencelabs.org`. Please use the template provided at +[Project Idea Template](/opportunities/internships/templates/projects-ideas/). diff --git a/pages/opportunities/internships/oss/project-ideas/index.md b/pages/opportunities/internships/oss/project-ideas/index.md new file mode 100644 index 000000000..bf003db49 --- /dev/null +++ b/pages/opportunities/internships/oss/project-ideas/index.md @@ -0,0 +1,98 @@ +--- +title: "OSS Project Ideas" +description: "OSS Project Ideas" +date: "2025-02-01" +authors: ["OSL Team"] +template: single-sidebar.html +--- + +# OSL Project Ideas + +Welcome to the Open Science Labs (OSL) project ideas page for the Open Source +Software Internship. As an umbrella organization, OSL hosts links to the ideas +pages of each member organization. You can explore these projects here. + +At OSL, we've assembled a selection of project ideas that not only embody our +mission but also provide enriching experiences for student and newcomers +open-source developpers. These projects cover a variety of topics and +technologies, catering to diverse interests. Below, we've outlined some +potential project ideas we're considering for the internship. We believe these +projects provide students with a valuable chance to engage with open-source +efforts and develop their skills under the mentorship of seasoned professionals. + +This page details the sub-organizations available for the internship +participants. Applicants are welcome to reach out to us on our +[Discord](https://opensciencelabs.org/discord) or directly contact the +sub-oganization/project mentors. + +## Sub-Organizations + +_Note: Each organization includes a designated list of mentors. Please get in +touch with them directly if you have any inquiries._ + +### ArxLang/IRx + +- **Description**: IRx aims to provide a translator to LLVM-IR from ASTx + objects. IRx uses llvmlite in order to generate LLVM-IR source and binary + generation. +- **Project WEB Page**: +- **Repository**: +- **Communication channel**: [Discord](https://arxlang.org/discord) +- **Project Ideas**: [link](https://github.com/arxlang/irx/wiki/Project-Ideas) +- **Compensation**: Unpaid + +### Makim + +- **Description**: Makim is based on **make** and focus on improving the way to + define targets and dependencies. Instead of using the Makefile format, it uses + yaml format. +- **Project WEB Page**: +- **Repository**: +- **Communication channel**: [Discord](https://opensciencelabs.org/discord) +- **Project Ideas**: + [link](https://github.com/osl-incubator/makim/wiki/Project-Ideas) +- **Compensation**: Unpaid + +### Rago + +- **Description**: Rago is a lightweight framework for RAG. +- **Project WEB Page**: +- **Repository**: +- **Communication channel**: [Discord](https://opensciencelabs.org/discord) +- **Project Ideas**: + [link](https://github.com/osl-incubator/rago/wiki/Project-Ideas) +- **Compensation**: Unpaid + +### SciCookie + +- **Description**: SciCookie creates new python project's structure from an + opinionated project template. +- **Project WEB Page**: +- **Repository**: +- **Communication channel**: [Discord](https://opensciencelabs.org/discord) +- **Project Ideas**: + [link](https://github.com/osl-incubator/scicookie/wiki/Project-Ideas) +- **Compensation**: Unpaid + +### SDX + +- **Description**: SDX provides a set of tools and libraries for health care + services empowered by AI. It includes screening, diagnosis, treatments, + prescriptions, clinical records, etc. +- **Project WEB Page**: +- **Repository**: +- **Communication channel**: [Discord](https://discord.gg/Nu4MdGj9jB) +- **Project Ideas**: [link](https://github.com/sdx-org/sdx/wiki/Project-Ideas) +- **Compensation**: Unpaid + +### Sugar + +- **Description**: Sugar organizes your stack of containers, gathering some + useful scripts and keeping this information centralized in a configuration + file with a friendly command line interface. +- **Project WEB Page**: +- **Repository**: +- **Communication channel**: [Discord](https://opensciencelabs.org/discord) +- **Project Ideas**: + [link](https://github.com/osl-incubator/sugar/wiki/Project-Ideas) +- **Compensation**: Unpaid diff --git a/pages/opportunities/internships/templates/candidate-proposal/index.md b/pages/opportunities/internships/templates/candidate-proposal/index.md new file mode 100644 index 000000000..0ae3fff30 --- /dev/null +++ b/pages/opportunities/internships/templates/candidate-proposal/index.md @@ -0,0 +1,114 @@ +--- +title: "Intern Project Proposal Template" +description: "Intern Project Proposal Template" +date: "2024-01-09" +authors: ["OSL Team"] +template: single-sidebar.html +--- + +``` +Instructions: + +* Remove HTML Comments: Please delete all content found within HTML + comment tags, denoted by (in the source code of this file). +* Replace Placeholders: Look for text enclosed in square brackets [ and ]. + Replace this placeholder text with relevant information. +* Remove Square Brackets: After replacing the placeholders, ensure to remove + the square brackets [ and ] themselves. +``` + +```md +# [Project Proposal Name] + +## Candidate Info + +- **Name:** [Candidate's Name] +- **GitHub:** [Candidate's GitHub URL] +- **Email:** [Candidate's Email] +- **Twitter/X:** [Candidate's Twitter/X URL] +- **University Course:** [Current or Last University Course Name] +- **University:** [Current or Last University Name] +- **Time Zone:** [Candidate's Current Timezone] + +**Bio:** + +[Provide a one or two-paragraph bio of the candidate.] + +## Project Overview + +- **Project:** [Desired Project Name] +- **Project Idea/Plan:** [Desired Project Idea] +- **Expected Time (hours):** [Total Time Dedicated Over 3 Months] + +### Abstract + +[Provide a brief abstract of the project idea/plan.] + +### Mentors + +[List the mentors for this internship project.] + +### Implementation Plan + +[Describe the tasks according to the project plan/idea.] + +### Benefits to the Community + +[Explain how the project will benefit the community or users.] + +## Planned Workflow + +[Detail your planned workflow, including the project management methodology, +frequency and focus of mentor meetings, progress tracking, and task management +strategies.] + +## Deliverables + +[List all expected deliverables, such as new features, documentation updates, +tutorials, and blog posts. Consider writing a blog post for each major feature +or bug fix.] + +## Timeline + +[Provide a detailed timeline of the internship, including key dates and tasks. +This should include Community Bonding Period activities, task periods, blog post +submission dates, and Midterm and Final evaluation schedules.] + +| Dates | Tasks | +| :---- | :---- | +| | | + +## Previous Contributions to the Project + +[Summarize your contributions to the project, including the number of merged +PRs, resolved issues, or types of contributions.] + +### Pull Requests + +[List all contributed PRs with titles, numbers, links, and their status.] + +| Pull Request Title/Number | Status | +| :------------------------ | :----- | +| | | + +### Issues + +[List all resolved issues with titles, numbers, links, and their status.] + +| Issue Title/Number | Status | +| :----------------- | :----- | +| | | + +## Why This Project? + +[Explain your motivation for choosing this project.] + +## Availability + +[Confirm your availability during the internship, including weekly hours, other +commitments, and a plan for catching up if behind schedule.] + +## Post-OSL Internship Program + +[Outline any plans for continuing contributions to the project post-internship.] +``` diff --git a/pages/opportunities/internships/templates/projects-ideas/index.md b/pages/opportunities/internships/templates/projects-ideas/index.md new file mode 100644 index 000000000..623484781 --- /dev/null +++ b/pages/opportunities/internships/templates/projects-ideas/index.md @@ -0,0 +1,67 @@ +--- +title: "Projects Ideas Template" +description: "Projects Ideas Template" +date: "2023-11-01" +authors: ["OSL Team"] +template: single-sidebar.html +--- + +``` +Instructions: + +* Remove HTML Comments: Please delete all content found within HTML + comment tags, denoted by (in the source code of this file). +* Replace Placeholders: Look for text enclosed in square brackets [ and ]. + Replace this placeholder text with relevant information. +* Remove Square Brackets: After replacing the placeholders, ensure to remove + the square brackets [ and ] themselves. +* Add Additional Content: If you have more Project Ideas to include, please + add them at the end of the document. Follow the provided template format for + consistency. +``` + +```md +# [Project Name] + +[Project Summary] + +- **Project License:** [Link to the project license] +- **Code of Conduct:** [Link to the code of conduct] +- **Documentation:** [Link to the documentation page] +- **Compensation:** [Specify if compensation is provided by the mentor or if + this is an unpaid internship] + +## Project Idea 1: [Project Idea 1 Title] + +### Abstract + +[Short summary or abstract of Project Idea 1] + +### Current State + +[Current status or progress of Project Idea 1] + +### Tasks + +[List of specific tasks for Project Idea 1] + +### Expected Outcomes + +[Desired results or achievements for Project Idea 1] + +### Details + +- Prerequisites: + - [List prerequisites here] +- Expected Time: [#] hours (note: minimum 350 hours) +- Potential Mentor(s): [Mentor 1, Mentor 2, ...] + + +### References + +[Include any relevant links or resources for this project idea] + +--- + + +``` diff --git a/pages/partnership/index.md b/pages/partnership/index.md new file mode 100644 index 000000000..e1f8185d5 --- /dev/null +++ b/pages/partnership/index.md @@ -0,0 +1,51 @@ +--- +title: "Partners Program" +description: "Partners Program" +date: "2023-08-27" +authors: ["OSL Team"] +template: main.html +--- + +# Become a Partner with Open Science Labs + +Open Science Labs (OSL) is committed to advancing open science and open-source +technology through collaboration with diverse partners. By joining forces with +OSL, your organization can play a pivotal role in shaping the future of +scientific research and technological innovation. We welcome partnerships with +academic institutions, industry leaders, non-profits, and community groups. + +## Benefits of Partnership + +Partnership with OSL offers numerous benefits: + +- **Enhanced Visibility**: Gain recognition within and beyond the OSL community + through joint projects, events, and promotional activities. +- **Collaborative Opportunities**: Work alongside renowned experts in open + science and technology on projects that are at the forefront of innovation. +- **Resource Sharing**: Leverage OSL's network of resources, expertise, and + platforms to accelerate your own projects and initiatives. +- **Community Engagement**: Engage with a vibrant community of researchers, + developers, and enthusiasts dedicated to open-source collaboration and + knowledge sharing. + +## How You Can Contribute + +Partners can contribute in various ways: + +- **Project Collaboration**: Bring your projects under the OSL umbrella to + benefit from our incubator and internship programs. +- **Mentorship**: Provide expertise and guidance to budding scientists and + developers in our community. +- **Financial Support**: Contribute through funding to help sustain and grow + OSL's activities and infrastructure. +- **Resource Provision**: Offer tools, datasets, or platforms that can aid in + the development of open-source projects. + +## How to Apply + +If your organization is interested in partnering with Open Science Labs, please +reach out to us via email at `team@opensciencelabs.org`. We are eager to discuss +potential collaboration and how we can work together to make a significant +impact in the realm of open science. + +Together, we can build a more open, collaborative, and innovative future. diff --git a/pages/partnership/open-proposals/community-training/index.md b/pages/partnership/open-proposals/community-training/index.md new file mode 100644 index 000000000..3d02efb07 --- /dev/null +++ b/pages/partnership/open-proposals/community-training/index.md @@ -0,0 +1,121 @@ +--- +title: "Open Proposal: Community Training" +description: "Open Proposal: Community Training" +date: "2025-03-23" +authors: ["OSL Team"] +template: single-sidebar.html +--- + +# Project: Community Training + +## Executive Summary + +Community Training is an initiative designed to create a centralized online +platform for training and certifying community facilitators. The program will +offer courses on topics such as Diversity, Equity, and Inclusion (DEI), +effective communication, project management, inclusive language, and basic +pedagogical principles. Successful participants will earn digital badges +displayed on their public profiles. This initiative aims to enhance community +management by equipping facilitators with the skills needed to support their +communities effectively. + +## Background / Problem Statement + +Many digital communities lack a standardized resource for training facilitators +in effective management and communication. Without proper guidance, those in +leadership roles, such as project mentors and study group coordinators, may +struggle to address conflicts or guide community interactions. Community +Training addresses this gap by providing a structured program that ensures +facilitators are well-prepared to manage community issues and support +collaborative growth. + +## Objectives and Goals + +- **Objective:** Establish an online training platform to train and certify + community facilitators. +- **Goals:** + - Develop and deliver courses covering topcis such as: DEI, communication, + project management, inclusive language, and foundational pedagogical + methods. + - Implement an assessment system where successful participants earn digital + badges. + - Create a public profile system for certified facilitators to showcase their + credentials. + - Enhance overall community management through continuous learning and + mentorship. + +## Scope and Deliverables + +- **Scope:** + - Design and develop an online platform tailored for community facilitator + training. + - Create curriculum content for at least five core courses. + - Integrate an examination system and digital badge issuance mechanism. + - Establish a public profile system for displaying certifications. +- **Deliverables:** + - A fully functional online platform with user registration and course + modules. + - Comprehensive course materials and exam questions for each module. + - Automated digital badge generation and profile integration. + - Documentation and guidelines for both facilitators and administrators. + +## Approach / Methodology + +The project will be implemented in three phases: + +1. **Planning and Design (Months 1-2):** Define the curriculum, design the + platform architecture, and establish the certification process. +2. **Development and Implementation (Months 3-5):** Build the online platform, + develop course content, integrate the exam and badge systems, and conduct + pilot testing. +3. **Evaluation and Rollout (Month 6):** Gather feedback from pilot users, + refine course content and the platform, and officially launch Community + Training. + +An agile methodology will be applied throughout to allow for regular reviews and +continuous improvements. + +## Timeline / Project Schedule + +- **Phase 1: Planning and Design (Months 1-2)** + - Finalize curriculum and platform design. +- **Phase 2: Development and Implementation (Months 3-5)** + - Develop the online platform and integrate course modules. + - Launch a pilot test with a select group of facilitators. +- **Phase 3: Evaluation and Rollout (Month 6)** + - Collect feedback, refine the platform and content, and officially launch + Community Training. + +## Budget and Resource Requirements + +- **Platform Development:** $20,000 +- **Content Creation & Course Development:** $10,000 +- **Pilot Testing & Evaluation:** $2,000 +- **Fiscal Sponsor Overhead (10%):** $3,200 **Total Estimated Budget:** $35,200 + +Additional resources include technical staff for platform development, subject +matter experts for course content, and administrative support for coordination +and outreach. + +## Risk Management + +- **Content Delays:** Set clear deadlines and allocate dedicated resources for + course development. +- **Low Enrollment:** Implement targeted outreach strategies and leverage + existing community networks. +- **Technical Challenges:** Conduct thorough testing during the pilot phase and + allocate resources for rapid troubleshooting. +- **Insufficient Funding:** Seek additional funding or partnerships early to + secure adequate resources. + +## Conclusion and Next Steps + +Community Training aims to address a critical gap in digital community +management by providing structured training and certification for facilitators. +This initiative is expected to improve community support and foster a more +effective, inclusive digital ecosystem. We invite potential partners to discuss +this proposal further and explore collaborative opportunities to support the +project's development and long-term success. + +For more information or to discuss this proposal further, feel free to contact +us at: . diff --git a/pages/partnership/open-proposals/index.md b/pages/partnership/open-proposals/index.md new file mode 100644 index 000000000..82fdf0065 --- /dev/null +++ b/pages/partnership/open-proposals/index.md @@ -0,0 +1,26 @@ +--- +title: "Open Proposals" +description: "Open Proposals" +date: "2025-03-23" +authors: ["OSL Team"] +template: single-sidebar.html +--- + +# Open Proposals + +Welcome to the Open Proposals page of Open Science Labs (OSL). This page serves +as a central hub for proposals aimed at addressing common challenges across our +communities and organizations. Here, we publish ideas that have the potential to +be developed in partnership with other communities, institutes, or interested +partners. + +Proposals on this page may originate from OSL or from our partner organizations, +and they are intended to foster collaborative solutions that benefit the broader +open science and technology ecosystem. Each proposal will remain open for +discussion and feedback for one year. If a proposal does not generate sufficient +interest within that period, it will be closed to focus our efforts on active +and promising initiatives. + +We invite all partners and interested organizations to review these proposals, +share your feedback, and consider collaboration on projects that can drive +meaningful impact. diff --git a/pages/partnership/partners/index.md b/pages/partnership/partners/index.md new file mode 100644 index 000000000..40ec544f7 --- /dev/null +++ b/pages/partnership/partners/index.md @@ -0,0 +1,120 @@ +--- +title: Partners +date: 2022-01-01 +authors: ["Ivan Ogasawara"] +template: partners.html +partners: + - name: The GRAPH Network + summary: | + The Global Research and Analyses for Public Health (GRAPH) + Network is a community of professionals, universities, NGOs, + and international organizations working in the fields of Public + Health, Software Development, Social Science and Education. + We provide training, research and data analysis services to + governmental units, NGOs, and private enterprises. + thumbnail: https://thegraphnetwork.org/wp-content/uploads/2021/07/Research_GRAPH_logo-2-1-1-2-3-150x150.png + url: https://thegraphnetwork.org/ + github: https://github.com/thegraphnetwork + twitter: https://twitter.com/thegraphnetwork + + - name: The GRAPH Courses + summary: | + The GRAṔH Courses is a non-profit making data science accessible for + students, researchers and professionals with affordable live bootcamps + and free self-paced courses. + thumbnail: /images/partners/graph_courses_logo.png + url: https://thegraphcourses.org/ + github: https://github.com/the-graph-courses + twitter: https://twitter.com/thegraphnetwork + + - name: AlertaDengue + summary: | + InfoDengue is an early-warning system to all states + of Brazil, the system is based on the continuous analysis of hybrid + data generated through the research of climate and epidemiological + data and social scraping. + thumbnail: /images/partners/info-dengue.png + url: https://info.dengue.mat.br/ + github: https://github.com/AlertaDengue/AlertaDengue + + - name: EpiGraphHub + summary: | + Health Data Hub & Data Analysis Ecosystem for + Rapid Epidemic Outbreak Response. + thumbnail: /images/partners/epigraphhub.png + url: https://www.epigraphhub.org/ + github: https://github.com/thegraphnetwork/EpiGraphHub + + - name: ArxLang + summary: | + Arx compiler aims to provide arrow datatypes as + native datatypes. + thumbnail: /images/partners/arx.png + url: https://arxlang.org/ + github: https://github.com/arxlang/arx + twitter: https://twitter.com/arx_lang + discord: https://arxlang.org/discord + youtube: https://www.youtube.com/@arxlang + + - name: pyOpenSci + summary: | + pyOpenSci promotes open and reproducible research + through peer-review of scientific Python packages. + thumbnail: /images/partners/pyopensci.png + url: https://www.pyopensci.org/ + github: https://github.com/pyOpenSci/software-review + twitter: https://twitter.com/pyopensci + bluesky: https://bsky.app/profile/pyopensci.bsky.social + discord: https://discord.gg/yYyDFP2BcP + linkedin: https://www.linkedin.com/company/pyopensci + rss: https://www.pyopensci.org/feed.xml + + - name: LiteRev + summary: | + A tool that reduces searching times, showing the relationships between + searching topics. You can easily find the most relevant content from several + scientific databases. Whether you are a student, scientist, or professional, + LiteRev simplifies the process of finding the articles you need. + thumbnail: /images/partners/literev.png + url: https://literev.unige.ch + github: https://github.com/thegraphnetwork-literev + + - name: IGDORE + summary: | + Institute for Globally Distributed Open Research and Education + (IGDORE) is an independent research institute dedicated to improving + the quality of science, science education, and quality of life for + scientists, students and their families. + thumbnail: /images/partners/IGDORE-logo.png + url: https://igdore.org + twitter: https://twitter.com/IGDOREinstitute + + - name: Data Umbrella + summary: | + Data Umbrella, founded in December 2019, is a global community for + underrepresented persons in data science. Underrepresented persons + can be of any self-identified category (gender, race, ethnicity, + age, sexual orientation, disability, geographic location, + socioeconomic level and others). + thumbnail: /images/partners/dataumbrella.jpg + url: https://dataumbrella.org + youtube: https://www.youtube.com/c/dataumbrella + linkedin: https://www.linkedin.com/company/dataumbrella/ + blog: https://blog.dataumbrella.org/ + github: https://github.com/data-umbrella + + - name: TeleHealthCareAI + summary: | + TeleHealthCareAI is an initiative dedicated to advancing (tele)medicine + through artificial intelligence using an open-source and open-science + approach. Our mission is to build a dynamic network of healthcare + projects that leverage AI to enhance remote diagnosis, + treatment and patient care. + thumbnail: /images/partners/thcai.png + url: https://telehealthcareai.org + github: https://github.com/telehealthcareai + discord: https://discord.gg/Nu4MdGj9jB + # instagram: https://instagram.com/telehealthcareai +--- + +# Partners diff --git a/pages/projects/affiliation/index.md b/pages/projects/affiliation/index.md new file mode 100644 index 000000000..8b9a917d1 --- /dev/null +++ b/pages/projects/affiliation/index.md @@ -0,0 +1,67 @@ +--- +title: "Project Affiliation Program" +description: "Project Affiliation Program" +date: "2024-01-21" +authors: ["OSL Team"] +template: main.html +--- + +# Open Science Labs Project Affiliation Program + +Open Science Labs (OSL) is excited to introduce the Project Affiliation Program, +designed to support and promote projects that align with our mission of +fostering open science, open source, and technology. This program aims to create +a collaborative ecosystem where affiliated projects can thrive through various +support mechanisms. + +## Program Benefits + +Affiliated projects will have access to a range of benefits, including: + +- **Participation in the OSL Internship Program:** Affiliated projects can + become part of our internship program, gaining access to enthusiastic interns + eager to contribute and learn. + +- **Eligibility for OSL Grants:** Projects will be eligible to apply for future + funding opportunities through the **OSL Grants Program**, supporting further + development and growth. + +- **Promotion and Visibility:** OSL will actively promote affiliated projects + through our social media channels and at events organized by OSL, increasing + their visibility within the community. + +- **More Benefits to Come:** We are continuously working on adding more + advantages to this program and will announce new benefits as they become + available. + +## Eligibility Criteria + +To become an affiliated project, applicants should: + +- Be aligned with the mission and values of open science, open source, and + technology. +- Have a demonstrable track record of active development and community + engagement. +- Commit to maintaining an open and inclusive project environment. + +## How to Apply + +Interested projects can apply for affiliation by submitting a detailed proposal +outlining their project's goals, current status, and how they align with OSL’s +mission. Proposals should be sent to `team@opensciencelabs.org`. + +## Review Process + +All applications will undergo a thorough review by the OSL team to ensure +alignment with our values and goals. Successful applicants will be notified and +onboarded into the program. + +## Conclusion + +The Project Affiliation Program is a testament to our commitment to nurturing +and promoting open science and technology projects. We look forward to welcoming +new projects into the OSL family and working together towards a future of open +and collaborative innovation. + +For more information or inquiries, please contact us at +`team@opensciencelabs.org`. diff --git a/content/programs/incubator/index.md b/pages/projects/incubation/index.md similarity index 94% rename from content/programs/incubator/index.md rename to pages/projects/incubation/index.md index bec760c22..e7a8a5912 100644 --- a/content/programs/incubator/index.md +++ b/pages/projects/incubation/index.md @@ -1,12 +1,10 @@ -+++ -title = "Incubator Program" -description = "Incubator Program" -date = "2023-08-23" -aliases = ["incubator"] -author = "OSL Team" -sidebar = false -singlecolumn = true -+++ +--- +title: "Incubator Program" +description: "Incubator Program" +date: "2023-08-23" +authors: ["OSL Team"] +template: main.html +--- # Open Science Labs (OSL) Incubator Program @@ -33,8 +31,8 @@ Projects in this phase can be found at **Application Process:** - Submit a proposal through - [OSL PoC GitHub Issues](https://github.com/osl-pocs/issues), including the - concept, objectives, and a high-level design. + [OSL PoC GitHub Issues](https://github.com/osl-pocs/tickets/issues), including + the concept, objectives, and a high-level design. - Undergo a review process by the OSL selection committee. ### 2. Incubation @@ -56,7 +54,7 @@ in this stage can be found at - Complete the PoC phase with positive evaluations. - Submit an application for the Incubation phase at - [OSL Incubator GitHub Issues](https://github.com/osl-incubator/issues), + [OSL Incubator GitHub Issues](https://github.com/osl-incubator/tickets/issues), including a detailed project plan. - Obtain approval from OSL mentors and stakeholders. @@ -82,7 +80,7 @@ Graduated projects are available at - Successfully meet all the milestones during the Incubation phase. - Submit a graduation application at - [OSL Graduated GitHub Issues](https://github.com/osl-projects/issues), + [OSL Graduated GitHub Issues](https://github.com/osl-projects/tickets/issues), detailing achievements and future plans. - Undergo a final review and approval by OSL’s governing board. diff --git a/pages/projects/index.md b/pages/projects/index.md new file mode 100644 index 000000000..93e338a6f --- /dev/null +++ b/pages/projects/index.md @@ -0,0 +1,44 @@ +--- +title: Programs +--- + +# Open Science Labs Projects + +Open Science Labs (OSL) champions the intersection of open science and +open-source technology, fostering a vibrant community where researchers, +developers, and enthusiasts can collaborate and innovate. OSL supports this +mission through robust programs designed to facilitate growth and development. + +## Incubator and Affiliated Projects + +### Incubator Program + +The **Incubator Program** at OSL supports emerging open-source libraries and +tools to support scientific and general projects, providing them with necessary +resources, mentorship, and a collaborative community. Projects in this program +benefit from guidance on best practices in open-source development and +scientific research, helping to enhance their visibility and impact. + +### Affiliation Benefits + +Projects that become affiliated with OSL enjoy several advantages. They gain +eligibility to participate in special programs such as the OSL Internship +Program, the Google Summer of Code, and potentially receive OSL Development +Grants aimed at accelerating their growth and expanding their reach within the +global community. + +## Internship Program + +The **Internship Program** offers hands-on experience to aspiring professionals +by pairing them with both incubated and affiliated projects under the OSL +umbrella. Modeled after successful initiatives like Google Summer of Code, this +program allows interns to work on substantive projects, sharpening their skills +and contributing to significant advancements in open science. + +## Bridging Theory and Practice + +Through these initiatives, OSL is dedicated to transforming theoretical +knowledge into practical application, fostering a dynamic environment where +continuous learning and active contribution drive scientific progress. Whether +you are developing an innovative project or seeking to engage with the +open-source community, OSL provides the resources and platform to thrive. diff --git a/pages/projects/list/index.md b/pages/projects/list/index.md new file mode 100644 index 000000000..e5ec119f7 --- /dev/null +++ b/pages/projects/list/index.md @@ -0,0 +1,215 @@ +--- +title: "Affiliated and Incubated Projects" +description: "Affiliated and Incubated Projects" +date: "2024-01-29" +authors: ["OSL Team"] +template: projects.html +projects: + - name: Alpha One Labs + type: affiliated + maintainer_name: Daniel Jones + maintainer_email: info@alphaonelabs.com + url: https://github.com/alphaonelabs/education-website + communication_channel: + provider: slack + url: https://join.slack.com/t/alphaonelabs/shared_invite/zt-3glzypiib-8Lq~UZwWvcCFAjeG5uwcPg + description: | + Alpha One Labs is a nonprofit, open-source education platform dedicated + to hands-on learning in tech, science, and engineering. Evolving from a + Brooklyn hackerspace founded in 2009, we now provide cutting-edge STEM + experiences to learners everywhere. Our mission is to inspire creativity, + experimentation, and collaboration through engaging, hands-on innovation. + + - name: AnamnesisAI + type: incubated + maintainer_name: Ivan Ogasawara + maintainer_email: ivan.ogasawara@gmail.com + url: https://osl-incubator.github.io/anamnesis.ai/ + communication_channel: + provider: discord + url: https://opensciencelabs.org/discord + description: | + AnamnesisAI is a project focused on extracting anamnesis in FHIR format from text. + + - name: ArtBox + type: incubated + maintainer_name: Ivan Ogasawara + maintainer_email: ivan.ogasawara@gmail.com + url: https://mediatoolbox-org.github.io/artbox/ + communication_channel: + provider: discord + url: https://opensciencelabs.org/discord + description: | + ArtBox is a tool set for handling multimedia files with a bunch of useful + functions. + + - name: ArxLang + type: affiliated + maintainer_name: Ivan Ogasawara + maintainer_email: ivan.ogasawara@gmail.com + url: https://arxlang.org + communication_channel: + provider: discord + url: https://arxlang.org/discord + description: | + ArxLang Project is compounded mainly by three sub-projects: ASTx, IRx, and Arx. + ASTx is an agnostic expression structure for AST. It is agnostic because it is + not specific to any language, neither to the ArxLang project, although its main + focus is to provide all needed feature for ArxLang. + IRx aims to provide a translator to LLVM-IR from ASTx objects. + Arx is a new programming language that uses the power of LLVM to provide a + multi-architecture machine target code generation. + + - name: Envers + type: incubated + maintainer_name: Ivan Ogasawara + maintainer_email: ivan.ogasawara@gmail.com + url: https://osl-incubator.github.io/envers/ + communication_channel: + provider: discord + url: https://opensciencelabs.org/discord + description: | + Envers is a command-line tool (CLI) designed to manage and version environment + variables for different deployment stages such as staging, development, and + production. It provides a secure and organized way to handle + environment-specific configurations. + + - name: Extralit + type: affiliated + maintainer_name: Jonny Tran + maintainer_email: nhat.c.tran@gmail.com + url: https://github.com/extralit/extralit + communication_channel: + provider: slack + url: https://join.slack.com/t/extralit/shared_invite/zt-32blg3602-0m0XewPBXF7776BQ3m7ZlA + description: | + Extralit is an open-source platform for researchers to + extract structured data from scientific literature. It + combines advanced document AI with collaborative human + validation workflows to create analysis-ready datasets + fit-for-purpose to any scientific domain, enabling faster + evidence synthesis and meta-analysis. + + - name: fqlearn + type: incubated + maintainer_name: Ever Vino + maintainer_email: ever.vino00@gmail.com + url: https://osl-pocs.github.io/fqlearn/ + description: | + This Project aims to facilitate the teaching of unit operations and + thermodynamics. + + - name: Makim + type: affiliated + maintainer_name: Ivan Ogasawara + maintainer_email: ivan.ogasawara@gmail.com + url: https://osl-incubator.github.io/makim/ + communication_channel: + provider: discord + url: https://opensciencelabs.org/discord + description: | + Makim (or makim) is based on make and focus on improve the way to define targets + and dependencies. Instead of using the Makefile format, it uses yaml format. + + - name: Rago + type: incubated + maintainer_name: Ivan Ogasawara + maintainer_email: ivan.ogasawara@gmail.com + url: https://osl-incubator.github.io/rago/ + communication_channel: + provider: discord + url: https://opensciencelabs.org/discord + description: | + Rago is a lightweight framework for RAG. + + - name: noWorkflow + type: affiliated + maintainer_name: Joao Felipe + maintainer_email: joaofelipenp@gmail.com + url: https://gems-uff.github.io/noworkflow/ + description: | + The noWorkflow project aims at allowing scientists to benefit from provenance + data analysis even when they don't use a workflow system. It transparently + collects provenance from Python scripts and notebooks and provide tools to + support the analysis and management of the provenance. + + - name: PyDataStructs + type: affiliated + maintainer_name: Gagandeep Singh + maintainer_email: gdp.1807@gmail.com + url: https://pydatastructs.readthedocs.io/en/latest/ + description: | + PyDataStructs project aims to be a Python package for various data structures + and algorithms (including their parallel implementations). + + - name: PyMedX + type: incubated + maintainer_name: Ever Vino + maintainer_email: ever.vino00@gmail.com + url: https://osl-incubator.github.io/pymedx + communication_channel: + provider: discord + url: https://opensciencelabs.org/discord + description: | + PyMedX is a Python library that provides access to PubMed/PubMed Central. + This project is a fork from the archived project PyMed. + + - name: SciCookie + type: incubated + maintainer_name: Ivan Ogasawara + maintainer_email: ivan.ogasawara@gmail.com + url: https://osl-incubator.github.io/scicookie + communication_channel: + provider: discord + url: https://opensciencelabs.org/discord + description: | + SciCookie is a template developed by Open Science Labs that creates + projects from project templates. + + - name: SDX + type: affiliated + maintainer_name: Ivan Ogasawara + maintainer_email: ivan.ogasawara@gmail.com + url: https://sdx-org.github.io/sdx/ + communication_channel: + provider: discord + url: https://discord.gg/Nu4MdGj9jB + description: | + SDX provides a set of tools and libraries for health care + services empowered by AI. It includes screening, diagnosis, + treatments, prescriptions, clinical records, etc. + + - name: Sugar + type: affiliated + maintainer_name: Ivan Ogasawara + maintainer_email: ivan.ogasawara@gmail.com + url: https://sugar-org.github.io/sugar/ + communication_channel: + provider: discord + url: https://opensciencelabs.org/discord + description: | + Sugar aims to organize your stack of containers, gathering some useful scripts + and keeping this information centralized in a configuration file. So the command + line would be very simple. + + - name: swarm-external-secrets + type: affiliated + maintainer_name: Sai Sanjay + maintainer_email: sanjay@nullvijayawada.org + url: https://sugar-org.github.io/swarm-external-secrets/ + communication_channel: + provider: discord + url: https://opensciencelabs.org/discord + description: | + A Docker Swarm secrets plugin that integrates with multiple secret management providers including HashiCorp Vault, AWS Secrets Manager, Azure Key Vault, and OpenBao. +--- + +# Affiliated and Incubated Projects + +We proudly showcase a curated list of innovative and diverse projects that are +part of the Open Science Labs family. Each of these projects embodies our +commitment to open science and technology, and they play a pivotal role in +driving forward our shared goals. These collaborations not only strengthen our +community but also contribute significantly to the broader field of open source +and scientific research. Below, you'll find information about affiliated and +incubated projects. diff --git a/pages/robots.txt b/pages/robots.txt new file mode 100644 index 000000000..eb0536286 --- /dev/null +++ b/pages/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/pages/search.md b/pages/search.md new file mode 100644 index 000000000..5bc901f82 --- /dev/null +++ b/pages/search.md @@ -0,0 +1,5 @@ +--- +title: "Search" +searchPage: true +type: "search" +--- diff --git a/pages/twitter/index.md b/pages/twitter/index.md new file mode 100644 index 000000000..674ff57c7 --- /dev/null +++ b/pages/twitter/index.md @@ -0,0 +1,11 @@ +--- +title: "Open Science Labs Twitter/X" +description: "Open Science Labs, sharing knowledge" +date: "2019-02-28" +authors: ["OSL Team"] +template: main.html +--- + + diff --git a/pages/youtube/index.md b/pages/youtube/index.md new file mode 100644 index 000000000..68b1fe21e --- /dev/null +++ b/pages/youtube/index.md @@ -0,0 +1,11 @@ +--- +title: "Open Science Labs YouTube" +description: "Open Science Labs, sharing knowledge" +date: "2019-02-28" +authors: ["OSL Team"] +template: main.html +--- + + diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 000000000..5eb2ecdea --- /dev/null +++ b/poetry.lock @@ -0,0 +1,3799 @@ +# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. + +[[package]] +name = "aiohappyeyeballs" +version = "2.4.4" +description = "Happy Eyeballs for asyncio" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "aiohappyeyeballs-2.4.4-py3-none-any.whl", hash = "sha256:a980909d50efcd44795c4afeca523296716d50cd756ddca6af8c65b996e27de8"}, + {file = "aiohappyeyeballs-2.4.4.tar.gz", hash = "sha256:5fdd7d87889c63183afc18ce9271f9b0a7d32c2303e394468dd45d514a757745"}, +] + +[[package]] +name = "aiohttp" +version = "3.11.11" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a60804bff28662cbcf340a4d61598891f12eea3a66af48ecfdc975ceec21e3c8"}, + {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b4fa1cb5f270fb3eab079536b764ad740bb749ce69a94d4ec30ceee1b5940d5"}, + {file = "aiohttp-3.11.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:731468f555656767cda219ab42e033355fe48c85fbe3ba83a349631541715ba2"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb23d8bb86282b342481cad4370ea0853a39e4a32a0042bb52ca6bdde132df43"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f047569d655f81cb70ea5be942ee5d4421b6219c3f05d131f64088c73bb0917f"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd7659baae9ccf94ae5fe8bfaa2c7bc2e94d24611528395ce88d009107e00c6d"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af01e42ad87ae24932138f154105e88da13ce7d202a6de93fafdafb2883a00ef"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5854be2f3e5a729800bac57a8d76af464e160f19676ab6aea74bde18ad19d438"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6526e5fb4e14f4bbf30411216780c9967c20c5a55f2f51d3abd6de68320cc2f3"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:85992ee30a31835fc482468637b3e5bd085fa8fe9392ba0bdcbdc1ef5e9e3c55"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:88a12ad8ccf325a8a5ed80e6d7c3bdc247d66175afedbe104ee2aaca72960d8e"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0a6d3fbf2232e3a08c41eca81ae4f1dff3d8f1a30bae415ebe0af2d2458b8a33"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84a585799c58b795573c7fa9b84c455adf3e1d72f19a2bf498b54a95ae0d194c"}, + {file = "aiohttp-3.11.11-cp310-cp310-win32.whl", hash = "sha256:bfde76a8f430cf5c5584553adf9926534352251d379dcb266ad2b93c54a29745"}, + {file = "aiohttp-3.11.11-cp310-cp310-win_amd64.whl", hash = "sha256:0fd82b8e9c383af11d2b26f27a478640b6b83d669440c0a71481f7c865a51da9"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773"}, + {file = "aiohttp-3.11.11-cp311-cp311-win32.whl", hash = "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62"}, + {file = "aiohttp-3.11.11-cp311-cp311-win_amd64.whl", hash = "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e"}, + {file = "aiohttp-3.11.11-cp312-cp312-win32.whl", hash = "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600"}, + {file = "aiohttp-3.11.11-cp312-cp312-win_amd64.whl", hash = "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5"}, + {file = "aiohttp-3.11.11-cp313-cp313-win32.whl", hash = "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d"}, + {file = "aiohttp-3.11.11-cp313-cp313-win_amd64.whl", hash = "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3e23419d832d969f659c208557de4a123e30a10d26e1e14b73431d3c13444c2e"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21fef42317cf02e05d3b09c028712e1d73a9606f02467fd803f7c1f39cc59add"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f21bb8d0235fc10c09ce1d11ffbd40fc50d3f08a89e4cf3a0c503dc2562247a"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1642eceeaa5ab6c9b6dfeaaa626ae314d808188ab23ae196a34c9d97efb68350"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2170816e34e10f2fd120f603e951630f8a112e1be3b60963a1f159f5699059a6"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8be8508d110d93061197fd2d6a74f7401f73b6d12f8822bbcd6d74f2b55d71b1"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eed954b161e6b9b65f6be446ed448ed3921763cc432053ceb606f89d793927e"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6c9af134da4bc9b3bd3e6a70072509f295d10ee60c697826225b60b9959acdd"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:44167fc6a763d534a6908bdb2592269b4bf30a03239bcb1654781adf5e49caf1"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:479b8c6ebd12aedfe64563b85920525d05d394b85f166b7873c8bde6da612f9c"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:10b4ff0ad793d98605958089fabfa350e8e62bd5d40aa65cdc69d6785859f94e"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b540bd67cfb54e6f0865ceccd9979687210d7ed1a1cc8c01f8e67e2f1e883d28"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1dac54e8ce2ed83b1f6b1a54005c87dfed139cf3f777fdc8afc76e7841101226"}, + {file = "aiohttp-3.11.11-cp39-cp39-win32.whl", hash = "sha256:568c1236b2fde93b7720f95a890741854c1200fba4a3471ff48b2934d2d93fd3"}, + {file = "aiohttp-3.11.11-cp39-cp39-win_amd64.whl", hash = "sha256:943a8b052e54dfd6439fd7989f67fc6a7f2138d0a2cf0a7de5f18aa4fe7eb3b1"}, + {file = "aiohttp-3.11.11.tar.gz", hash = "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e"}, +] + +[package.dependencies] +aiohappyeyeballs = ">=2.3.0" +aiosignal = ">=1.1.2" +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +propcache = ">=0.2.0" +yarl = ">=1.17.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] + +[[package]] +name = "aiosignal" +version = "1.3.2" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5"}, + {file = "aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "anyio" +version = "4.6.2.post1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"}, + {file = "anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] + +[[package]] +name = "appnope" +version = "0.1.4" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = ">=3.6" +groups = ["main"] +markers = "platform_system == \"Darwin\"" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + +[[package]] +name = "argon2-cffi" +version = "23.1.0" +description = "Argon2 for Python" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, +] + +[package.dependencies] +argon2-cffi-bindings = "*" + +[package.extras] +dev = ["argon2-cffi[tests,typing]", "tox (>4)"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] +tests = ["hypothesis", "pytest"] +typing = ["mypy"] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +description = "Low-level CFFI bindings for Argon2" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, +] + +[package.dependencies] +cffi = ">=1.0.1" + +[package.extras] +dev = ["cogapp", "pre-commit", "pytest", "wheel"] +tests = ["pytest"] + +[[package]] +name = "arrow" +version = "1.3.0" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, + {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" +types-python-dateutil = ">=2.8.10" + +[package.extras] +doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] + +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + +[[package]] +name = "async-lru" +version = "2.0.4" +description = "Simple LRU cache for asyncio" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, + {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, +] + +[[package]] +name = "attrs" +version = "24.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, +] + +[package.extras] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] + +[[package]] +name = "babel" +version = "2.16.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, +] + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +groups = ["main"] +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "bleach" +version = "6.1.0" +description = "An easy safelist-based HTML-sanitizing tool." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, + {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, +] + +[package.dependencies] +six = ">=1.9.0" +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.3)"] + +[[package]] +name = "bracex" +version = "2.5.post1" +description = "Bash style brace expander." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "bracex-2.5.post1-py3-none-any.whl", hash = "sha256:13e5732fec27828d6af308628285ad358047cec36801598368cb28bc631dbaf6"}, + {file = "bracex-2.5.post1.tar.gz", hash = "sha256:12c50952415bfa773d2d9ccb8e79651b8cdb1f31a42f6091b804f6ba2b4a66b6"}, +] + +[[package]] +name = "case-insensitive-dictionary" +version = "0.2.1" +description = "Typed Python Case Insensitive Dictionary" +optional = false +python-versions = ">=3.7,<4.0" +groups = ["main"] +markers = "platform_system == \"Windows\"" +files = [ + {file = "case-insensitive-dictionary-0.2.1.tar.gz", hash = "sha256:7e94726f97eb2c0ceac53209971db50ffc996def663e5e5080d0a1acb4a42280"}, + {file = "case_insensitive_dictionary-0.2.1-py3-none-any.whl", hash = "sha256:a8971780be1ba25e363db259515f0a2f003013465f82552e2f9aed08d5a9ca28"}, +] + +[[package]] +name = "certifi" +version = "2024.8.30" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, +] + +[[package]] +name = "cffi" +version = "1.17.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "cfgv" +version = "3.4.0" +description = "Validate configuration and produce human readable error messages." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +groups = ["main"] +files = [ + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main"] +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "comm" +version = "0.2.2" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "debugpy" +version = "1.8.7" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "debugpy-1.8.7-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:95fe04a573b8b22896c404365e03f4eda0ce0ba135b7667a1e57bd079793b96b"}, + {file = "debugpy-1.8.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:628a11f4b295ffb4141d8242a9bb52b77ad4a63a2ad19217a93be0f77f2c28c9"}, + {file = "debugpy-1.8.7-cp310-cp310-win32.whl", hash = "sha256:85ce9c1d0eebf622f86cc68618ad64bf66c4fc3197d88f74bb695a416837dd55"}, + {file = "debugpy-1.8.7-cp310-cp310-win_amd64.whl", hash = "sha256:29e1571c276d643757ea126d014abda081eb5ea4c851628b33de0c2b6245b037"}, + {file = "debugpy-1.8.7-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:caf528ff9e7308b74a1749c183d6808ffbedbb9fb6af78b033c28974d9b8831f"}, + {file = "debugpy-1.8.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cba1d078cf2e1e0b8402e6bda528bf8fda7ccd158c3dba6c012b7897747c41a0"}, + {file = "debugpy-1.8.7-cp311-cp311-win32.whl", hash = "sha256:171899588bcd412151e593bd40d9907133a7622cd6ecdbdb75f89d1551df13c2"}, + {file = "debugpy-1.8.7-cp311-cp311-win_amd64.whl", hash = "sha256:6e1c4ffb0c79f66e89dfd97944f335880f0d50ad29525dc792785384923e2211"}, + {file = "debugpy-1.8.7-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:4d27d842311353ede0ad572600c62e4bcd74f458ee01ab0dd3a1a4457e7e3706"}, + {file = "debugpy-1.8.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:703c1fd62ae0356e194f3e7b7a92acd931f71fe81c4b3be2c17a7b8a4b546ec2"}, + {file = "debugpy-1.8.7-cp312-cp312-win32.whl", hash = "sha256:2f729228430ef191c1e4df72a75ac94e9bf77413ce5f3f900018712c9da0aaca"}, + {file = "debugpy-1.8.7-cp312-cp312-win_amd64.whl", hash = "sha256:45c30aaefb3e1975e8a0258f5bbd26cd40cde9bfe71e9e5a7ac82e79bad64e39"}, + {file = "debugpy-1.8.7-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:d050a1ec7e925f514f0f6594a1e522580317da31fbda1af71d1530d6ea1f2b40"}, + {file = "debugpy-1.8.7-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f4349a28e3228a42958f8ddaa6333d6f8282d5edaea456070e48609c5983b7"}, + {file = "debugpy-1.8.7-cp313-cp313-win32.whl", hash = "sha256:11ad72eb9ddb436afb8337891a986302e14944f0f755fd94e90d0d71e9100bba"}, + {file = "debugpy-1.8.7-cp313-cp313-win_amd64.whl", hash = "sha256:2efb84d6789352d7950b03d7f866e6d180284bc02c7e12cb37b489b7083d81aa"}, + {file = "debugpy-1.8.7-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:4b908291a1d051ef3331484de8e959ef3e66f12b5e610c203b5b75d2725613a7"}, + {file = "debugpy-1.8.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da8df5b89a41f1fd31503b179d0a84a5fdb752dddd5b5388dbd1ae23cda31ce9"}, + {file = "debugpy-1.8.7-cp38-cp38-win32.whl", hash = "sha256:b12515e04720e9e5c2216cc7086d0edadf25d7ab7e3564ec8b4521cf111b4f8c"}, + {file = "debugpy-1.8.7-cp38-cp38-win_amd64.whl", hash = "sha256:93176e7672551cb5281577cdb62c63aadc87ec036f0c6a486f0ded337c504596"}, + {file = "debugpy-1.8.7-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:90d93e4f2db442f8222dec5ec55ccfc8005821028982f1968ebf551d32b28907"}, + {file = "debugpy-1.8.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6db2a370e2700557a976eaadb16243ec9c91bd46f1b3bb15376d7aaa7632c81"}, + {file = "debugpy-1.8.7-cp39-cp39-win32.whl", hash = "sha256:a6cf2510740e0c0b4a40330640e4b454f928c7b99b0c9dbf48b11efba08a8cda"}, + {file = "debugpy-1.8.7-cp39-cp39-win_amd64.whl", hash = "sha256:6a9d9d6d31846d8e34f52987ee0f1a904c7baa4912bf4843ab39dadf9b8f3e0d"}, + {file = "debugpy-1.8.7-py2.py3-none-any.whl", hash = "sha256:57b00de1c8d2c84a61b90880f7e5b6deaf4c312ecbde3a0e8912f2a56c4ac9ae"}, + {file = "debugpy-1.8.7.zip", hash = "sha256:18b8f731ed3e2e1df8e9cdaa23fb1fc9c24e570cd0081625308ec51c82efe42e"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +groups = ["main"] +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main"] +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + +[[package]] +name = "distlib" +version = "0.3.9" +description = "Distribution utilities" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, + {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, +] + +[[package]] +name = "executing" +version = "2.1.0" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "fastjsonschema" +version = "2.20.0" +description = "Fastest Python implementation of JSON schema" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"}, + {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"}, +] + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + +[[package]] +name = "filelock" +version = "3.16.1" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] +typing = ["typing-extensions (>=4.12.2)"] + +[[package]] +name = "fqdn" +version = "1.5.1" +description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" +optional = false +python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" +groups = ["main"] +files = [ + {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, + {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, +] + +[[package]] +name = "frozenlist" +version = "1.5.0" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5"}, + {file = "frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb"}, + {file = "frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf"}, + {file = "frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942"}, + {file = "frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f"}, + {file = "frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8"}, + {file = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03"}, + {file = "frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c"}, + {file = "frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e"}, + {file = "frozenlist-1.5.0-cp38-cp38-win32.whl", hash = "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723"}, + {file = "frozenlist-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c"}, + {file = "frozenlist-1.5.0-cp39-cp39-win32.whl", hash = "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3"}, + {file = "frozenlist-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0"}, + {file = "frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3"}, + {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"}, +] + +[[package]] +name = "fuzzywuzzy" +version = "0.18.0" +description = "Fuzzy string matching in python" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "fuzzywuzzy-0.18.0-py2.py3-none-any.whl", hash = "sha256:928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993"}, + {file = "fuzzywuzzy-0.18.0.tar.gz", hash = "sha256:45016e92264780e58972dca1b3d939ac864b78437422beecebb3095f8efd00e8"}, +] + +[package.extras] +speedup = ["python-levenshtein (>=0.12)"] + +[[package]] +name = "ghp-import" +version = "2.1.0" +description = "Copy your docs directly to the gh-pages branch." +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, + {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, +] + +[package.dependencies] +python-dateutil = ">=2.8.1" + +[package.extras] +dev = ["flake8", "markdown", "twine", "wheel"] + +[[package]] +name = "gitdb" +version = "4.0.11" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.43" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, + {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[package.extras] +doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.6" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, + {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<1.0)"] + +[[package]] +name = "httpx" +version = "0.27.2" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, + {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "identify" +version = "2.6.1" +description = "File identification library for Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0"}, + {file = "identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98"}, +] + +[package.extras] +license = ["ukkonen"] + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "ipykernel" +version = "6.29.5" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=24" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.28.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "ipython-8.28.0-py3-none-any.whl", hash = "sha256:530ef1e7bb693724d3cdc37287c80b07ad9b25986c007a53aa1857272dac3f35"}, + {file = "ipython-8.28.0.tar.gz", hash = "sha256:0d0d15ca1e01faeb868ef56bc7ee5a0de5bd66885735682e8a322ae289a13d1a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt-toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5.13.0" +typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} + +[package.extras] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "intersphinx-registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing-extensions"] +kernel = ["ipykernel"] +matplotlib = ["matplotlib"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["packaging", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] + +[[package]] +name = "isoduration" +version = "20.11.0" +description = "Operations with ISO 8601 durations" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, + {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, +] + +[package.dependencies] +arrow = ">=0.15.0" + +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "joblib" +version = "1.5.2" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241"}, + {file = "joblib-1.5.2.tar.gz", hash = "sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55"}, +] + +[[package]] +name = "json5" +version = "0.9.25" +description = "A Python implementation of the JSON5 data format." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "json5-0.9.25-py3-none-any.whl", hash = "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f"}, + {file = "json5-0.9.25.tar.gz", hash = "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae"}, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, +] + +[[package]] +name = "jsonschema" +version = "4.23.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} +rpds-py = ">=0.7.1" +uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +webcolors = {version = ">=24.6.0", optional = true, markers = "extra == \"format-nongpl\""} + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] + +[[package]] +name = "jsonschema-specifications" +version = "2024.10.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, + {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "jupyter-client" +version = "8.6.3" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, + {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, +] + +[package.dependencies] +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyter-events" +version = "0.10.0" +description = "Jupyter Event System library" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "jupyter_events-0.10.0-py3-none-any.whl", hash = "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960"}, + {file = "jupyter_events-0.10.0.tar.gz", hash = "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22"}, +] + +[package.dependencies] +jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} +python-json-logger = ">=2.0.4" +pyyaml = ">=5.3" +referencing = "*" +rfc3339-validator = "*" +rfc3986-validator = ">=0.1.1" +traitlets = ">=5.3" + +[package.extras] +cli = ["click", "rich"] +docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"] +test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] + +[[package]] +name = "jupyter-lsp" +version = "2.2.5" +description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001"}, + {file = "jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da"}, +] + +[package.dependencies] +jupyter-server = ">=1.1.2" + +[[package]] +name = "jupyter-server" +version = "2.14.2" +description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "jupyter_server-2.14.2-py3-none-any.whl", hash = "sha256:47ff506127c2f7851a17bf4713434208fc490955d0e8632e95014a9a9afbeefd"}, + {file = "jupyter_server-2.14.2.tar.gz", hash = "sha256:66095021aa9638ced276c248b1d81862e4c50f292d575920bbe960de1c56b12b"}, +] + +[package.dependencies] +anyio = ">=3.1.0" +argon2-cffi = ">=21.1" +jinja2 = ">=3.0.3" +jupyter-client = ">=7.4.4" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +jupyter-events = ">=0.9.0" +jupyter-server-terminals = ">=0.4.4" +nbconvert = ">=6.4.4" +nbformat = ">=5.3.0" +overrides = ">=5.0" +packaging = ">=22.0" +prometheus-client = ">=0.9" +pywinpty = {version = ">=2.0.1", markers = "os_name == \"nt\""} +pyzmq = ">=24" +send2trash = ">=1.8.2" +terminado = ">=0.8.3" +tornado = ">=6.2.0" +traitlets = ">=5.6.0" +websocket-client = ">=1.7" + +[package.extras] +docs = ["ipykernel", "jinja2", "jupyter-client", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] +test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0,<9)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.7)", "pytest-timeout", "requests"] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.3" +description = "A Jupyter Server Extension Providing Terminals." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, + {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, +] + +[package.dependencies] +pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} +terminado = ">=0.8.3" + +[package.extras] +docs = ["jinja2", "jupyter-server", "mistune (<4.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] +test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] + +[[package]] +name = "jupyterlab" +version = "4.2.5" +description = "JupyterLab computational environment" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "jupyterlab-4.2.5-py3-none-any.whl", hash = "sha256:73b6e0775d41a9fee7ee756c80f58a6bed4040869ccc21411dc559818874d321"}, + {file = "jupyterlab-4.2.5.tar.gz", hash = "sha256:ae7f3a1b8cb88b4f55009ce79fa7c06f99d70cd63601ee4aa91815d054f46f75"}, +] + +[package.dependencies] +async-lru = ">=1.0.0" +httpx = ">=0.25.0" +ipykernel = ">=6.5.0" +jinja2 = ">=3.0.3" +jupyter-core = "*" +jupyter-lsp = ">=2.0.0" +jupyter-server = ">=2.4.0,<3" +jupyterlab-server = ">=2.27.1,<3" +notebook-shim = ">=0.2" +packaging = "*" +setuptools = ">=40.1.0" +tornado = ">=6.2.0" +traitlets = "*" + +[package.extras] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.3.5)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<7.3.0)", "sphinx-copybutton"] +docs-screenshots = ["altair (==5.3.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.2)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.1.post2)", "matplotlib (==3.8.3)", "nbconvert (>=7.0.0)", "pandas (==2.2.1)", "scipy (==1.12.0)", "vega-datasets (==0.9.0)"] +test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] +upgrade-extension = ["copier (>=9,<10)", "jinja2-time (<0.3)", "pydantic (<3.0)", "pyyaml-include (<3.0)", "tomli-w (<2.0)"] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +description = "Pygments theme using JupyterLab CSS variables" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, +] + +[[package]] +name = "jupyterlab-server" +version = "2.27.3" +description = "A set of server components for JupyterLab and JupyterLab like applications." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4"}, + {file = "jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4"}, +] + +[package.dependencies] +babel = ">=2.10" +jinja2 = ">=3.0.3" +json5 = ">=0.9.0" +jsonschema = ">=4.18.0" +jupyter-server = ">=1.21,<3" +packaging = ">=21.3" +requests = ">=2.31" + +[package.extras] +docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] +openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] +test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0,<8)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] + +[[package]] +name = "levenshtein" +version = "0.26.0" +description = "Python extension for computing string edit distances and similarities." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "levenshtein-0.26.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e5fb23bf35ef1094d00415bb2116dd862fb919adc4044436508029dafedfd687"}, + {file = "levenshtein-0.26.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea97df5fecf4195ed24aa4c245e5b6cf42527a5818bd7d0d92ba8c7425828861"}, + {file = "levenshtein-0.26.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c06ddb9149ee0f25ba334ad04ee3f782be3e64ab4bf8b9f34d6e4bf19a22880"}, + {file = "levenshtein-0.26.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf2561d9077367aa01f3c6caf6132cec84b2b9a481f64f14f35f9e976a353605"}, + {file = "levenshtein-0.26.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54200110ba27c20cb2e3bc48cf855d7d910c6704a47caefe97ced8c59ee075b4"}, + {file = "levenshtein-0.26.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed1c1354f0f1e4736c2fb6f91e3913b63e38c8873a228a299f656bdaf788e1eb"}, + {file = "levenshtein-0.26.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4ecf7d755304d2ffab2ee808100f5e87889347b572c61c97d9f4f9a318806713"}, + {file = "levenshtein-0.26.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c532571fabd8a23fa12971f432cd17ababa031dee6efbaa8fa31380876593a3e"}, + {file = "levenshtein-0.26.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:71a3afbfc7d97fd536f128084a20c2a79b5d79995c7111eced1baf4d103ea6d4"}, + {file = "levenshtein-0.26.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:c49a20ddb119ab2d56e7e4d62e43602dff8c397718be4f00474723b40d626a7f"}, + {file = "levenshtein-0.26.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e8a34d41c7b392df98fce7c8353ea87cbbbf39239db141096ded00f4e1e75e6e"}, + {file = "levenshtein-0.26.0-cp310-cp310-win32.whl", hash = "sha256:a541040a01333994e5a037cb4e2c2b0e2496a2141facf63bbc9b359fe9f5b1dd"}, + {file = "levenshtein-0.26.0-cp310-cp310-win_amd64.whl", hash = "sha256:68a165bd91dab44c2b91c8278e3728f0da98cb48b1ed7f263bfdf616efcf4932"}, + {file = "levenshtein-0.26.0-cp310-cp310-win_arm64.whl", hash = "sha256:968731244a7d56354c912c054e7b6ea33c3700632ef7cab1c895b3110e86dc7b"}, + {file = "levenshtein-0.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7aabafb951b96ca6e0f981b1edb3ec81b41c010b7437758e275393768fa84453"}, + {file = "levenshtein-0.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cefa552c5190e912f0fe39b62a5b08597d1256f330ed2c459ba724947458282"}, + {file = "levenshtein-0.26.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a0ed02c8aaef0903b72fe0da88d9d24d7964b07dbc123997e549ac165efad8d"}, + {file = "levenshtein-0.26.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5d21d3b08ceb7e544fae04897e211e43fb3500c9b3a8e74d08468b015c7270d"}, + {file = "levenshtein-0.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77422c5da5cfd8455a8835329d965e24250b0f0c1398e0a6362879f00d18f27c"}, + {file = "levenshtein-0.26.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4931c8263e06edbece310b1f8e03bfcb74f211863a85058b46cdf8460a4136af"}, + {file = "levenshtein-0.26.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3e265812db8b04e6ae159751c7a82d6e0e5025223bd330fc9104a8a5beeeb7cf"}, + {file = "levenshtein-0.26.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8c58cb6c9f90f9b11d6b478e2da6ac1f0bcb5ea9608a5611088d30f782ee5920"}, + {file = "levenshtein-0.26.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:754669e9b82795cfc3ca0d70f2e715b58ff4d0f7e7f4e77fc6539543439ae22c"}, + {file = "levenshtein-0.26.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:830b1993e3e945b213a6b73ceca8b555147a6ecd7323e4959b80dee35abfc7fc"}, + {file = "levenshtein-0.26.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2b3aa9a0b844ddaeb6f5317eb4e85b5748901cf40c9a9b0d3a8bf76ef9d3cccc"}, + {file = "levenshtein-0.26.0-cp311-cp311-win32.whl", hash = "sha256:07ffd78569ca80adfd55172156faac35eb12ccd375d6d51ba4512b0346337cbf"}, + {file = "levenshtein-0.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:1bf886afed2304e0022c33ed644afb719411cce4d4af11ba5bb040f05d9f00c1"}, + {file = "levenshtein-0.26.0-cp311-cp311-win_arm64.whl", hash = "sha256:c68b6e6c74ce9056370559196177b9e514ba20611a1ce9545dcd366d8a97cc60"}, + {file = "levenshtein-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fe230c754f628f6d266b8d970f8556775fb0a9c05027f807754312af7927b2ed"}, + {file = "levenshtein-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a01150b33505596be83bff9f6f06f53bc1a14fd5e36e840dc134822c6ba20e00"}, + {file = "levenshtein-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:247767593ede88f3ddbd4f948ed30817cb751e25a335b35ec2332752021e4e10"}, + {file = "levenshtein-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:52a7407416723cd7163238b16b7c0eba4b30bc53f549e803e654f1df6824e0b5"}, + {file = "levenshtein-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0fa54bd453b8b347139b4ef940d717939c6a8966fdbcde2cf8d70316497e292"}, + {file = "levenshtein-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14c96604ce1228922094ea266d9927227ab129e939b3e5dd84fee07390b72b5f"}, + {file = "levenshtein-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6170cbbec2ffc3df86adf2f457f83a22df99b6c4e2b21c76bc9a67b23c2940d1"}, + {file = "levenshtein-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7211e700ddca453efe49bdce57c84073451667873d80037c73c1f55840d08e70"}, + {file = "levenshtein-0.26.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:2150961cff9cfcfd4b5e4c1a5c90b2d4520a7d9cb65cd070cda5601b7f099496"}, + {file = "levenshtein-0.26.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0afb8bd5bc2d686d34ed721399d78359d104c7483a740b262fd260357599e318"}, + {file = "levenshtein-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a68f863bef8a5301bc7ca4b99f2f8d666b5edcd30dca6234ee6cd541ca8a8f4e"}, + {file = "levenshtein-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3baa2c8ebc1f3b773ffb010e03e7319098323618f919c5db2c7188e439d13602"}, + {file = "levenshtein-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad6da19613e53c288bd130fadb91937b0ba849013065ddd377568cdd90611caa"}, + {file = "levenshtein-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:bcbd4403c630755a5f898e6905975c1a8bb2c71a756d399f93811f82b5c0b1b3"}, + {file = "levenshtein-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:770dc2973c9c76598d68b736319c2b2b6fad1f88837119a92e9124ff2167cc49"}, + {file = "levenshtein-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb13782c15c2c0f5a74e920a9c9c26da5730830c13809bcb7a32876f1a4fb643"}, + {file = "levenshtein-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a9949dd238e8c1bd27669a1bf66a5507eed2fd486130b30b2df44cc4f238a3c"}, + {file = "levenshtein-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dafc593a6e346fec5520f5dec9d87f4894aa9d584ccad43ce9fdcc363d9e9c34"}, + {file = "levenshtein-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ce82de94989df4367ff38de2c4193bf0ea77b4e207ae60e98876922007a0f81"}, + {file = "levenshtein-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cbd4775e0e88e209cbb4f722d39d057531138dafbd07e36c4b33eb18e29494ef"}, + {file = "levenshtein-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:75e2567bf64e422843d0f67917938c0235a9292b395076dd5f8bbb731d1c3058"}, + {file = "levenshtein-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:22c40516cc830aeeb18b09bd96ec32378b7e52e201d67e86dfb7f6a2e3bf3b3d"}, + {file = "levenshtein-0.26.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c311554a220a12110d2640ee245d74f07b25cdc0acc04c625ab2bdf708f3bf84"}, + {file = "levenshtein-0.26.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0560746b2c40cdd25458cb4a065e4d7ffbb245783638f5b0173cfd135f9d6664"}, + {file = "levenshtein-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3e8e373586026d71ec2053300ef46c5268fe41a29d9f58a724487e3f060502db"}, + {file = "levenshtein-0.26.0-cp313-cp313-win32.whl", hash = "sha256:f88d05187622366b529b25b130a8fad6497d7b6189e82198ce67d3921c3e418c"}, + {file = "levenshtein-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cc288a6ab97a3ccd980d8a0465378b99eb53e32232f99279092a97578c4b2e9"}, + {file = "levenshtein-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:de7727a57d1241f8c2d53a9f70642f48891514789bbd4daa0f90547b4e0bf70f"}, + {file = "levenshtein-0.26.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:64bfad7270c2fc0f872f6ca2e26cc091efebfb64b7b1ae156123c2304fbcbae4"}, + {file = "levenshtein-0.26.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17c9e1d7bbde972c09e2c6578392ff0668697db8f815649594b984ed2b0b2843"}, + {file = "levenshtein-0.26.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7acff8e4335f18bb5b60cbd310957cf46c964f0b5bc1cc82fe6647c45309b9f8"}, + {file = "levenshtein-0.26.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d526636efb6e727dce5f67eb3437079f1d5d71dd2c0a2b6f48a62791a789764e"}, + {file = "levenshtein-0.26.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a492bd9e0075ed5f748ac000ffff581d7652f6cb2cf1d9ec9de3d12270dfc225"}, + {file = "levenshtein-0.26.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd953f8952c825c5d7112e9d64136afc8c7c122b9facc3ec4f9f87591a85e6d1"}, + {file = "levenshtein-0.26.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:912fe5a3bcc970ab4b97e7e83ea118cf9a98831813535efa0f499b0b4df032dd"}, + {file = "levenshtein-0.26.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d9c8ac0f4ae2de173b6ccc3d0b379d1aa4212f653badc324fb5aa868e304e847"}, + {file = "levenshtein-0.26.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:47a4d8c58114c2b9a4318dcb8e2a0dc8446ec3ec637b051f3dbe27555786f603"}, + {file = "levenshtein-0.26.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:baf0c8c09d5c55f136b62e201886c4b93b4abbdbde0475f67dd8fc278bb403f7"}, + {file = "levenshtein-0.26.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:88f051a0a4eec22cd8071634d5a2ee40d9810080e3b6d1e61e4fbe2a7a7ece3d"}, + {file = "levenshtein-0.26.0-cp39-cp39-win32.whl", hash = "sha256:c2d3f8cf45deeb6d0faa9df089c0e36e457236fc66aa31e67d3e7c15336e8401"}, + {file = "levenshtein-0.26.0-cp39-cp39-win_amd64.whl", hash = "sha256:9238be73beff55e2b285ac393573274e55233e7270cb6484fa4550b775016705"}, + {file = "levenshtein-0.26.0-cp39-cp39-win_arm64.whl", hash = "sha256:abc4618610ec6fff1c894fc931bc8b57c6d1ad7b8b9acafa685e19a84f521f8b"}, + {file = "levenshtein-0.26.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:ca2735baf43fb540be7d3cf24eb2fc97a395e9e85ec8fae64199f3b2ccbf5c5c"}, + {file = "levenshtein-0.26.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93a949fabc6280ab44a6252d780577715e8e71a63a295c4730ce5490006ae1f5"}, + {file = "levenshtein-0.26.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:588094f406d5cb01dbf74201f8b4fe345d2b92a789997eb5371dad754f831d5b"}, + {file = "levenshtein-0.26.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c95201c7425cdff12ed16ff0a15af52c46477935e7589d1dc6ebd24f416c9ed8"}, + {file = "levenshtein-0.26.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:651b011617937d18f671450c8294d11b5b556b09e33ac038b923ae6496e35d31"}, + {file = "levenshtein-0.26.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0576b0e817904adc621077761e71c97555ae9e698e712b0bdbe868464444200b"}, + {file = "levenshtein-0.26.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16a3f4d0bcdbd0d14e0c49844a2ac02d8acece9f6cce41ea437c1d07ac536ec1"}, + {file = "levenshtein-0.26.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e40e9a2c6482f6cce9046693844b33c492f35e57c849a0e104b03234ef3a31f6"}, + {file = "levenshtein-0.26.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8104cb5642277439c07091c160ad3b1c3d20c160db8dbf5306871f065721e5e8"}, + {file = "levenshtein-0.26.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a30d30485eec8a2efe72d639fb9c33f0991416a6ddb490d6f0eef01c9dc79b7a"}, + {file = "levenshtein-0.26.0.tar.gz", hash = "sha256:960b020d96bbd348400d6ff5c16290adee49f0ae2d42707a550a3b4f7d092abe"}, +] + +[package.dependencies] +rapidfuzz = ">=3.9.0,<4.0.0" + +[[package]] +name = "linkcheckmd" +version = "1.4.0" +description = "Check links for Markdown-based site" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "linkcheckmd-1.4.0.tar.gz", hash = "sha256:3a539c9a4e11697fc7fcc269d379accf93c8cccbf971f3cea0bae40912d9f609"}, +] + +[package.dependencies] +aiohttp = ">=3.3" + +[package.extras] +lint = ["flake8", "flake8-blind-except", "flake8-bugbear", "flake8-builtins", "mypy"] +requests = ["requests"] +tests = ["pytest"] + +[[package]] +name = "lunr" +version = "0.8.0" +description = "A Python implementation of Lunr.js" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "lunr-0.8.0-py3-none-any.whl", hash = "sha256:a2bc4e08dbb35b32723006bf2edbe6dc1f4f4b95955eea0d23165a184d276ce8"}, + {file = "lunr-0.8.0.tar.gz", hash = "sha256:b46cf5059578d277a14bfc901bb3d5666d013bf73c035331ac0222fdac358228"}, +] + +[package.dependencies] +nltk = {version = "*", optional = true, markers = "extra == \"languages\""} + +[package.extras] +dev = ["black", "build", "coverage", "flake8", "furo", "hatch-fancy-pypi-readme", "ipython", "mypy", "myst-parser", "nltk", "pdbpp", "pytest", "pytest-benchmark", "pytest-timeout", "sphinx", "sphinx-autobuild", "tox", "twine", "wheel"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-autobuild"] +languages = ["nltk"] +local = ["black", "build", "flake8", "hatch-fancy-pypi-readme", "ipython", "mypy", "pdbpp", "pytest-benchmark", "twine", "wheel"] +tests = ["coverage", "nltk", "pytest", "pytest-timeout", "tox"] + +[[package]] +name = "makim" +version = "1.19.0" +description = "Simplify the usage of containers" +optional = false +python-versions = "<4,>=3.9" +groups = ["main"] +files = [ + {file = "makim-1.19.0-py3-none-any.whl", hash = "sha256:51c1b98d5dada4347fe9f5ffebe39a9984e9589ee2966542ae7e2b65897d9ee4"}, + {file = "makim-1.19.0.tar.gz", hash = "sha256:c22c701bb1544975052f0d6e4a1f86c7ede349fea06c91b824f22f8074f10aae"}, +] + +[package.dependencies] +fuzzywuzzy = ">=0.18.0" +jinja2 = ">=2.0" +jsonschema = ">=4" +python-dotenv = ">=0.21.1" +python-levenshtein = ">=0.23.0" +pyyaml = ">=5.0" +rich = ">=10.11.0" +sh = ">=2.0.0" +shellingham = ">=1.5.4" +typer = ">=0.9.0" +xonsh = ">=0.15.0" + +[[package]] +name = "markdown" +version = "3.3.7" +description = "Python implementation of Markdown." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"}, + {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"}, +] + +[package.extras] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "3.0.2" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "mdx-truly-sane-lists" +version = "1.3" +description = "Extension for Python-Markdown that makes lists truly sane. Custom indents for nested lists and fix for messy linebreaks." +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "mdx_truly_sane_lists-1.3-py3-none-any.whl", hash = "sha256:b9546a4c40ff8f1ab692f77cee4b6bfe8ddf9cccf23f0a24e71f3716fe290a37"}, + {file = "mdx_truly_sane_lists-1.3.tar.gz", hash = "sha256:b661022df7520a1e113af7c355c62216b384c867e4f59fb8ee7ad511e6e77f45"}, +] + +[package.dependencies] +Markdown = ">=2.6" + +[[package]] +name = "mergedeep" +version = "1.3.4" +description = "A deep merge function for 🐍." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, + {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, +] + +[[package]] +name = "mistune" +version = "3.0.2" +description = "A sane and fast Markdown parser with useful plugins and renderers" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, + {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, +] + +[[package]] +name = "mkdocs" +version = "1.4.2" +description = "Project documentation with Markdown." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "mkdocs-1.4.2-py3-none-any.whl", hash = "sha256:c8856a832c1e56702577023cd64cc5f84948280c1c0fcc6af4cd39006ea6aa8c"}, + {file = "mkdocs-1.4.2.tar.gz", hash = "sha256:8947af423a6d0facf41ea1195b8e1e8c85ad94ac95ae307fe11232e0424b11c5"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} +ghp-import = ">=1.0" +jinja2 = ">=2.11.1" +markdown = ">=3.2.1,<3.4" +mergedeep = ">=1.3.4" +packaging = ">=20.5" +pyyaml = ">=5.1" +pyyaml-env-tag = ">=0.1" +watchdog = ">=2.0" + +[package.extras] +i18n = ["babel (>=2.9.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] + +[[package]] +name = "mkdocs-blogging-plugin" +version = "2.2.11" +description = "Mkdocs plugin that generates a blog index page sorted by creation date." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "mkdocs-blogging-plugin-2.2.11.tar.gz", hash = "sha256:91b3ebc1ee3870958a0f9304d985f73a8e170a1f8d17948488415fa1a4257b2e"}, + {file = "mkdocs_blogging_plugin-2.2.11-py3-none-any.whl", hash = "sha256:7e0f14e5a5d9d7fa106ee014b04a49e2fdb5ffe70a0026106dceb79930ba8ac2"}, +] + +[package.dependencies] +babel = ">=2.7.0" +GitPython = ">=3.1.18" +jinja2 = ">=2" +mkdocs = ">=1.0" + +[[package]] +name = "mkdocs-git-revision-date-localized-plugin" +version = "1.3.0" +description = "Mkdocs plugin that enables displaying the localized date of the last git modification of a markdown file." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "mkdocs_git_revision_date_localized_plugin-1.3.0-py3-none-any.whl", hash = "sha256:c99377ee119372d57a9e47cff4e68f04cce634a74831c06bc89b33e456e840a1"}, + {file = "mkdocs_git_revision_date_localized_plugin-1.3.0.tar.gz", hash = "sha256:439e2f14582204050a664c258861c325064d97cdc848c541e48bb034a6c4d0cb"}, +] + +[package.dependencies] +babel = ">=2.7.0" +GitPython = "*" +mkdocs = ">=1.0" +pytz = "*" + +[package.extras] +all = ["GitPython", "babel (>=2.7.0)", "click", "codecov", "mkdocs (>=1.0)", "mkdocs-gen-files", "mkdocs-git-authors-plugin", "mkdocs-material", "mkdocs-static-i18n", "pytest", "pytest-cov", "pytz"] +base = ["GitPython", "babel (>=2.7.0)", "mkdocs (>=1.0)", "pytz"] +dev = ["click", "codecov", "mkdocs-gen-files", "mkdocs-git-authors-plugin", "mkdocs-material", "mkdocs-static-i18n", "pytest", "pytest-cov"] + +[[package]] +name = "mkdocs-include-markdown-plugin" +version = "7.1.2" +description = "Mkdocs Markdown includer plugin." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "mkdocs_include_markdown_plugin-7.1.2-py3-none-any.whl", hash = "sha256:ff1175d1b4f83dea6a38e200d6f0c3db10308975bf60c197d31172671753dbc4"}, + {file = "mkdocs_include_markdown_plugin-7.1.2.tar.gz", hash = "sha256:1b393157b1aa231b0e6c59ba80f52b723f4b7827bb7a1264b505334f8542aaf1"}, +] + +[package.dependencies] +mkdocs = ">=1.4" +wcmatch = "*" + +[package.extras] +cache = ["platformdirs"] + +[[package]] +name = "mkdocs-rss-plugin" +version = "1.8.0" +description = "MkDocs plugin which generates a static RSS feed using git log and page.meta." +optional = false +python-versions = ">=3.8, <4" +groups = ["main"] +files = [ + {file = "mkdocs-rss-plugin-1.8.0.tar.gz", hash = "sha256:475bf4ea05cbe786af38d519b55352b1b2eb87597ad680fcbc309056864ed5c4"}, + {file = "mkdocs_rss_plugin-1.8.0-py2.py3-none-any.whl", hash = "sha256:0fa13c99730c1d3ad9ec05102ff3d148c9849396c40b30be789339d38722fa8f"}, +] + +[package.dependencies] +GitPython = ">=3.1,<3.2" +mkdocs = ">=1.1,<2" +tzdata = {version = "==2023.*", markers = "python_version >= \"3.9\" and sys_platform == \"win32\""} + +[package.extras] +dev = ["black", "feedparser (>=6.0,<6.1)", "flake8 (>=4,<7)", "pre-commit (>=3,<4)", "pytest-cov (>=4,<4.2)", "validator-collection (>=1.5,<1.6)"] +doc = ["mkdocs-bootswatch (>=1,<2)", "mkdocs-minify-plugin (==0.6.*)", "pygments (>=2.5,<3)", "pymdown-extensions (>=10,<11)"] + +[[package]] +name = "multidict" +version = "6.1.0" +description = "multidict implementation" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, + {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, + {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, + {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, + {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, + {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, + {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, + {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, + {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, + {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, + {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, + {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, + {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, + {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, + {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, +] + +[[package]] +name = "nbclient" +version = "0.10.0" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +optional = false +python-versions = ">=3.8.0" +groups = ["main"] +files = [ + {file = "nbclient-0.10.0-py3-none-any.whl", hash = "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"}, + {file = "nbclient-0.10.0.tar.gz", hash = "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09"}, +] + +[package.dependencies] +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +nbformat = ">=5.1" +traitlets = ">=5.4" + +[package.extras] +dev = ["pre-commit"] +docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] + +[[package]] +name = "nbconvert" +version = "7.16.4" +description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "nbconvert-7.16.4-py3-none-any.whl", hash = "sha256:05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3"}, + {file = "nbconvert-7.16.4.tar.gz", hash = "sha256:86ca91ba266b0a448dc96fa6c5b9d98affabde2867b363258703536807f9f7f4"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +bleach = "!=5.0.0" +defusedxml = "*" +jinja2 = ">=3.0" +jupyter-core = ">=4.7" +jupyterlab-pygments = "*" +markupsafe = ">=2.0" +mistune = ">=2.0.3,<4" +nbclient = ">=0.5.0" +nbformat = ">=5.7" +packaging = "*" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +tinycss2 = "*" +traitlets = ">=5.1" + +[package.extras] +all = ["flaky", "ipykernel", "ipython", "ipywidgets (>=7.5)", "myst-parser", "nbsphinx (>=0.2.12)", "playwright", "pydata-sphinx-theme", "pyqtwebengine (>=5.15)", "pytest (>=7)", "sphinx (==5.0.2)", "sphinxcontrib-spelling", "tornado (>=6.1)"] +docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] +qtpdf = ["pyqtwebengine (>=5.15)"] +qtpng = ["pyqtwebengine (>=5.15)"] +serve = ["tornado (>=6.1)"] +test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] +webpdf = ["playwright"] + +[[package]] +name = "nbformat" +version = "5.10.4" +description = "The Jupyter Notebook format" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, + {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, +] + +[package.dependencies] +fastjsonschema = ">=2.15" +jsonschema = ">=2.6" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +traitlets = ">=5.1" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["pep440", "pre-commit", "pytest", "testpath"] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +groups = ["main"] +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + +[[package]] +name = "nltk" +version = "3.9.1" +description = "Natural Language Toolkit" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1"}, + {file = "nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868"}, +] + +[package.dependencies] +click = "*" +joblib = "*" +regex = ">=2021.8.3" +tqdm = "*" + +[package.extras] +all = ["matplotlib", "numpy", "pyparsing", "python-crfsuite", "requests", "scikit-learn", "scipy", "twython"] +corenlp = ["requests"] +machine-learning = ["numpy", "python-crfsuite", "scikit-learn", "scipy"] +plot = ["matplotlib"] +tgrep = ["pyparsing"] +twitter = ["twython"] + +[[package]] +name = "nodeenv" +version = "1.9.1" +description = "Node.js virtual environment builder" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main"] +files = [ + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, +] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +description = "A shim layer for notebook traits and config" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, + {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, +] + +[package.dependencies] +jupyter-server = ">=1.8,<3" + +[package.extras] +test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] + +[[package]] +name = "overrides" +version = "7.7.0" +description = "A decorator to automatically detect mismatch when overriding a method." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, + {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, +] + +[[package]] +name = "packaging" +version = "24.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +description = "Utilities for writing pandoc filters in python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] +files = [ + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, +] + +[[package]] +name = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +groups = ["main"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "platformdirs" +version = "4.3.6" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] + +[[package]] +name = "pre-commit" +version = "4.0.1" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878"}, + {file = "pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + +[[package]] +name = "prometheus-client" +version = "0.21.0" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "prometheus_client-0.21.0-py3-none-any.whl", hash = "sha256:4fa6b4dd0ac16d58bb587c04b1caae65b8c5043e85f778f42f5f632f6af2e166"}, + {file = "prometheus_client-0.21.0.tar.gz", hash = "sha256:96c83c606b71ff2b0a433c98889d275f51ffec6c5e267de37c7a2b5c9aa9233e"}, +] + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.48" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +groups = ["main"] +files = [ + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "propcache" +version = "0.2.1" +description = "Accelerated property cache" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6"}, + {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2"}, + {file = "propcache-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b"}, + {file = "propcache-0.2.1-cp310-cp310-win32.whl", hash = "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4"}, + {file = "propcache-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e"}, + {file = "propcache-0.2.1-cp311-cp311-win32.whl", hash = "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034"}, + {file = "propcache-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518"}, + {file = "propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246"}, + {file = "propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30"}, + {file = "propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6"}, + {file = "propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6a9a8c34fb7bb609419a211e59da8887eeca40d300b5ea8e56af98f6fbbb1541"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae1aa1cd222c6d205853b3013c69cd04515f9d6ab6de4b0603e2e1c33221303e"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:accb6150ce61c9c4b7738d45550806aa2b71c7668c6942f17b0ac182b6142fd4"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eee736daafa7af6d0a2dc15cc75e05c64f37fc37bafef2e00d77c14171c2097"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7a31fc1e1bd362874863fdeed71aed92d348f5336fd84f2197ba40c59f061bd"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba4cfa1052819d16699e1d55d18c92b6e094d4517c41dd231a8b9f87b6fa681"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f089118d584e859c62b3da0892b88a83d611c2033ac410e929cb6754eec0ed16"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:781e65134efaf88feb447e8c97a51772aa75e48b794352f94cb7ea717dedda0d"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31f5af773530fd3c658b32b6bdc2d0838543de70eb9a2156c03e410f7b0d3aae"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:a7a078f5d37bee6690959c813977da5291b24286e7b962e62a94cec31aa5188b"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cea7daf9fc7ae6687cf1e2c049752f19f146fdc37c2cc376e7d0032cf4f25347"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:8b3489ff1ed1e8315674d0775dc7d2195fb13ca17b3808721b54dbe9fd020faf"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9403db39be1393618dd80c746cb22ccda168efce239c73af13c3763ef56ffc04"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5d97151bc92d2b2578ff7ce779cdb9174337390a535953cbb9452fb65164c587"}, + {file = "propcache-0.2.1-cp39-cp39-win32.whl", hash = "sha256:9caac6b54914bdf41bcc91e7eb9147d331d29235a7c967c150ef5df6464fd1bb"}, + {file = "propcache-0.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:92fc4500fcb33899b05ba73276dfb684a20d31caa567b7cb5252d48f896a91b1"}, + {file = "propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54"}, + {file = "propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64"}, +] + +[[package]] +name = "psutil" +version = "6.1.0" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main"] +files = [ + {file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc"}, + {file = "psutil-6.1.0-cp27-none-win32.whl", hash = "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e"}, + {file = "psutil-6.1.0-cp27-none-win_amd64.whl", hash = "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a"}, + {file = "psutil-6.1.0-cp36-cp36m-win32.whl", hash = "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca"}, + {file = "psutil-6.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747"}, + {file = "psutil-6.1.0-cp37-abi3-win32.whl", hash = "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e"}, + {file = "psutil-6.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be"}, + {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"}, +] + +[package.extras] +dev = ["black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "wheel"] +test = ["pytest", "pytest-xdist", "setuptools"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +groups = ["main"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\" or os_name != \"nt\"" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pygments" +version = "2.18.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pymdown-extensions" +version = "10.4" +description = "Extension pack for Python Markdown." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pymdown_extensions-10.4-py3-none-any.whl", hash = "sha256:cfc28d6a09d19448bcbf8eee3ce098c7d17ff99f7bd3069db4819af181212037"}, + {file = "pymdown_extensions-10.4.tar.gz", hash = "sha256:bc46f11749ecd4d6b71cf62396104b4a200bad3498cb0f5dad1b8502fe461a35"}, +] + +[package.dependencies] +markdown = ">=3.2" +pyyaml = "*" + +[package.extras] +extra = ["pygments (>=2.12)"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-json-logger" +version = "2.0.7" +description = "A python library adding a json log formatter" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, + {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, +] + +[[package]] +name = "python-levenshtein" +version = "0.26.0" +description = "Python extension for computing string edit distances and similarities." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "python_Levenshtein-0.26.0-py3-none-any.whl", hash = "sha256:1d808ba2f9df04aaea5eceba6e73734f2ffeba99d98d2a91078f32276cd041f4"}, + {file = "python_levenshtein-0.26.0.tar.gz", hash = "sha256:b454dd13708546649f1cba2a0f450dd98e7c1679a92e2d6f0a8b8c013c276e55"}, +] + +[package.dependencies] +Levenshtein = "0.26.0" + +[[package]] +name = "pytz" +version = "2025.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"}, + {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"}, +] + +[[package]] +name = "pywin32" +version = "308" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"" +files = [ + {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, + {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, + {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"}, + {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, + {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, + {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, + {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"}, + {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"}, + {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"}, + {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, + {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, + {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, + {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"}, + {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"}, + {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"}, + {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"}, + {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"}, + {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"}, +] + +[[package]] +name = "pywinpty" +version = "2.0.14" +description = "Pseudo terminal support for Windows from Python." +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "os_name == \"nt\"" +files = [ + {file = "pywinpty-2.0.14-cp310-none-win_amd64.whl", hash = "sha256:0b149c2918c7974f575ba79f5a4aad58bd859a52fa9eb1296cc22aa412aa411f"}, + {file = "pywinpty-2.0.14-cp311-none-win_amd64.whl", hash = "sha256:cf2a43ac7065b3e0dc8510f8c1f13a75fb8fde805efa3b8cff7599a1ef497bc7"}, + {file = "pywinpty-2.0.14-cp312-none-win_amd64.whl", hash = "sha256:55dad362ef3e9408ade68fd173e4f9032b3ce08f68cfe7eacb2c263ea1179737"}, + {file = "pywinpty-2.0.14-cp313-none-win_amd64.whl", hash = "sha256:074fb988a56ec79ca90ed03a896d40707131897cefb8f76f926e3834227f2819"}, + {file = "pywinpty-2.0.14-cp39-none-win_amd64.whl", hash = "sha256:5725fd56f73c0531ec218663bd8c8ff5acc43c78962fab28564871b5fce053fd"}, + {file = "pywinpty-2.0.14.tar.gz", hash = "sha256:18bd9529e4a5daf2d9719aa17788ba6013e594ae94c5a0c27e83df3278b0660e"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "pyyaml-env-tag" +version = "0.1" +description = "A custom YAML tag for referencing environment variables in YAML files. " +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, + {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, +] + +[package.dependencies] +pyyaml = "*" + +[[package]] +name = "pyzmq" +version = "26.2.0" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629"}, + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea"}, + {file = "pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6"}, + {file = "pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b"}, + {file = "pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e"}, + {file = "pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0"}, + {file = "pyzmq-26.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win32.whl", hash = "sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd"}, + {file = "pyzmq-26.2.0-cp38-cp38-win32.whl", hash = "sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988"}, + {file = "pyzmq-26.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940"}, + {file = "pyzmq-26.2.0-cp39-cp39-win32.whl", hash = "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f"}, + {file = "pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "rapidfuzz" +version = "3.10.0" +description = "rapid fuzzy string matching" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "rapidfuzz-3.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:884453860de029380dded8f3c1918af2d8eb5adf8010261645c7e5c88c2b5428"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:718c9bd369288aca5fa929df6dbf66fdbe9768d90940a940c0b5cdc96ade4309"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a68e3724b7dab761c01816aaa64b0903734d999d5589daf97c14ef5cc0629a8e"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1af60988d47534246d9525f77288fdd9de652608a4842815d9018570b959acc6"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3084161fc3e963056232ef8d937449a2943852e07101f5a136c8f3cfa4119217"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6cd67d3d017296d98ff505529104299f78433e4b8af31b55003d901a62bbebe9"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b11a127ac590fc991e8a02c2d7e1ac86e8141c92f78546f18b5c904064a0552c"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:aadce42147fc09dcef1afa892485311e824c050352e1aa6e47f56b9b27af4cf0"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b54853c2371bf0e38d67da379519deb6fbe70055efb32f6607081641af3dc752"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ce19887268e90ee81a3957eef5e46a70ecc000713796639f83828b950343f49e"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f39a2a5ded23b9b9194ec45740dce57177b80f86c6d8eba953d3ff1a25c97766"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0ec338d5f4ad8d9339a88a08db5c23e7f7a52c2b2a10510c48a0cef1fb3f0ddc"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-win32.whl", hash = "sha256:56fd15ea8f4c948864fa5ebd9261c67cf7b89a1c517a0caef4df75446a7af18c"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:43dfc5e733808962a822ff6d9c29f3039a3cfb3620706f5953e17cfe4496724c"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-win_arm64.whl", hash = "sha256:ae7966f205b5a7fde93b44ca8fed37c1c8539328d7f179b1197de34eceaceb5f"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bb0013795b40db5cf361e6f21ee7cda09627cf294977149b50e217d7fe9a2f03"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:69ef5b363afff7150a1fbe788007e307b9802a2eb6ad92ed51ab94e6ad2674c6"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c582c46b1bb0b19f1a5f4c1312f1b640c21d78c371a6615c34025b16ee56369b"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:288f6f6e7410cacb115fb851f3f18bf0e4231eb3f6cb5bd1cec0e7b25c4d039d"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9e29a13d2fd9be3e7d8c26c7ef4ba60b5bc7efbc9dbdf24454c7e9ebba31768"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea2da0459b951ee461bd4e02b8904890bd1c4263999d291c5cd01e6620177ad4"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:457827ba82261aa2ae6ac06a46d0043ab12ba7216b82d87ae1434ec0f29736d6"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5d350864269d56f51ab81ab750c9259ae5cad3152c0680baef143dcec92206a1"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a9b8f51e08c3f983d857c3889930af9ddecc768453822076683664772d87e374"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7f3a6aa6e70fc27e4ff5c479f13cc9fc26a56347610f5f8b50396a0d344c5f55"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:803f255f10d63420979b1909ef976e7d30dec42025c9b067fc1d2040cc365a7e"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2026651761bf83a0f31495cc0f70840d5c0d54388f41316e3f9cb51bd85e49a5"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-win32.whl", hash = "sha256:4df75b3ebbb8cfdb9bf8b213b168620b88fd92d0c16a8bc9f9234630b282db59"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f9f0bbfb6787b97c51516f3ccf97737d504db5d239ad44527673b81f598b84ab"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-win_arm64.whl", hash = "sha256:10fdad800441b9c97d471a937ba7d42625f1b530db05e572f1cb7d401d95c893"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7dc87073ba3a40dd65591a2100aa71602107443bf10770579ff9c8a3242edb94"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a425a0a868cf8e9c6e93e1cda4b758cdfd314bb9a4fc916c5742c934e3613480"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d5d1d75e61df060c1e56596b6b0a4422a929dff19cc3dbfd5eee762c86b61"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34f213d59219a9c3ca14e94a825f585811a68ac56b4118b4dc388b5b14afc108"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96ad46f5f56f70fab2be9e5f3165a21be58d633b90bf6e67fc52a856695e4bcf"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9178277f72d144a6c7704d7ae7fa15b7b86f0f0796f0e1049c7b4ef748a662ef"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76a35e9e19a7c883c422ffa378e9a04bc98cb3b29648c5831596401298ee51e6"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a6405d34c394c65e4f73a1d300c001f304f08e529d2ed6413b46ee3037956eb"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bd393683129f446a75d8634306aed7e377627098a1286ff3af2a4f1736742820"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b0445fa9880ead81f5a7d0efc0b9c977a947d8052c43519aceeaf56eabaf6843"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c50bc308fa29767ed8f53a8d33b7633a9e14718ced038ed89d41b886e301da32"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e89605afebbd2d4b045bccfdc12a14b16fe8ccbae05f64b4b4c64a97dad1c891"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-win32.whl", hash = "sha256:2db9187f3acf3cd33424ecdbaad75414c298ecd1513470df7bda885dcb68cc15"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:50e3d0c72ea15391ba9531ead7f2068a67c5b18a6a365fef3127583aaadd1725"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-win_arm64.whl", hash = "sha256:9eac95b4278bd53115903d89118a2c908398ee8bdfd977ae844f1bd2b02b917c"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fe5231e8afd069c742ac5b4f96344a0fe4aff52df8e53ef87faebf77f827822c"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:886882367dbc985f5736356105798f2ae6e794e671fc605476cbe2e73838a9bb"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b33e13e537e3afd1627d421a142a12bbbe601543558a391a6fae593356842f6e"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:094c26116d55bf9c53abd840d08422f20da78ec4c4723e5024322321caedca48"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:545fc04f2d592e4350f59deb0818886c1b444ffba3bec535b4fbb97191aaf769"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:916a6abf3632e592b937c3d04c00a6efadd8fd30539cdcd4e6e4d92be7ca5d90"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb6ec40cef63b1922083d33bfef2f91fc0b0bc07b5b09bfee0b0f1717d558292"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c77a7330dd15c7eb5fd3631dc646fc96327f98db8181138766bd14d3e905f0ba"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:949b5e9eeaa4ecb4c7e9c2a4689dddce60929dd1ff9c76a889cdbabe8bbf2171"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b5363932a5aab67010ae1a6205c567d1ef256fb333bc23c27582481606be480c"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5dd6eec15b13329abe66cc241b484002ecb0e17d694491c944a22410a6a9e5e2"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79e7f98525b60b3c14524e0a4e1fedf7654657b6e02eb25f1be897ab097706f3"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-win32.whl", hash = "sha256:d29d1b9857c65f8cb3a29270732e1591b9bacf89de9d13fa764f79f07d8f1fd2"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:fa9720e56663cc3649d62b4b5f3145e94b8f5611e8a8e1b46507777249d46aad"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-win_arm64.whl", hash = "sha256:eda4c661e68dddd56c8fbfe1ca35e40dd2afd973f7ebb1605f4d151edc63dff8"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cffbc50e0767396ed483900900dd58ce4351bc0d40e64bced8694bd41864cc71"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c038b9939da3035afb6cb2f465f18163e8f070aba0482923ecff9443def67178"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca366c2e2a54e2f663f4529b189fdeb6e14d419b1c78b754ec1744f3c01070d4"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c4c82b1689b23b1b5e6a603164ed2be41b6f6de292a698b98ba2381e889eb9d"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98f6ebe28831a482981ecfeedc8237047878424ad0c1add2c7f366ba44a20452"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4bd1a7676ee2a4c8e2f7f2550bece994f9f89e58afb96088964145a83af7408b"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec9139baa3f85b65adc700eafa03ed04995ca8533dd56c924f0e458ffec044ab"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:26de93e6495078b6af4c4d93a42ca067b16cc0e95699526c82ab7d1025b4d3bf"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f3a0bda83c18195c361b5500377d0767749f128564ca95b42c8849fd475bb327"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:63e4c175cbce8c3adc22dca5e6154588ae673f6c55374d156f3dac732c88d7de"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4dd3d8443970eaa02ab5ae45ce584b061f2799cd9f7e875190e2617440c1f9d4"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e5ddb2388610799fc46abe389600625058f2a73867e63e20107c5ad5ffa57c47"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-win32.whl", hash = "sha256:2e9be5d05cd960914024412b5406fb75a82f8562f45912ff86255acbfdbfb78e"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:47aca565a39c9a6067927871973ca827023e8b65ba6c5747f4c228c8d7ddc04f"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-win_arm64.whl", hash = "sha256:b0732343cdc4273b5921268026dd7266f75466eb21873cb7635a200d9d9c3fac"}, + {file = "rapidfuzz-3.10.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f744b5eb1469bf92dd143d36570d2bdbbdc88fe5cb0b5405e53dd34f479cbd8a"}, + {file = "rapidfuzz-3.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b67cc21a14327a0eb0f47bc3d7e59ec08031c7c55220ece672f9476e7a8068d3"}, + {file = "rapidfuzz-3.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fe5783676f0afba4a522c80b15e99dbf4e393c149ab610308a8ef1f04c6bcc8"}, + {file = "rapidfuzz-3.10.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4688862f957c8629d557d084f20b2d803f8738b6c4066802a0b1cc472e088d9"}, + {file = "rapidfuzz-3.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20bd153aacc244e4c907d772c703fea82754c4db14f8aa64d75ff81b7b8ab92d"}, + {file = "rapidfuzz-3.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:50484d563f8bfa723c74c944b0bb15b9e054db9c889348c8c307abcbee75ab92"}, + {file = "rapidfuzz-3.10.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5897242d455461f2c5b82d7397b29341fd11e85bf3608a522177071044784ee8"}, + {file = "rapidfuzz-3.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:116c71a81e046ba56551d8ab68067ca7034d94b617545316d460a452c5c3c289"}, + {file = "rapidfuzz-3.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0a547e4350d1fa32624d3eab51eff8cf329f4cae110b4ea0402486b1da8be40"}, + {file = "rapidfuzz-3.10.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:399b9b79ccfcf50ca3bad7692bc098bb8eade88d7d5e15773b7f866c91156d0c"}, + {file = "rapidfuzz-3.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7947a425d1be3e744707ee58c6cb318b93a56e08f080722dcc0347e0b7a1bb9a"}, + {file = "rapidfuzz-3.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:94c48b4a2a4b1d22246f48e2b11cae01ec7d23f0c9123f8bb822839ad79d0a88"}, + {file = "rapidfuzz-3.10.0.tar.gz", hash = "sha256:6b62af27e65bb39276a66533655a2fa3c60a487b03935721c45b7809527979be"}, +] + +[package.extras] +all = ["numpy"] + +[[package]] +name = "referencing" +version = "0.35.1" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + +[[package]] +name = "regex" +version = "2025.9.1" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "regex-2025.9.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5aa2a6a73bf218515484b36a0d20c6ad9dc63f6339ff6224147b0e2c095ee55"}, + {file = "regex-2025.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c2ff5c01d5e47ad5fc9d31bcd61e78c2fa0068ed00cab86b7320214446da766"}, + {file = "regex-2025.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d49dc84e796b666181de8a9973284cad6616335f01b52bf099643253094920fc"}, + {file = "regex-2025.9.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9914fe1040874f83c15fcea86d94ea54091b0666eab330aaab69e30d106aabe"}, + {file = "regex-2025.9.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e71bceb3947362ec5eabd2ca0870bb78eae4edfc60c6c21495133c01b6cd2df4"}, + {file = "regex-2025.9.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:67a74456f410fe5e869239ee7a5423510fe5121549af133809d9591a8075893f"}, + {file = "regex-2025.9.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5c3b96ed0223b32dbdc53a83149b6de7ca3acd5acd9c8e64b42a166228abe29c"}, + {file = "regex-2025.9.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:113d5aa950f428faf46fd77d452df62ebb4cc6531cb619f6cc30a369d326bfbd"}, + {file = "regex-2025.9.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fcdeb38de4f7f3d69d798f4f371189061446792a84e7c92b50054c87aae9c07c"}, + {file = "regex-2025.9.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4bcdff370509164b67a6c8ec23c9fb40797b72a014766fdc159bb809bd74f7d8"}, + {file = "regex-2025.9.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:7383efdf6e8e8c61d85e00cfb2e2e18da1a621b8bfb4b0f1c2747db57b942b8f"}, + {file = "regex-2025.9.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1ec2bd3bdf0f73f7e9f48dca550ba7d973692d5e5e9a90ac42cc5f16c4432d8b"}, + {file = "regex-2025.9.1-cp310-cp310-win32.whl", hash = "sha256:9627e887116c4e9c0986d5c3b4f52bcfe3df09850b704f62ec3cbf177a0ae374"}, + {file = "regex-2025.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:94533e32dc0065eca43912ee6649c90ea0681d59f56d43c45b5bcda9a740b3dd"}, + {file = "regex-2025.9.1-cp310-cp310-win_arm64.whl", hash = "sha256:a874a61bb580d48642ffd338570ee24ab13fa023779190513fcacad104a6e251"}, + {file = "regex-2025.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e5bcf112b09bfd3646e4db6bf2e598534a17d502b0c01ea6550ba4eca780c5e6"}, + {file = "regex-2025.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:67a0295a3c31d675a9ee0238d20238ff10a9a2fdb7a1323c798fc7029578b15c"}, + {file = "regex-2025.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea8267fbadc7d4bd7c1301a50e85c2ff0de293ff9452a1a9f8d82c6cafe38179"}, + {file = "regex-2025.9.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6aeff21de7214d15e928fb5ce757f9495214367ba62875100d4c18d293750cc1"}, + {file = "regex-2025.9.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d89f1bbbbbc0885e1c230f7770d5e98f4f00b0ee85688c871d10df8b184a6323"}, + {file = "regex-2025.9.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ca3affe8ddea498ba9d294ab05f5f2d3b5ad5d515bc0d4a9016dd592a03afe52"}, + {file = "regex-2025.9.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:91892a7a9f0a980e4c2c85dd19bc14de2b219a3a8867c4b5664b9f972dcc0c78"}, + {file = "regex-2025.9.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e1cb40406f4ae862710615f9f636c1e030fd6e6abe0e0f65f6a695a2721440c6"}, + {file = "regex-2025.9.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:94f6cff6f7e2149c7e6499a6ecd4695379eeda8ccbccb9726e8149f2fe382e92"}, + {file = "regex-2025.9.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6c0226fb322b82709e78c49cc33484206647f8a39954d7e9de1567f5399becd0"}, + {file = "regex-2025.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a12f59c7c380b4fcf7516e9cbb126f95b7a9518902bcf4a852423ff1dcd03e6a"}, + {file = "regex-2025.9.1-cp311-cp311-win32.whl", hash = "sha256:49865e78d147a7a4f143064488da5d549be6bfc3f2579e5044cac61f5c92edd4"}, + {file = "regex-2025.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:d34b901f6f2f02ef60f4ad3855d3a02378c65b094efc4b80388a3aeb700a5de7"}, + {file = "regex-2025.9.1-cp311-cp311-win_arm64.whl", hash = "sha256:47d7c2dab7e0b95b95fd580087b6ae196039d62306a592fa4e162e49004b6299"}, + {file = "regex-2025.9.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:84a25164bd8dcfa9f11c53f561ae9766e506e580b70279d05a7946510bdd6f6a"}, + {file = "regex-2025.9.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:645e88a73861c64c1af558dd12294fb4e67b5c1eae0096a60d7d8a2143a611c7"}, + {file = "regex-2025.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:10a450cba5cd5409526ee1d4449f42aad38dd83ac6948cbd6d7f71ca7018f7db"}, + {file = "regex-2025.9.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9dc5991592933a4192c166eeb67b29d9234f9c86344481173d1bc52f73a7104"}, + {file = "regex-2025.9.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a32291add816961aab472f4fad344c92871a2ee33c6c219b6598e98c1f0108f2"}, + {file = "regex-2025.9.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:588c161a68a383478e27442a678e3b197b13c5ba51dbba40c1ccb8c4c7bee9e9"}, + {file = "regex-2025.9.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47829ffaf652f30d579534da9085fe30c171fa2a6744a93d52ef7195dc38218b"}, + {file = "regex-2025.9.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e978e5a35b293ea43f140c92a3269b6ab13fe0a2bf8a881f7ac740f5a6ade85"}, + {file = "regex-2025.9.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4cf09903e72411f4bf3ac1eddd624ecfd423f14b2e4bf1c8b547b72f248b7bf7"}, + {file = "regex-2025.9.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d016b0f77be63e49613c9e26aaf4a242f196cd3d7a4f15898f5f0ab55c9b24d2"}, + {file = "regex-2025.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:656563e620de6908cd1c9d4f7b9e0777e3341ca7db9d4383bcaa44709c90281e"}, + {file = "regex-2025.9.1-cp312-cp312-win32.whl", hash = "sha256:df33f4ef07b68f7ab637b1dbd70accbf42ef0021c201660656601e8a9835de45"}, + {file = "regex-2025.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:5aba22dfbc60cda7c0853516104724dc904caa2db55f2c3e6e984eb858d3edf3"}, + {file = "regex-2025.9.1-cp312-cp312-win_arm64.whl", hash = "sha256:ec1efb4c25e1849c2685fa95da44bfde1b28c62d356f9c8d861d4dad89ed56e9"}, + {file = "regex-2025.9.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bc6834727d1b98d710a63e6c823edf6ffbf5792eba35d3fa119531349d4142ef"}, + {file = "regex-2025.9.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c3dc05b6d579875719bccc5f3037b4dc80433d64e94681a0061845bd8863c025"}, + {file = "regex-2025.9.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22213527df4c985ec4a729b055a8306272d41d2f45908d7bacb79be0fa7a75ad"}, + {file = "regex-2025.9.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8e3f6e3c5a5a1adc3f7ea1b5aec89abfc2f4fbfba55dafb4343cd1d084f715b2"}, + {file = "regex-2025.9.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcb89c02a0d6c2bec9b0bb2d8c78782699afe8434493bfa6b4021cc51503f249"}, + {file = "regex-2025.9.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b0e2f95413eb0c651cd1516a670036315b91b71767af83bc8525350d4375ccba"}, + {file = "regex-2025.9.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a41dc039e1c97d3c2ed3e26523f748e58c4de3ea7a31f95e1cf9ff973fff5a"}, + {file = "regex-2025.9.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f0b4258b161094f66857a26ee938d3fe7b8a5063861e44571215c44fbf0e5df"}, + {file = "regex-2025.9.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bf70e18ac390e6977ea7e56f921768002cb0fa359c4199606c7219854ae332e0"}, + {file = "regex-2025.9.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b84036511e1d2bb0a4ff1aec26951caa2dea8772b223c9e8a19ed8885b32dbac"}, + {file = "regex-2025.9.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c2e05dcdfe224047f2a59e70408274c325d019aad96227ab959403ba7d58d2d7"}, + {file = "regex-2025.9.1-cp313-cp313-win32.whl", hash = "sha256:3b9a62107a7441b81ca98261808fed30ae36ba06c8b7ee435308806bd53c1ed8"}, + {file = "regex-2025.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:b38afecc10c177eb34cfae68d669d5161880849ba70c05cbfbe409f08cc939d7"}, + {file = "regex-2025.9.1-cp313-cp313-win_arm64.whl", hash = "sha256:ec329890ad5e7ed9fc292858554d28d58d56bf62cf964faf0aa57964b21155a0"}, + {file = "regex-2025.9.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:72fb7a016467d364546f22b5ae86c45680a4e0de6b2a6f67441d22172ff641f1"}, + {file = "regex-2025.9.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c9527fa74eba53f98ad86be2ba003b3ebe97e94b6eb2b916b31b5f055622ef03"}, + {file = "regex-2025.9.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c905d925d194c83a63f92422af7544ec188301451b292c8b487f0543726107ca"}, + {file = "regex-2025.9.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74df7c74a63adcad314426b1f4ea6054a5ab25d05b0244f0c07ff9ce640fa597"}, + {file = "regex-2025.9.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4f6e935e98ea48c7a2e8be44494de337b57a204470e7f9c9c42f912c414cd6f5"}, + {file = "regex-2025.9.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4a62d033cd9ebefc7c5e466731a508dfabee827d80b13f455de68a50d3c2543d"}, + {file = "regex-2025.9.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef971ebf2b93bdc88d8337238be4dfb851cc97ed6808eb04870ef67589415171"}, + {file = "regex-2025.9.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d936a1db208bdca0eca1f2bb2c1ba1d8370b226785c1e6db76e32a228ffd0ad5"}, + {file = "regex-2025.9.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:7e786d9e4469698fc63815b8de08a89165a0aa851720eb99f5e0ea9d51dd2b6a"}, + {file = "regex-2025.9.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6b81d7dbc5466ad2c57ce3a0ddb717858fe1a29535c8866f8514d785fdb9fc5b"}, + {file = "regex-2025.9.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cd4890e184a6feb0ef195338a6ce68906a8903a0f2eb7e0ab727dbc0a3156273"}, + {file = "regex-2025.9.1-cp314-cp314-win32.whl", hash = "sha256:34679a86230e46164c9e0396b56cab13c0505972343880b9e705083cc5b8ec86"}, + {file = "regex-2025.9.1-cp314-cp314-win_amd64.whl", hash = "sha256:a1196e530a6bfa5f4bde029ac5b0295a6ecfaaffbfffede4bbaf4061d9455b70"}, + {file = "regex-2025.9.1-cp314-cp314-win_arm64.whl", hash = "sha256:f46d525934871ea772930e997d577d48c6983e50f206ff7b66d4ac5f8941e993"}, + {file = "regex-2025.9.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a13d20007dce3c4b00af5d84f6c191ed1c0f70928c6d9b6cd7b8d2f125df7f46"}, + {file = "regex-2025.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d6b046b0a01cb713fd53ef36cb59db4b0062b343db28e83b52ac6aa01ee5b368"}, + {file = "regex-2025.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0fa9a7477288717f42dbd02ff5d13057549e9a8cdb81f224c313154cc10bab52"}, + {file = "regex-2025.9.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2b3ad150c6bc01a8cd5030040675060e2adbe6cbc50aadc4da42c6d32ec266e"}, + {file = "regex-2025.9.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:aa88d5a82dfe80deaf04e8c39c8b0ad166d5d527097eb9431cb932c44bf88715"}, + {file = "regex-2025.9.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6f1dae2cf6c2dbc6fd2526653692c144721b3cf3f769d2a3c3aa44d0f38b9a58"}, + {file = "regex-2025.9.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ff62a3022914fc19adaa76b65e03cf62bc67ea16326cbbeb170d280710a7d719"}, + {file = "regex-2025.9.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a34ef82216189d823bc82f614d1031cb0b919abef27cecfd7b07d1e9a8bdeeb4"}, + {file = "regex-2025.9.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d40e6b49daae9ebbd7fa4e600697372cba85b826592408600068e83a3c47211"}, + {file = "regex-2025.9.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:0aeb0fe80331059c152a002142699a89bf3e44352aee28261315df0c9874759b"}, + {file = "regex-2025.9.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a90014d29cb3098403d82a879105d1418edbbdf948540297435ea6e377023ea7"}, + {file = "regex-2025.9.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6ff623271e0b0cc5a95b802666bbd70f17ddd641582d65b10fb260cc0c003529"}, + {file = "regex-2025.9.1-cp39-cp39-win32.whl", hash = "sha256:d161bfdeabe236290adfd8c7588da7f835d67e9e7bf2945f1e9e120622839ba6"}, + {file = "regex-2025.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:43ebc77a7dfe36661192afd8d7df5e8be81ec32d2ad0c65b536f66ebfec3dece"}, + {file = "regex-2025.9.1-cp39-cp39-win_arm64.whl", hash = "sha256:5d74b557cf5554001a869cda60b9a619be307df4d10155894aeaad3ee67c9899"}, + {file = "regex-2025.9.1.tar.gz", hash = "sha256:88ac07b38d20b54d79e704e38aa3bd2c0f8027432164226bdee201a1c0c9c9ff"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +description = "A pure python RFC3339 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main"] +files = [ + {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, + {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +description = "Pure python rfc3986 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main"] +files = [ + {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, + {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, +] + +[[package]] +name = "rich" +version = "13.9.2" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.8.0" +groups = ["main"] +files = [ + {file = "rich-13.9.2-py3-none-any.whl", hash = "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1"}, + {file = "rich-13.9.2.tar.gz", hash = "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "rpds-py" +version = "0.20.0" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "rpds_py-0.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2"}, + {file = "rpds_py-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94"}, + {file = "rpds_py-0.20.0-cp310-none-win32.whl", hash = "sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee"}, + {file = "rpds_py-0.20.0-cp310-none-win_amd64.whl", hash = "sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58"}, + {file = "rpds_py-0.20.0-cp311-none-win32.whl", hash = "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0"}, + {file = "rpds_py-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174"}, + {file = "rpds_py-0.20.0-cp312-none-win32.whl", hash = "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139"}, + {file = "rpds_py-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57"}, + {file = "rpds_py-0.20.0-cp313-none-win32.whl", hash = "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a"}, + {file = "rpds_py-0.20.0-cp313-none-win_amd64.whl", hash = "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a"}, + {file = "rpds_py-0.20.0-cp38-none-win32.whl", hash = "sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5"}, + {file = "rpds_py-0.20.0-cp38-none-win_amd64.whl", hash = "sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b"}, + {file = "rpds_py-0.20.0-cp39-none-win32.whl", hash = "sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7"}, + {file = "rpds_py-0.20.0-cp39-none-win_amd64.whl", hash = "sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8"}, + {file = "rpds_py-0.20.0.tar.gz", hash = "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121"}, +] + +[[package]] +name = "ruff" +version = "0.8.6" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "ruff-0.8.6-py3-none-linux_armv6l.whl", hash = "sha256:defed167955d42c68b407e8f2e6f56ba52520e790aba4ca707a9c88619e580e3"}, + {file = "ruff-0.8.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:54799ca3d67ae5e0b7a7ac234baa657a9c1784b48ec954a094da7c206e0365b1"}, + {file = "ruff-0.8.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e88b8f6d901477c41559ba540beeb5a671e14cd29ebd5683903572f4b40a9807"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0509e8da430228236a18a677fcdb0c1f102dd26d5520f71f79b094963322ed25"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91a7ddb221779871cf226100e677b5ea38c2d54e9e2c8ed847450ebbdf99b32d"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:248b1fb3f739d01d528cc50b35ee9c4812aa58cc5935998e776bf8ed5b251e75"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:bc3c083c50390cf69e7e1b5a5a7303898966be973664ec0c4a4acea82c1d4315"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52d587092ab8df308635762386f45f4638badb0866355b2b86760f6d3c076188"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61323159cf21bc3897674e5adb27cd9e7700bab6b84de40d7be28c3d46dc67cf"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ae4478b1471fc0c44ed52a6fb787e641a2ac58b1c1f91763bafbc2faddc5117"}, + {file = "ruff-0.8.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0c000a471d519b3e6cfc9c6680025d923b4ca140ce3e4612d1a2ef58e11f11fe"}, + {file = "ruff-0.8.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9257aa841e9e8d9b727423086f0fa9a86b6b420fbf4bf9e1465d1250ce8e4d8d"}, + {file = "ruff-0.8.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:45a56f61b24682f6f6709636949ae8cc82ae229d8d773b4c76c09ec83964a95a"}, + {file = "ruff-0.8.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:496dd38a53aa173481a7d8866bcd6451bd934d06976a2505028a50583e001b76"}, + {file = "ruff-0.8.6-py3-none-win32.whl", hash = "sha256:e169ea1b9eae61c99b257dc83b9ee6c76f89042752cb2d83486a7d6e48e8f764"}, + {file = "ruff-0.8.6-py3-none-win_amd64.whl", hash = "sha256:f1d70bef3d16fdc897ee290d7d20da3cbe4e26349f62e8a0274e7a3f4ce7a905"}, + {file = "ruff-0.8.6-py3-none-win_arm64.whl", hash = "sha256:7d7fc2377a04b6e04ffe588caad613d0c460eb2ecba4c0ccbbfe2bc973cbc162"}, + {file = "ruff-0.8.6.tar.gz", hash = "sha256:dcad24b81b62650b0eb8814f576fc65cfee8674772a6e24c9b747911801eeaa5"}, +] + +[[package]] +name = "send2trash" +version = "1.8.3" +description = "Send file to trash natively under Mac OS X, Windows and Linux" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main"] +files = [ + {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, + {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, +] + +[package.extras] +nativelib = ["pyobjc-framework-Cocoa", "pywin32"] +objc = ["pyobjc-framework-Cocoa"] +win32 = ["pywin32"] + +[[package]] +name = "setuptools" +version = "75.2.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "setuptools-75.2.0-py3-none-any.whl", hash = "sha256:a7fcb66f68b4d9e8e66b42f9876150a3371558f98fa32222ffaa5bced76406f8"}, + {file = "setuptools-75.2.0.tar.gz", hash = "sha256:753bb6ebf1f465a1912e19ed1d41f403a79173a9acf66a42e7e6aec45c3c16ec"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"] + +[[package]] +name = "sh" +version = "2.1.0" +description = "Python subprocess replacement" +optional = false +python-versions = "<4.0,>=3.8.1" +groups = ["main"] +files = [ + {file = "sh-2.1.0-py3-none-any.whl", hash = "sha256:bf5e44178dd96a542126c2774e9b7ab1d89bfe0e2ef84d92e6d0ed7358d63d01"}, + {file = "sh-2.1.0.tar.gz", hash = "sha256:7e27301c574bec8ca5bf6f211851357526455ee97cd27a7c4c6cc5e2375399cb"}, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +description = "Tool to Detect Surrounding Shell" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, +] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["main"] +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "smmap" +version = "5.0.1" +description = "A pure Python implementation of a sliding window memory map manager" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "soupsieve" +version = "2.6" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "terminado" +version = "0.18.1" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, + {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, +] + +[package.dependencies] +ptyprocess = {version = "*", markers = "os_name != \"nt\""} +pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} +tornado = ">=6.1.0" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] +typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] + +[[package]] +name = "tinycss2" +version = "1.3.0" +description = "A tiny CSS parser" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "tinycss2-1.3.0-py3-none-any.whl", hash = "sha256:54a8dbdffb334d536851be0226030e9505965bb2f30f21a4a82c55fb2a80fae7"}, + {file = "tinycss2-1.3.0.tar.gz", hash = "sha256:152f9acabd296a8375fbca5b84c961ff95971fcfc32e79550c8df8e29118c54d"}, +] + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["pytest", "ruff"] + +[[package]] +name = "tornado" +version = "6.4.1" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, + {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, + {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, + {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] +discord = ["requests"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "typer" +version = "0.12.5" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b"}, + {file = "typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722"}, +] + +[package.dependencies] +click = ">=8.0.0" +rich = ">=10.11.0" +shellingham = ">=1.3.0" +typing-extensions = ">=3.7.4.3" + +[[package]] +name = "types-python-dateutil" +version = "2.9.0.20241003" +description = "Typing stubs for python-dateutil" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "types-python-dateutil-2.9.0.20241003.tar.gz", hash = "sha256:58cb85449b2a56d6684e41aeefb4c4280631246a0da1a719bdbe6f3fb0317446"}, + {file = "types_python_dateutil-2.9.0.20241003-py3-none-any.whl", hash = "sha256:250e1d8e80e7bbc3a6c99b907762711d1a1cdd00e978ad39cb5940f6f0a87f3d"}, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "tzdata" +version = "2023.4" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +groups = ["main"] +markers = "sys_platform == \"win32\"" +files = [ + {file = "tzdata-2023.4-py2.py3-none-any.whl", hash = "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3"}, + {file = "tzdata-2023.4.tar.gz", hash = "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9"}, +] + +[[package]] +name = "uri-template" +version = "1.3.0" +description = "RFC 6570 URI Template Processor" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, + {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, +] + +[package.extras] +dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"] + +[[package]] +name = "urllib3" +version = "2.2.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "virtualenv" +version = "20.27.0" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "virtualenv-20.27.0-py3-none-any.whl", hash = "sha256:44a72c29cceb0ee08f300b314848c86e57bf8d1f13107a5e671fb9274138d655"}, + {file = "virtualenv-20.27.0.tar.gz", hash = "sha256:2ca56a68ed615b8fe4326d11a0dca5dfbe8fd68510fb6c6349163bed3c15f2b2"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + +[[package]] +name = "watchdog" +version = "5.0.3" +description = "Filesystem events monitoring" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:85527b882f3facda0579bce9d743ff7f10c3e1e0db0a0d0e28170a7d0e5ce2ea"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53adf73dcdc0ef04f7735066b4a57a4cd3e49ef135daae41d77395f0b5b692cb"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e25adddab85f674acac303cf1f5835951345a56c5f7f582987d266679979c75b"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f01f4a3565a387080dc49bdd1fefe4ecc77f894991b88ef927edbfa45eb10818"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d11b07c64f63f49876e0ab8042ae034674c8653bfcdaa8c4b32e71cfff87e8"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:349c9488e1d85d0a58e8cb14222d2c51cbc801ce11ac3936ab4c3af986536926"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:53a3f10b62c2d569e260f96e8d966463dec1a50fa4f1b22aec69e3f91025060e"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:950f531ec6e03696a2414b6308f5c6ff9dab7821a768c9d5788b1314e9a46ca7"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6deb336cba5d71476caa029ceb6e88047fc1dc74b62b7c4012639c0b563906"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1021223c08ba8d2d38d71ec1704496471ffd7be42cfb26b87cd5059323a389a1"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:752fb40efc7cc8d88ebc332b8f4bcbe2b5cc7e881bccfeb8e25054c00c994ee3"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a2e8f3f955d68471fa37b0e3add18500790d129cc7efe89971b8a4cc6fdeb0b2"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8ca4d854adcf480bdfd80f46fdd6fb49f91dd020ae11c89b3a79e19454ec627"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:90a67d7857adb1d985aca232cc9905dd5bc4803ed85cfcdcfcf707e52049eda7"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:720ef9d3a4f9ca575a780af283c8fd3a0674b307651c1976714745090da5a9e8"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:223160bb359281bb8e31c8f1068bf71a6b16a8ad3d9524ca6f523ac666bb6a1e"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:560135542c91eaa74247a2e8430cf83c4342b29e8ad4f520ae14f0c8a19cfb5b"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:78864cc8f23dbee55be34cc1494632a7ba30263951b5b2e8fc8286b95845f82c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_i686.whl", hash = "sha256:1e9679245e3ea6498494b3028b90c7b25dbb2abe65c7d07423ecfc2d6218ff7c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:9413384f26b5d050b6978e6fcd0c1e7f0539be7a4f1a885061473c5deaa57221"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:294b7a598974b8e2c6123d19ef15de9abcd282b0fbbdbc4d23dfa812959a9e05"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:26dd201857d702bdf9d78c273cafcab5871dd29343748524695cecffa44a8d97"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7"}, + {file = "watchdog-5.0.3-py3-none-win32.whl", hash = "sha256:c66f80ee5b602a9c7ab66e3c9f36026590a0902db3aea414d59a2f55188c1f49"}, + {file = "watchdog-5.0.3-py3-none-win_amd64.whl", hash = "sha256:f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9"}, + {file = "watchdog-5.0.3-py3-none-win_ia64.whl", hash = "sha256:49f4d36cb315c25ea0d946e018c01bb028048023b9e103d3d3943f58e109dd45"}, + {file = "watchdog-5.0.3.tar.gz", hash = "sha256:108f42a7f0345042a854d4d0ad0834b741d421330d5f575b81cb27b883500176"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[[package]] +name = "wcmatch" +version = "10.0" +description = "Wildcard/glob file name matcher." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "wcmatch-10.0-py3-none-any.whl", hash = "sha256:0dd927072d03c0a6527a20d2e6ad5ba8d0380e60870c383bc533b71744df7b7a"}, + {file = "wcmatch-10.0.tar.gz", hash = "sha256:e72f0de09bba6a04e0de70937b0cf06e55f36f37b3deb422dfaf854b867b840a"}, +] + +[package.dependencies] +bracex = ">=2.1.1" + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "webcolors" +version = "24.8.0" +description = "A library for working with the color formats defined by HTML and CSS." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "webcolors-24.8.0-py3-none-any.whl", hash = "sha256:fc4c3b59358ada164552084a8ebee637c221e4059267d0f8325b3b560f6c7f0a"}, + {file = "webcolors-24.8.0.tar.gz", hash = "sha256:08b07af286a01bcd30d583a7acadf629583d1f79bfef27dd2c2c5c263817277d"}, +] + +[package.extras] +docs = ["furo", "sphinx", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-notfound-page", "sphinxext-opengraph"] +tests = ["coverage[toml]"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "websocket-client" +version = "1.8.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, +] + +[package.extras] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + +[[package]] +name = "xonsh" +version = "0.18.3" +description = "Python-powered shell. Full-featured and cross-platform." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "xonsh-0.18.3-py310-none-any.whl", hash = "sha256:2b371e5e984481c46a2bd65412762971ad35005988102ffbbc5ed2e0361c89ec"}, + {file = "xonsh-0.18.3-py311-none-any.whl", hash = "sha256:f02b2869b4801e7c6b8c22ade4b5e39ed31652b97b7426b607dfd59109414b0d"}, + {file = "xonsh-0.18.3-py312-none-any.whl", hash = "sha256:4d4e8a3cec130ed77056c5e703f00ed922d9da00685de10e30391f445bd50e9a"}, + {file = "xonsh-0.18.3-py39-none-any.whl", hash = "sha256:43340cdea9b04e114dd4e36b974a4bdbaeb3761cfe2073a05005d66457fcafb4"}, + {file = "xonsh-0.18.3.tar.gz", hash = "sha256:e57630d3f7e77e083618751402bf486bef51d2c42ed2abf3e0f4db388a50795f"}, +] + +[package.dependencies] +case-insensitive-dictionary = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +bestshell = ["prompt-toolkit (>=3.0.29)", "pygments (>=2.2)"] +dev = ["pre-commit", "re-ver", "tomli", "xonsh[doc,test]"] +doc = ["doctr", "furo", "livereload", "matplotlib", "myst-parser", "numpydoc", "psutil", "pyzmq", "runthis-sphinxext", "sphinx (>=3.1)", "tornado", "xonsh[bestshell]"] +full = ["distro", "gnureadline", "setproctitle", "ujson", "xonsh[ptk,pygments]"] +linux = ["distro"] +mac = ["gnureadline"] +proctitle = ["setproctitle"] +ptk = ["prompt-toolkit (>=3.0.29)", "pyperclip"] +pygments = ["pygments (>=2.2)"] +test = ["coverage (>=5.3.1)", "prompt-toolkit (>=3.0.29)", "pygments (>=2.2)", "pyte (>=0.8.0)", "pytest (>=7)", "pytest-cov", "pytest-mock", "pytest-rerunfailures", "pytest-subprocess", "pytest-timeout", "requests", "restructuredtext-lint", "virtualenv (>=20.16.2)", "xonsh[bestshell]"] + +[[package]] +name = "yarl" +version = "1.18.3" +description = "Yet another URL library" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, + {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, + {file = "yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690"}, + {file = "yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6"}, + {file = "yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8"}, + {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069"}, + {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193"}, + {file = "yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a"}, + {file = "yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1"}, + {file = "yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5"}, + {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50"}, + {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576"}, + {file = "yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285"}, + {file = "yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2"}, + {file = "yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477"}, + {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb"}, + {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa"}, + {file = "yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8"}, + {file = "yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d"}, + {file = "yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c"}, + {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04"}, + {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719"}, + {file = "yarl-1.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1"}, + {file = "yarl-1.18.3-cp39-cp39-win32.whl", hash = "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5"}, + {file = "yarl-1.18.3-cp39-cp39-win_amd64.whl", hash = "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9"}, + {file = "yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b"}, + {file = "yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" +propcache = ">=0.2.0" + +[metadata] +lock-version = "2.1" +python-versions = ">=3.11,<3.12" +content-hash = "60c1509757bbdaaef6cfe3fe5d7c0fede08289ff72935563a8963fb3cc134aaf" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..79ceb7a47 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,74 @@ +[project] +name = "oslweb" +version = "0.1.0" +description = "" +readme = "README.md" +authors = [ + {"name" = "Ivan Ogasawara", "email" = "ivan.ogasawara@gmail.com"} +] +license = "BSD-3-Clause" +requires-python = ">=3.11,<3.12" +dependencies = [ + "pre-commit>=4.0.1", + "mkdocs>=1.4.2", + "makim>=1.19.0", + "mkdocs-blogging-plugin>=2.2.11", + "mkdocs-rss-plugin<1.9.0", + "jupyterlab>=4.2.5", + "nbconvert>=7.16.4", + "pymdown-extensions>=10", + "mkdocs-include-markdown-plugin>=7.1", + "colorama (>=0.4.6,<0.5.0)", + "linkcheckmd (>=1.4.0,<2.0.0)", + "beautifulsoup4 (>=4.12.3,<5.0.0)", + "mkdocs-git-revision-date-localized-plugin (>=1.3)", + "mdx-truly-sane-lists (>=1.3,<2.0)", + "lunr[languages] (>=0.8.0)", + "nltk (>=3.9.1)", +] + + +[tool.poetry] +package-mode = false + + +[tool.poetry.group.dev.dependencies] +ruff = "^0.8.6" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + + +[tool.ruff] +line-length = 79 +force-exclude = true +src = ["./"] +fix = true + +[tool.ruff.lint] +ignore = [ + "F811", + "PLR0911", # Too many return statements + "PLR0912", # Too many branches + "PLR0913", +] +select = [ + "E", # pycodestyle + "F", # pyflakes + "D", # pydocstyle + "YTT", # flake8-2020 + "PL", # PL + "RUF", # Ruff-specific rules + "I001", # isort +] + +[tool.ruff.lint.pydocstyle] +convention = "numpy" + +[tool.ruff.lint.isort] +# Use a single line between direct and from import +lines-between-types = 1 + +[tool.ruff.format] +quote-style = "double" diff --git a/resources/_gen/assets/sass/sass/main.sass_d2bdc985df0e3369a538eb4e858e857f.content b/resources/_gen/assets/sass/sass/main.sass_d2bdc985df0e3369a538eb4e858e857f.content deleted file mode 100644 index ea7427799..000000000 --- a/resources/_gen/assets/sass/sass/main.sass_d2bdc985df0e3369a538eb4e858e857f.content +++ /dev/null @@ -1,3 +0,0 @@ -html{--color-mode: 'lit';--light: #fff;--dark: #000;--bg: #002538;--haze: #f2f2f2;--gray: #020202;--accent: var(--gray);--text: #575757;--header-text: var(--dark);--font: Metropolis, sans-serif;--theme: #0077b8;--ease: cubic-bezier(.19,1,.22,1);--code-bg: var(--bg);--table-bg: var(--light);--table-haze: var(--haze);--table-border: #dedede;--footer-bg: var(--haze);--shadow: rgba(0,0,0,0.12);--translucent: rgba(0,0,0,0.05);--translucent-light: rgba(255,255,255,0.05);--post-bg: var(--light);--choice-bg: var(--haze);--ease: cubic-bezier(0.39, 0.575, 0.565, 1);--easing: cubic-bezier(.19,1,.22,1);--notice-code-bg: var(--bg);--notice-info-border-color: #6AB0DE;--notice-info-background: #E7F2FA;--notice-note-border-color: #F0B37E;--notice-note-background: #FFF2DB;--notice-tip-border-color: rgba(92, 184, 92, 0.8);--notice-tip-background: #E6F9E6;--notice-warning-border-color: rgba(217, 83, 79, 0.8);--notice-warning-background: #FAE2E2}html.page{--choice-bg: var(--light)}html[data-mode="dim"]{--light: hsla(0,0%,100%,0.87);--color-mode: 'dim';--text: var(--light);--accent: var(--bubble);--choice-bg: var(--bg);--code-bg: var(--translucent-light);--header-text: var(--light);--table-bg: var(--code-bg);--table-haze: rgba(255,255,255,0.1);--table-border: var(--code-bg);--footer-bg: var(--bg);--post-bg: var(--translucent-light)}html[data-mode="dim"] blockquote{background:var(--translucent-light);color:#dedede}html[data-mode="dim"] svg.icon{fill:var(--light)}html[data-mode="dim"] .icon img{background:none}html[data-mode="dim"] .icon svg{fill:#fafafa}html[data-mode="dim"] .sidebar_inner::before{display:none}html[data-mode="dim"] .color_choice::after{background-image:url("../images/night-moon.jpg");transform:translateX(1.4rem)}@media (prefers-color-scheme: dark){html:not([data-mode="lit"]){--light: hsla(0,0%,100%,0.87);--color-mode: 'dim';--text: var(--light);--accent: var(--bubble);--choice-bg: var(--bg);--code-bg: var(--translucent-light);--header-text: var(--light);--table-bg: var(--code-bg);--table-haze: rgba(255,255,255,0.1);--table-border: var(--code-bg);--footer-bg: var(--bg);--post-bg: var(--translucent-light)}html:not([data-mode="lit"]) blockquote{background:var(--translucent-light);color:#dedede}html:not([data-mode="lit"]) svg.icon{fill:var(--light)}html:not([data-mode="lit"]) .icon img{background:none}html:not([data-mode="lit"]) .icon svg{fill:#fafafa}html:not([data-mode="lit"]) .sidebar_inner::before{display:none}html:not([data-mode="lit"]) .color_choice::after{background-image:url("../images/night-moon.jpg");transform:translateX(1.4rem)}}.landing-content{margin:0;padding:2rem;gap:10px;max-width:100%;display:grid;align-content:center;justify-content:center;margin:15px auto}.landing-content div{text-align:center}.landing-content h3{max-width:1000px}.info{max-width:65rem;margin:15px auto}html{--color-mode: 'lit';--light: #fff;--dark: #102723;--bg: #374955;--haze: #f2f2f2;--gray: #020202;--accent: var(--gray);--text: #575757;--header-text: var(--dark);--font: Metropolis, sans-serif;--theme: #0077b8;--ease: cubic-bezier(.19,1,.22,1);--code-bg: var(--bg);--table-bg: var(--light);--table-haze: var(--haze);--table-border: #dedede;--footer-bg: var(--haze);--shadow: rgba(0,0,0,0.12);--translucent: rgba(0,0,0,0.05);--translucent-light: rgba(255,255,255,0.05);--post-bg: var(--light);--choice-bg: var(--haze);--ease: cubic-bezier(0.39, 0.575, 0.565, 1);--easing: cubic-bezier(.19,1,.22,1);--notice-code-bg: var(--bg);--notice-info-border-color: #6AB0DE;--notice-info-background: #E7F2FA;--notice-note-border-color: #F0B37E;--notice-note-background: #FFF2DB;--notice-tip-border-color: rgba(92, 184, 92, 0.8);--notice-tip-background: #E6F9E6;--notice-warning-border-color: rgba(217, 83, 79, 0.8);--notice-warning-background: #FAE2E2}.logo{height:50px}h3>a{color:#0ca5de}.author_name{font-weight:500}@font-face{font-family:'Metropolis';font-style:normal;font-weight:200;src:local("Metropolis Extra Light"),local("Metropolis-Light"),url("../fonts/Metropolis-ExtraLight.woff2") format("woff2"),url("../fonts/Metropolis-ExtraLight.woff") format("woff");font-display:swap}@font-face{font-family:'Metropolis';font-style:italic;font-weight:200;src:local("Metropolis Extra Light Italic"),local("Metropolis-ExtraLightItalic"),url("../fonts/Metropolis-ExtraLightItalic.woff2") format("woff2"),url("../fonts/Metropolis-ExtraLightItalic.woff") format("woff");font-display:swap}@font-face{font-family:'Metropolis';font-style:normal;font-weight:300;src:local("Metropolis Light"),local("Metropolis-Light"),url("../fonts/Metropolis-Light.woff2") format("woff2"),url("../fonts/Metropolis-Light.woff") format("woff");font-display:swap}@font-face{font-family:'Metropolis';font-style:italic;font-weight:300;src:local("Metropolis Light Italic"),local("Metropolis-LightItalic"),url("../fonts/Metropolis-LightItalic.woff2") format("woff2"),url("../fonts/Metropolis-LightItalic.woff") format("woff");font-display:swap}@font-face{font-family:'Metropolis';font-style:normal;font-weight:400;src:local("Metropolis Regular"),local("Metropolis-Regular"),url("../fonts/Metropolis-Regular.woff2") format("woff2"),url("../fonts/Metropolis-Regular.woff") format("woff");font-display:swap}@font-face{font-family:'Metropolis';font-style:italic;font-weight:400;src:local("Metropolis Regular Italic"),local("Metropolis-RegularItalic"),url("../fonts/Metropolis-RegularItalic.woff2") format("woff2"),url("../fonts/Metropolis-RegularItalic.woff") format("woff");font-display:swap}@font-face{font-family:'Metropolis';font-style:normal;font-weight:500;src:local("Metropolis Medium"),local("Metropolis-Medium"),url("../fonts/Metropolis-Medium.woff2") format("woff2"),url("../fonts/Metropolis-Medium.woff") format("woff");font-display:swap}@font-face{font-family:'Metropolis';font-style:italic;font-weight:500;src:local("Metropolis Medium Italic"),local("Metropolis-MediumItalic"),url("../fonts/Metropolis-MediumItalic.woff2") format("woff2"),url("../fonts/Metropolis-MediumItalic.woff") format("woff");font-display:swap}@font-face{font-family:'Metropolis';font-style:normal;font-weight:700;src:local("Metropolis Bold"),local("Metropolis-Bold"),url("../fonts/Metropolis-Bold.woff2") format("woff2"),url("../fonts/Metropolis-Bold.woff") format("woff");font-display:swap}@font-face{font-family:'Metropolis';font-style:italic;font-weight:700;src:local("Metropolis Bold Italic"),local("Metropolis-BoldItalic"),url("../fonts/Metropolis-BoldItalic.woff2") format("woff2"),url("../fonts/Metropolis-BoldItalic.woff") format("woff");font-display:swap}*{box-sizing:border-box;-webkit-appearance:none;margin:0;padding:0}body,html{scroll-behavior:smooth;-webkit-text-size-adjust:100%;font-kerning:normal;-webkit-font-feature-settings:"kern" 1;text-rendering:optimizeLegibility;text-rendering:geometricPrecision;-webkit-text-size-adjust:100%;font-size:100%;scroll-padding-top:4.5rem}body::-webkit-scrollbar-corner,html::-webkit-scrollbar-corner{background-color:transparent}body{font-family:var(--font);background:var(--choice-bg);color:var(--text);font-size:1.1rem;line-height:1.5;max-width:1920px;margin:0 auto;position:relative;display:flex;flex-direction:column;justify-content:space-between;min-height:100vh;font-kerning:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{text-decoration:none;color:inherit}a:focus,a:focus-within{outline:none !important}h1,h2,h3,h4,h5{font-family:inherit;font-weight:300;padding:5px 0;margin:15px 0;color:var(--header-text);line-height:1.35}h1:hover .link,h2:hover .link,h3:hover .link,h4:hover .link,h5:hover .link{opacity:1}h1{font-size:200%;font-weight:400}h2{font-size:175%}h3{font-size:150%}h4{font-size:125%}h5{font-size:120%}h6{font-size:100%}img,svg{max-width:100%;vertical-align:middle}img{height:auto;margin:1rem auto;padding:0}img:focus,img:focus-within{outline:none !important;border:none !important}main{flex:1}ul{list-style:none;-webkit-padding-start:0;-moz-padding-start:0}em{font-weight:500}b,strong{font-weight:700}hr{border:none;padding:1px;background:#e7e7e7;opacity:0.5;margin:1rem 0}@media (prefers-color-scheme: dark){hr{background:var(--theme)}}aside h3{position:relative;margin:0 !important}aside ul{list-style:initial;padding-left:1rem}aside li{padding:0.25rem 0}table{width:100%;border-collapse:collapse;background:var(--table-haze);margin-bottom:1.5rem}table:not(.ln-table) t{background:var(--table-bg)}td,th{padding:0.5rem 1rem;border:1px solid var(--table-border)}td,th{padding:0.5rem 1rem;font-weight:400}td:not(:first-child),th:not(:first-child){padding-left:1.5rem}th{font-weight:700}tbody{padding:0}tbody tr:nth-child(even){background-color:var(--table-haze)}tbody tr:nth-child(odd){background-color:var(--table-bg)}blockquote{margin:25px auto;quotes:"“" "”" "‘" "’";padding:1.5rem;color:#555555;padding:1rem 1.5rem;border-left:0.2rem solid #0ca5de;position:relative;background:var(--haze)}blockquote+.highlight_wrap{margin-top:2.25rem}p{padding:0.8rem 0}picture{display:block;width:100%}.nav_open+.nav_sub::before,.nav_open+.nav_sub .nav_child:first-child::before{width:0;height:0;border-left:0.33rem solid transparent;border-right:0.33rem solid transparent;top:-0.5rem;left:1rem}.nav{color:#fafafa;display:flex;justify-content:space-between;--maxWidth: 1440px;max-width:var(--maxWidth);margin-left:auto;margin-right:auto}.nav_active{background-color:rgba(230,244,241,0.05);border-radius:0.25rem}.nav_icon{width:0.7rem;margin-left:0.33rem;transition:transform 0.3s var(--ease);transform-origin:50% 50%}.nav_body{display:flex;flex:1}.nav_header{background-color:#374955;padding:0 1.5rem;position:fixed;width:100%;z-index:99;left:0}.nav_item{padding:0.5rem 1rem;display:inline-flex;align-items:center}.nav_sub{width:100%;left:0;position:absolute;z-index:20;border-radius:0 0 0.5rem 0.5rem;top:3rem;transition:height 0.3s ease-in-out;height:0;overflow:hidden;padding:0.96rem 0 0;background:transparent}.nav_parent{position:relative;display:flex;align-items:center;margin:0.25rem 0;border-radius:0.5rem}.nav_open+.nav_sub .nav_child{padding-top:0.5rem;padding-bottom:0.5rem;z-index:3}@media screen and (min-width: 769px){.nav_open+.nav_sub .nav_child+a{padding-top:0}}.nav_open+.nav_sub .nav_child:not(:first-child){position:relative}.nav_open+.nav_sub .nav_child:first-child::before{position:absolute;content:"";border-bottom:0.5rem solid var(--translucent-light);z-index:2}.nav_open+.nav_sub{height:initial;z-index:999;overflow:initial;border-radius:0.5rem;padding-bottom:0.5rem}@media screen and (min-width: 769px){.nav_open+.nav_sub{color:var(--text)}}.nav_open+.nav_sub::before,.nav_open+.nav_sub::after{content:"";position:absolute}.nav_open+.nav_sub::before{z-index:1}@media screen and (min-width: 769px){.nav_open+.nav_sub::before{border-bottom:0.5rem solid var(--choice-bg)}}.nav_open+.nav_sub::after{top:0;left:0;right:0;bottom:0;background:var(--translucent-light);border-radius:0.5rem;box-shadow:0 1rem 3rem rgba(0,0,0,0.25)}@media screen and (min-width: 769px){.nav_open+.nav_sub{background:var(--choice-bg);width:auto;white-space:nowrap}}.nav_open .nav_icon{transform:rotate(180deg)}.nav_sub .nav_item{z-index:5;display:block;padding-top:0.75rem;padding-bottom:0.75rem;transition:background 0.3s ease-out;margin:0}.nav_sub .nav_item:not(.nav_child){position:relative}.nav_brand img{max-width:15rem;margin:0}@media screen and (min-width: 769px){.nav_brand{padding-left:0}.nav_brand img{background:transparent !important}}.nav_center{display:none}@media screen and (min-width: 769px){.nav_center{display:flex;flex:1;align-items:center;justify-content:center}.nav_center+.follow{flex:initial}}@media screen and (min-width: 769px){.nav_hide{display:none}}.nav_close{display:none}.content,.footer{padding:1.5rem}@media screen and (min-width: 1441px){.content,.footer{padding:1.5rem 0}}.content{padding-top:5rem;--maxWidth: 1440px;max-width:var(--maxWidth);margin-left:auto;margin-right:auto}.footer{background:var(--footer-bg);margin-top:2rem;font-size:0.9rem}.footer_inner{--maxWidth: 1440px;max-width:var(--maxWidth);margin-left:auto;margin-right:auto;display:flex;justify-content:center;align-items:center;position:relative}.button{background-color:#0ca5de;color:#e6f4f1;display:inline-flex;padding:0.5rem 1.5rem;text-transform:uppercase;border:1px solid #0ca5de;border-radius:1.5rem;font-size:0.9rem;align-items:center;user-select:none}.button_back{color:#e6f4f1;outline:none;border:none;appearance:none;background-color:#0ca5de;font-size:1rem;cursor:pointer;padding:0.5rem 1rem;margin-bottom:1.33rem;border-radius:1.5rem}.button:hover,.button:focus{background-color:#075d7d;color:#e6f4f1;border:1px solid #075d7d}.button_translucent{background-color:rgba(12,165,222,0.15);color:#0ca5de;border:1px solid transparent}.button_tally{padding:0 0.75rem;border-radius:0.5rem;background-color:#0ca5de;display:inline-flex;justify-content:center;align-items:center;color:#e6f4f1;margin:0.1rem 0 0.1rem 0.2rem;font-size:0.7rem}.post_link,.post_title{margin-bottom:0}.post_link{line-height:1}.post_link>a{display:block;line-height:1.35}.posts{margin-top:2rem}.post_header{height:50vh;max-height:35rem;background-color:#374955;background-size:cover;background-position:center;margin-top:4.2rem}@media screen and (max-width: 992px){.post_header{height:40vh;margin-top:3rem}}@media screen and (max-width: 667px){.post_header{height:30vh}}.post_header+.content{padding-top:0}.post_item{margin-bottom:3rem;border-radius:0.5rem;background:var(--post-bg)}.post_tag{padding:0.2rem 0.8rem;font-size:0.8rem}.post_tags{display:none}.post_tags.jswidgetopen{display:initial;position:fixed;top:0;left:0;height:100vh;overflow-y:auto;width:100vw;padding:5rem 1.5rem;background:var(--translucent-light);cursor:pointer;z-index:999;overflow-y:auto}.post_tags_toggle{margin-top:0.5rem;margin-left:0.5rem;cursor:pointer}.post_tag,.post_share{margin:0.5rem}.post_share{display:inline-flex}.post_meta{align-items:stretch}.post_meta,.post_meta span{display:inline-flex;flex-flow:row wrap}.post_meta span{align-items:center;margin-bottom:0.5rem}@media screen and (min-width: 557px){.post_meta span{gap:0.5rem 0}}@media screen and (max-width: 667px){.post_meta span:last-of-type{margin-top:-0.5rem}}@media screen and (min-width: 667px){.post_meta .button{margin:0 0.5rem}}.post_date{margin-right:0.5rem;margin-left:0.25rem}.post_featured{display:block;margin:1rem auto}.post_content a:not(.button){color:#0ca5de}.post_content ul,.post_content ol{list-style:initial;padding:0.5rem 1.25rem}.post_content ul li,.post_content ol li{padding-top:0.25rem}.post_content ol{list-style:decimal}.scrollable{display:grid;width:100%;max-width:100%;overflow-x:auto}.to-top{position:fixed;bottom:2rem;right:1.5rem;height:2.25rem;width:2.25rem;background-color:#0ca5de;display:flex;align-items:center;justify-content:center;border:none;-webkit-appearance:none;border-radius:50%;color:#e6f4f1 !important;text-decoration:none !important;font-size:1.25rem;cursor:pointer}@media screen and (max-width: 667px){.to-top{bottom:2.25rem}}.to-top,.to-top:focus{outline:none}.mb-0{margin-bottom:0 !important}.tags_list{cursor:initial;background:var(--choice-bg);padding:4.5rem 1.5rem 1.5rem 1.5rem;border-radius:1rem;max-width:720px;margin:0 auto;box-shadow:0 0.5rem 1.5rem rgba(0,0,0,0.12);position:relative;display:flex;flex-flow:row wrap}.tags_nav{position:relative}.tags_hide{position:absolute;top:1rem;right:1.5rem;padding:0.5rem;border-radius:50%;cursor:pointer}@media screen and (min-width: 992px){.tags_hide{display:none}}.tags_sort{font-size:1rem;color:var(--light);background:var(--theme);position:absolute;top:1.5rem;left:1.5rem;border-radius:1.5rem;padding:0.1rem}.tags_sort,.tags_sort span{user-select:none}.tags_sort span{display:inline-flex;justify-content:center;align-items:center;height:2rem;position:relative;z-index:5;cursor:pointer;width:5rem;font-weight:500}.tags_sort::before{content:"";position:absolute;width:4.5rem;top:0.25rem;bottom:0.25rem;left:0.25rem;z-index:3;background:var(--bg);opacity:0.5;border-radius:1.5rem;transition:0.25s transform var(--ease)}.tags_sort.sorted::before{transform:translateX(5rem)}.tag-title{border-bottom:none !important;display:inline-block !important;position:relative;font-size:2rem;margin-bottom:-1rem}.tag-title::after{content:attr(data-count);margin-left:1.5rem;background-color:#eee;padding:0.25rem 1rem;border-radius:15%;font-size:1.5rem}.icon{display:inline-flex;justify-content:center;align-items:center;margin:0 0.5rem}.icon,.icon img,.icon svg{width:1.1rem;height:1.1rem}.icon_2{width:5rem;height:4rem}.link{opacity:0;position:relative}.link_owner .icon{background-image:url("../icons/link.svg");background-size:100%;background-repeat:no-repeat;background-position:center right}.link_yank{opacity:1}.link_yanked{position:absolute;right:-1rem;top:-2rem;background-color:#0ca5de;color:#e6f4f1;width:7rem;padding:0.25rem 0.5rem;font-size:0.9rem;border-radius:1rem;text-align:center}.link_yanked::after{position:absolute;top:1rem;content:"";border-color:#0ca5de transparent;border-style:solid;border-width:1rem 1rem 0 1rem;height:0;width:0;transform-origin:50% 50%;transform:rotate(145deg);right:0.45rem}.excerpt_header,.excerpt_footer{padding:1rem}.excerpt_footer{padding:0 1rem 2.25rem 1rem}.excerpt_thumbnail{min-height:10rem;display:none}@media screen and (min-width: 769px){.excerpt_thumbnail{display:block;border-radius:0.5rem}}.excerpt_footer.partition{display:grid}@media screen and (min-width: 769px){.excerpt_footer.partition{grid-template-columns:2fr 1fr;grid-gap:1rem}}.sidebar_inner{position:relative}.sidebar_inner::before{content:"";padding:0.5px;top:0;bottom:0;background:linear-gradient(to bottom, var(--haze), var(--light), var(--haze));position:absolute;left:-2rem}.author_header{display:grid;grid-template-columns:3rem 1fr;grid-gap:1rem}.author_bio a{color:#0ca5de}.pagination{display:flex}.page-item{padding:0.2rem}.page-item.disabled{opacity:0.7}.page-item:first-child,.page-item:last-child{display:none}.page-item.active a{background-color:#075d7d}.page-link{padding:0.25rem 0.75rem;background-color:#0ca5de;color:#e6f4f1;border-radius:1rem}.page_only{display:none !important}.page .page_only{display:initial !important}.round{border-radius:50%;max-width:100%;height:auto;padding:0;vertical-align:middle}.float_left{float:left;margin-right:1rem}.float_left+p{padding-top:0}.float_right{float:right;margin-left:1rem}.float_left::after,.float_right::after{clear:both}.follow{display:flex;align-items:center;flex:1;justify-content:flex-end}.follow svg{fill:#fafafa;margin-left:0.75rem}figcaption{font-style:italic;opacity:0.67;font-size:0.9rem}.to_top{background-color:#0ca5de;width:2.75rem;height:2.75rem;display:flex;justify-content:center;align-items:center;cursor:pointer;border-radius:50%;position:fixed;bottom:1.5rem;right:1.5rem;z-index:99}.to_top.ios{position:absolute;bottom:0.75rem;right:0}.to_top:hover{background-color:#0ca5de}.to_top svg{fill:#e6f4f1;opacity:0.5;transition:0.3s opacity var(--ease)}.to_top:hover svg{opacity:1}.color_mode{height:1.5rem;display:grid;align-items:center;margin:0 0.5rem}@media screen and (min-width: 769px){.color_mode{margin:0 1.5rem;grid-template-columns:1fr}}.color_choice{width:3rem;background-color:var(--translucent-light);border-radius:1rem;height:1.5rem;outline:none;border:none;-webkit-appearance:none;cursor:pointer;position:relative;position:relative;overflow:hidden;box-shadow:0 0.25rem 1rem rgba(0,0,0,0.15)}.color_choice::after{content:"";position:absolute;top:0.1rem;left:0.1rem;width:1.3rem;height:1.3rem;background-image:url("../images/sun.svg");background-position:center;background-size:cover;border-radius:50%;z-index:2}.color_animate{transition:transform 0.5s cubic-bezier(0.075, 0.82, 0.165, 1)}.color_animate::after{transition:transform 0.5s cubic-bezier(0.19, 1, 0.22, 1);will-change:transform}.taxonomy{text-transform:capitalize}.image-scale{position:fixed;z-index:999999;left:0;right:0;height:100vh;top:0;padding:1.5rem;background-color:var(--bg);display:grid;align-items:center;overflow:auto}.image-scale .image-scalable{background-color:var(--text)}.image-scalable{cursor:pointer;transition:transform 0.3s var(--ease)}.image_featured{display:block;margin-left:auto !important;margin-right:auto !important}.image_thumbnail{margin:0}.video{overflow:hidden;padding-bottom:56.25%;position:relative;height:0;margin:1.5rem 0;border-radius:0.6rem;background-color:var(--bg);box-shadow:0 1rem 2rem rgba(0,0,0,0.17)}.video iframe{left:0;top:0;height:100%;width:100%;border:none;position:absolute;transform:scale(1.02)}.notices{border-top-width:2rem;border-top-style:solid;color:#666;margin:2rem 0;padding-bottom:.1px;padding-left:1rem;padding-right:1rem}.notices .label{color:#fff;margin-top:-1.75rem;font-weight:bold}.notices .label:first-child::before{font-weight:900;margin-left:-.35rem;margin-right:.35rem}.notices.info{border-color:var(--notice-info-border-color);background:var(--notice-info-background)}.notices.warning{border-color:var(--notice-warning-border-color);background:var(--notice-warning-background)}.notices.image-warning{margin:0}.notices.note{border-color:var(--notice-note-border-color);background:var(--notice-note-background)}.notices.tip{border-color:var(--notice-tip-border-color);background:var(--notice-tip-background)}.notices .highlight_wrap{background:var(--notice-code-bg) !important}.search{flex:1;display:flex;justify-content:flex-end;position:relative;max-width:25rem;margin:0.5rem 0 0;--border: transparent}.search_field{padding:0.5rem 1rem;width:100%;outline:none;color:var(--text);background:var(--post-bg);border:1px solid var(--border);border-radius:8px;font-size:1rem;box-shadow:0 0.25rem 1rem rgba(0,0,0,0.1)}.search_field:focus+.search_label{opacity:0}.search_label{position:absolute;z-index:9;opacity:0.67;right:0.67rem;top:0.25rem;width:1rem;height:1rem}.search_label svg{width:100%;height:100%;fill:#7C849B}.search_result{padding:0.5rem 1rem}.search_result:not(.passive):hover{background-color:var(--code-bg);color:#e6f4f1}.search_result.passive{display:grid}.search_results{width:100%;background-color:var(--choice-bg);color:var(--text);border-radius:var(--radius);box-shadow:0 1rem 4rem rgba(0,0,0,0.17) !important;position:absolute;top:125%;display:grid;overflow:hidden;z-index:3}.search_results:empty{display:none}.search_title{padding:0.25rem 1rem !important;background-color:#0ca5de;color:var(--light);margin:0;font-size:1.25rem}.search_title:empty{display:none}.search_submit{position:absolute;--margin: 3px;right:var(--margin);top:var(--margin);bottom:var(--margin);z-index:9;cursor:pointer;border-radius:calc(var(--radius) / 2)}#results .search_title,#results .search_result{padding:0.5rem 0}.openstreetmap{border:none}.post_content{max-width:65rem;margin-left:auto;margin-right:auto}.pt-1{padding-top:1.5rem}.pb-1{padding-bottom:1.5rem}.mt-1{margin-top:1.5rem}.mb-1{margin-bottom:1.5rem}.pt-2{padding-top:3rem}.pb-2{padding-bottom:3rem}.mt-2{margin-top:3rem}.mb-2{margin-bottom:3rem}.flex{display:flex;flex-direction:column;align-items:center}.shadow{box-shadow:0 0 60px rgba(0,0,0,0.17)}@media screen and (min-width: 42rem){.grid-2,.grid-3,.grid-4,.grid-auto,.grid-inverse{display:grid;grid-template-columns:1fr}[class*='grid-']{grid-gap:2rem}.grid-inverse{grid-template-columns:70% 1fr;grid-column-gap:4rem}.grid-2{grid-template-columns:1fr 1fr}.grid-3{grid-template-columns:repeat(auto-fit, minmax(19rem, 1fr))}.grid-4{grid-template-columns:repeat(auto-fit, minmax(16rem, 1fr))}}.facebook svg{fill:#325c94}.twitter svg{fill:#00abdc}.linkedin svg{fill:#007bb6}.never{height:75vh;display:flex;justify-content:center;align-items:center;flex-direction:column;padding:1.5rem;text-align:center}.inline{display:inline;margin:0}.hidden{display:none}@media screen and (max-width: 769px){.nav,.nav_body{flex-direction:column}.nav_body{position:fixed;width:90%;max-width:16.5rem;top:0;bottom:0;background-color:#374955;transition:transform 0.3s var(--easing)}.nav_body_right{transform:translateX(100vw);right:0}.nav_body_left{transform:translateX(-100vw);left:0}.nav_close{width:3rem;position:absolute;right:-4rem;top:0;bottom:0;height:100%;cursor:pointer;z-index:1000;display:flex;justify-content:center;align-items:center}.nav_close svg{width:1.25rem;fill:var(--light);height:1.25rem;display:none}.nav_close svg:first-child{display:initial}.nav_close svg.isopen{display:none}.nav_close svg.isopen+svg{display:initial}.nav_brand{position:relative;z-index:999;width:calc(100% - 3rem);padding-left:0}.nav_parent{display:grid}.nav_sub{position:relative;top:initial;padding-top:0}.jsopen::after{content:"";position:fixed;z-index:2;background-color:rgba(0,0,0,0.3);top:0;left:0;right:0;bottom:0}.jsopen .nav_body{transform:translateX(0);padding-left:1.5rem;padding-right:1.5rem}.jsopen .nav_parent:first-child{margin-top:4.4rem}.jsopen .nav .follow{justify-content:flex-start;flex:initial;margin-top:0.75rem}}@keyframes pulse{0%{opacity:1}75%{opacity:0.1}100%{opacity:1}}code{font-size:85%;font-weight:400;overflow-y:hidden;display:block;font-family:'Monaco', monospace;word-break:break-all}code.noClass{--inlineColor: rgb(194, 29, 0);color:var(--inlineColor);display:inline;line-break:anywhere}.windows .highlight{overflow-x:hidden}.windows .highlight:hover{overflow-x:auto}.highlight{display:grid;width:100%;border-radius:0 0.2rem 0.2rem 0;overflow-x:auto;position:relative}.highlight_wrap{background:var(--code-bg) !important;border-radius:0.5rem;position:relative;padding:0 1rem;margin:1.5rem auto 1rem auto}.highlight_wrap+.highlight_wrap{margin-top:2.25rem}.highlight_wrap:hover>div{opacity:1}.highlight_wrap .lang{position:absolute;top:0;right:0;text-align:right;width:7.5rem;padding:0.5rem 1rem;font-style:italic;text-transform:uppercase;font-size:67%;opacity:0.5;color:var(--light)}.highlight_wrap:hover .lang{opacity:0.1}.highlight .highlight{margin:0}.highlight pre{color:var(--light) !important;border-radius:4px;font-family:'Monaco', monospace;padding-top:1.5rem;padding-bottom:2rem}.highlight table{display:grid;max-width:100%;margin-bottom:0;background:transparent}.highlight td,.highlight th{padding:0}.highlight .lntd{width:100%;border:none}.highlight .lntd:first-child,.highlight .lntd:first-child pre{width:2.5rem !important;padding-left:0;padding-right:0;color:rgba(255,255,255,0.5);user-select:none}.highlight .lntd:first-child pre{width:100%;display:flex;align-items:center;flex-direction:column}.err{color:#a61717;background-color:#e3d2d2}.hl{width:100%;background-color:rgba(255,255,255,0.25)}.ln,.lnt{margin-right:0.75rem;padding:0;transition:opacity 0.3s var(--ease)}.ln,.ln span,.lnt,.lnt span{color:rgba(255,255,255,0.5);user-select:none}.k,.kc,.kd,.kn,.kp,.kr,.kt,.nt{color:#6ab825;font-weight:500}.kn,.kp{font-weight:400}.nb,.no,.nv{color:#24909d}.nc,.nf,.nn{color:#447fcf}.s,.sa,.sb,.sc,.dl,.sd,.s2,.se,.sh,.si,.sx,.sr,.s1,.ss{color:#ed9d13}.m,.mb,.mf,.mh,.mi,.il,.mo{color:#3677a9}.ow{color:#6ab825;font-weight:500}.c,.ch,.cm,.c1{color:#999;font-style:italic}.cs{color:#e50808;background-color:#520000;font-weight:500}.cp,.cpf{color:#cd2828;font-weight:500}.gd,.gr{color:#d22323}.ge{font-style:italic}.gh,.gu,.nd,.na,.ne{color:#ffa500;font-weight:500}.gi{color:#589819}.go{color:#ccc}.gp{color:#aaa}.gs{font-weight:500}.gt{color:#d22323}.w{color:#666}.hljs-string{color:#6ab825}.hljs-attr{color:#ed9d13}.p .hljs-attr{color:var(--light)}.pre_wrap{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}.pre_nolines.line .ln{display:none}.panel_box{display:inline-flex;perspective:300px;grid-gap:0.5rem;transition:opacity 0.3s var(--easing);background:var(--code-bg);padding:0.5rem 1.5rem;border-radius:2rem;align-items:center;position:absolute;right:0rem;top:-2.1rem;opacity:0}.panel_icon{display:inline-flex;align-items:center;justify-content:center;cursor:pointer;padding:0.1rem;transform-origin:50% 50%;background-size:100%;background-repeat:no-repeat}.panel_icon.active{animation:pulse 0.1s linear}.panel_icon svg{fill:var(--light);width:1.5rem;height:1.5rem}.panel_hide{display:none}.panel_from{position:absolute;color:var(--theme);bottom:0;font-size:1.5rem;font-weight:500;padding:0.5rem 0;cursor:pointer;letter-spacing:0.1px;z-index:19}.panel_expanded .panel_from{display:none} - -/*# sourceMappingURL=styles.css.map */ \ No newline at end of file diff --git a/resources/_gen/assets/sass/sass/main.sass_d2bdc985df0e3369a538eb4e858e857f.json b/resources/_gen/assets/sass/sass/main.sass_d2bdc985df0e3369a538eb4e858e857f.json deleted file mode 100644 index e8d99a327..000000000 --- a/resources/_gen/assets/sass/sass/main.sass_d2bdc985df0e3369a538eb4e858e857f.json +++ /dev/null @@ -1 +0,0 @@ -{"Target":"css/styles.87df07b1e1bda89abe9fa0aef9eb91c543483040c7b57e3f3eb94e17e62491867eb2433280c3dac1aeeaf5aa14bfc1d4153e5f5bfe4f193ce6acc4fee1e281d2.css","MediaType":"text/css","Data":{"Integrity":"sha512-h98HseG9qJq+n6Cu+euRxUNIMEDHtX4/PrlOF+YkkYZ+skMygMPawa7q9aoUv8HUFT5fW/5PGTzmrMT+4eKB0g=="}} \ No newline at end of file diff --git a/scripts/check-broken-links-internal.py b/scripts/check-broken-links-internal.py new file mode 100644 index 000000000..9b1efc053 --- /dev/null +++ b/scripts/check-broken-links-internal.py @@ -0,0 +1,117 @@ +"""Check for broken internal links.""" + +from __future__ import annotations + +import argparse +import os +import subprocess +import sys +import threading + +from http.server import HTTPServer, SimpleHTTPRequestHandler +from pathlib import Path + + +def start_http_server(folder_path: Path, port: int) -> HTTPServer: + """Start a local HTTP server to serve files from the folder.""" + os.chdir(folder_path) # Change to the target directory + handler = SimpleHTTPRequestHandler + server = HTTPServer(("localhost", port), handler) + thread = threading.Thread(target=server.serve_forever, daemon=True) + thread.start() + return server + + +def check_links(folder_path: Path, port: int): + """Use wget to check links recursively from the local HTTP server.""" + url = f"http://localhost:{port}/" + cmd = [ + "wget", + "--spider", # Check links without downloading files + "-r", # Follow links recursively + "-nd", # Don't create a directory structure + "-nv", # Less verbose output + "-l", + "10", # Maximum link depth to follow + url, + ] + + exitcode = 0 + log_err = "" + + try: + print(f"[II] Checking links starting from {url}") + subprocess.run( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + check=True, + ) + except KeyboardInterrupt: + print("[EE] Interrupted by user.") + os._exit(1) + + except subprocess.CalledProcessError as e: + exitcode = e.returncode + log_err = e.stderr + + if exitcode == 0: + print("[II] All links are ok.") + return + + # Check for broken links section in stderr + flagged_errors = [] + if "Found" in log_err: + lines = log_err.splitlines() + start_index = ( + lines.index( + [line for line in lines if line.startswith("Found")][0] # noqa: RUF015 + ) + + 2 + ) + for line in lines[start_index:]: + line = line.strip() # noqa: PLW2901 + if not line or line.startswith("FINISHED"): + break + flagged_errors.append(line) + + # Print flagged errors + if not flagged_errors: + print("[II] All links are ok.") + print("No errors flagged.") + return + + total_errors = len(flagged_errors) + print(f"{total_errors} errors flagged for the following URLs:") + for line in flagged_errors: + print(line) + sys.exit(1) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Check for broken internal links." + ) + parser.add_argument( + "--port", "-p", default=8000, type=int, help="Port for HTTP server." + ) + parser.add_argument( + "--folder", "-f", default="build", type=str, help="Folder to serve." + ) + args = parser.parse_args() + + folder_path = Path(args.folder) + HTTP_PORT = args.port + + if not folder_path.exists(): + print(f"Error: The path {folder_path} doesn't exist.") + sys.exit(1) + + # Start the HTTP server + server = start_http_server(folder_path, HTTP_PORT) + try: + check_links(folder_path, HTTP_PORT) + finally: + server.shutdown() + print("[II] HTTP server stopped.") diff --git a/scripts/check-broken-links-md.py b/scripts/check-broken-links-md.py new file mode 100644 index 000000000..37ea8165b --- /dev/null +++ b/scripts/check-broken-links-md.py @@ -0,0 +1,65 @@ +"""Check if ther eis any broken links.""" + +from __future__ import annotations + +import os +import subprocess + +# List of exception URLs +exception_urls = [ + "https://www.linkedin.com/", +] + + +def process_log() -> None: + """Run the command and capture the output.""" + log_err = "" + exitcode = 0 + + try: + subprocess.run( + ["python", "-m", "linkcheckmd", "-r", "-v", "-m", "get", "pages"], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + check=True, + ) + except subprocess.CalledProcessError as e: + exitcode = e.returncode + # for some reason they were swapped + log_err = e.stdout + + if exitcode == 0: + print("[II] All links are ok.") + return + + flagged_errors = [] + for line in log_err.splitlines(): + line = line.strip() # noqa: PLW2901 + # Check if the line starts with '(' + if not line.startswith("("): + continue + + if line.endswith("429)"): + # Too Many Requests http error + continue + # Extract the URL using regex + for exception_url in exception_urls: + if exception_url not in line: + flagged_errors.append(line) + + # Print flagged errors + if not flagged_errors: + print("[II] All links are ok.") + print("No errors flagged. All URLs are in the exception list.") + return + + print("Errors flagged for the following URLs:") + for line in flagged_errors: + print(line) + os._exit(1) + + +# Run the script +if __name__ == "__main__": + process_log() diff --git a/scripts/clean-output.py b/scripts/clean-output.py new file mode 100644 index 000000000..526313b7c --- /dev/null +++ b/scripts/clean-output.py @@ -0,0 +1,29 @@ +"""Clean the output.""" + +import re +import sys + + +def remove_ansi_escape_sequences(text: str) -> str: + """ + Remove ANSI escape sequences from a string. + + Parameters + ---------- + - text: A string that may contain ANSI escape codes. + + Returns + ------- + - A string with ANSI escape codes removed. + """ + # ANSI escape code regex pattern + ansi_escape_pattern = re.compile( + r"(?:\x1B[@-_]|[\x80-\x9F])[0-?]*[ -/]*[@-~]" + ) + return ansi_escape_pattern.sub("", text) + + +if __name__ == "__main__": + input_text = sys.stdin.read() + cleaned_text = remove_ansi_escape_sequences(input_text) + print(cleaned_text, end="") diff --git a/scripts/migrations/_config.py b/scripts/migrations/_config.py deleted file mode 100644 index 205742d2e..000000000 --- a/scripts/migrations/_config.py +++ /dev/null @@ -1,15 +0,0 @@ -""" -Mutual configuration for python scripts -""" - -from pathlib import Path - -BLOG_PATH = Path(Path(__file__).parent.parent / 'content' / 'blog') - -def gen_all_files_with_extension(ROOT_DIR, EXTENSIONS=['.md']): - if Path(ROOT_DIR).exists(): - for path in Path(ROOT_DIR).glob(r'**/*'): - if path.suffix in EXTENSIONS: - yield path - else: - raise Exception(f"{ROOT_DIR} not found") diff --git a/scripts/migrations/check_links.py b/scripts/migrations/check_links.py deleted file mode 100644 index 89ab2edd9..000000000 --- a/scripts/migrations/check_links.py +++ /dev/null @@ -1,4 +0,0 @@ -""" -A module that check if the links that has links of other articles will be working correctly -Instructions to be made ..... -""" \ No newline at end of file diff --git a/scripts/migrations/conjunciones_es.txt b/scripts/migrations/conjunciones_es.txt deleted file mode 100644 index 4c196f6cd..000000000 --- a/scripts/migrations/conjunciones_es.txt +++ /dev/null @@ -1,86 +0,0 @@ -e -u -y -empero -mas -ni -o -ora -pero -sino -siquiera -y -auqnue -como -conque -cuando -donde -entonces -ergo -incluso -luego -mientras -porque -por -pues -que -qué -sea -si -ya -en -donde -puesto -así -tal -a -de -la -el -los -es -las -para -lo -esto -con -un -no -cómo -podemos -permite -puedes -realizar -una -se -del -su -te -tanto -desde -ha -han -al -tu -al -más -son -algunas -esta -has -pueden -sus -cual -cuál -entre -to -le -este -puede -ser -estos -tus -nos -tener -gran -sin \ No newline at end of file diff --git a/scripts/migrations/csv_creator.py b/scripts/migrations/csv_creator.py deleted file mode 100644 index bdf1e8979..000000000 --- a/scripts/migrations/csv_creator.py +++ /dev/null @@ -1,33 +0,0 @@ -""" -Takes a files directory, where md file exists. -From every md file, create a row inside a csv file where you specify separated in columns: the file name, slug, author, -date, tags, category, url -Example -from a file which has the following metadata - -filename=filtrar-datos-r.md ---- -title: "Crea tu nube de palabras en R a partir de un documento de texto" -author: Ever Vino -slug: filtrar-datos-r -category: data science -date: 2022-09-25 -draft: false -usePageBundles: true -thumbnail: '/header.png' -featureImage: '/header.png' -tags: [nube de palabras, r, visualización de datos] ---- - -create a new row inside a new csv file - -filename, slug, author, date, tags, category, url -... -filtrar-datos-r.md, filtrar-datos-r, Ever Vino, 2022-09-25, "nube de palabras, r, visualización de datos", data science, https://opensciencelabs.org/blog/filtrar-datos-r/filtrar-datos-r/ -... - -This should return a csv file in the path indicated as argument -""" - -def csv_creator_fun(files_dir, path_where): - pass \ No newline at end of file diff --git a/scripts/migrations/csv_setter.py b/scripts/migrations/csv_setter.py deleted file mode 100644 index 8d43afef1..000000000 --- a/scripts/migrations/csv_setter.py +++ /dev/null @@ -1,145 +0,0 @@ -""" -From a csv file and the files directory path as arguments, modify the metadata according the new metadata assigned from -the csv file. - -Example -if the file exist in the csv file modify its metadata according to - -filename, slug, author, date, tags, category -... -filtrar-datos-r.md, filtrar-datos-r, John Vino, 2022-09-25, "Word Cloud, r, DataViz", ciencia de datos https://opensciencelabs.org/blog/filtrar-datos-r/filtrar-datos-r/ -... - -filename=filtrar-datos-r.md ---- -title: "Crea tu nube de palabras en R a partir de un documento de texto" -author: John Vino -slug: filtrar-datos-r -category: ciencia de datos -date: 2022-09-25 -draft: false -usePageBundles: true -thumbnail: '/header.png' -featureImage: '/header.png' -tags: ["Word Cloud, r, DataViz"] -alias: ["https://opensciencelabs.org/blog/filtrar-datos-r/filtrar-datos-r/"] ---- -Note that in the alias key in the metadata is equal to a list containing the url -""" -import csv -import re -# Para la nube de palabras -import numpy as np -from PIL import Image -from wordcloud import WordCloud -import matplotlib.pyplot as plt -import matplotlib as mpl - -# Separando ingles y español -def separate_files(csv_file): - lst = [] - with open(csv_file) as f: - reader = csv.DictReader(f) - for a in reader: - lst.append(a) - for e in lst: - e["tags"] = e["tags"].replace("][", "]\n[").replace("] [", "]\n[") - e["category"] = e["category"].replace("][", "]\n[").replace("] [", "]\n[") - - es_cat = [] - es_tags = [] - for e in lst: - partial = e["tags"].split("\n")[1] - es_tags.append(partial) - print(e["category"]) - partial_cat = e["category"].split("\n")[1] - print(partial_cat) - es_cat.append(partial_cat) - print() - - with open("tags_cats_es.csv", "w") as f: - field_names = ["slug", "categorias", "tags"] - writer = csv.DictWriter(f, fieldnames=field_names) - writer.writeheader() - for i, row in enumerate(lst): - writer.writerow({"slug": row["slug"], "categorias": es_cat[i], "tags": es_tags[i]}) - - -#csv_file = "../../csv_folder/new_cat_tags.csv" - - - -# obteniendo la frecuencia de las categorias y tags -def freq_file(csv_file): - lst = [] - with open(csv_file) as f: - reader = csv.DictReader(f) - for a in reader: - lst.append(a) - - count = dict() - count_tag = dict() - for e in lst: - cat = e["categorias"].replace("[","").replace("]","").split(",") - for w in cat: - word = w.strip() - if word not in count: - count[word] = 0 - count[word] += 1 - tags = e["tags"].replace("[","").replace("]","").split(",") - for t in tags: - tag = t.strip() - if tag not in count_tag: - count_tag[tag] = 0 - count_tag[tag] += 1 - # Verificando que no existan categorias que esten como tags - for el in count: - if el in count_tag: - print(el) - return count, count_tag -#reemplazando tags de acuerdo al csv_file -def replace_tags_cats(csv_file): - lst = [] - with open(csv_file) as f: - reader = csv.DictReader(f) - for a in reader: - lst.append(a) - - for lst1 in lst: - path = "../../content/blog/"+lst1["slug"]+"/index.md" - try: - with open(path, "r") as fw: - reader = fw.read() - - - pattern_tags = re.compile(r"(tags:\s).+") - tags = pattern_tags.search(reader).group() - - reader = reader.replace(tags, "tags: " + lst1["tags"]) - - pattern_cat = re.compile(r"(categories:\s).+") - cats = pattern_cat.search(reader).group() - - reader = reader.replace(cats, "categories: " + lst1["categorias"]) - - with open(path, "w") as f: - f.write(reader) - except Exception as e: - print(f"error en {path}", e) - - -def make_image(dct): - #colormap = colors.ListedColormap(['#FF0000','#FF7F50','#FFE4C4']) - colormap = mpl.colormaps["Paired"] - wc = WordCloud(background_color = "white",width=1400, height=900, repeat=True, colormap=colormap) - wc.generate_from_frequencies(dct) - plt.imshow(wc, interpolation="bilinear") - plt.axis("off") - plt.show() - -# slug categorias y tags -csv_file = "./tags_cats_es.csv" -#freq_file(csv_file) -cats, tags = freq_file(csv_file) -make_image(tags) -#make_image(cats) diff --git a/scripts/migrations/get_tags.py b/scripts/migrations/get_tags.py deleted file mode 100644 index 3facd6e06..000000000 --- a/scripts/migrations/get_tags.py +++ /dev/null @@ -1,88 +0,0 @@ -import re -from _config import gen_all_files_with_extension - -def get_slug(data): - pattern_meta = re.compile(r"---.+---", re.DOTALL) - meta = pattern_meta.search(data) - - if meta: - pattern_slug = re.compile(r"(?<=slug:\s).+") - slug = pattern_slug.search(meta.group()) - if slug: - return slug.group() - return None - -def remove_meta_code(data): - - pattern_meta = re.compile(r"---.+---", re.DOTALL) - data = pattern_meta.sub("", data) - - pattern_code = re.compile(r"```.+```", re.DOTALL) - data = pattern_code.sub("", data) - - return data - -def remove_punctuations(data): - punctuations = "!"+"#$%&'()*+,-./:;<=>?@[\]^_`{|}~¿"+'"' - for p in punctuations: - if p in data: - data = data.replace(p, "") - return data - -def get_conj_words(): - with open("conjunciones_es.txt", "r") as f: - reader = f.readlines() - lst = [] - for line in reader: - lst.append(line.rstrip()) - - return lst - -def remove_conjuctions_words(data_dict): - conjunc = get_conj_words() - for k in data_dict.copy(): - if k in conjunc: - data_dict.pop(k) - - return data_dict - -def get_tags(file): - with open(file, "r") as f : - reader = f.read() - slug = get_slug(reader) - data = remove_meta_code(reader) - data = remove_punctuations(data) - data = data.lower() - data = data.split() - - freq = dict() - for word in data: - if word not in freq: - freq[word] = 0 - freq[word] += 1 - tags = remove_conjuctions_words(freq) - - tags = sorted(tags,reverse = True, key= lambda x:tags[x])[:10] - - return slug, tags - -def generate_csv_tags(path): - file = open("../csv_folder/new_tags.csv", "w") - file.write("slug, new_tags") - file.write("\n") - for md_file in gen_all_files_with_extension(path): - slug, tags = get_tags(md_file) - print(tags) - new_tags = ", ".join(tags) - if slug: - file.write(f'{slug},"[{new_tags}]"') - file.write("\n") - file.close() - - -def main(): - PATH = "../content/blog/" - generate_csv_tags(PATH) - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/scripts/migrations/integrador.py b/scripts/migrations/integrador.py deleted file mode 100644 index dd0d2e0e3..000000000 --- a/scripts/migrations/integrador.py +++ /dev/null @@ -1,17 +0,0 @@ -""" -Module that integrates the the other modules. It will serve to do the complete migration -""" - -def do_migration(): - # work with the metadata first it should return the new files do it maybe with a loop through a file directory - # Once creates the new files use csv_getter - pass - -def do_changes(): - #With the files created with the above function, make changes in the metadata using csv_setter module - # Modify the image links with links_mod module - # Move the images files to the new directory the showed in the test files the name of the folder that contains the images - #should be the same as its slug - pass - - diff --git a/scripts/migrations/links_mod.py b/scripts/migrations/links_mod.py deleted file mode 100644 index 689c63aa6..000000000 --- a/scripts/migrations/links_mod.py +++ /dev/null @@ -1,63 +0,0 @@ -""" -Takes as input a md file path and changes its contained links. -According to the following example - -Erase the next image link -![hoja de datos](../../../images/blog/filtrar-datos-r/header.png) - -Change the link -![hoja de datos](../../../images/blog/filtrar-datos-r/header.png) -to -![hoja de datos](../../header.png) - -Usage: - -`python migrations\ scripts/links_mod.py` -""" -import re -import logging - -from pathlib import Path -from _config import gen_all_files_with_extension - -def replace(ROOT_DIR): - for md_file in gen_all_files_with_extension(ROOT_DIR): - replace_header_links(md_file) - replace_links(md_file) - - -def replace_header_links(md_file): - - content = Path(md_file).read_text() - - pattern = "(!\[[a-zA-Z ]+\]\()[\.\.\/]+\/images\/blog\/[a-zA-Z-]+\/(header\.png\))" - #subst = r"\1../../\2" - subst = "" - - output = open(md_file,"w") - output.write(re.sub(pattern, subst, content, 0, re.MULTILINE)) - output.close() - - logging.warning(f'{md_file} updated.') - -def replace_links(md_file): - #"![header](../../../images/blog/visualiza-tus-datos-en-r-con-ggplot-y-gganimate/header.png)" - content = Path(md_file).read_text() - #"![Mapa de](../../../images/blog/dibuja-shapefile/grafica3.png)" - #"![Meme GOT](../../../../images/blog/ethereum-merge/meme-summer.jpeg)" - pattern = "(!\[[a-zA-Z\s : ]+\]\()[\.\.\/]+\/images\/blog\/[a-zA-Z-]+\/([a-zA-Z0-9.-_]+\))" - subst = r"\1\2" - - - output = open(md_file,"w") - output.write(re.sub(pattern, subst, content, 0, re.MULTILINE)) - output.close() - - logging.warning(f'{md_file} updated.') - -def main(): - from _config import BLOG_PATH - replace(BLOG_PATH) - -if __name__ == "__main__": - main() diff --git a/scripts/migrations/metadata_mod.py b/scripts/migrations/metadata_mod.py deleted file mode 100644 index 8f0c9a0f2..000000000 --- a/scripts/migrations/metadata_mod.py +++ /dev/null @@ -1,90 +0,0 @@ -""" -A Function that takes an md document path as an argument. -Return a new file with the metadata changed from nikola format to new metadata required for hugo, the returned file -will be saved in the new_dir directory - -Example -nikola format - - -to hugo format - ---- -title: "Cómo filtrar datos de tu tabla con dplyr en R" -slug: filtrar-datos-r -date: 2022-06-14 -author: Ever Vino -slug: filtrar-datos-r -category: data science -draft: false -usePageBundles: true -thumbnail: '/header.png' -featureImage: '/header.png' -tags: [open science, r, filtrar datos, dplyr, recursos, data science ] ---- - -Usage: - -`python migrations\ scripts/metadata_mod.py` - -""" - -import re -import logging - -from pathlib import Path -from _config import gen_all_files_with_extension - -def replace(ROOT_DIR): - for md_file in gen_all_files_with_extension(ROOT_DIR): - replace_metadata(md_file) - - -def replace_metadata(md_file): - - content = Path(md_file).read_text() - pattern = "" - extract_comment_tag = re.compile(pattern) - result = extract_comment_tag.findall(content) - - if result: - new_content = result[0] - - new_content = new_content.replace("", "") - new_content = new_content.replace(".. ", "") - new_content = re.sub("title: (.*)", r'title: "\1"', new_content) - new_content = re.sub("date: ([0-9]+-[0-9]+-[0-9]+) .*", r"date: \1", new_content) - new_content = re.sub("tags: (.*)", r"tags: [\1]", new_content) - new_content = re.sub("category: (.*)", r"category: [\1]", new_content) - new_content = re.sub("(link:.*|description:.*)", "", new_content) - new_content = re.sub("\n\s+\n", "\n", new_content, re.MULTILINE) - new_content += 'draft: false\n' - new_content += 'usePageBundles: true\n' - new_content += 'thumbnail: "/header.png"\n' - new_content += 'featureImage: "/header.png"\n' - new_content = f"---{new_content}---\n" - - output = open(md_file,"w") - output.write(content.replace(result[0], new_content)) - output.close() - - logging.warning(f'{md_file} updated.') - - -def main(): - from _config import BLOG_PATH - replace(BLOG_PATH) - -if __name__ == "__main__": - main() diff --git a/scripts/migrations/move_imgs.py b/scripts/migrations/move_imgs.py deleted file mode 100644 index f1210937b..000000000 --- a/scripts/migrations/move_imgs.py +++ /dev/null @@ -1,90 +0,0 @@ -""" -Create a folder for each blog page (images/) and move -inside all its images. - -extensions to move: -.png -.jpeg/jpg -.gif -.webp -.csv? - -before: -test_files/blog//*images - -after: -test_files/images//*images -""" - -import logging -from pathlib import Path -import shutil -import re -from _config import gen_all_files_with_extension - - -def move(ROOT_DIR): - for md_file in gen_all_files_with_extension(ROOT_DIR): - move_images(md_file) - - -def move_images(md_file): - - images = _grep_imgs(md_file) - imgs_dir = _create_dir(md_file) - - for image in images: - if Path(imgs_dir / str(image).split('/')[-1]).exists(): - Path(image).unlink() - - else: - shutil.move(image, imgs_dir) - logging.warning(f'{str(image).split("/")[-1]} moved to {imgs_dir}') - - -def _extract_slug(md_file): - - content = Path(md_file).read_text() - pattern = 'slug: [a-zA-z0-9-]+\n' - extract_comment_tag = re.compile(pattern) - result = extract_comment_tag.search(content) - if result: - slug = result.group().split('slug: ')[1] - slug = slug.replace("'", "") - slug = slug.replace("\n", "") - slug = slug.replace("$", "") - return slug - - else: - logging.warning(f'Slug for {md_file} was not found') - - -def _create_dir(md_file): - - slug = _extract_slug(md_file) - img_dir = Path(md_file).parent.parent.parent / 'images' / slug - img_dir.mkdir(exist_ok=True, parents=True) - - return img_dir - - -def _grep_imgs(md_file): - - extensions = ['.png', '.jpeg', '.jpg', '.gif', '.webp', '.csv'] - md_dir = Path(md_file).parent - - images = [] - if md_dir.exists(): - for file in Path(md_dir).glob(r'**/*'): - if file.suffix in extensions: - images.append(file) - - return images - - -def main(): - from _config import BLOG_PATH - move(BLOG_PATH) - -if __name__ == "__main__": - main() diff --git a/scripts/migrations/prueba.py b/scripts/migrations/prueba.py deleted file mode 100644 index d6d1a205f..000000000 --- a/scripts/migrations/prueba.py +++ /dev/null @@ -1,12 +0,0 @@ -import numpy as np -import matplotlib.pyplot as plt - -fig, axes = plt.subplots(nrows=2, ncols=2) -for ax in axes.flat: - im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1) - -fig.subplots_adjust(right=0.8) -cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7]) -fig.colorbar(im, cax=cbar_ax) - -plt.show() \ No newline at end of file diff --git a/scripts/migrations/tags_cats_es.csv b/scripts/migrations/tags_cats_es.csv deleted file mode 100644 index b2043d4f2..000000000 --- a/scripts/migrations/tags_cats_es.csv +++ /dev/null @@ -1,69 +0,0 @@ -slug,categorias,tags -cinco-cosas-que-no-debes-olvidar-al-trabajar-con-datos-abiertos,"[ciencia abierta, datos abiertos]",[datos] -investigacion-colaborativa-con-git,"[ciencia abierta, investigación abierta, desarrollo de software, control de versiones]","[git, ramas]" -que-es-el-acceso-abierto-y-por-que-debes-tenerlo-en-cuenta-para-tus-investigaciones,"[ciencia abierta, acceso abierto]",[proyectos] -plataformas-que-te-ayudaran-en-la-gestion-de-tu-grupo-de-trabajo,"[organización, gestión de equipos]","[comunicación, gestión]" -ibis-framework,"[ciencia abierta, datos abiertos, acceso abierto, Python, SQL]","[ibis, dataframe, datos, pandas]" -como-aplicar-la-investigacion-reproducible-proyectos-de-codigo-abierto,"[ciencia abierta, investigación abierta, código abierto]","[código, reproducibilidad]" -por-que-deberias-considerar-carpentries-como-una-referencia-para-aprender-ciencia-de-datos,"[ciencia de datos, aprendizaje]","[carpentries, datos, proyectos]" -ciencia-abierta,"[ciencia abierta, ciencia de datos, inteligencia artificial]",[datos] -que-son-las-mentorias-y-como-potencian-los-proyectos-de-ciencia-abierta,"[organización, mentorías]",[proyectos] -te-hablamos-de-cinco-repositorios-con-datos-abiertos-sobre-paises,"[ciencia abierta, datos abiertos, acceso abierto]","[datos, repositorios, acceso]" -como-aplicar-los-principios-de-acceso-abierto-en-tus-investigaciones,"[ciencia abierta, datos abiertos, acceso abierto]",[repositorios] -visualiza-tus-datos-en-r-con-ggplot-y-gganimate,"[ciencia abierta, código abierto, R]","[visualización de datos, ggplot2, gganimate]" -que-es-la-ciencia-abierta,[ciencia abierta],[datos] -dibuja-tus-mapas-en-r-usando-archivos-de-formato-shapefile,"[ciencia abierta, R]","[mapas, datos, visualización de datos, shapefile]" -cinco-tips-para-aumentar-tu-productividad-con-git,"[desarrollo de software, control de versiones, aprendizaje]","[git, ramas, repositorios, cambios]" -primeros-pasos-con-rstudio,"[ciencia abierta, código abierto, R, IDE]",[rstudio] -filtrar-datos-r,"[ciencia de datos, R]","[datos, paquetes, tablas, dplyr, filtrar datos]" -como-instalar-y-comenzar-utilizar-tensorflow,"[ciencia abierta, código abierto, Python, ciencia de datos, inteligencia artificial]","[tensorflow,código, tensorflow, pip, docker]" -que-es-el-lenguaje-r-y-como-puede-ayudarte-en-tus-proyectos,"[ciencia de datos, estadística, R, aprendizaje]","[rstudio, rmarkdown, proyectos, markdown]" -caracteristicas-y-tips-utiles-que-te-ayudaran-sacar-el-maximo-provecho-de-conda,"[ciencia abierta, código abierto, desarrollo de software, DevOps]","[conda, empaquetado, paquetes, entorno virtual]" -razones-para-usar-python-en-tu-proximo-proyecto-de-investigacion,"[ciencia abierta, investigación abierta, ciencia de datos, Python]","[bibliotecas, herramientas, código]" -cinco-cosas-que-no-debes-olvidar-al-trabajar-con-markdown,[ciencia de datos],[markdown] -reorganiza-tus-tablas-con-tidyr,"[R, ciencia de datos]","[tidyr, bibliotecas, tablas, reorganizar, filtrar datos]" -que-son-los-datos-abiertos,"[ciencia abierta, datos abiertos, investigación abierta]",[datos] -te-hablamos-de-las-licencias-mas-utilizadas-en-proyectos-de-ciencia-abierta,[ciencia abierta],"[licencia, proyectos, free software]" -como-instalar-y-comenzar-utilizar-conda,"[ciencia abierta, código abierto, desarrollo de software, DevOps]","[conda, empaquetado, paquetes, gestor, entorno virtual]" -la-investigacion-abierta-el-manejo-de-repositorios-y-control-de-versiones,"[ciencia abierta, investigación abierta, desarrollo de software, control de versiones]","[versionado, repositorios]" -cuales-son-los-principios-de-la-investigacion-reproducible,"[ciencia abierta, investigación abierta]","[reproducibilidad, datos]" -cinco-cosas-que-te-ayudaran-gestionar-mejor-los-datos-de-tus-proximos-proyectos,"[ciencia de datos, investigación abierta]","[datos, proyectos, gestión]" -la-investigacion-abierta-podria-cambiar-el-futuro-de-la-investigacion-en-ciencias-puras-te-contamos-por-que,"[ciencia abierta, investigación abierta]",[datos] -si-pensado-en-como-automatizar-la-construccion-de-citas-en-tu-proyecto-te-contamos-como-hacerlo-posible,[ciencia abierta],"[proyectos, citas, referencias, zotero, metadatos]" -los-laboratorios-sociales-y-el-manejo-del-covid-19,[ciencia abierta],"[laboratorios sociales, covid19, ciencia ciudadana]" -algunos-proyectos-entretenidos-de-codigo-abierto,"[ciencia abierta, código abierto]","[código, proyectos]" -r-nube-de-palabras,"[ciencia abierta, código abierto, R, ciencia de datos, minería de datos]","[nube de palabras, tm]" -te-contamos-sobre-la-comunidad-ropensci,"[ciencia abierta, R]","[comunidad, ropensci, paquetes, revisión]" -automatizacion-de-tareas-via-bash,[desarrollo de software],"[bash, automatización]" -todo-lo-que-debes-saber-sobre-la-investigacion-colaborativa,"[ciencia abierta, investigación abierta]","[investigación colaborativa, equipos]" -que-es-el-open-science-framework,"[ciencia abierta, investigación abierta]","[osf, framework, proyectos]" -como-presentar-tu-codigo-como-un-articulo-cientifico,"[ciencia abierta, código abierto]","[artículos, publicación, código, herramientas]" -algunos-proyectos-de-ciencia-e-inteligencia-ciudadana-para-atender-la-pandemia-del-covid-19,[ciencia abierta],"[covid19, proyectos, ciencia ciudadana]" -git-de-en-diez-sencillos-pasos,"[desarrollo de software, control de versiones]","[git, repositorios, github]" -que-son-los-laboratorios-sociales-y-como-pueden-ayudar-los-equipos-de-investigacion,[ciencia abierta],"[laboratorios sociales, comunidad, ciencia ciudadana]" -herramientas-de-visualizacion-en-python,[Python],"[visualización de datos, bibliotecas, código, herramientas]" -epigraphhub,"[ciencia abierta, código abierto]","[epigraphhub, visualización de datos, análisis, datos, epidemiología]" -que-hemos-aprendido-gracias-la-ciencia-abierta-del-manejo-de-pandemias,"[ciencia abierta, investigación abierta]","[pandemias, covid19]" -que-es-el-codigo-abierto-y-como-puede-ayudarte,"[ciencia abierta, código abierto]","[código, software]" -te-mostramos-algunos-repositorios-con-datos-sobre-el-covid-19,"[ciencia abierta, datos abiertos, acceso abierto]","[repositorios, datos, salud, covid19]" -aspectos-clave-en-el-manejo-de-equipos-de-ciencia-abierta,"[organización, gestión de equipos]",[investigación colaborativa] -todas-las-posibilidades-que-te-ofrece-utilizar-figshare-en-tus-proyectos,"[ciencia abierta, investigación abierta, acceso abierto]","[figshare, proyectos, plataforma]" -que-es-ciencia-ciudadana,"[ciencia abierta, investigación abierta]","[ciencia ciudadana, comunidad]" -ethereum-merge-is-coming-pero-que-significa,"[tecnología, web3]","[ethereum, transacciones, bitcoin, criptomoneda]" -pyopensci-un-promotor-de-la-ciencia-abierta,"[ciencia abierta, revisión abierta por pares, código abierto, Python]",[pyopensci] -ya-probado-los-cuadernos-de-jupyter-te-explicamos-que-son-y-como-te-ayudaran-en-tu-proxima-investigacion,"[ciencia abierta, código abierto, programación, IDE]","[jupyter, cuaderno]" -que-necesitas-para-desarrollar-en-la-web3,"[desarrollo de software, UI-UX, web3]","[cripto, desarrollador]" -te-hablamos-del-uso-de-dashboards-para-visualizacion-de-datos-de-tu-proximo-proyecto,[ciencia abierta],"[visualización de datos, proyectos, datos, código, dashboard, framework]" -si-ya-usas-codigo-abierto-te-contamos-como-puedes-sacarle-mayor-provecho-tu-documentacion-para-tus-articulos-y-publicaciones,"[ciencia abierta, código abierto, desarrollo de software]","[documentación, código, proyectos, artículos]" -code-abbey-una-plataforma-mejorar-tu-habilidad-en-programacion,[programación],"[codeabbey, retos de programación]" -herramientas-de-visualizacion-en-r,"[ciencia abierta, código abierto, R]","[datos, visualización de datos, lattice, ggplot2, tidyverse, ggmap, plotly, shiny]" -como-documentar-tu-proyecto-de-ciencia-abierta,"[ciencia abierta, desarrollo de software]","[proyectos, documentación]" -que-es-el-data-version-control-dvc-y-por-que-es-necesario-que-tu-equipo-sepa-como-utilizarlo,"[ciencia abierta, investigación abierta, desarrollo de software, control de versiones]","[dvc, datos, versionado]" -la-importancia-de-la-integridad-en-los-datos-manejados-en-los-dashboards,[ciencia de datos],"[datos, dashboard, herramientas, código]" -te-mostramos-cinco-librerias-en-python-para-tu-proximo-proyecto-de-ciencia-abierta,"[ciencia abierta, código abierto, Python]","[datos, visualización de datos, pandas, scipy, matplotlib, seaborn, bokeh]" -apache-superset,"[ciencia de datos, SQL]","[apache superset, datos, visualización de datos, dashboard]" -dataverse-y-su-potencial-para-proyectos-de-ciencia-abierta,"[ciencia abierta, datos abiertos, acceso abierto]","[datosverse, datos, repositorios]" -nft-mas-que-un-jpg,[tecnología],"[nft, criptomoneda, Blockchain]" -tres-proyectos-de-ciencia-ciudadana-que-te-sorprenderan,[ciencia abierta],"[comunidad, proyectos, basura, ciencia ciudadana]" -te-ensenamos-lugares-para-aprender-los-fundamentos-de-la-ciencia-abierta,[ciencia abierta],"[datos, manual]" -primeros-pasos-con-spyder,"[ciencia abierta, código abierto, programación, IDE, Python]","[spyder, código]" diff --git a/static/banners/home.png b/static/banners/home.png deleted file mode 100644 index 3ee56d7ff..000000000 Binary files a/static/banners/home.png and /dev/null differ diff --git a/static/icons/favicon-32x32.png b/static/icons/favicon-32x32.png deleted file mode 100644 index 9a6a7199c..000000000 Binary files a/static/icons/favicon-32x32.png and /dev/null differ diff --git a/static/index.css b/static/index.css deleted file mode 100644 index be33ee41f..000000000 --- a/static/index.css +++ /dev/null @@ -1,18 +0,0 @@ -.card-columns { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); - gap: 15px; - padding: 10px; - - } - - .card { - - padding: 10px; - } - .row.g-0 { - background-color: var(--choice-bg); - } - .card.mb-3 { - padding: 0; - } \ No newline at end of file diff --git a/theme/base.html b/theme/base.html new file mode 100644 index 000000000..22ee2ba23 --- /dev/null +++ b/theme/base.html @@ -0,0 +1,532 @@ +{% set menu_2nd_level_selected = [] %} +{% set menu_group_titles = [''] %} + + + + + + + + {% set page_title = page.title %} + {% if page_title %}{{ page_title }} · {% endif %}{{ config.site_name }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% block header_extra %} + {% endblock header_extra%} + + {% include "icons/sprites.svg" %} + + + + +
    + + + +
    +
    +
    {{ config.site_name }}
    + +
    + +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + {% block content %} +
    +
    +
    + {% block content_inner %} + {{ page.content }} + {% endblock content_inner %} +
    +
    +
    + {% endblock content %} + +
    + + {% if page.meta.git_revision_date_localized %} + Last update: {{ page.meta.git_revision_date_localized }} + {% endif %} + {% if page.meta.git_created_date_localized %} +  • Created: {{ page.meta.git_created_date_localized }} + {% endif %} + +
    +
    +
    +
    + + + + {% block footer %} + + to-top + + + + + + + + + + + + + + + + + {% endblock footer %} + + + diff --git a/theme/blog-list-base.html b/theme/blog-list-base.html new file mode 100644 index 000000000..47742945e --- /dev/null +++ b/theme/blog-list-base.html @@ -0,0 +1,62 @@ +{# theme/blog-list-base.html #} +{% set page_num = (pages|count / page_size)|round(method='ceil')|int %} + +{% if page_num == 0 or not paging %} + {% set page_num = 1 %} + {% if not paging %} + {% set page_size = (10000 if page_size == -1 else page_size) %} + {% endif %} +{% endif %} + +{# Define tag helpers if not provided #} +{% if render_tags is not defined %} + {% from "blog-tags-render.html" import render_tags %} +{% endif %} +{% if get_tags_style is not defined %} + {% from "blog-tags-render.html" import get_tags_style %} +{% endif %} + +{% block tags_style %} + {% call get_tags_style() %}{% endcall %} +{% endblock %} + +
    +

    Blog

    + +
    + {% for page_idx in range(0, page_num) %} + {% set pg_group = pages[page_idx*page_size:(page_idx + 1)*page_size] %} +
    +
      + {% for pg in pg_group %} + {# collect fields #} + {% set url = pg.canonical_url %} + {% set title = pg.meta.title_full if pg.meta and pg.meta.title_full else pg.title %} + {% set description = "" %} + {% if full_content %} + {% set description = pg.content|safe %} + {% elif pg.meta.description %} + {% set description = pg.meta.description|truncate %} + {% endif %} + {% set time = (pg.meta["localized-time"] if pg.meta and pg.meta["localized-time"] else "") %} + + {# delegate rendering of each LI to the macro #} + {% call render_blog(title, description, time, url, pg) %}{% endcall %} + {% endfor %} +
    +
    + {% endfor %} +
    + +
    + + {% if show_total %} +
    Total {{ pages|count }} posts.
    + {% endif %} +
    +
    diff --git a/theme/blog-list.html b/theme/blog-list.html new file mode 100644 index 000000000..1b604433d --- /dev/null +++ b/theme/blog-list.html @@ -0,0 +1,81 @@ +{# theme/blog-list.html #} +{% extends "blog-list-base.html" %} + +{% macro render_blog(title, description, time, url, page) -%} +{% if title != "Blog" %} + {# Thumbnail path (fallback if missing) #} + {% set thumb = '/images/placeholders/post-16x9.png' %} + {% if page.meta and page.meta.slug and page.meta.thumbnail %} + {% set thumb = '/blog/' ~ page.meta.slug ~ page.meta.thumbnail %} + {% endif %} + +
  • +
    + + {{ title }} + + +
    +

    + {{ title }} +

    + + + + {% if show_tags and "tags" in page.meta %} + + {% endif %} + + {% if description %} +

    {{ description }}

    + {% endif %} + +
    + Read more + +
    + + + + + + + + + +
    +
    +
    +
    +
  • + {{ caller() }} +{% endif %} +{%- endmacro %} + +{# no inline CSS; rely on /css/blog.css #} diff --git a/theme/blog-post.html b/theme/blog-post.html new file mode 100644 index 000000000..febdcaa9e --- /dev/null +++ b/theme/blog-post.html @@ -0,0 +1,95 @@ +{% extends "main.html" %} + +{% block content_inner %} + +
    +

    + + {{ page.meta["title"] }} + +

    + + + + + +
    +
    + + {{ page.meta['title'] }} + +
    +
    + + +
    + {{ page.content }} +
    +
    + +{# Related: show other blog pages #} +{% for nav_item in nav %} + {% if nav_item.title == "Blog" and nav_item.children %} +
    + {% for sub_nav_item in nav_item.children if sub_nav_item.title != "main" %} +
    + + {{ sub_nav_item.title }} + +

    {{ sub_nav_item.title }}

    +

    {{ sub_nav_item.summary }}

    + +
    + {% endfor %} +
    + {% endif %} +{% endfor %} + +{% endblock content_inner %} diff --git a/theme/css/base.css b/theme/css/base.css new file mode 100644 index 000000000..d15fb77be --- /dev/null +++ b/theme/css/base.css @@ -0,0 +1,38 @@ +/* Reset & base layout */ +* { box-sizing: border-box; -webkit-appearance: none; } +html, body { min-height: 100%; } +html { scroll-padding-top: 4.5rem; } +body{ + background: var(--bg); + color: var(--fg); + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + position: relative; +} + +/* One fixed background layer to avoid “banding” on long pages */ +body::before{ + content:""; + position: fixed; inset: 0; z-index: -1; pointer-events: none; + background: + radial-gradient(1200px 600px at 10% -10%, var(--glow-1), transparent 60%), + radial-gradient(900px 500px at 110% 10%, var(--glow-2), transparent 60%); + background-repeat: no-repeat; + background-attachment: fixed; +} + +/* Typography */ +a{ color: var(--brand); text-decoration: none; } +a:hover{ color: var(--brand-2); } +h1,h2,h3,h4,h5,h6{ font-weight: 300; line-height: 1.35; margin: 15px 0 5px; } +h1{ font-size: 175%; font-weight: 400; } +h2{ font-size: 150%; } h3{ font-size: 130%; } h4{ font-size: 120%; } h5{ font-size: 110%; } h6{ font-size: 100%; } +p{ padding: .8rem 0 0 0; } + +/* Media */ +img, svg{ max-width: 100%; height: auto; vertical-align: middle; } +.logo{ height: 34px; } + +/* Containers */ +.container-xxl{ max-width: 1200px; } +.content-inner{ padding-top: 2rem; padding-bottom: 4rem; } diff --git a/theme/css/blog.css b/theme/css/blog.css new file mode 100644 index 000000000..210b3f071 --- /dev/null +++ b/theme/css/blog.css @@ -0,0 +1,223 @@ +/* ===== Blog index ===== */ + +.blog-title { margin-bottom: .75rem; } + +/* Pagination */ +.blog-pager { text-align: center; margin-top: 1.25rem; } +.blog-pagination { display: inline-block; } +.blog-pagination .page-number{ + color: var(--fg); + display: inline-block; + padding: .35em 1.05em; + margin: 0 .25em; + text-decoration: none; + border-radius: 1em; + border: 1px solid var(--border, rgba(255,255,255,.12)); + transition: background-color .15s, color .15s, border-color .15s; +} +.blog-pagination .page-number:hover{ background: rgba(255,255,255,.06); } +.blog-hidden{ display: none; } + +/* ===== Grid ===== */ +.post-grid{ + /* responsive grid; tweak min width to taste */ + --card-min: 320px; + --gap: 1rem; + + list-style: none; + padding: 0; + margin: 0; + display: grid; + grid-template-columns: repeat(auto-fill, minmax(var(--card-min), 1fr)); + gap: var(--gap); +} + +/* (Extra bullet-killers for stubborn user-agent / legacy styles) */ +.post-grid > li { list-style: none; } +.post-grid *::marker { content: ''; } + +/* ===== Card ===== */ +.post-card{ display: block; } + +.excerpt{ + display: flex; /* keep thumbnail on top, body below */ + flex-direction: column; + border: 1px solid rgba(255,255,255,.08); + border-radius: var(--radius, 16px); + background: rgba(255,255,255,.04); + box-shadow: var(--shadow, 0 10px 30px rgba(0,0,0,.25)); + overflow: hidden; + transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease, background .18s ease; +} +.excerpt:hover{ + transform: translateY(-2px); + border-color: rgba(255,255,255,.14); + background: rgba(255,255,255,.05); +} + +/* Thumbnail */ +.post-thumb{ + display: block; + position: relative; + aspect-ratio: 16 / 9; + background: linear-gradient(180deg, rgba(255,255,255,.08), rgba(255,255,255,.02)); +} +.post-thumb img{ + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} + +/* Body */ +.excerpt_body{ + padding: 1rem 1rem 1.05rem; + display: grid; + gap: .6rem; +} + +/* Title */ +.post_link{ margin: 0; line-height: 1.25; } +.post_link a{ + color: var(--fg); + text-decoration: none; + display: -webkit-box; + -webkit-line-clamp: 2; /* clamp long titles */ + -webkit-box-orient: vertical; + overflow: hidden; +} +.post_link a:hover{ color: var(--brand); } + +/* Meta row */ +.post_meta{ + display: flex; + flex-wrap: wrap; + gap: .5rem .9rem; + align-items: center; + font-size: .9rem; + color: var(--muted, #a7b0c0); +} +.post_meta .icon{ + width: 16px; height: 16px; opacity: .85; vertical-align: -2px; margin-right: .25rem; +} +.meta_item{ display: inline-flex; align-items: center; } + +/* Tags */ +.post_tags{ display: flex; flex-wrap: wrap; gap: .4rem .5rem; } +.post_tag{ + font-size: .8rem; + padding: .25rem .5rem; + border-radius: .5rem; + border: 1px solid rgba(255,255,255,.16); + color: var(--fg); + text-decoration: none; +} +.post_tag:hover{ + background: rgba(255,255,255,.08); + border-color: rgba(255,255,255,.22); +} + +/* Description (clamp to keep cards even-ish) */ +.post_desc{ + margin: 0; + color: var(--fg); + opacity: .92; + display: -webkit-box; + -webkit-line-clamp: 5; /* adjust to taste */ + -webkit-box-orient: vertical; + overflow: hidden; +} + +/* Actions row */ +.excerpt_actions{ + display: flex; + align-items: center; + justify-content: space-between; + gap: .75rem; + margin-top: .25rem; +} +.excerpt_more.button{ padding: .4rem .7rem; } + +/* Share icons */ +.post_share{ + display: inline-flex; align-items: center; gap: .45rem; + font-size: .85rem; color: var(--muted, #a7b0c0); +} +.post_share .icon{ width: 18px; height: 18px; opacity: .9; } +.post_share a{ + display: inline-flex; align-items: center; + padding: .25rem; border-radius: .4rem; +} +.post_share a:hover{ background: rgba(255,255,255,.08); } +.post_share .share_label{ margin-right: .25rem; } + +/* Narrow screens: single column */ +@media (max-width: 640px){ + .post-grid{ --card-min: 100%; --gap: .85rem; } + .excerpt_body{ padding: .9rem; } +} + +/* ===== Blog post page ===== */ +.blog-article .post-title { + margin: 0 0 .25rem 0; +} + +.blog-article .post_meta { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: .5rem 1rem; + color: var(--muted-fg, rgba(255,255,255,.75)); + margin-bottom: 1rem; +} + +/* Small, consistent icons only in the blog areas */ +.blog-article .post_meta .icon, +.blog-article .post_share .icon, +.posts .icon, +.blog-card .icon { + width: 1.05rem; + height: 1.05rem; + vertical-align: -.15em; + flex: 0 0 auto; + opacity: .9; +} + +/* Meta “chips” */ +.blog-article .meta_item { + display: inline-flex; + align-items: center; + gap: .4rem; + font-size: .95rem; +} + +/* Share row */ +.blog-article .post_share { + display: inline-flex; + align-items: center; + gap: .4rem; +} + +.blog-article .post_share .share_label { + margin-right: .25rem; + font-size: .92rem; + opacity: .9; +} + +.blog-article .post_share a { + color: var(--muted-fg, rgba(255,255,255,.75)); +} +.blog-article .post_share a:hover { color: var(--brand); } + +/* Tags below meta */ +.blog-article .post_tags { + display: inline-flex; + flex-wrap: wrap; + gap: .35rem; +} + +/* Thumbnail spacing fix */ +.blog-article .excerpt_thumbnail figure { margin: 0; } + +/* Safety: never allow gigantic SVGs inside blog content */ +.blog-article .post_body svg.icon { width: 1em; height: 1em; } diff --git a/theme/css/code.css b/theme/css/code.css new file mode 100644 index 000000000..d18642b5f --- /dev/null +++ b/theme/css/code.css @@ -0,0 +1,67 @@ +/* Code blocks & highlighting wrappers */ +code{ + font-size: 85%; + font-weight: 400; + display: inline-block; + font-family: Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace; +} +.highlight{ display: grid; width: 100%; border-radius: 4px; overflow-x: auto; position: relative; } +.highlight_wrap{ + background: var(--code-bg) !important; + border-radius: .5rem; + position: relative; + padding: 0 1rem; + margin: 1.5rem auto 1rem auto; +} +.highlight pre{ + border-radius: 4px; + font-family: Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace; + padding: 1.5rem 10px 2rem 10px; +} + +/* Optional: your magenta theme (comment out to disable) */ +.highlight *{ background: #44002e !important; } +.language-text.highlight *{ background-color: #333 !important; } +.language-text.highlight code.noClass{ color: #fff !important; } + +/* Token-ish colors (only if you use Pygments/HLJS classes) */ +.k,.kc,.kd,.kn,.kp,.kr,.kt,.nt{ color:#6ab825; font-weight:500; } +.nb,.no,.nv{ color:#24909d; } +.nc,.nf,.nn{ color:#447fcf; } +.s,.sa,.sb,.sc,.dl,.sd,.s2,.se,.sh,.si,.sx,.sr,.s1,.ss{ color:#ed9d13; } +.m,.mb,.mf,.mh,.mi,.il,.mo{ color:#3677a9; } +.c,.ch,.cm,.c1{ color:#999; font-style: italic; } + +/* Code output helpers */ +.language-text.highlight .output{ padding-bottom: 0; } +.code-output{ border-top: 10px solid #383838; } +.code-label{ + font-size: 18px; border-bottom: 1px solid #fafafa; line-height: 23.4px; + position: absolute; right: 25px; margin-top: 15px; color: #fff !important; +} + +/* ===== Lock
     / block-code colors (same in light & dark) ===== */
    +
    +/* Choose a single text color that matches your fixed pre background */
    +:root{
    +  --pre-fg-locked: #e6edf3; /* good for a dark pre background */
    +  /* if your pre background is light, use something like: #111 */
    +}
    +
    +/* Block code only (does NOT touch inline `code`) */
    +pre,
    +pre.output,
    +pre code,
    +pre.output code,
    +.highlight pre,
    +.highlight code {
    +  color: var(--pre-fg-locked) !important;
    +}
    +
    +/* Extra specificity so theme toggles can’t override */
    +[data-bs-theme="light"] pre,
    +[data-bs-theme="dark"]  pre,
    +[data-bs-theme="light"] pre code,
    +[data-bs-theme="dark"]  pre code {
    +  color: var(--pre-fg-locked) !important;
    +}
    diff --git a/theme/css/content.css b/theme/css/content.css
    new file mode 100644
    index 000000000..e22028850
    --- /dev/null
    +++ b/theme/css/content.css
    @@ -0,0 +1,44 @@
    +/* Main content width helpers */
    +.post_content,
    +.info{ max-width: 65rem; margin-left: auto; margin-right: auto; }
    +
    +/* Tables */
    +table{ width: 100%; border-collapse: collapse; background: var(--table-haze); margin-bottom: 1.5rem; }
    +table tbody{ background: var(--table-bg); }
    +td, th{ padding: .5rem 1rem; border: 1px solid var(--table-border); font-weight: 400; }
    +td:not(:first-child), th:not(:first-child){ padding-left: 1.5rem; }
    +th{ font-weight: 700; }
    +tbody tr:nth-child(even){ background-color: var(--table-haze); }
    +tbody tr:nth-child(odd){ background-color: var(--table-bg); }
    +
    +/* Blockquotes */
    +blockquote{
    +  margin: 25px auto;
    +  padding: 1rem 1.5rem;
    +  border-left: .2rem solid var(--brand);
    +  background: var(--table-haze);
    +  color: #555;
    +}
    +
    +/* Notices / callouts */
    +.notices{ border-top-width: 2rem; border-top-style: solid; color: #666; margin: 2rem 0; padding: 0 .1px; }
    +.notices .label{ color: #fff; margin-top: -1.75rem; font-weight: 700; }
    +.notices.info{ border-color: var(--notice-info-border-color); background: var(--notice-info-background); }
    +.notices.warning{ border-color: var(--notice-warning-border-color); background: var(--notice-warning-background); }
    +.notices.note{ border-color: var(--notice-note-border-color); background: var(--notice-note-background); }
    +.notices.tip{ border-color: var(--notice-tip-border-color); background: var(--notice-tip-background); }
    +.notices .highlight_wrap{ background: var(--code-bg) !important; }
    +
    +/* copy-code button */
    +.copy-code { font-size: .75rem; line-height: 1; }
    +
    +/* heading anchor mark */
    +.anchor-link { text-decoration: none; opacity: .6; }
    +.anchor-link:hover { opacity: 1; }
    +
    +/* ensure the back-to-top is perfectly round */
    +.to_top {
    +  width: 48px; height: 48px; border-radius: 50%;
    +  display: grid; place-items: center;
    +}
    +.to_top .icon { width: 24px; height: 24px; }
    diff --git a/theme/css/footer.css b/theme/css/footer.css
    new file mode 100644
    index 000000000..ae68c5505
    --- /dev/null
    +++ b/theme/css/footer.css
    @@ -0,0 +1,75 @@
    +footer.footer{
    +  margin-top: 3rem;
    +  border-top: 1px solid var(--nav-border);
    +  background: rgba(255,255,255,.02);
    +}
    +.footer_inner{
    +  display: flex; gap: 1rem; align-items: center; justify-content: space-between;
    +  padding: 1.25rem 0;
    +}
    +.footer_inner .icon{ width: 22px; height: 22px; fill: var(--fg); opacity: .85; }
    +.footer_inner .icon:hover{ opacity: 1; }
    +.badge-updated{
    +  background: rgba(255,255,255,.08);
    +  color: var(--muted);
    +  border-radius: .5rem;
    +  padding: .35rem .6rem;
    +}
    +
    +/* ========== Color mode toggle (footer) ========== */
    +.color_mode{
    +  display:flex;
    +  align-items:center;
    +  min-height:28px;
    +}
    +
    +/* The switch “track” */
    +.color_choice{
    +  width:48px;
    +  height:24px;
    +  appearance:none;
    +  -webkit-appearance:none;
    +  background:rgba(255,255,255,.12);
    +  border:1px solid rgba(255,255,255,.18);
    +  border-radius:999px;
    +  position:relative;
    +  cursor:pointer;
    +  outline:none;
    +  display:inline-block;
    +}
    +
    +/* The “knob” */
    +.color_choice::after{
    +  content:"";
    +  position:absolute;
    +  top:2px;
    +  left:2px;
    +  width:20px;
    +  height:20px;
    +  border-radius:50%;
    +  background:#fff;
    +  box-shadow:0 2px 8px rgba(0,0,0,.25);
    +  transform:translateX(0);
    +  transition:transform .22s ease, background .22s ease;
    +}
    +
    +/* Dark mode: move knob right */
    +html[data-mode="dim"] .color_choice::after{
    +  transform:translateX(24px);
    +}
    +
    +/* Optional: show a subtle sun/moon via emojis (no images needed) */
    +.color_choice:before{
    +  content:"☀️";
    +  position:absolute;
    +  left:8px;
    +  top:50%;
    +  transform:translateY(-50%);
    +  font-size:11px;
    +  opacity:.8;
    +}
    +html[data-mode="dim"] .color_choice:before{
    +  content:"🌙";
    +  left:auto;
    +  right:6px;
    +}
    diff --git a/theme/css/home.css b/theme/css/home.css
    new file mode 100644
    index 000000000..cae8ab4a3
    --- /dev/null
    +++ b/theme/css/home.css
    @@ -0,0 +1,169 @@
    +/* ---------- Hero ---------- */
    +.home-hero{
    +  position: relative;
    +  isolation: isolate;
    +  background-image:
    +    var(--hero-overlay, linear-gradient(to bottom right, rgba(0,0,0,.55), rgba(0,0,0,.35))),
    +    var(--hero-image);
    +  background-size: cover;
    +  background-position: center;
    +  color: #fff;
    +  border-radius: var(--radius, 12px);
    +  overflow: hidden;
    +  margin-top: 1rem;
    +}
    +[data-bs-theme="light"] .home-hero{
    +  --hero-overlay: linear-gradient(to bottom right, rgba(0,0,0,.55), rgba(0,0,0,.30));
    +}
    +[data-bs-theme="dark"] .home-hero{
    +  --hero-overlay: linear-gradient(to bottom right, rgba(0,0,0,.60), rgba(0,0,0,.45));
    +}
    +.home-hero .eyebrow{
    +  letter-spacing: .08em;
    +  text-transform: uppercase;
    +  opacity: .85;
    +}
    +.home-hero h1{
    +  text-wrap: balance;
    +}
    +.home-hero .lead{
    +  max-width: 52ch;
    +  opacity: .9;
    +}
    +.hero-bullets{
    +  list-style: none; padding: 0; margin: 0;
    +  display: flex; flex-wrap: wrap; gap: .75rem 1.25rem;
    +  opacity: .95;
    +}
    +.hero-bullets .dot{
    +  display: inline-block; width: .5rem; height: .5rem; border-radius: 50%;
    +  background: var(--brand, #4ea1ff); margin-right: .5rem;
    +  transform: translateY(-.1rem);
    +}
    +
    +/* ---------- Cards / tiles ---------- */
    +.home-card{
    +  background: var(--surface, rgba(255,255,255,.06));
    +  border: 1px solid var(--card-border, rgba(255,255,255,.12));
    +  border-radius: var(--radius, 12px);
    +  padding: 1.25rem 1.25rem;
    +}
    +[data-bs-theme="light"] .home-card{
    +  --surface: #fff;
    +  --card-border: rgba(0,0,0,.08);
    +}
    +.home-tile{
    +  display: block;
    +  text-decoration: none;
    +  color: inherit;
    +  border-radius: var(--radius, 12px);
    +  border: 1px solid var(--card-border, rgba(255,255,255,.12));
    +  background: var(--surface, rgba(255,255,255,.06));
    +  transition: transform .12s ease, border-color .12s ease, box-shadow .12s ease;
    +}
    +.home-tile:hover{
    +  transform: translateY(-2px);
    +  box-shadow: 0 10px 24px rgba(0,0,0,.15);
    +  border-color: var(--brand, #4ea1ff);
    +}
    +.home-tile .tile-body{ padding: 1.25rem 1.25rem; }
    +
    +/* ---------- Section title ---------- */
    +.section-title{
    +  margin-bottom: .25rem;
    +}
    +
    +/* ---------- Logo grid ---------- */
    +.logo-grid{
    +  --cols: 6;
    +  list-style: none; padding: 0; margin: 0;
    +  display: grid; gap: 1rem;
    +  grid-template-columns: repeat(var(--cols), minmax(0, 1fr));
    +}
    +@media (max-width: 1200px){ .logo-grid{ --cols: 5; } }
    +@media (max-width: 992px){ .logo-grid{ --cols: 4; } }
    +@media (max-width: 768px){ .logo-grid{ --cols: 3; } }
    +@media (max-width: 576px){ .logo-grid{ --cols: 2; } }
    +
    +.logo-item{
    +  border: 1px solid var(--card-border, rgba(255,255,255,.12));
    +  background: var(--surface, rgba(255,255,255,.04));
    +  border-radius: var(--radius, 12px);
    +  padding: .75rem .75rem 1rem;
    +  text-align: center;
    +  transition: transform .12s ease, border-color .12s ease;
    +}
    +.logo-item:hover{
    +  transform: translateY(-2px);
    +  border-color: var(--brand, #4ea1ff);
    +}
    +.logo-item img{
    +  max-width: 100%;
    +  max-height: 52px;
    +  object-fit: contain;
    +  filter: saturate(.95);
    +}
    +.logo-caption{
    +  display: block;
    +  font-size: .85rem;
    +  opacity: .8;
    +  margin-top: .35rem;
    +}
    +
    +/* ---------- CTA banner ---------- */
    +.cta-banner{
    +  display: flex; align-items: center; justify-content: space-between;
    +  gap: 1rem; flex-wrap: wrap;
    +  background: linear-gradient(180deg, rgba(255,255,255,.08), rgba(255,255,255,.02));
    +  border: 1px solid var(--card-border, rgba(255,255,255,.12));
    +  border-radius: var(--radius, 12px);
    +  padding: 1.25rem 1.25rem;
    +}
    +[data-bs-theme="light"] .cta-banner{
    +  background: linear-gradient(180deg, #ffffff, #fafafa);
    +}
    +
    +/* ---------- Fix “Back to top” button shape (site-wide safe) ---------- */
    +.to_top{
    +  width: 48px; height: 48px;
    +  border-radius: 50%;
    +  display: grid; place-items: center;
    +  backdrop-filter: blur(10px);
    +  -webkit-backdrop-filter: blur(10px);
    +  background: rgba(0,0,0,.35);
    +  box-shadow: 0 6px 20px rgba(0,0,0,.25);
    +}
    +[data-bs-theme="light"] .to_top{ background: rgba(255,255,255,.85); }
    +.to_top .icon{ width: 22px; height: 22px; }
    +
    +/* ===================== Light-mode contrast boost ===================== */
    +/* Stronger borders, solid white surfaces, and a subtle elevation */
    +[data-bs-theme="light"] .home-card,
    +[data-bs-theme="light"] .home-tile,
    +[data-bs-theme="light"] .logo-item,
    +[data-bs-theme="light"] .cta-banner{
    +  --surface: #ffffff;
    +  --card-border: rgba(0,0,0,.14);                 /* was ~.08 */
    +  background-color: #ffffff;
    +  border-color: rgba(0,0,0,.14);
    +  box-shadow: 0 2px 8px rgba(0,0,0,.06);
    +}
    +
    +/* Hover elevation + clearer edge */
    +[data-bs-theme="light"] .home-tile:hover,
    +[data-bs-theme="light"] .home-card:hover,
    +[data-bs-theme="light"] .logo-item:hover{
    +  box-shadow: 0 10px 24px rgba(0,0,0,.12);
    +  border-color: rgba(0,0,0,.22);
    +}
    +
    +/* Type color tweaks for better legibility on white */
    +[data-bs-theme="light"] .section-title{ color:#111827; }        /* near-black */
    +[data-bs-theme="light"] .home-card,
    +[data-bs-theme="light"] .home-tile .tile-body{ color:#24292f; } /* body text */
    +[data-bs-theme="light"] .cta-banner{
    +  background: linear-gradient(180deg, #ffffff, #f7f7f8);        /* more contrast */
    +}
    +
    +/* (optional) tone the “secondary” copy up a bit only inside home sections */
    +[data-bs-theme="light"] section .text-secondary{ color:#4b5563 !important; }
    diff --git a/theme/css/nav.css b/theme/css/nav.css
    new file mode 100644
    index 000000000..ce8fad18d
    --- /dev/null
    +++ b/theme/css/nav.css
    @@ -0,0 +1,245 @@
    +/* ==========================
    +   NAV / DROPDOWNS / OFFCANVAS
    +   (Bootstrap accordion inside mega dropdown)
    +   ========================== */
    +
    +/* Navbar (desktop) */
    +.navbar{
    +  backdrop-filter: blur(12px);
    +  -webkit-backdrop-filter: blur(12px);
    +  background: var(--nav-bg);
    +  border-bottom: 1px solid var(--nav-border);
    +}
    +.navbar .nav-link{ color: var(--nav-link) !important; }
    +.navbar .nav-link.active,
    +.navbar .nav-link:hover,
    +.nav_active > a{ color: var(--brand) !important; }
    +
    +/* Spacing tokens (tune here) */
    +:root{
    +  --nav-link-px: 1.05rem;     /* L/R padding for top-level items */
    +  --nav-link-py: 0.55rem;     /* T/B padding for top-level items */
    +
    +  --dropdown-link-px: 1rem;   /* L/R padding for dropdown items */
    +  --dropdown-link-py: 0.50rem;/* T/B padding for dropdown items */
    +
    +  --mobile-link-px: 1rem;     /* Offcanvas links L/R */
    +  --mobile-link-py: 0.55rem;  /* Offcanvas links T/B */
    +}
    +
    +/* Desktop: top-level items */
    +.navbar-nav > .nav-item > .nav-link{
    +  padding: var(--nav-link-py) var(--nav-link-px);
    +  line-height: 1.2;
    +  min-height: 42px;
    +}
    +
    +/* Dropdowns (shared) */
    +.dropdown-menu{
    +  background: var(--dd-bg);
    +  border: 1px solid var(--dd-border);
    +  backdrop-filter: blur(10px);
    +  -webkit-backdrop-filter: blur(10px);
    +  border-radius: var(--radius);
    +  overflow: hidden;
    +  padding: .35rem;                     /* menu chrome minimal; items add real padding */
    +  max-height: min(72vh, 720px);        /* long menus scroll instead of overflowing */
    +  overflow-y: auto;
    +}
    +.dropdown-item{
    +  display: block;
    +  color: var(--dd-link);
    +  padding: var(--dropdown-link-py) var(--dropdown-link-px);
    +  border-radius: .375rem;              /* soft hover edges */
    +  min-height: 42px;
    +}
    +.dropdown-item:hover,
    +.dropdown-item:focus{ background: var(--dd-hover-bg); color: var(--dd-hover); }
    +.dropdown-item.active{ color: var(--brand); }
    +.dropdown-divider{ margin: .35rem 0; }
    +
    +/* ===== Mega dropdown (desktop) ===== */
    +.dropdown-menu.mega{
    +  max-height: 70vh;
    +  overflow: auto;
    +  padding: .5rem;
    +}
    +
    +/* Grid wrapper (kept for structure; can be simple) */
    +.mega .mega-grid{ display: block; }
    +
    +/* Accordion inside mega */
    +.mega .accordion{ --bs-accordion-bg: transparent; }
    +.mega .accordion-item{
    +  background: transparent;
    +  border: 0;
    +  margin-bottom: .15rem;
    +}
    +.mega .accordion-header{ margin: 0; }
    +
    +/* Title rows (accordion buttons = group titles) */
    +.mega .accordion-button{
    +  background: transparent;
    +  color: var(--fg);
    +  font-weight: 600;
    +  padding: var(--dropdown-link-py) var(--dropdown-link-px);
    +  border-radius: .375rem;
    +  box-shadow: none;
    +  min-height: 42px;
    +}
    +.mega .accordion-button:hover{ background: rgba(255,255,255,.05); }
    +.mega .accordion-button:not(.collapsed){
    +  background: rgba(255,255,255,.06);
    +  color: var(--fg);
    +  box-shadow: none;
    +}
    +
    +/* Caret icon (Bootstrap’s ::after) — ensure it’s visible on dark glass */
    +.mega .accordion-button::after{
    +  filter: invert(1) opacity(.75);
    +}
    +.mega .accordion-button:not(.collapsed)::after{
    +  filter: invert(1) opacity(1);
    +}
    +
    +/* Collapse body */
    +.mega .accordion-collapse{ border: 0; }
    +.mega .accordion-body{
    +  padding: 0; /* list handles spacing */
    +}
    +
    +/* Links inside accordion body */
    +.mega .accordion-body ul{
    +  list-style: none;
    +  margin: .15rem 0 0 0;
    +  padding: .25rem 0 .5rem 0;
    +}
    +.mega .accordion-body .dropdown-item{
    +  padding: var(--dropdown-link-py) var(--dropdown-link-px);
    +  border-radius: .375rem;
    +}
    +.mega .accordion-body .dropdown-item:hover,
    +.mega .accordion-body .dropdown-item:focus,
    +.mega .accordion-body .dropdown-item.active{
    +  background: rgba(255,255,255,.08);
    +}
    +
    +/* “Link-only” items (children without grandchildren) styled like headers, no caret */
    +.mega .link-only .accordion-button{
    +  cursor: pointer;
    +  text-decoration: none;
    +}
    +.mega .link-only .accordion-button::after{ display: none; }
    +
    +/* ===== Offcanvas (mobile) ===== */
    +.offcanvas.text-bg-dark{
    +  background: #0e121a; /* stable dark under blur */
    +}
    +.offcanvas .accordion{ --bs-accordion-bg: transparent; }
    +.offcanvas .accordion-item{ background: transparent; border: 0; }
    +.offcanvas .accordion-button{
    +  background: transparent;
    +  color: var(--fg);
    +  box-shadow: none;
    +  padding: var(--mobile-link-py) var(--mobile-link-px);
    +  min-height: 42px;
    +}
    +.offcanvas .accordion-button:not(.collapsed){
    +  background: rgba(255,255,255,.06);
    +  color: var(--fg);
    +}
    +.offcanvas .accordion-body{ padding: .25rem 0 .5rem 0; }
    +.offcanvas .accordion-body .nav-link{
    +  color: var(--fg);
    +  padding: var(--mobile-link-py) var(--mobile-link-px);
    +  min-height: 42px;
    +}
    +.offcanvas .accordion-body .nav-link.active,
    +.offcanvas .accordion-body .nav-link:hover{
    +  color: var(--brand);
    +}
    +
    +/* Back to top */
    +.to_top{ position: fixed; right: 1rem; bottom: 1rem; z-index: 10; opacity: .9; }
    +.to_top .icon{ width: 34px; height: 34px; }
    +
    +
    +/* Keep navbar items on one line and let brand | menu | search align properly */
    +.navbar > .container-xxl,
    +.navbar > .container,
    +.navbar > .container-fluid{
    +  display: flex;              /* be explicit */
    +  flex-wrap: nowrap;          /* no wrapping */
    +  align-items: center;        /* vertical centering */
    +  justify-content: space-between; /* brand left, last item (search) far right */
    +}
    +
    +
    +/* Keep icon + input on one line and vertically centered */
    +.navbar .searchbar { flex-wrap: nowrap; align-items: center; }
    +
    +/* Make the icon sit nicely in light/dark */
    +.navbar .searchbar .input-group-text {
    +  display: flex; align-items: center;
    +  color: var(--nav-link); /* inherits your theme */
    +}
    +
    +/* Size + feel of the field */
    +.navbar .searchbar .form-control {
    +  min-width: 20rem;           /* adjust as you like */
    +  box-shadow: none !important;
    +  color: var(--nav-link);
    +}
    +.navbar .searchbar .form-control::placeholder { opacity: .6; }
    +
    +/* Tweak for narrower viewports where this form is still visible */
    +@media (max-width: 1200px){
    +  .navbar .searchbar .form-control { min-width: 14rem; }
    +}
    +
    +/* Prevent navbar wrapping that shoves items to a new row */
    +.navbar .container,
    +.navbar .container-fluid { flex-wrap: nowrap; align-items: center; }
    +
    +/* Brand sizing guard — prevents distortion */
    +.navbar-brand img {
    +  height: 34px;           /* adjust if you prefer 32/36 */
    +  width: auto;
    +  object-fit: contain;
    +  display: block;
    +}
    +
    +/* Search bar: keep icon + field on one line and nice width */
    +.navbar .searchbar {
    +  flex-wrap: nowrap;
    +  align-items: center;
    +  width: clamp(12rem, 22vw, 18rem); /* doesn’t push nav items */
    +}
    +
    +/* Icon inside the input group (independent of your global .icon rules) */
    +.navbar .searchbar .search-icon {
    +  width: 16px; height: 16px;
    +  display: block;
    +}
    +
    +/* Field look + colors for dark/light */
    +.navbar .searchbar .form-control {
    +  box-shadow: none !important;
    +  color: var(--nav-link);
    +}
    +.navbar .searchbar .form-control::placeholder { opacity: .6; }
    +
    +/* Make sure the text addon inherits theme color */
    +.navbar .searchbar .input-group-text {
    +  color: var(--nav-link);
    +}
    +
    +/* Slightly shrink on tighter desktops so it never wraps */
    +@media (max-width: 1200px){
    +  .navbar .searchbar { width: clamp(10rem, 24vw, 14rem); }
    +}
    +
    +/* Let the menu take the middle space so search pushes to the edge */
    +@media (min-width: 992px){
    +  .navbar .navbar-collapse { flex-grow: 1; }
    +}
    diff --git a/theme/css/partners.css b/theme/css/partners.css
    new file mode 100644
    index 000000000..3a1482371
    --- /dev/null
    +++ b/theme/css/partners.css
    @@ -0,0 +1,112 @@
    +/* ===== Partners grid (dark/light friendly, glass cards) ===== */
    +
    +:root{
    +  --pc-text: var(--fg, #e8eaf0);
    +  --pc-bg: rgba(16,18,27,.6);
    +  --pc-border: rgba(255,255,255,.12);
    +  --pc-hover: rgba(255,255,255,.06);
    +}
    +[data-bs-theme="light"]{
    +  --pc-text: #111827;
    +  --pc-bg: #ffffff;
    +  --pc-border: rgba(0,0,0,.08);
    +  --pc-hover: rgba(0,0,0,.04);
    +}
    +
    +.partners-grid .partner-card{
    +  background: var(--pc-bg);
    +  border: 1px solid var(--pc-border);
    +  border-radius: 1rem;
    +  backdrop-filter: blur(10px);
    +  -webkit-backdrop-filter: blur(10px);
    +  box-shadow: 0 10px 24px rgba(0,0,0,.08);
    +  transition: transform .15s ease, box-shadow .2s ease, border-color .2s ease;
    +  position: relative;
    +}
    +.partners-grid .partner-card:hover{
    +  transform: translateY(-2px);
    +  box-shadow: 0 16px 36px rgba(0,0,0,.16);
    +  border-color: color-mix(in oklab, var(--pc-border) 60%, var(--brand, #3b82f6));
    +}
    +
    +.partners-grid .partner-body{
    +  color: var(--pc-text);
    +}
    +.partners-grid .partner-title a{
    +  color: inherit;
    +  text-decoration: none;
    +}
    +.partners-grid .partner-title a:hover{
    +  text-decoration: underline;
    +}
    +.partners-grid .partner-summary{
    +  color: color-mix(in oklab, var(--pc-text) 80%, transparent);
    +  margin-bottom: .75rem;
    +}
    +
    +.partners-grid .icon{ width: 18px; height: 18px; }
    +
    +.partners-grid .icon-btn{
    +  --_bd: var(--pc-border);
    +  --_fg: var(--pc-text);
    +  display: inline-flex; align-items: center; justify-content: center;
    +  gap: .35rem;
    +  border: 1px solid var(--_bd);
    +  border-radius: 999px;
    +  padding: .35rem .45rem;
    +  line-height: 1;
    +  color: var(--_fg);
    +  background: transparent;
    +  text-decoration: none;
    +  transition: background-color .15s ease, border-color .15s ease, transform .05s ease;
    +}
    +.partners-grid .icon-btn:hover{
    +  background: var(--pc-hover);
    +  border-color: color-mix(in oklab, var(--_bd) 60%, var(--brand, #3b82f6));
    +}
    +.partners-grid .icon-btn:active{ transform: translateY(1px); }
    +
    +/* Logo band: fixed height + hidden overflow so nothing spills into the title */
    +.partners-grid .logo-wrap{
    +  height: 110px;                 /* was 130px */
    +  padding: 12px 16px;
    +  overflow: hidden;              /* hard stop */
    +  display: flex; align-items: center; justify-content: center;
    +  border-bottom: 1px dashed var(--pc-border);
    +  background: color-mix(in oklab, var(--pc-bg) 92%, transparent);
    +  border-top-left-radius: 1rem; border-top-right-radius: 1rem;
    +}
    +
    +/* Logos: clamp both height and width so tall/wide marks don’t dominate */
    +.partners-grid .logo-wrap img{
    +  display: block;
    +  object-fit: contain;
    +  width: auto;
    +  max-width: 80%;                /* prevent super-wide brands from touching edges */
    +  max-height: clamp(44px, 8vw, 78px); /* scale responsively but never huge */
    +  transform: scale(var(--logo-scale, 1));  /* per-partner fine-tune (see below) */
    +  transform-origin: center;
    +}
    +
    +/* Slightly larger on very wide screens, still bounded */
    +@media (min-width: 1400px){
    +  .partners-grid .logo-wrap{ height: 120px; }
    +  .partners-grid .logo-wrap img{ max-height: 84px; }
    +}
    +
    +/* And a touch smaller on tight screens to avoid crowding */
    +@media (max-width: 480px){
    +  .partners-grid .logo-wrap{ height: 96px; }
    +  .partners-grid .logo-wrap img{ max-height: 64px; }
    +}
    +
    +/* Optional: keep long names tidy */
    +.partners-grid .partner-title{
    +  display: -webkit-box;
    +  -webkit-line-clamp: 2;         /* clamp to 2 lines */
    +  -webkit-box-orient: vertical;
    +  overflow: hidden;
    +}
    +
    +.partner-card .stretched-link::after { z-index: 1; }           /* overlay */
    +.partner-card .icon-btn { position: relative; z-index: 2; }    /* icons above */
    diff --git a/theme/css/search.css b/theme/css/search.css
    new file mode 100644
    index 000000000..119a69dab
    --- /dev/null
    +++ b/theme/css/search.css
    @@ -0,0 +1,55 @@
    +/* /css/search.css */
    +.search-popover{
    +  position: absolute;
    +  left: 0;
    +  right: 0;
    +  top: calc(100% + .25rem);
    +  z-index: 1050;
    +
    +  background: var(--dd-bg, rgba(16,18,27,.98));
    +  border: 1px solid var(--dd-border, rgba(255,255,255,.12));
    +  backdrop-filter: blur(10px);
    +  -webkit-backdrop-filter: blur(10px);
    +  border-radius: .5rem;
    +  padding: .25rem;
    +  box-shadow: 0 8px 30px rgba(0,0,0,.25);
    +  display: none;
    +  max-height: min(60vh, 520px);
    +  overflow: auto;
    +}
    +.search-popover.open{ display: block; }
    +
    +.sr-item{
    +  display: block;
    +  padding: .6rem .7rem;
    +  border-radius: .4rem;
    +  color: var(--fg, #e8eaf0);
    +  text-decoration: none;
    +}
    +.sr-item .sr-title{ font-weight: 600; margin-bottom: .15rem; }
    +.sr-item .sr-snippet{ font-size: .875rem; opacity: .85; line-height: 1.35; }
    +.sr-item:hover,
    +.sr-item.active{
    +  background: var(--dd-hover-bg, rgba(255,255,255,.08));
    +}
    +
    +.sr-item.muted{ opacity: .7; pointer-events: none; }
    +
    +mark{
    +  background: color-mix(in oklab, var(--brand, #3b82f6) 28%, transparent);
    +  color: inherit;
    +  padding: 0 .15em;
    +  border-radius: .2em;
    +}
    +
    +/* Light-mode tweaks (a bit more contrast) */
    +[data-bs-theme="light"] .search-popover{
    +  background: #fff;
    +  border-color: rgba(0,0,0,.12);
    +  box-shadow: 0 8px 24px rgba(0,0,0,.12);
    +}
    +[data-bs-theme="light"] .sr-item{ color: #1f2937; }
    +[data-bs-theme="light"] .sr-item:hover,
    +[data-bs-theme="light"] .sr-item.active{
    +  background: rgba(0,0,0,.05);
    +}
    diff --git a/theme/css/team.css b/theme/css/team.css
    new file mode 100644
    index 000000000..497bf0ebe
    --- /dev/null
    +++ b/theme/css/team.css
    @@ -0,0 +1,56 @@
    +/* ===== Team page (scoped) ===== */
    +.team-grid .card{
    +  border-radius: 1rem;
    +  border: 1px solid var(--card-border, rgba(255,255,255,.12));
    +  background: var(--card-bg, rgba(20,24,33,.6));
    +  overflow: hidden;
    +}
    +[data-bs-theme="light"] .team-grid .card{
    +  background: #fff;
    +  border-color: rgba(0,0,0,.08);
    +}
    +
    +.team-grid .card-img-top{
    +  display:block;
    +  width:100%;
    +  aspect-ratio: 4 / 3;       /* keeps consistent header area */
    +  object-fit: cover;         /* crops tall/wide headshots neatly */
    +}
    +
    +.team-grid .card-title{
    +  font-size: 1.15rem;
    +  margin-bottom: .25rem;
    +}
    +
    +/* Social icon row */
    +.team-grid .social{
    +  display: flex;
    +  align-items: center;
    +  gap: .5rem;
    +}
    +
    +/* Tight, consistent SVG icon sizing + inherit theme color */
    +.team-grid .social .icon{
    +  width: 22px;               /* <- right here: fix HUGE icon */
    +  height: 22px;
    +  display: inline-block;
    +  vertical-align: middle;
    +  fill: currentColor;        /* ensure symbols use text color */
    +}
    +.team-grid .social a{
    +  color: var(--fg, #e6e9f0);
    +  opacity: .85;
    +  text-decoration: none;
    +}
    +[data-bs-theme="light"] .team-grid .social a{
    +  color: #1f2937;
    +}
    +.team-grid .social a:hover{
    +  color: var(--brand, #3b82f6);
    +  opacity: 1;
    +}
    +
    +/* Sponsor iframe wrapper spacing */
    +.team-grid .sponsor{
    +  margin-top: .5rem;
    +}
    diff --git a/theme/css/tokens.css b/theme/css/tokens.css
    new file mode 100644
    index 000000000..431e00fbf
    --- /dev/null
    +++ b/theme/css/tokens.css
    @@ -0,0 +1,96 @@
    +/* ───────── TOKENS & MODES (light default; dark via [data-mode="dim"]) ───────── */
    +:root{
    +  /* Palette */
    +  --bg: #f8fafc;
    +  --fg: #101218;
    +  --muted: #5f6b7a;
    +
    +  --brand: #5cc8ff;
    +  --brand-2: #8a7dff;
    +
    +  /* Nav / surfaces */
    +  --nav-bg: rgba(255,255,255,.75);
    +  --nav-border: rgba(0,0,0,.06);
    +  --nav-link: rgba(0,0,0,.72);
    +
    +  /* Dropdown (desktop & mobile) */
    +  --dd-bg: rgba(255,255,255,.98);
    +  --dd-border: rgba(0,0,0,.08);
    +  --dd-link: #111827;
    +  --dd-hover-bg: rgba(92,200,255,.14);
    +  --dd-hover: #0b1220;
    +
    +  /* Background glow (fixed layer) */
    +  --glow-1: rgba(92,200,255,.10);
    +  --glow-2: rgba(138,125,255,.08);
    +
    +  /* Layout */
    +  --radius: 16px;
    +  --shadow: 0 10px 30px rgba(0,0,0,.12);
    +
    +  /* Tables / callouts */
    +  --table-bg: #fff;
    +  --table-haze: #f2f2f2;
    +  --table-border: #dedede;
    +
    +  --notice-info-border-color: #6AB0DE;
    +  --notice-info-background: #E7F2FA;
    +  --notice-note-border-color: #F0B37E;
    +  --notice-note-background: #FFF2DB;
    +  --notice-tip-border-color: rgba(92,184,92,.8);
    +  --notice-tip-background: #E6F9E6;
    +  --notice-warning-border-color: rgba(217,83,79,.8);
    +  --notice-warning-background: #FAE2E2;
    +
    +  /* Code */
    +  --code-bg: #0f1420;
    +}
    +
    +/* Dark mode via attribute */
    +html[data-mode="dim"]{
    +  --bg: #0b0d12;
    +  --fg: #e7ecf4;
    +  --muted: #a7b0c0;
    +
    +  --nav-bg: rgba(14,18,26,.55);
    +  --nav-border: rgba(255,255,255,.06);
    +  --nav-link: rgba(255,255,255,.78);
    +
    +  --dd-bg: rgba(16,18,26,.94);
    +  --dd-border: rgba(255,255,255,.08);
    +  --dd-link: #e7ecf4;
    +  --dd-hover-bg: rgba(92,200,255,.16);
    +  --dd-hover: #ffffff;
    +
    +  --glow-1: rgba(92,200,255,.18);
    +  --glow-2: rgba(138,125,255,.16);
    +  --table-bg: rgba(255,255,255,.06);
    +  --table-haze: rgba(255,255,255,.08);
    +  --table-border: rgba(255,255,255,.12);
    +}
    +
    +/* Respect OS if user hasn’t forced a mode */
    +@media (prefers-color-scheme: dark){
    +  html:not([data-mode="lit"]){
    +    /* mirror dark tokens */
    +    --bg: #0b0d12;
    +    --fg: #e7ecf4;
    +    --muted: #a7b0c0;
    +
    +    --nav-bg: rgba(14,18,26,.55);
    +    --nav-border: rgba(255,255,255,.06);
    +    --nav-link: rgba(255,255,255,.78);
    +
    +    --dd-bg: rgba(16,18,26,.94);
    +    --dd-border: rgba(255,255,255,.08);
    +    --dd-link: #e7ecf4;
    +    --dd-hover-bg: rgba(92,200,255,.16);
    +    --dd-hover: #ffffff;
    +
    +    --glow-1: rgba(92,200,255,.18);
    +    --glow-2: rgba(138,125,255,.16);
    +    --table-bg: rgba(255,255,255,.06);
    +    --table-haze: rgba(255,255,255,.08);
    +    --table-border: rgba(255,255,255,.12);
    +  }
    +}
    diff --git a/theme/css/utilities.css b/theme/css/utilities.css
    new file mode 100644
    index 000000000..8cee390c1
    --- /dev/null
    +++ b/theme/css/utilities.css
    @@ -0,0 +1,34 @@
    +/* Spacing helpers */
    +.pt-1{ padding-top:1.5rem; } .pb-1{ padding-bottom:1.5rem; }
    +.mt-1{ margin-top:1.5rem; } .mb-1{ margin-bottom:1.5rem; }
    +.pt-2{ padding-top:3rem; } .pb-2{ padding-bottom:3rem; }
    +.mt-2{ margin-top:3rem; } .mb-2{ margin-bottom:3rem; }
    +
    +/* Visibility & shape */
    +.hidden{ display: none !important; }
    +.inline{ display: inline; margin: 0; }
    +.round{ border-radius: 50%; vertical-align: middle; }
    +.float_left{ float: left; margin-right: 1rem; } .float_left + p{ padding-top: 0; }
    +.float_right{ float: right; margin-left: 1rem; }
    +
    +/* Layout helpers */
    +.landing-content{
    +  margin: 15px auto; padding: 2rem; gap: 10px; max-width: 100%;
    +  display: grid; align-content: center; justify-content: center; text-align: center;
    +}
    +.info{ max-width: 65rem; margin: 15px auto; }
    +
    +/* Grid helpers (optional) */
    +@media (min-width:42rem){
    +  [class*='grid-']{ display:grid; grid-gap:2rem; }
    +  .grid-2{ grid-template-columns:1fr 1fr; }
    +  .grid-3{ grid-template-columns:repeat(auto-fit, minmax(19rem, 1fr)); }
    +  .grid-4{ grid-template-columns:repeat(auto-fit, minmax(16rem, 1fr)); }
    +  .grid-inverse{ grid-template-columns:70% 1fr; grid-column-gap:4rem; }
    +}
    +
    +
    +/* Generic icon theming: inherit text color in all modes */
    +svg.icon { fill: currentColor; stroke: currentColor; }
    +svg.icon [fill]:not([fill="none"]) { fill: currentColor !important; }
    +svg.icon [stroke]:not([stroke="none"]) { stroke: currentColor !important; }
    diff --git a/theme/custom-markdown.tpl b/theme/custom-markdown.tpl
    new file mode 100644
    index 000000000..1b215ea96
    --- /dev/null
    +++ b/theme/custom-markdown.tpl
    @@ -0,0 +1,29 @@
    +{% extends 'markdown/index.md.j2'%}
    +{% block data_text %}
    +
    +

    + OUTPUT + +

    +
    +  {{ super().split('\n') | map('trim') | join('\n') }}
    +
    +
    +{% endblock data_text %} + +{% block data_html %} +{{ super().split('\n') | map('trim') | join('\n') }} +{% endblock data_html %} + + +{% block stream %} +
    +

    + OUTPUT + +

    +
    +  {{ super().split('\n') | map('trim') | join('\n') }}
    +
    +
    +{% endblock stream %} diff --git a/theme/events.html b/theme/events.html new file mode 100644 index 000000000..8b1aefb85 --- /dev/null +++ b/theme/events.html @@ -0,0 +1,74 @@ +{% extends "main.html" %} + +{% set colors=["", "bg-light"] %} + +{% block content %} + {{ page.content }} + +
    +
    + {%set upcoming_events = page.meta.get("events", {}).get("upcoming", {}) %} +

    Upcoming Events

    + {% for event in upcoming_events %} + +
    +
    + + + +
    +
    +

    {{ event.name }}

    +

    {{ event.description }}

    +

    + From {{ event.date_start }} to + {{ event.date_end }}. +

    +

    + More information +

    +
    +
    + + {% endfor %} + + {% if not upcoming_events %} + No upcoming events for now. + {% endif %} +
    +
    + +
    +
    +

    Past Events

    + {%set past_events = page.meta.get("events", {}).get("past_events", {}) %} + {% for event in past_events %} + +
    +
    + + + +
    +
    +

    {{ event.name }}

    +

    {{ event.description }}

    +

    + From {{ event.date_start }} to + {{ event.date_end }}. +

    +

    + More information +

    +
    +
    + + {% endfor %} + + {% if not past_events %} + No past events yet. + {% endif %} +
    +
    + +{% endblock content %} diff --git a/static/fonts/Metropolis-Black.woff b/theme/fonts/Metropolis-Black.woff similarity index 100% rename from static/fonts/Metropolis-Black.woff rename to theme/fonts/Metropolis-Black.woff diff --git a/static/fonts/Metropolis-Black.woff2 b/theme/fonts/Metropolis-Black.woff2 similarity index 100% rename from static/fonts/Metropolis-Black.woff2 rename to theme/fonts/Metropolis-Black.woff2 diff --git a/static/fonts/Metropolis-BlackItalic.woff b/theme/fonts/Metropolis-BlackItalic.woff similarity index 100% rename from static/fonts/Metropolis-BlackItalic.woff rename to theme/fonts/Metropolis-BlackItalic.woff diff --git a/static/fonts/Metropolis-BlackItalic.woff2 b/theme/fonts/Metropolis-BlackItalic.woff2 similarity index 100% rename from static/fonts/Metropolis-BlackItalic.woff2 rename to theme/fonts/Metropolis-BlackItalic.woff2 diff --git a/static/fonts/Metropolis-Bold.woff b/theme/fonts/Metropolis-Bold.woff similarity index 100% rename from static/fonts/Metropolis-Bold.woff rename to theme/fonts/Metropolis-Bold.woff diff --git a/static/fonts/Metropolis-Bold.woff2 b/theme/fonts/Metropolis-Bold.woff2 similarity index 100% rename from static/fonts/Metropolis-Bold.woff2 rename to theme/fonts/Metropolis-Bold.woff2 diff --git a/static/fonts/Metropolis-BoldItalic.woff b/theme/fonts/Metropolis-BoldItalic.woff similarity index 100% rename from static/fonts/Metropolis-BoldItalic.woff rename to theme/fonts/Metropolis-BoldItalic.woff diff --git a/static/fonts/Metropolis-BoldItalic.woff2 b/theme/fonts/Metropolis-BoldItalic.woff2 similarity index 100% rename from static/fonts/Metropolis-BoldItalic.woff2 rename to theme/fonts/Metropolis-BoldItalic.woff2 diff --git a/static/fonts/Metropolis-ExtraBold.woff b/theme/fonts/Metropolis-ExtraBold.woff similarity index 100% rename from static/fonts/Metropolis-ExtraBold.woff rename to theme/fonts/Metropolis-ExtraBold.woff diff --git a/static/fonts/Metropolis-ExtraBold.woff2 b/theme/fonts/Metropolis-ExtraBold.woff2 similarity index 100% rename from static/fonts/Metropolis-ExtraBold.woff2 rename to theme/fonts/Metropolis-ExtraBold.woff2 diff --git a/static/fonts/Metropolis-ExtraBoldItalic.woff b/theme/fonts/Metropolis-ExtraBoldItalic.woff similarity index 100% rename from static/fonts/Metropolis-ExtraBoldItalic.woff rename to theme/fonts/Metropolis-ExtraBoldItalic.woff diff --git a/static/fonts/Metropolis-ExtraBoldItalic.woff2 b/theme/fonts/Metropolis-ExtraBoldItalic.woff2 similarity index 100% rename from static/fonts/Metropolis-ExtraBoldItalic.woff2 rename to theme/fonts/Metropolis-ExtraBoldItalic.woff2 diff --git a/static/fonts/Metropolis-ExtraLight.woff b/theme/fonts/Metropolis-ExtraLight.woff similarity index 100% rename from static/fonts/Metropolis-ExtraLight.woff rename to theme/fonts/Metropolis-ExtraLight.woff diff --git a/static/fonts/Metropolis-ExtraLight.woff2 b/theme/fonts/Metropolis-ExtraLight.woff2 similarity index 100% rename from static/fonts/Metropolis-ExtraLight.woff2 rename to theme/fonts/Metropolis-ExtraLight.woff2 diff --git a/static/fonts/Metropolis-ExtraLightItalic.woff b/theme/fonts/Metropolis-ExtraLightItalic.woff similarity index 100% rename from static/fonts/Metropolis-ExtraLightItalic.woff rename to theme/fonts/Metropolis-ExtraLightItalic.woff diff --git a/static/fonts/Metropolis-ExtraLightItalic.woff2 b/theme/fonts/Metropolis-ExtraLightItalic.woff2 similarity index 100% rename from static/fonts/Metropolis-ExtraLightItalic.woff2 rename to theme/fonts/Metropolis-ExtraLightItalic.woff2 diff --git a/static/fonts/Metropolis-Light.woff b/theme/fonts/Metropolis-Light.woff similarity index 100% rename from static/fonts/Metropolis-Light.woff rename to theme/fonts/Metropolis-Light.woff diff --git a/static/fonts/Metropolis-Light.woff2 b/theme/fonts/Metropolis-Light.woff2 similarity index 100% rename from static/fonts/Metropolis-Light.woff2 rename to theme/fonts/Metropolis-Light.woff2 diff --git a/static/fonts/Metropolis-LightItalic.woff b/theme/fonts/Metropolis-LightItalic.woff similarity index 100% rename from static/fonts/Metropolis-LightItalic.woff rename to theme/fonts/Metropolis-LightItalic.woff diff --git a/static/fonts/Metropolis-LightItalic.woff2 b/theme/fonts/Metropolis-LightItalic.woff2 similarity index 100% rename from static/fonts/Metropolis-LightItalic.woff2 rename to theme/fonts/Metropolis-LightItalic.woff2 diff --git a/static/fonts/Metropolis-Medium.woff b/theme/fonts/Metropolis-Medium.woff similarity index 100% rename from static/fonts/Metropolis-Medium.woff rename to theme/fonts/Metropolis-Medium.woff diff --git a/static/fonts/Metropolis-Medium.woff2 b/theme/fonts/Metropolis-Medium.woff2 similarity index 100% rename from static/fonts/Metropolis-Medium.woff2 rename to theme/fonts/Metropolis-Medium.woff2 diff --git a/static/fonts/Metropolis-MediumItalic.woff b/theme/fonts/Metropolis-MediumItalic.woff similarity index 100% rename from static/fonts/Metropolis-MediumItalic.woff rename to theme/fonts/Metropolis-MediumItalic.woff diff --git a/static/fonts/Metropolis-MediumItalic.woff2 b/theme/fonts/Metropolis-MediumItalic.woff2 similarity index 100% rename from static/fonts/Metropolis-MediumItalic.woff2 rename to theme/fonts/Metropolis-MediumItalic.woff2 diff --git a/static/fonts/Metropolis-Regular.woff b/theme/fonts/Metropolis-Regular.woff similarity index 100% rename from static/fonts/Metropolis-Regular.woff rename to theme/fonts/Metropolis-Regular.woff diff --git a/static/fonts/Metropolis-Regular.woff2 b/theme/fonts/Metropolis-Regular.woff2 similarity index 100% rename from static/fonts/Metropolis-Regular.woff2 rename to theme/fonts/Metropolis-Regular.woff2 diff --git a/static/fonts/Metropolis-RegularItalic.woff b/theme/fonts/Metropolis-RegularItalic.woff similarity index 100% rename from static/fonts/Metropolis-RegularItalic.woff rename to theme/fonts/Metropolis-RegularItalic.woff diff --git a/static/fonts/Metropolis-RegularItalic.woff2 b/theme/fonts/Metropolis-RegularItalic.woff2 similarity index 100% rename from static/fonts/Metropolis-RegularItalic.woff2 rename to theme/fonts/Metropolis-RegularItalic.woff2 diff --git a/static/fonts/Metropolis-SemiBold.woff b/theme/fonts/Metropolis-SemiBold.woff similarity index 100% rename from static/fonts/Metropolis-SemiBold.woff rename to theme/fonts/Metropolis-SemiBold.woff diff --git a/static/fonts/Metropolis-SemiBold.woff2 b/theme/fonts/Metropolis-SemiBold.woff2 similarity index 100% rename from static/fonts/Metropolis-SemiBold.woff2 rename to theme/fonts/Metropolis-SemiBold.woff2 diff --git a/static/fonts/Metropolis-SemiBoldItalic.woff b/theme/fonts/Metropolis-SemiBoldItalic.woff similarity index 100% rename from static/fonts/Metropolis-SemiBoldItalic.woff rename to theme/fonts/Metropolis-SemiBoldItalic.woff diff --git a/static/fonts/Metropolis-SemiBoldItalic.woff2 b/theme/fonts/Metropolis-SemiBoldItalic.woff2 similarity index 100% rename from static/fonts/Metropolis-SemiBoldItalic.woff2 rename to theme/fonts/Metropolis-SemiBoldItalic.woff2 diff --git a/static/fonts/Metropolis-Thin.woff b/theme/fonts/Metropolis-Thin.woff similarity index 100% rename from static/fonts/Metropolis-Thin.woff rename to theme/fonts/Metropolis-Thin.woff diff --git a/static/fonts/Metropolis-Thin.woff2 b/theme/fonts/Metropolis-Thin.woff2 similarity index 100% rename from static/fonts/Metropolis-Thin.woff2 rename to theme/fonts/Metropolis-Thin.woff2 diff --git a/static/fonts/Metropolis-ThinItalic.woff b/theme/fonts/Metropolis-ThinItalic.woff similarity index 100% rename from static/fonts/Metropolis-ThinItalic.woff rename to theme/fonts/Metropolis-ThinItalic.woff diff --git a/static/fonts/Metropolis-ThinItalic.woff2 b/theme/fonts/Metropolis-ThinItalic.woff2 similarity index 100% rename from static/fonts/Metropolis-ThinItalic.woff2 rename to theme/fonts/Metropolis-ThinItalic.woff2 diff --git a/theme/home.html b/theme/home.html new file mode 100644 index 000000000..d17121876 --- /dev/null +++ b/theme/home.html @@ -0,0 +1,144 @@ +{% extends "base.html" %} + +{% set hero_image = page.meta.hero_image or "/images/home/header.jpg" %} +{% set hero_title = page.meta.hero_title or "Open collaboration for research, education & social good." %} +{% set hero_blurb = page.meta.hero_blurb or "Open Science Labs helps people learn, build, and contribute to impactful open-source projects — mentored by a welcoming community." %} +{% set cta_primary = page.meta.cta_primary or {"label":"Explore Projects", "href":"/projects/"} %} +{% set cta_secondary= page.meta.cta_secondary or {"label":"Get Involved", "href":"/opportunities/"} %} + +{% block header_extra %} + + +{% endblock header_extra %} + +{% block content %} + + +
    +
    +
    +
    +

    Welcome to

    +

    {{ hero_title }}

    +

    {{ hero_blurb }}

    + + + +
      +
    • Mentored OSS contributions
    • +
    • Programs & study groups
    • +
    • A supportive global community
    • +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +

    Our Mission

    +

    + At Open Science Labs (OSL), we are dedicated to advancing the scientific + research through collaboration, innovation, and education. Our mission + is to create a more inclusive, transparent, and accessible scientific community. +

    +
    +
    +
    +
    +

    Our Goals

    +

    + To empower researchers, educators, and students by providing resources, + tools, and a collaborative platform for sharing knowledge and advancing + open science initiatives. +

    +
    +
    +
    +
    +
    + + +
    + +
    + + +
    +
    +

    Our Partners

    +

    + We collaborate with organizations across research, education and social good. +

    + + +
    +
    + + +
    +
    +
    +
    +

    Ready to join the community?

    +

    Contribute to projects, mentor newcomers, or start a study group.

    +
    + +
    +
    +
    + +{% endblock content %} diff --git a/static/icons/android-chrome-192x192.png b/theme/icons/android-chrome-192x192.png similarity index 100% rename from static/icons/android-chrome-192x192.png rename to theme/icons/android-chrome-192x192.png diff --git a/static/icons/android-chrome-256x256.png b/theme/icons/android-chrome-256x256.png similarity index 100% rename from static/icons/android-chrome-256x256.png rename to theme/icons/android-chrome-256x256.png diff --git a/static/icons/apple-touch-icon.png b/theme/icons/apple-touch-icon.png similarity index 100% rename from static/icons/apple-touch-icon.png rename to theme/icons/apple-touch-icon.png diff --git a/static/icons/bar.svg b/theme/icons/bar.svg similarity index 100% rename from static/icons/bar.svg rename to theme/icons/bar.svg diff --git a/static/icons/browserconfig.xml b/theme/icons/browserconfig.xml similarity index 100% rename from static/icons/browserconfig.xml rename to theme/icons/browserconfig.xml diff --git a/static/icons/cancel.svg b/theme/icons/cancel.svg similarity index 100% rename from static/icons/cancel.svg rename to theme/icons/cancel.svg diff --git a/static/icons/caret-icon.svg b/theme/icons/caret-icon.svg similarity index 91% rename from static/icons/caret-icon.svg rename to theme/icons/caret-icon.svg index 8f9bb98c4..5a3096009 100644 --- a/static/icons/caret-icon.svg +++ b/theme/icons/caret-icon.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/static/icons/carly.svg b/theme/icons/carly.svg similarity index 99% rename from static/icons/carly.svg rename to theme/icons/carly.svg index 2b41b2c0b..a8a0a98df 100644 --- a/static/icons/carly.svg +++ b/theme/icons/carly.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/static/icons/close.svg b/theme/icons/close.svg similarity index 100% rename from static/icons/close.svg rename to theme/icons/close.svg diff --git a/static/icons/copy.svg b/theme/icons/copy.svg similarity index 100% rename from static/icons/copy.svg rename to theme/icons/copy.svg diff --git a/static/icons/expand.svg b/theme/icons/expand.svg similarity index 95% rename from static/icons/expand.svg rename to theme/icons/expand.svg index dce2376e5..78bd2f99d 100644 --- a/static/icons/expand.svg +++ b/theme/icons/expand.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/static/icons/favicon-16x16.png b/theme/icons/favicon-16x16.png similarity index 100% rename from static/icons/favicon-16x16.png rename to theme/icons/favicon-16x16.png diff --git a/static/favicon-32x32.png b/theme/icons/favicon-32x32.png similarity index 100% rename from static/favicon-32x32.png rename to theme/icons/favicon-32x32.png diff --git a/static/icons/favicon.ico b/theme/icons/favicon.ico similarity index 100% rename from static/icons/favicon.ico rename to theme/icons/favicon.ico diff --git a/static/icons/link.svg b/theme/icons/link.svg similarity index 100% rename from static/icons/link.svg rename to theme/icons/link.svg diff --git a/static/icons/logo-osl.svg b/theme/icons/logo-osl.svg similarity index 100% rename from static/icons/logo-osl.svg rename to theme/icons/logo-osl.svg diff --git a/static/icons/mstile-150x150.png b/theme/icons/mstile-150x150.png similarity index 100% rename from static/icons/mstile-150x150.png rename to theme/icons/mstile-150x150.png diff --git a/static/icons/order.svg b/theme/icons/order.svg similarity index 100% rename from static/icons/order.svg rename to theme/icons/order.svg diff --git a/static/icons/osl-logo-black.png b/theme/icons/osl-logo-black.png similarity index 100% rename from static/icons/osl-logo-black.png rename to theme/icons/osl-logo-black.png diff --git a/static/icons/osl-logo-black.svg b/theme/icons/osl-logo-black.svg similarity index 100% rename from static/icons/osl-logo-black.svg rename to theme/icons/osl-logo-black.svg diff --git a/static/icons/site.webmanifest b/theme/icons/site.webmanifest similarity index 100% rename from static/icons/site.webmanifest rename to theme/icons/site.webmanifest diff --git a/theme/icons/sprites.svg b/theme/icons/sprites.svg new file mode 100644 index 000000000..0cf508489 --- /dev/null +++ b/theme/icons/sprites.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + diff --git a/static/image/background.svg b/theme/images/background.svg similarity index 100% rename from static/image/background.svg rename to theme/images/background.svg diff --git a/static/image/draw.jpg b/theme/images/draw.jpg similarity index 100% rename from static/image/draw.jpg rename to theme/images/draw.jpg diff --git a/theme/images/events/openverse24.png b/theme/images/events/openverse24.png new file mode 100644 index 000000000..556906f51 Binary files /dev/null and b/theme/images/events/openverse24.png differ diff --git a/theme/images/events/openverse24.svg b/theme/images/events/openverse24.svg new file mode 100644 index 000000000..730d48806 --- /dev/null +++ b/theme/images/events/openverse24.svg @@ -0,0 +1,60 @@ + + + +OpenVerse'24 diff --git a/static/images/home/1.png b/theme/images/home/1.png similarity index 100% rename from static/images/home/1.png rename to theme/images/home/1.png diff --git a/static/images/home/Company-pana.png b/theme/images/home/Company-pana.png similarity index 100% rename from static/images/home/Company-pana.png rename to theme/images/home/Company-pana.png diff --git a/static/images/home/Development-bro.png b/theme/images/home/Development-bro.png similarity index 100% rename from static/images/home/Development-bro.png rename to theme/images/home/Development-bro.png diff --git a/static/images/home/Digital presentation-amico.png b/theme/images/home/Digital presentation-amico.png similarity index 100% rename from static/images/home/Digital presentation-amico.png rename to theme/images/home/Digital presentation-amico.png diff --git a/static/images/home/Formula-pana.png b/theme/images/home/Formula-pana.png similarity index 100% rename from static/images/home/Formula-pana.png rename to theme/images/home/Formula-pana.png diff --git a/static/images/home/International cooperation-bro.png b/theme/images/home/International cooperation-bro.png similarity index 100% rename from static/images/home/International cooperation-bro.png rename to theme/images/home/International cooperation-bro.png diff --git a/static/images/home/Soft skills-bro.png b/theme/images/home/Soft skills-bro.png similarity index 100% rename from static/images/home/Soft skills-bro.png rename to theme/images/home/Soft skills-bro.png diff --git a/static/images/home/Teacher-bro.png b/theme/images/home/Teacher-bro.png similarity index 100% rename from static/images/home/Teacher-bro.png rename to theme/images/home/Teacher-bro.png diff --git a/static/images/home/concept-of-data-analysis-and-maintenance.png b/theme/images/home/concept-of-data-analysis-and-maintenance.png similarity index 100% rename from static/images/home/concept-of-data-analysis-and-maintenance.png rename to theme/images/home/concept-of-data-analysis-and-maintenance.png diff --git a/theme/images/home/header.jpg b/theme/images/home/header.jpg new file mode 100644 index 000000000..a0bd96702 Binary files /dev/null and b/theme/images/home/header.jpg differ diff --git a/static/images/home/heroheader.png b/theme/images/home/heroheader.png similarity index 100% rename from static/images/home/heroheader.png rename to theme/images/home/heroheader.png diff --git a/static/images/home/undraw_Pair_programming_re_or4x.png b/theme/images/home/undraw_Pair_programming_re_or4x.png similarity index 100% rename from static/images/home/undraw_Pair_programming_re_or4x.png rename to theme/images/home/undraw_Pair_programming_re_or4x.png diff --git a/theme/images/internship/map.png b/theme/images/internship/map.png new file mode 100644 index 000000000..d3ba64034 Binary files /dev/null and b/theme/images/internship/map.png differ diff --git a/static/image/logo.svg b/theme/images/logo.svg similarity index 100% rename from static/image/logo.svg rename to theme/images/logo.svg diff --git a/static/logos/justlogo.png b/theme/images/logos/justlogo.png similarity index 100% rename from static/logos/justlogo.png rename to theme/images/logos/justlogo.png diff --git a/static/logos/logo.png b/theme/images/logos/logo.png similarity index 100% rename from static/logos/logo.png rename to theme/images/logos/logo.png diff --git a/static/logos/logolarge.png b/theme/images/logos/logolarge.png similarity index 100% rename from static/logos/logolarge.png rename to theme/images/logos/logolarge.png diff --git a/static/logos/osl-color-horizontal.png b/theme/images/logos/osl-color-horizontal.png similarity index 100% rename from static/logos/osl-color-horizontal.png rename to theme/images/logos/osl-color-horizontal.png diff --git a/static/logos/osl-logo-white.png b/theme/images/logos/osl-logo-white.png similarity index 100% rename from static/logos/osl-logo-white.png rename to theme/images/logos/osl-logo-white.png diff --git a/static/logos/osl-white-horizontal.png b/theme/images/logos/osl-white-horizontal.png similarity index 100% rename from static/logos/osl-white-horizontal.png rename to theme/images/logos/osl-white-horizontal.png diff --git a/static/logos/osl-white.png b/theme/images/logos/osl-white.png similarity index 100% rename from static/logos/osl-white.png rename to theme/images/logos/osl-white.png diff --git a/static/images/night-moon.jpg b/theme/images/night-moon.jpg similarity index 100% rename from static/images/night-moon.jpg rename to theme/images/night-moon.jpg diff --git a/static/images/partners/IGDORE-logo-200pxx200px.png b/theme/images/partners/IGDORE-logo-200pxx200px.png similarity index 100% rename from static/images/partners/IGDORE-logo-200pxx200px.png rename to theme/images/partners/IGDORE-logo-200pxx200px.png diff --git a/static/images/partners/IGDORE-logo.png b/theme/images/partners/IGDORE-logo.png similarity index 100% rename from static/images/partners/IGDORE-logo.png rename to theme/images/partners/IGDORE-logo.png diff --git a/static/images/partners/arx.png b/theme/images/partners/arx.png similarity index 100% rename from static/images/partners/arx.png rename to theme/images/partners/arx.png diff --git a/theme/images/partners/dataumbrella.jpg b/theme/images/partners/dataumbrella.jpg new file mode 100644 index 000000000..04c649663 Binary files /dev/null and b/theme/images/partners/dataumbrella.jpg differ diff --git a/static/images/partners/epigraphhub.png b/theme/images/partners/epigraphhub.png similarity index 100% rename from static/images/partners/epigraphhub.png rename to theme/images/partners/epigraphhub.png diff --git a/theme/images/partners/graph_courses_logo.png b/theme/images/partners/graph_courses_logo.png new file mode 100644 index 000000000..340edb2ae Binary files /dev/null and b/theme/images/partners/graph_courses_logo.png differ diff --git a/static/images/partners/info-dengue.png b/theme/images/partners/info-dengue.png similarity index 100% rename from static/images/partners/info-dengue.png rename to theme/images/partners/info-dengue.png diff --git a/theme/images/partners/literev.png b/theme/images/partners/literev.png new file mode 100644 index 000000000..95d9be7b8 Binary files /dev/null and b/theme/images/partners/literev.png differ diff --git a/static/images/partners/pydatastructs.png b/theme/images/partners/pydatastructs.png similarity index 100% rename from static/images/partners/pydatastructs.png rename to theme/images/partners/pydatastructs.png diff --git a/static/images/partners/pyopensci.png b/theme/images/partners/pyopensci.png similarity index 100% rename from static/images/partners/pyopensci.png rename to theme/images/partners/pyopensci.png diff --git a/theme/images/partners/thcai.png b/theme/images/partners/thcai.png new file mode 100644 index 000000000..54b7edd4f Binary files /dev/null and b/theme/images/partners/thcai.png differ diff --git a/static/images/sun.svg b/theme/images/sun.svg similarity index 100% rename from static/images/sun.svg rename to theme/images/sun.svg diff --git a/static/image/white-background.jpg b/theme/images/white-background.jpg similarity index 100% rename from static/image/white-background.jpg rename to theme/images/white-background.jpg diff --git a/theme/js/osl-search.js b/theme/js/osl-search.js new file mode 100644 index 000000000..c694135d3 --- /dev/null +++ b/theme/js/osl-search.js @@ -0,0 +1,541 @@ +/* OSL Search – minimal Lunr typeahead for MkDocs + - Requires lunr.min.js (and optional lunr-languages) loaded BEFORE this file. + - Exposes window.initSearch(inputEl) so theme.js can initialize both desktop & mobile fields. +*/ + +(function () { + 'use strict'; + + const INDEX_URL = '/search/search_index.json'; + const MAX_RESULTS = 8; + const MIN_QUERY_LEN = 2; + + // Internal state (built once) + let _docs = null; // array of { title, text, location } + let _byRef = null; // Map(location -> doc) + let _idx = null; // lunr.Index + let _building = null; // build promise (avoid duplicate builds) + + // --- Utilities ----------------------------------------------------------- + + function toAbsolute(href) { + if (!href) return href; + // keep full URLs as-is + if (/^([a-z]+:)?\/\//i.test(href)) return href; + // force site-rooted path + return '/' + href.replace(/^\/+/, ''); + } + + function injectBaseStylesOnce() { + if (document.getElementById('osl-search-styles')) return; + const css = ` + .osl-search-panel { + position: absolute; + z-index: 1055; /* above navbar/offcanvas */ + min-width: 280px; + max-width: 560px; + max-height: 60vh; + overflow-y: auto; + background: var(--dd-bg, rgba(20,20,28,.98)); + border: 1px solid var(--dd-border, rgba(255,255,255,.12)); + border-radius: .5rem; + box-shadow: 0 6px 28px rgba(0,0,0,.25); + padding: .35rem; + } + .osl-search-item { + display: block; + text-decoration: none; + padding: .5rem .6rem; + border-radius: .375rem; + color: var(--fg, #e8e8ea); + } + .osl-search-item:hover, + .osl-search-item.is-active { + background: var(--dd-hover-bg, rgba(255,255,255,.08)); + color: var(--dd-hover, #fff); + } + .osl-search-title { + font-weight: 600; + line-height: 1.25; + margin: 0 0 .15rem 0; + } + .osl-search-snippet { + font-size: .875rem; + line-height: 1.25rem; + opacity: .82; + margin: 0; + } + .osl-search-empty { + padding: .6rem .7rem; + color: var(--fg, #e8e8ea); + opacity: .8; + } + .osl-search-mark { background: rgba(255, 208, 0, .35); border-radius: .2rem; } + + /* Added outline and keyboard focus enhancements */ + #mkdocs-search, + #mkdocs-search-mobile { + outline: 1px solid #e0e0e0; + outline-offset: 2px; + transition: all 0.2s ease; + border: 1px solid var(--border-color, rgba(255,255,255,.12)); + border-radius: 6px; + } + + #mkdocs-search:hover, + #mkdocs-search-mobile:hover { + border-color: var(--md-primary-fg-color, #1976d2); + } + + #mkdocs-search:focus, + #mkdocs-search-mobile:focus { + outline: 2px solid var(--md-primary-fg-color, #1976d2); + border-color: var(--md-primary-fg-color, #1976d2); + box-shadow: 0 0 0 4px var(--md-primary-fg-color-transparent, rgba(25, 118, 210, 0.1)); + } + + /* Search container styles */ + .search-container { + position: relative; + display: inline-block; + } + + .search-container:focus-within .search-hint { + opacity: 1; + } + + /* Add keyboard shortcut hint */ + .search-hint { + position: absolute; + right: 10px; + top: 50%; + transform: translateY(-50%); + font-size: 12px; + opacity: 0.6; + pointer-events: none; + transition: opacity 0.2s ease; + } + + /* Hide hint when input has content */ + .search-container input:not(:placeholder-shown) + .search-hint, + .search-container input:focus + .search-hint { + opacity: 0; + visibility: hidden; + } + `; + const style = document.createElement('style'); + style.id = 'osl-search-styles'; + style.textContent = css; + document.head.appendChild(style); + } + + async function ensureLunrReady() { + if (window.lunr) return; + await new Promise((resolve) => { + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', resolve, { once: true }); + } else { + setTimeout(resolve, 0); + } + }); + if (!window.lunr) throw new Error('Lunr failed to load'); + } + + async function fetchIndexJSON() { + const res = await fetch(INDEX_URL, { credentials: 'same-origin' }); + if (!res.ok) throw new Error(`Failed to fetch ${INDEX_URL}: ${res.status}`); + const json = await res.json(); + // MkDocs "search" plugin typically returns { docs: [...] } + return Array.isArray(json) ? json : json.docs || []; + } + + function normalizeDocs(arr) { + return arr.map((d) => ({ + title: d.title || '', + text: d.text || '', + location: d.location || '', + })); + } + + function buildSnippet(text, rawQuery) { + if (!text) return ''; + const q = (rawQuery || '').trim(); + const MAX = 160; + if (!q) return text.slice(0, MAX) + (text.length > MAX ? '…' : ''); + + // find first occurrence of any term (basic, case-insensitive) + const terms = q.split(/\s+/).filter(Boolean); + let hit = -1, + termUsed = ''; + for (const t of terms) { + const idx = text.toLowerCase().indexOf(t.toLowerCase()); + if (idx !== -1 && (hit === -1 || idx < hit)) { + hit = idx; + termUsed = t; + } + } + if (hit === -1) { + return text.slice(0, MAX) + (text.length > MAX ? '…' : ''); + } + const start = Math.max(0, hit - 40); + const end = Math.min(text.length, hit + 120); + let snip = + (start > 0 ? '…' : '') + + text.slice(start, end) + + (end < text.length ? '…' : ''); + + // simple highlight for all terms + terms.forEach((t) => { + if (!t) return; + const re = new RegExp(`(${escapeRegExp(t)})`, 'ig'); + snip = snip.replace(re, '$1'); + }); + return snip; + } + + function escapeRegExp(s) { + return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + } + + async function ensureIndex() { + if (_idx) return _idx; + if (_building) return _building; + + _building = (async () => { + await ensureLunrReady(); + + const raw = await fetchIndexJSON(); + _docs = normalizeDocs(raw); + _byRef = new Map(_docs.map((d) => [d.location, d])); + + // Build index + const hasMulti = typeof lunr.multiLanguage === 'function'; + _idx = lunr(function () { + if (hasMulti) { + // Adjust languages if you only need some of them + this.use(lunr.multiLanguage('en', 'es', 'pt')); + } + this.ref('location'); + this.field('title', { boost: 10 }); + this.field('text'); + + _docs.forEach((doc) => this.add(doc)); + }); + + return _idx; + })(); + + try { + return await _building; + } finally { + _building = null; + } + } + + function search(query) { + if (!_idx) return []; + if (!query || query.trim().length < MIN_QUERY_LEN) return []; + // Keep it simple; allow prefix matches + let q = query.trim(); + // Improve small queries a bit: foo -> foo* + if (!/[~^*]/.test(q)) + q = q + .split(/\s+/) + .map((t) => t + '*') + .join(' '); + let hits = []; + try { + hits = _idx.search(q); + } catch (e) { + // fallback: plain search without wildcard if syntax error + try { + hits = _idx.search(query); + } catch (_e) { + hits = []; + } + } + return hits + .slice(0, MAX_RESULTS) + .map((h) => { + const doc = _byRef.get(h.ref); + return doc ? { doc, score: h.score } : null; + }) + .filter(Boolean); + } + + // --- UI (panel) --------------------------------------------------------- + + function mkPanel() { + const div = document.createElement('div'); + div.className = 'osl-search-panel'; + div.setAttribute('role', 'listbox'); + div.style.display = 'none'; + document.body.appendChild(div); + return div; + } + + function positionPanel(panel, inputEl) { + const r = inputEl.getBoundingClientRect(); + const scrollY = window.scrollY || document.documentElement.scrollTop; + const scrollX = window.scrollX || document.documentElement.scrollLeft; + const width = Math.min(Math.max(r.width, 320), 560); + panel.style.left = `${r.left + scrollX}px`; + panel.style.top = `${r.bottom + scrollY + 6}px`; + panel.style.width = `${width}px`; + } + + function renderResults(panel, items, rawQuery) { + panel.innerHTML = ''; + if (!items.length) { + const empty = document.createElement('div'); + empty.className = 'osl-search-empty'; + empty.textContent = + rawQuery && rawQuery.length >= MIN_QUERY_LEN + ? 'No results' + : 'Type to search…'; + panel.appendChild(empty); + return; + } + items.forEach(({ doc }, idx) => { + const a = document.createElement('a'); + a.className = 'osl-search-item'; + a.href = toAbsolute(doc.location); + + const title = document.createElement('div'); + title.className = 'osl-search-title'; + title.innerHTML = doc.title || '(untitled)'; + + const snip = document.createElement('p'); + snip.className = 'osl-search-snippet'; + snip.innerHTML = buildSnippet(doc.text || '', rawQuery); + + a.appendChild(title); + a.appendChild(snip); + a.dataset.index = String(idx); + panel.appendChild(a); + }); + } + + function activateItem(panel, nextIndex) { + const items = Array.from(panel.querySelectorAll('.osl-search-item')); + if (!items.length) return -1; + items.forEach((el) => el.classList.remove('is-active')); + const idx = Math.max(0, Math.min(nextIndex, items.length - 1)); + items[idx].classList.add('is-active'); + items[idx].scrollIntoView({ block: 'nearest' }); + return idx; + } + + function currentActiveIndex(panel) { + const active = panel.querySelector('.osl-search-item.is-active'); + return active ? parseInt(active.dataset.index, 10) : -1; + } + + function navigateActive(panel) { + const active = + panel.querySelector('.osl-search-item.is-active') || + panel.querySelector('.osl-search-item'); + if (active) window.location.assign(active.href); + } + + function closePanel(panel) { + panel.style.display = 'none'; + panel.innerHTML = ''; + } + + // --- Per-input wiring ---------------------------------------------------- + + function wireInput(inputEl) { + if (!inputEl || inputEl.__oslWired__) return; + inputEl.__oslWired__ = true; + + // Add ARIA attributes + inputEl.setAttribute('role', 'searchbox'); + inputEl.setAttribute('aria-label', 'Search'); + inputEl.setAttribute('aria-expanded', 'false'); + + injectBaseStylesOnce(); + const panel = mkPanel(); + let lastQuery = ''; + let lastActive = -1; + + function openPanel() { + positionPanel(panel, inputEl); + panel.style.display = 'block'; + inputEl.setAttribute('aria-expanded', 'true'); + } + + function updatePosition() { + if (panel.style.display !== 'none') positionPanel(panel, inputEl); + } + + function closePanel(panel) { + panel.style.display = 'none'; + panel.innerHTML = ''; + inputEl.setAttribute('aria-expanded', 'false'); + } + // Debounce to keep it snappy + let t = null; + function onInput() { + clearTimeout(t); + t = setTimeout(async () => { + const q = inputEl.value || ''; + lastQuery = q; + if (q.trim().length < MIN_QUERY_LEN) { + renderResults(panel, [], q); + openPanel(); + lastActive = activateItem(panel, -1); + return; + } + try { + await ensureIndex(); + const items = search(q); + renderResults(panel, items, q); + openPanel(); + lastActive = activateItem(panel, 0); + } catch (e) { + console.warn('[OSL Search] failed:', e); + renderResults(panel, [], q); + openPanel(); + } + }, 120); + } + + function onKey(e) { + if ( + panel.style.display === 'none' && + (e.key === 'ArrowDown' || e.key === 'ArrowUp') + ) { + openPanel(); + } + switch (e.key) { + case 'ArrowDown': + e.preventDefault(); + lastActive = activateItem(panel, currentActiveIndex(panel) + 1); + break; + case 'ArrowUp': + e.preventDefault(); + lastActive = activateItem(panel, currentActiveIndex(panel) - 1); + break; + case 'Enter': + // If the panel is open and we have results, navigate the active item + if (panel.style.display !== 'none') { + const anyItem = panel.querySelector('.osl-search-item'); + if (anyItem) { + e.preventDefault(); + navigateActive(panel); + closePanel(panel); + } + } + break; + case 'Escape': + closePanel(panel); + break; + } + } + + function onFocus() { + if ((inputEl.value || '').trim().length >= 0) { + updatePosition(); + panel.style.display = 'block'; + } + } + + function onBlur(e) { + // delay to allow clicks + setTimeout(() => { + if (!panel.contains(document.activeElement)) closePanel(panel); + }, 120); + } + + // Clicks inside panel: follow links, also set active on hover + panel.addEventListener('mousemove', (e) => { + const a = e.target.closest('.osl-search-item'); + if (a && panel.contains(a)) { + const idx = parseInt(a.dataset.index, 10); + if (!Number.isNaN(idx)) { + activateItem(panel, idx); + } + } + }); + panel.addEventListener('click', (e) => { + const a = e.target.closest('a.osl-search-item'); + if (!a) return; + e.preventDefault(); + window.location.assign(a.href); + closePanel(panel); + }); + + // Outside click closes panel + document.addEventListener('click', (e) => { + if (e.target === inputEl) return; + if (panel.contains(e.target)) return; + if (!panel.contains(e.target)) closePanel(panel); + }); + + // Reposition on scroll/resize + window.addEventListener('scroll', updatePosition, { passive: true }); + window.addEventListener('resize', updatePosition); + + inputEl.setAttribute('autocomplete', 'off'); + inputEl.addEventListener('input', onInput); + inputEl.addEventListener('keydown', onKey); + inputEl.addEventListener('focus', onFocus); + inputEl.addEventListener('blur', onBlur); + } + + function setupKeyboardShortcuts() { + document.addEventListener('keydown', (e) => { + // Check for Ctrl+K or Cmd+K + if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'k') { + e.preventDefault(); + const searchInput = + document.getElementById('mkdocs-search') || + document.getElementById('mkdocs-search-mobile'); + if (searchInput) { + searchInput.focus(); + } + } + }); + } + + // Public initializer (used by theme.js) + window.initSearch = function (inputEl) { + if (!inputEl) return; + wireInput(inputEl); + }; + + // Optional: auto-wire known fields if present + document.addEventListener('DOMContentLoaded', () => { + const desktop = document.getElementById('mkdocs-search'); + const mobile = document.getElementById('mkdocs-search-mobile'); + + if (desktop) { + // Wrap search input in container + const container = document.createElement('div'); + container.className = 'search-container'; + desktop.parentNode.insertBefore(container, desktop); + container.appendChild(desktop); + + wireInput(desktop); + + // Add keyboard shortcut hint inside container + const hint = document.createElement('span'); + hint.className = 'search-hint'; + hint.textContent = navigator.platform.includes('Mac') ? '⌘K' : 'Ctrl+K'; + container.appendChild(hint); + } + + if (mobile) { + // Wrap mobile search input in container + const container = document.createElement('div'); + container.className = 'search-container'; + mobile.parentNode.insertBefore(container, mobile); + container.appendChild(mobile); + + wireInput(mobile); + } + + setupKeyboardShortcuts(); + }); +})(); diff --git a/theme/js/theme.js b/theme/js/theme.js new file mode 100644 index 000000000..ea3fa4d5e --- /dev/null +++ b/theme/js/theme.js @@ -0,0 +1,209 @@ +/* /js/theme.js */ +(function () { + const STORAGE_KEY = 'osl-color-mode'; + const docEl = document.documentElement; + + function applyMode(mode) { + const bs = (mode === 'dim') ? 'dark' : 'light'; + docEl.setAttribute('data-mode', mode); + docEl.setAttribute('data-bs-theme', bs); + try { localStorage.setItem(STORAGE_KEY, mode); } catch (e) {} + + const toggle = document.getElementById('mode'); + if (toggle) { + toggle.checked = (mode === 'dim'); + toggle.setAttribute('aria-checked', String(toggle.checked)); + } + } + + function getInitialMode() { + try { + const saved = localStorage.getItem(STORAGE_KEY); + if (saved === 'dim' || saved === 'lit') return saved; + } catch (e) {} + return (window.matchMedia && matchMedia('(prefers-color-scheme: dark)').matches) ? 'dim' : 'lit'; + } + + window.addEventListener('DOMContentLoaded', function () { + /* 1) Color mode */ + const currentAttr = docEl.getAttribute('data-mode'); + const mode = (currentAttr === 'dim' || currentAttr === 'lit') ? currentAttr : getInitialMode(); + applyMode(mode); + + const toggle = document.getElementById('mode'); + if (toggle) { + toggle.checked = (mode === 'dim'); + toggle.setAttribute('aria-checked', String(toggle.checked)); + toggle.addEventListener('change', function () { + applyMode(this.checked ? 'dim' : 'lit'); + }, false); + } + + /* 2) Copyright year */ + document.querySelectorAll('.year').forEach(n => n.textContent = String(new Date().getFullYear())); + + /* 3) MkDocs search (desktop + mobile) if available */ + if (typeof window.initSearch === 'function') { + const desktopSearch = document.getElementById('mkdocs-search'); + const mobileSearch = document.getElementById('mkdocs-search-mobile'); + if (desktopSearch) window.initSearch(desktopSearch); + if (mobileSearch) window.initSearch(mobileSearch); + } + + /* 4) Close offcanvas after selecting a link (not when toggling accordions) */ + const offcanvasEl = document.getElementById('offcanvasNav'); + if (offcanvasEl) { + offcanvasEl.addEventListener('click', function (e) { + const a = e.target.closest('a'); + if (!a) return; // ignore clicks on accordion buttons etc. + const offcanvas = bootstrap.Offcanvas.getInstance(offcanvasEl) || + new bootstrap.Offcanvas(offcanvasEl); + // Close for internal links (no target="_blank") + if (a.getAttribute('href') && !a.getAttribute('target')) { + offcanvas.hide(); + } + }); + } + + /* 5) Mega dropdown accordions: ensure one-open-at-a-time via data-bs-parent */ + document.querySelectorAll('.dropdown-menu.mega .accordion').forEach((acc, i) => { + // Make sure the accordion has an id + if (!acc.id) acc.id = `mega-acc-${i}`; + const parentSel = `#${acc.id}`; + + // For each collapse pane, set data-bs-parent if missing + acc.querySelectorAll('.accordion-collapse').forEach(col => { + if (!col.getAttribute('data-bs-parent')) { + col.setAttribute('data-bs-parent', parentSel); + } + }); + }); + + /* 6) Keep clicks inside mega from bubbling to the dropdown toggle (belt & suspenders). + With data-bs-auto-close="outside" this isn’t strictly needed, but it’s harmless. */ + document.querySelectorAll('.dropdown-menu.mega').forEach(menu => { + menu.addEventListener('click', (e) => e.stopPropagation()); + }); + }); + + // Optional public API + window.OSLTheme = { + getMode: () => docEl.getAttribute('data-mode'), + setMode: (m) => applyMode(m === 'dim' ? 'dim' : 'lit'), + clearPreference: () => { try { localStorage.removeItem(STORAGE_KEY); } catch (e) {} } + }; + + // --- Minimal extras formerly in bundle.js --- + + // A) external links => target=_blank, rel=noopener + document.querySelectorAll('a[href^="http"]').forEach(a => { + try { + const url = new URL(a.href); + // skip same-origin + if (url.origin === window.location.origin) return; + if (!a.hasAttribute('target')) a.setAttribute('target', '_blank'); + if (!a.hasAttribute('rel')) a.setAttribute('rel', 'noopener'); + } catch (_) {} + }); + + // B) small “copy code” buttons for pygments blocks (MkDocs default markup) + document.querySelectorAll('div.highlight > pre').forEach((pre, i) => { + // container for the button + const wrap = pre.parentElement; // .highlight + wrap.style.position = 'relative'; + + const btn = document.createElement('button'); + btn.type = 'button'; + btn.className = 'btn btn-sm btn-secondary position-absolute top-0 end-0 m-2 copy-code'; + btn.setAttribute('aria-label', 'Copy code'); + btn.textContent = 'Copy'; + + btn.addEventListener('click', async () => { + const code = pre.innerText; + try { + await navigator.clipboard.writeText(code); + const old = btn.textContent; + btn.textContent = 'Copied!'; + setTimeout(() => (btn.textContent = old), 1200); + } catch (e) { + // fallback + const ta = document.createElement('textarea'); + ta.value = code; + ta.style.position = 'fixed'; + ta.style.left = '-9999px'; + document.body.appendChild(ta); + ta.select(); + document.execCommand('copy'); + document.body.removeChild(ta); + const old = btn.textContent; + btn.textContent = 'Copied!'; + setTimeout(() => (btn.textContent = old), 1200); + } + }); + + wrap.appendChild(btn); + }); + + // C) heading anchors (h2–h4) inside main content + const contentRoot = document.querySelector('main .content-inner') || document.querySelector('main'); + if (contentRoot) { + contentRoot.querySelectorAll('h2[id], h3[id], h4[id]').forEach(h => { + if (h.querySelector('a.anchor-link')) return; // idempotent + const a = document.createElement('a'); + a.href = `#${h.id}`; + a.className = 'anchor-link ms-2'; + a.setAttribute('aria-label', 'Copy link to this section'); + a.innerHTML = '¶'; // simple mark; you can swap for an SVG if you prefer + a.addEventListener('click', (e) => { + // let it navigate, then copy + setTimeout(() => navigator.clipboard.writeText(window.location.href), 0); + }); + h.appendChild(a); + }); + } + +})(); + + +// --- Search results link absolutizer --- +(function () { + // Which containers might hold search result links? + const candidates = [ + '.mk-search-results', + '.search-results', + '#mkdocs-search-results' + ]; + + function absolutize(href) { + if (!href) return href; + if (/^([a-z]+:)?\/\//i.test(href)) return href; // already absolute URL + if (href.startsWith('/')) return href; // already site-absolute + return '/' + href.replace(/^\/+/, ''); // make it site-absolute + } + + function fixLinks(root = document) { + candidates.forEach(sel => { + root.querySelectorAll(`${sel} a[href]`).forEach(a => { + const fixed = absolutize(a.getAttribute('href')); + if (fixed && fixed !== a.getAttribute('href')) a.setAttribute('href', fixed); + }); + }); + } + + // 1) Run once after DOM ready (in case results render immediately) + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', () => fixLinks()); + } else { + fixLinks(); + } + + // 2) Watch for results being (re)rendered + const obs = new MutationObserver(muts => { + for (const m of muts) { + if (m.type === 'childList' && (m.addedNodes && m.addedNodes.length)) { + fixLinks(document); + } + } + }); + obs.observe(document.body, { childList: true, subtree: true }); +})(); diff --git a/theme/main.html b/theme/main.html new file mode 100644 index 000000000..94d9808cc --- /dev/null +++ b/theme/main.html @@ -0,0 +1 @@ +{% extends "base.html" %} diff --git a/theme/partners.html b/theme/partners.html new file mode 100644 index 000000000..52dcee015 --- /dev/null +++ b/theme/partners.html @@ -0,0 +1,58 @@ +{% extends "main.html" %} + +{% block header_extra %} + +{% endblock header_extra %} + +{% block content_inner %} +{{ page.content }} + +
    + + {% for partner in page.meta["partners"] %} + {% set logo = (partner.thumbnail if 'thumbnail' in partner else (partner.logo if 'logo' in partner else None)) %} + {% set site = partner.url if 'url' in partner else None %} + +
    +
    +
    + {% if logo %} + + {{ partner.name }} + + {% endif %} +
    + +
    +

    + {% if site %} + {{ partner.name }} + {% else %} + {{ partner.name }} + {% endif %} +

    + + {% if 'summary' in partner and partner.summary %} +

    {{ partner.summary }}

    + {% endif %} + +
    + {# Social icons (only render if URL exists). These IDs come from base.html sprite. #} + {% if 'github' in partner %}{% endif %} + {% if 'twitter' in partner %}{% endif %} + {% if 'linkedin' in partner %}{% endif %} + {% if 'facebook' in partner %}{% endif %} + {% if 'discord' in partner %}{% endif %} + {% if 'rss' in partner %}{% endif %} + {% if 'blog' in partner %}{% endif %} + {% if 'youtube' in partner %}{% endif %} + {% if 'instagram' in partner %}{% endif %} + {% if 'bluesky' in partner %}{% endif %} +
    +
    +
    +
    + {% endfor %} + +
    +{% endblock content_inner %} diff --git a/theme/projects.html b/theme/projects.html new file mode 100644 index 000000000..a9ea636fe --- /dev/null +++ b/theme/projects.html @@ -0,0 +1,53 @@ +{% extends "base.html" %} +{% set colors=["", "bg-light"] %} +{% set text_colors=["", "text-secondary"] %} + +{% block content %} +
    +
    +
    + {% block content_inner %} + {{ page.content }} + {% endblock content_inner %} +
    +
    + +
    +
    + + {% for project in page.meta["projects"] %} + +
    +
    +

    + + {% if project.type == "incubated" %} + Static Badge + {% elif project.type == "affiliated" %} + Static Badge + {% endif %} + {{ project.name }} + +

    +

    + Maintainer: {{ project.maintainer_name }} + <{{ project.maintainer_email }}>
    + {% if project.communication_channel %} + Communication Channel: + {{ project.communication_channel.provider.title() }} + {% endif %} +

    +

    {{ project.description }}

    +
    +
    + {% endfor %} +
    +
    +
    +{% endblock content %} diff --git a/theme/single-sidebar.html b/theme/single-sidebar.html new file mode 100644 index 000000000..97d19c49e --- /dev/null +++ b/theme/single-sidebar.html @@ -0,0 +1,55 @@ +{% extends "base.html" %} + +{% block content %} + +
    +
    + {% block side_menu %} + + {# prepare the nav3 content inside the side block -#} + {% set nav3_selected = [] -%} + {% for nav1 in nav -%} + {% for nav2 in (nav1.children or []) -%} + {% if nav2.active %} + {% for nav3 in (nav2.children or []) -%} + {% if nav3.title != "index" -%} + {{ nav3_selected.append(nav3) or "" -}} + {% endif %} + {% endfor -%} + {% endif -%} + {% endfor -%} + {% endfor %} + +
    + +
    + {% for nav3_item in nav3_selected %} + + {{ nav3_item.title }} + + {% endfor %} +
    + + {% if menu_3rd_level_selected %} +
    + {% for menu_item_3rd_level in menu_3rd_level_selected %} +

    + {{ menu_item_3rd_level.title }} +

    + {% endfor %} +
    + {% endif %} +
    + {% endblock side_menu %} +
    + {% block content_inner %} + {{ page.content }} + {% endblock content_inner %} +
    +
    +
    +{% endblock content %} diff --git a/theme/team.html b/theme/team.html new file mode 100644 index 000000000..2bd456b92 --- /dev/null +++ b/theme/team.html @@ -0,0 +1,70 @@ +{% extends "base.html" %} + +{% block header_extra %} + +{% endblock header_extra %} + +{% block content %} +
    +
    +
    + {% block content_inner %} + {{ page.content }} + {% endblock content_inner %} +
    +
    + + {% for group in page.meta["teams"] %} +
    +
    +

    {{ group.name }}

    + + +
    + {% for member in group.members %} +
    +
    + {% if member.image_url %} + {{ member.name }} + {% endif %} + +
    +
    +

    {{ member.name }}

    + + {% if member.github_url %} + + {% endif %} +
    + + {% if member.bio %} +

    {{ member.bio }}

    + {% endif %} + + {% if "github_sponsor" in member %} + + {% endif %} +
    +
    +
    + {% endfor %} +
    + +
    +
    + {% endfor %} +
    +{% endblock content %}