Add blog
This commit is contained in:
parent
468323f623
commit
a58794830c
11
_config.yml
11
_config.yml
|
@ -45,6 +45,17 @@ contact_note:
|
|||
|
||||
google_site_verification:
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Blog
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
blog_name: blog
|
||||
blog_description: blog
|
||||
permalink: /blog/:year/:title/
|
||||
|
||||
pagination:
|
||||
enabled: true
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Collections
|
||||
# -----------------------------------------------------------------------------
|
||||
|
|
|
@ -25,6 +25,15 @@
|
|||
{%- endif -%}
|
||||
</a>
|
||||
</li>
|
||||
{% if site.blog_name %}
|
||||
<li class="nav-item {% if page.url contains 'blog' %}active{% endif %}">
|
||||
<a class="nav-link" href="{{ '/blog/' | relative_url }}">blog
|
||||
{%- if page.title == "blog" -%}
|
||||
<span class="sr-only">(current)</span>
|
||||
{%- endif -%}
|
||||
</a>
|
||||
</li>
|
||||
{%- endif %}
|
||||
|
||||
{%- assign sorted_pages = site.pages | sort: "title" -%}
|
||||
{%- for p in sorted_pages -%}
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
{%- if paginator.total_pages > 1 -%}
|
||||
<nav aria-label="Blog page naviation">
|
||||
<ul class="pagination pagination-lg justify-content-center">
|
||||
<li class="page-item {% unless paginator.previous_page %}disabled{% endunless %}">
|
||||
<a class="page-link" href="{{ paginator.previous_page_path | relative_url }}" tabindex="-1" aria-disabled="{{ paginator.previous_page }}">Newer</a>
|
||||
</li>
|
||||
{%- if paginator.page_trail -%}
|
||||
{% for trail in paginator.page_trail -%}
|
||||
<li class="page-item {% if page.url == trail.path %}active{% endif %}"><a class="page-link" href="{{ trail.path | relative_url }}" title="{{trail.title}}">{{ trail.num }}</a></li>
|
||||
{% endfor -%}
|
||||
{%- endif -%}
|
||||
<li class="page-item {% unless paginator.next_page %}disabled{% endunless %}">
|
||||
<a class="page-link" href="{{ paginator.next_page_path | relative_url }}">Older</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
{%- endif -%}
|
|
@ -2,8 +2,6 @@
|
|||
layout: default
|
||||
---
|
||||
{%- assign year = page.date | date: "%Y" -%}
|
||||
{%- assign tags = page.tags | join: "" -%}
|
||||
{%- assign categories = page.categories | join: "" -%}
|
||||
|
||||
{% if page._styles %}
|
||||
<style type="text/css">
|
||||
|
@ -16,44 +14,12 @@ layout: default
|
|||
<header class="post-header">
|
||||
<h1 class="post-title">{{ page.title }}</h1>
|
||||
<p class="post-meta">{{ page.date | date: "%B %-d, %Y" }}{%- if page.author -%} • {{ page.author }}{%- endif -%}{%- if page.meta -%} • {{ page.meta }}{%- endif -%}</p>
|
||||
<p class="post-tags">
|
||||
<a href="{{ year | prepend: '/blog/' | prepend: site.baseurl}}"> <i class="fas fa-calendar fa-sm"></i> {{ year }} </a>
|
||||
{%- if tags != "" %}
|
||||
·
|
||||
{% for tag in page.tags -%}
|
||||
<a href="{{ tag | prepend: '/blog/tag/' | prepend: site.baseurl}}">
|
||||
<i class="fas fa-hashtag fa-sm"></i> {{ tag }}</a>
|
||||
{% endfor -%}
|
||||
{% endif %}
|
||||
|
||||
{%- if categories != "" %}
|
||||
·
|
||||
{% for category in page.categories -%}
|
||||
<a href="{{ category | prepend: '/blog/category/' | prepend: site.baseurl}}">
|
||||
<i class="fas fa-tag fa-sm"></i> {{ category }}</a>
|
||||
{% endfor -%}
|
||||
{% endif %}
|
||||
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<br/>
|
||||
|
||||
<article class="post-content">
|
||||
{{ content }}
|
||||
</article>
|
||||
|
||||
{%- if site.disqus_shortname and page.comments -%}
|
||||
<div id="disqus_thread"></div>
|
||||
<script type="text/javascript">
|
||||
var disqus_shortname = '{{ site.disqus_shortname }}';
|
||||
var disqus_identifier = '{{ page.id }}';
|
||||
var disqus_title = {{ page.title | jsonify }};
|
||||
(function() {
|
||||
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
|
||||
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
|
||||
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
|
||||
})();
|
||||
</script>
|
||||
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
|
||||
{%- endif %}
|
||||
|
||||
</div>
|
||||
|
|
|
@ -0,0 +1,77 @@
|
|||
---
|
||||
layout: post
|
||||
title: GitHub Copilot
|
||||
date: 2022-11-24 17:39:00
|
||||
description: ¿Avance o riesgo?
|
||||
---
|
||||
|
||||
Es una herramienta de GitHub o, como Microsoft publicita, un _AI pair programmer_, que te recomienda sugerencias de código a medida que vas programando. Estas sugerencias pueden ser recibidas empezando a escribir una parte del código o, también, agregando un comentario en lenguaje natural que describa lo que se esté intentando hacer. Este último punto, particularmente, le da un positivo diferencial en relación con sus posibles competidores como, por ejemplo, IntelliSense, que solo provee auto-completado de código, o Tabnine, que hace lo mismo que IntelliSense solo que usando AI, pero no tiene tanto poder de generación como Copilot.
|
||||
|
||||
### ¿Cómo funciona?
|
||||
|
||||
Usa OpenAI Codex, que, en pocas palabras, es un sistema que traduce lenguaje natural a código.
|
||||
|
||||
{% include figure.html path="assets/img/copilot.png" class="img-fluid rounded z-depth-1" %}
|
||||
|
||||
> Flujo de GitHub Copilot
|
||||
|
||||
Es un descendiente directo de GPT-3 (_generative pre-trained transformer_), el cual tiene como objetivo o tarea principal la generación de lenguaje natural en respuesta a un mensaje de, valga la redundancia, lenguaje natural. Por lo tanto, en base a un texto inicial, este puede producir texto que lo continúe y tenga, por supuesto, relación con el inicial. Codex, además de poseer la característica de procesamiento de lenguaje natural, puede producir código funcional.
|
||||
|
||||
Codex tiene una memoria de 14KB, en comparación con su antecesor que solo tiene 4KB. Esto hace que tenga en cuenta 3 veces más de información contextual. La información contextual surge de los comentarios y código que se está desarrollando tanto en el archivo actual como en el resto de los archivos del proyecto que se esté realizando (es decir, archivos que se encuentran en la misma carpeta).
|
||||
|
||||
Según [OpenAI](https://help.openai.com/en/articles/5480054-understanding-codex-training-data-and-outputs), Codex se entrenó tanto con lenguaje natural como con millones de líneas de código, provenientes de millones de repositorios públicos en GitHub. Además, con este entrenamiento, Codex da la respuesta correcta a los problemas en un 28.8% de los casos.
|
||||
|
||||
### ¿Es útil?
|
||||
|
||||
Depende. Mucha gente sostiene que facilita el proceso pero otros piensan todo lo contrario: lo ralentiza. Para mí, luego de hacer varias pruebas y de llevar un uso diario, la mayoría de las veces lentifica la producción del código. ¿Por qué? Simplemente porque si bien en algunos casos particulares puede darte el _snippet_ de código que necesitás (en vez de, por ejemplo, ir a sitios como Stack Overflow y copiar de este el código que se necesita), no es bueno para el entendimiento del código en forma integral y podría llegar a generar bugs que, mientras más se utilice esta herramienta, más difíciles serían de encontrar. Para que no ocurra esto, el uso de esta herramienta requiere de un gran conocimiento del lenguaje y de lo que se quiere programar; por lo que, teniendo este conocimiento, dudo de que en verdad se quiera utilizar esta herramienta.
|
||||
|
||||
Un caso parecido que merece la pena traer a colación es el de las traducciones. En algunas empresas, se empezó a obligar a los traductores a poner lo que se quiera traducir en una herramienta del estilo de Google Translate y, luego, corregirla (en vez de traducir de manera directa el texto). Esto, como en el caso de GitHub Copilot, sin duda puede traer ciertas mejoras en el tiempo total de traducción, no obstante, es preciso tener en cuenta que podría llegar a traer decrementos en el rendimiento general si la herramienta en cuestión no funcionara de manera adecuada.
|
||||
|
||||
### Problemas relacionados con la seguridad
|
||||
|
||||
Debido a que Codex podría generar cualquier código, se debe tener en cuenta que podría justamente ocasionar vulnerabilidades o algún [código malicioso](https://arxiv.org/pdf/2108.09293.pdf). Es por esto que OpenAI recomienda correr este código en un _sandbox_ primero, para asegurarse de que no sea efectivamente malware. Esto, de nuevo, requiere de un gran esfuerzo y conocimiento del programador para leer y releer el código generado y estudiar así sus posibles vulnerabilidades. De esta forma, se sigue perdiendo tiempo y precisamente se va en contra de lo que esta herramienta intenta resolver.
|
||||
|
||||
Uno podría pensar que mientras más se ajuste esta herramienta (es decir, mientras más se actualice y se mejore) esto no continuaría ocurriendo, pero, curiosamente, sucedería lo contrario. Si se mejorara la herramienta, esta produciría código más potente y, por tanto, con mucho mayor riesgo de tener vulnerabilidades o de contener malware.
|
||||
|
||||
### Problemas con licencias
|
||||
|
||||
Como vimos, GitHub Copilot se entrena con los repositorios públicos de GitHub. Esto trae graves problemas con relación a las diferentes [licencias de OSS](https://opensource.org/licenses) (_open source software_), puesto que podría hacer que se usen partes de código de software libre en proyectos de código propietario.
|
||||
|
||||
Algunas licencias de OSS no permiten la reproducción si no se mantiene la misma licencia ([copyleft](https://www.gnu.org/licenses/copyleft.en.html)), es decir, no se puede usar su código en un proyecto propietario a menos que este último cambie su licencia. El problema es que esto no lo tiene en cuenta GitHub Copilot, ya que, al menos en la versión publicada el 24/11/2022, únicamente recomienda código sin perjuicio de qué licencia tenga el proyecto del cual se obtuvo. Además, como si fuera poco, GitHub se lava las manos dejando el _copyleft compliance_ a los usuarios. Pero, sin embargo, surge otra pregunta: ¿cómo se puede hacer esto si los usuarios directamente no saben de dónde se obtuvo el código?
|
||||
|
||||
Por otro lado, otro problema que puede aflorar con el uso de esta herramienta es la debilitación de las comunidades open source, pues hace que muchos programadores obtengan código de forma rápida sin ver de dónde salió. Entonces se pierde el contacto de programador a programador.
|
||||
|
||||
Debido a todo esto, Microsoft recibió una [demanda judicial](https://githubcopilotlitigation.com/) por parte de un grupo de personas en USA. El grupo alega que se violan varios derechos legales en relación con las licencias OSS, y los propios términos de servicio y políticas de privacidad de Microsoft, entre otras cosas.
|
||||
|
||||
Justamente, por todo esto muchos proyectos _open source_ (y particularmente [SFC](https://sfconservancy.org/GiveUpGitHub/#ICE-contract-details)) se están yendo de GitHub. Microsoft piensa que proveyendo el hosting de código ya es su dueño y, por tanto, que puede hacer lo que quiere con él.
|
||||
|
||||
Me gustaría que el lector curioso piense sobre este tema y reflexione, a su vez, si no es una buena opción, e incluso éticamente responsable, irse de GitHub y usar otras alternativas como GitLab, SourceHut, CodeBerg o, si es que efectivamente tiene los conocimientos necesarios (y el debido hardware), tratar de hostear un sistema SCM usted mismo.
|
||||
|
||||
### Referencias
|
||||
|
||||
- https://arxiv.org/pdf/2107.03374.pdf
|
||||
- https://arxiv.org/pdf/2108.09293.pdf
|
||||
- https://openai.com/blog/openai-codex
|
||||
- https://github.com/openai/human-eval
|
||||
- https://www.fast.ai/posts/2021-07-19-copilot.html
|
||||
- https://github.com/features/copilot
|
||||
- https://docs.github.com/en/copilot/overview-of-github-copilot/about-github-copilot
|
||||
- https://www.theregister.com/2021/07/06/github_copilot_autocoder_caught_spilling
|
||||
- https://www.youtube.com/watch?v=SGUCcjHTmGY
|
||||
- https://medium.com/analytics-vidhya/github-copilot-all-you-need-to-know-8e6fc1d5ccc
|
||||
- https://en.wikipedia.org/wiki/GPT-3
|
||||
- https://en.wikipedia.org/wiki/OpenAI_Codex
|
||||
- https://betterprogramming.pub/ai-review-github-copilot-d43afde51a5a
|
||||
- https://thenewstack.io/github-copilot-and-open-source-a-love-story-that-wont-end-well
|
||||
- https://sfconservancy.org/GiveUpGitHub/#ICE-contract-details
|
||||
- https://choosealicense.com/licenses/agpl-3.0
|
||||
- https://opensource.org/faq#copyleft
|
||||
- https://www.gnu.org/licenses/copyleft.en.html
|
||||
- https://techcrunch.com/2022/07/01/open-source-developers-urged-to-ditch-github-following-copilot-launch
|
||||
- https://githubcopilotinvestigation.com/#what-does-copilot-mean-for-open-source-communities
|
||||
- https://github.blog/2021-06-30-github-copilot-research-recitation
|
||||
- https://help.openai.com/en/articles/5480054-understanding-codex-training-data-and-outputs
|
||||
- https://matthewbutterick.com/chron/this-copilot-is-stupid-and-wants-to-kill-me.html
|
||||
- https://www.securityweek.com/code-generated-github-copilot-can-introduce-vulnerabilities-researchers
|
||||
- https://thestack.technology/microsoft-github-sued-over-copilot
|
||||
- https://dl.acm.org/doi/pdf/10.1145/3442188.3445922
|
|
@ -561,3 +561,63 @@ html.transition *:after {
|
|||
font-size: 0.875rem;
|
||||
padding-top: 0.25rem;
|
||||
}
|
||||
|
||||
// Blog
|
||||
|
||||
.header-bar {
|
||||
border-bottom: 1px solid var(--global-divider-color);
|
||||
text-align: center;
|
||||
padding-top: 2rem;
|
||||
padding-bottom: 5rem;
|
||||
h1 {
|
||||
color: var(--global-theme-color);
|
||||
font-size: 5rem;
|
||||
}
|
||||
}
|
||||
|
||||
.post-list {
|
||||
margin: 0;
|
||||
margin-bottom: 40px;
|
||||
padding: 0;
|
||||
li {
|
||||
border-bottom: 1px solid var(--global-divider-color);
|
||||
list-style: none;
|
||||
padding-top: 2rem;
|
||||
padding-bottom: 2rem;
|
||||
.post-meta {
|
||||
color: var(--global-text-color-light);
|
||||
font-size: 0.875rem;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.post-tags {
|
||||
color: var(--global-text-color-light);
|
||||
font-size: 0.875rem;
|
||||
padding-top: 0.25rem;
|
||||
}
|
||||
a {
|
||||
color: var(--global-text-color);
|
||||
text-decoration: none;
|
||||
&:hover {
|
||||
color: var(--global-theme-color);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.pagination {
|
||||
.page-item {
|
||||
.page-link {
|
||||
color: var(--global-text-color);
|
||||
&:hover {
|
||||
color: $black-color;
|
||||
}
|
||||
}
|
||||
&.active .page-link {
|
||||
color: $white-color;
|
||||
background-color: var(--global-theme-color);
|
||||
&:hover {
|
||||
background-color: var(--global-theme-color);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 250 KiB |
|
@ -0,0 +1,49 @@
|
|||
---
|
||||
layout: default
|
||||
title: blog
|
||||
pagination:
|
||||
enabled: true
|
||||
collection: posts
|
||||
permalink: /page/:num/
|
||||
per_page: 3
|
||||
sort_field: date
|
||||
sort_reverse: true
|
||||
trail:
|
||||
before: 1
|
||||
after: 3
|
||||
---
|
||||
|
||||
<div class="post">
|
||||
|
||||
<div class="header-bar">
|
||||
<h2>{{ site.blog_name }}</h1>
|
||||
<!-- <h2>{{ site.blog_description }}</h2> -->
|
||||
</div>
|
||||
|
||||
<ul class="post-list">
|
||||
{% for post in paginator.posts %}
|
||||
|
||||
{% assign read_time = post.content | number_of_words | divided_by: 180 | plus: 1 %}
|
||||
{% assign year = post.date | date: "%Y" %}
|
||||
{% assign tags = post.tags | join: "" %}
|
||||
{% assign categories = post.categories | join: "" %}
|
||||
|
||||
<li>
|
||||
<h3>
|
||||
{% if post.redirect == blank %}
|
||||
<a class="post-title" href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a>
|
||||
{% else %}
|
||||
<a class="post-title" href="{% if post.redirect contains '://' %}{{ post.redirect }}{% else %}{{ post.redirect | relative_url }}{% endif %}">{{ post.title }}</a>
|
||||
{% endif %}
|
||||
</h3>
|
||||
<p>{{ post.description }}</p>
|
||||
<p class="post-meta"> {{read_time}} min read ·
|
||||
{{ post.date | date: '%B %-d, %Y' }}
|
||||
</p>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
{% include pagination.html %}
|
||||
|
||||
</div>
|
Loading…
Reference in New Issue