tag:blogger.com,1999:blog-376425712024-03-13T03:04:45.320-07:00Thinking In SoftwareNestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.comBlogger767125tag:blogger.com,1999:blog-37642571.post-861199703286619112024-03-10T05:23:00.000-07:002024-03-10T05:23:48.446-07:00Securely sharing the content of your MAC OSX ~/.zshrc and other profile configuration files<pre>
cat ~/.zshrc | sed -E "s/(export[^=]*=).*/\1***/"
</pre>Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-2352486566499012662024-02-23T14:16:00.000-08:002024-02-23T14:16:31.981-08:00Replace 4 spaces indentation by 2 spaces indentation in vi/vim<pre>
:%s/[ ]\{4\}/ /g
</pre>Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-42698037300025182072024-02-20T04:10:00.000-08:002024-02-20T04:10:38.173-08:00Run tree command respecting .gitignore<script src="https://gist.github.com/nestoru/6a78e03e6c093372062f8bb5227a7b82.js"></script>Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-30638018203879451662024-02-19T03:11:00.000-08:002024-03-13T03:04:12.348-07:00My .vimrc for google (and amazon) cloud shellWill keep here what I am using in google (and amazon) cloud shells.
<pre>
" keep all defaults
source $VIMRUNTIME/defaults.vim
" disable visual mode when using mouse
set mouse=c
" keep all defaults
source $VIMRUNTIME/defaults.vim
" disable visual mode when using mouse
set mouse=c
" paste as copied
set paste
" indentation
set tabstop=2 " Set the width of a tab character to 2 spaces
set shiftwidth=2 " Set the number of spaces to use for each step of (auto)indent
set expandtab " Convert tabs to spaces
set softtabstop=2 " Set the number of spaces a Tab counts for while performing editing operations, like inserting a Tab or using BS
set smartindent " Enable smart indenting for new lines
</pre>Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-40173207402065337382024-02-19T02:24:00.000-08:002024-02-19T02:24:52.949-08:00Sharing code without using gitSometimes you do not want to commit to git for security reasons and yet you want to test your code somewhere else.
<br/>
Run the below from your local copy of the git repository:
<pre>
rsync -av --exclude-from='.gitignore' --exclude='.git' . ~/Downloads/my-repo-copy
cd ~/Downloads/my-repo-copy
zip -r ~/Downloads/my-repo-copy.zip ./
</pre>
Copy the content to the remote location and run the below:
<pre>
mkdir my-repo
mv my-repo-copy.zip my-repo/
cd my-repo
unzip my-repo-copy.zip
rm my-repo-copy.zip
</pre>Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-91931590163739160272023-09-06T01:37:00.005-07:002023-09-06T01:37:31.610-07:00Apps not opening from Android search results Apps | Chrome | Storage and Cache | Clear CacheNestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-46785796043305203402023-05-30T11:55:00.003-07:002023-05-30T11:55:51.003-07:00Copy MongoDB indexes from one host database to anotherDo it in one environment. Use it in all the rest:
<script src="https://gist.github.com/nestoru/9a32aa823a41ede26b56cf0d67f3cc5a.js"></script>Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-87951698319501065862023-05-12T01:22:00.000-07:002023-05-12T01:22:45.258-07:00A CLI script to interact with ChatGPT via API<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4ijhKGPL3UwBeCWd-o2KJsnZpAQVtaN6-P8VYF9Wp8lGfz9_6NrTrdIHUlPzTMyxHn5729PIDT-LPheTMAcb-UrpcgQc0-MqNU7YRblEobhzxWSQdSWPCvIRyi2p0X8_AbiVilOxcpdIizqtSWnlQpzbKkmWbi1zH0tH8sRVRQDH__HE6gcE/s598/Screen%20Shot%202023-05-12%20at%2010.02.10%20AM.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="320" data-original-height="474" data-original-width="598" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4ijhKGPL3UwBeCWd-o2KJsnZpAQVtaN6-P8VYF9Wp8lGfz9_6NrTrdIHUlPzTMyxHn5729PIDT-LPheTMAcb-UrpcgQc0-MqNU7YRblEobhzxWSQdSWPCvIRyi2p0X8_AbiVilOxcpdIizqtSWnlQpzbKkmWbi1zH0tH8sRVRQDH__HE6gcE/s320/Screen%20Shot%202023-05-12%20at%2010.02.10%20AM.png"/></a></div>
<br/>
I built this script to find out how much faster would I be translating from the command line interface (CLI) using ChatGPT API versus translating from its web interface, and I was not disappointed. My new poetry book is coming up in English as well as in Spanish at once. Writing in both languages at the same time is test driven delivery (#TDD) because at the time I am done creating, I am also done with reviewed everything, and therefore it is ready to be shipped to my Editor. Exiting times in front of us with #LLMs. These engines are our best pals when it comes to productivity.
<script src="https://gist.github.com/nestoru/857d54a123f52b73fe7e3283a149f258.js"></script>Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-6887028057224923822023-04-29T03:44:00.004-07:002023-04-29T07:15:26.293-07:00ChatGPT does not get it yet - Learning is not about repeating, but instead about [critical] thinking.<p><span face="Roboto, Arial, sans-serif" style="background-color: white; color: #202124; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;"></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWLeX74j_TQRgcGppmo3kiAJEOelxvTsSXh71pvAKlMFHmgz105f-hDaic9YAvx0paA4XmwGCCg32pTGM0jFfzPigTbOIkkniHgVXIcFwyNrYMEoYWXu_XvLWhxSpDz-ODtn6ekcyhJmmlW1InDF3K-JJSQ-MSGbFSoVXdgiQ8f2qwqvQf9Jo/s679/ChatGPTDoesNotGetIt.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="611" data-original-width="679" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWLeX74j_TQRgcGppmo3kiAJEOelxvTsSXh71pvAKlMFHmgz105f-hDaic9YAvx0paA4XmwGCCg32pTGM0jFfzPigTbOIkkniHgVXIcFwyNrYMEoYWXu_XvLWhxSpDz-ODtn6ekcyhJmmlW1InDF3K-JJSQ-MSGbFSoVXdgiQ8f2qwqvQf9Jo/s320/ChatGPTDoesNotGetIt.png" width="320" /></a></div><br /><div>I translated the <a href="https://www.amazon.com/s?k=%22nestor+urquiza%22" target="_blank">two books that I have published so far</a> from Spanish to English using #ChatGPT, and here is what I learned:</div><div><br /></div><div>1. Agreed with https://arxiv.org/pdf/2301.08745.pdf that ChatGPT is a good translator for spoken language.</div><div>2. 37 problems in a total of 31,459 words. Not bad at all.</div><div>3. 9 of the problems were also present in DeepL. The rest were not.</div><div>4. ChatGPT can be instructed to keep the format, and with that convert dialogs in Spanish (which use quotation dashes) to dialogs in English (which use quotes).</div><div>5. However, DeepL autosuggestion feature is a productivity boost and with just 9 errors shown I think it is still a more effective way to translate in cases where respecting format is not a must-have.</div><div>6. If text is heavily formatted like for example XML variants like HTML, then ChatGPT is unable to keep all escaped XML entities like '&lt;'. Instead, it randomly keeps them or shows them as literals, like in this case '<'. Prompting more gets the engine in repeating mode, demonstrating that there is no creativity and no critical thinking in ChatGPT. This to me is a demonstration that the ultimate question scientists have to answer is *how* these models actually "learn" so that we can predict how they will "behave". Learning is not about repeating, but instead about [critical] thinking. We know why and how an atomic bomb works, but we don't fully understand why and how AI works.</div><div><br /></div><div>I will report back when I finish my upcoming poetry book, which I will only publish once I have the final material in the two languages because ChatGPT has taught me a lesson: In reviewing multilingual content, an author finds better ways to say the same even in their own native/mother tongue.</div>Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-43797762489284064992023-04-27T06:14:00.008-07:002023-04-27T12:47:40.788-07:00Wishful thinking versus scientific evidence<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlj2FO_BIMv0RSmvGBrypeY1-17oL9ydliUX95pkgvArv7zKRyRJfAqnGO9CSK-2LCm46-oCCrjDFOFH6Wk1a2m1K731-qypLIYsLxzDExP-SYXUNfq6zUrH79s6AUZhvC_w02-ezhZ9UJdmGI9JxDBpGMJ9msMnhdHxbdROfm6ptpvgaEofA/s640/plot.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlj2FO_BIMv0RSmvGBrypeY1-17oL9ydliUX95pkgvArv7zKRyRJfAqnGO9CSK-2LCm46-oCCrjDFOFH6Wk1a2m1K731-qypLIYsLxzDExP-SYXUNfq6zUrH79s6AUZhvC_w02-ezhZ9UJdmGI9JxDBpGMJ9msMnhdHxbdROfm6ptpvgaEofA/s320/plot.png" width="320" /></a></div><br />Plotted you see all the numbers for the first draw (ball) of all Megamillions ever played in Europe since Fri Feb 13, 2004 to Tue Apr 25, 2023. Do you see any pattern there? No, you can't. The reason is that these numbers are all random.<div><br /></div><div>If there would be a pattern, then a #LLM like #ChatGPT would be able to find it, but there is none. Yet you get news like "Man makes headlines after winning the lottery with ChatGPT" with statements like "The winning amount was small, but the approach was impressive.".</div><div><br /></div><div>Take any lottery in the world, line up any amount of wining numbers separated by commas and pipe them through the below python script to find out if you find any pattern. </div><div><br /></div><blockquote><div><p class="p1" style="background-color: black; color: #400bd9; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>1 </span><span class="s2" style="font-variant-ligatures: no-common-ligatures;">import</span><span class="s3" style="color: #2fff12; font-variant-ligatures: no-common-ligatures;"> sys</span></p><p class="p2" style="background-color: black; color: #2fff12; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>2 </span><span class="s4" style="color: #400bd9; font-variant-ligatures: no-common-ligatures;">import</span><span class="s2" style="font-variant-ligatures: no-common-ligatures;"> matplotlib.pyplot </span><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;">as</span><span class="s2" style="font-variant-ligatures: no-common-ligatures;"> plt</span></p><p class="p3" style="background-color: black; color: #9fa01c; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s2" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>3<span class="Apple-converted-space"> </span></span></p><p class="p2" style="background-color: black; color: #2fff12; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>4 </span><span class="s2" style="font-variant-ligatures: no-common-ligatures;">numbers = []</span></p><p class="p2" style="background-color: black; color: #2fff12; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>5 for</span><span class="s2" style="font-variant-ligatures: no-common-ligatures;"> token </span><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;">in</span><span class="s2" style="font-variant-ligatures: no-common-ligatures;"> sys.stdin.read().split(</span><span class="s5" style="color: #c814c9; font-variant-ligatures: no-common-ligatures;">','</span><span class="s2" style="font-variant-ligatures: no-common-ligatures;">):</span></p><p class="p3" style="background-color: black; color: #9fa01c; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s2" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>6 </span><span class="s3" style="color: #2fff12; font-variant-ligatures: no-common-ligatures;"> </span><span class="s2" style="font-variant-ligatures: no-common-ligatures;">try</span><span class="s3" style="color: #2fff12; font-variant-ligatures: no-common-ligatures;">:</span></p><p class="p2" style="background-color: black; color: #2fff12; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>7 </span><span class="s2" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>numbers.append(</span><span class="s6" style="color: #2eaebb; font-variant-ligatures: no-common-ligatures;">int</span><span class="s2" style="font-variant-ligatures: no-common-ligatures;">(token.strip()))</span></p><p class="p3" style="background-color: black; color: #9fa01c; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s2" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>8 </span><span class="s3" style="color: #2fff12; font-variant-ligatures: no-common-ligatures;"> </span><span class="s2" style="font-variant-ligatures: no-common-ligatures;">except</span><span class="s3" style="color: #2fff12; font-variant-ligatures: no-common-ligatures;"> </span><span class="s7" style="color: #2fb41d; font-variant-ligatures: no-common-ligatures;">ValueError</span><span class="s3" style="color: #2fff12; font-variant-ligatures: no-common-ligatures;">:</span></p><p class="p4" style="background-color: black; color: #2eaebb; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>9 </span><span class="s3" style="color: #2fff12; font-variant-ligatures: no-common-ligatures;"> </span><span class="s2" style="font-variant-ligatures: no-common-ligatures;"># ignore tokens that can't be converted to integers</span></p><p class="p2" style="background-color: black; color: #2fff12; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>10 </span><span class="s2" style="font-variant-ligatures: no-common-ligatures;"> </span><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;">pass</span></p><p class="p3" style="background-color: black; color: #9fa01c; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s2" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>11<span class="Apple-converted-space"> </span></span></p><p class="p4" style="background-color: black; color: #2eaebb; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>12 </span><span class="s2" style="font-variant-ligatures: no-common-ligatures;"># Create a new figure and axis object</span></p><p class="p2" style="background-color: black; color: #2fff12; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>13 </span><span class="s2" style="font-variant-ligatures: no-common-ligatures;">fig, ax = plt.subplots()</span></p><p class="p3" style="background-color: black; color: #9fa01c; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s2" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>14<span class="Apple-converted-space"> </span></span></p><p class="p4" style="background-color: black; color: #2eaebb; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>15 </span><span class="s2" style="font-variant-ligatures: no-common-ligatures;"># Set the title of the plot</span></p><p class="p5" style="background-color: black; color: #c814c9; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>16 </span><span class="s3" style="color: #2fff12; font-variant-ligatures: no-common-ligatures;">ax.set_title(</span><span class="s2" style="font-variant-ligatures: no-common-ligatures;">"Input Numbers"</span><span class="s3" style="color: #2fff12; font-variant-ligatures: no-common-ligatures;">)</span></p><p class="p3" style="background-color: black; color: #9fa01c; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s2" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>17<span class="Apple-converted-space"> </span></span></p><p class="p4" style="background-color: black; color: #2eaebb; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>18 </span><span class="s2" style="font-variant-ligatures: no-common-ligatures;"># Set the labels for the X and Y axis</span></p><p class="p2" style="background-color: black; color: #2fff12; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>19 </span><span class="s2" style="font-variant-ligatures: no-common-ligatures;">ax.set_xlabel(</span><span class="s5" style="color: #c814c9; font-variant-ligatures: no-common-ligatures;">"Position"</span><span class="s2" style="font-variant-ligatures: no-common-ligatures;">)</span></p><p class="p2" style="background-color: black; color: #2fff12; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>20 </span><span class="s2" style="font-variant-ligatures: no-common-ligatures;">ax.set_ylabel(</span><span class="s5" style="color: #c814c9; font-variant-ligatures: no-common-ligatures;">"Number"</span><span class="s2" style="font-variant-ligatures: no-common-ligatures;">)</span></p><p class="p3" style="background-color: black; color: #9fa01c; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s2" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>21<span class="Apple-converted-space"> </span></span></p><p class="p4" style="background-color: black; color: #2eaebb; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>22 </span><span class="s2" style="font-variant-ligatures: no-common-ligatures;"># Plot the numbers as a line chart</span></p><p class="p2" style="background-color: black; color: #2fff12; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>23 </span><span class="s2" style="font-variant-ligatures: no-common-ligatures;">ax.plot(numbers)</span></p><p class="p3" style="background-color: black; color: #9fa01c; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s2" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>24<span class="Apple-converted-space"> </span></span></p><p class="p4" style="background-color: black; color: #2eaebb; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>25 </span><span class="s2" style="font-variant-ligatures: no-common-ligatures;"># Show the plot</span></p><p class="p2" style="background-color: black; color: #2fff12; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>26 </span><span class="s2" style="font-variant-ligatures: no-common-ligatures;">plt.show()</span></p><p class="p3" style="background-color: black; color: #9fa01c; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s2" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>27<span class="Apple-converted-space"> </span></span></p><p class="p4" style="background-color: black; color: #2eaebb; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>28 </span><span class="s2" style="font-variant-ligatures: no-common-ligatures;"># Save the plot</span></p><p class="p2" style="background-color: black; color: #2fff12; font-family: "Andale Mono"; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span class="s1" style="color: #9fa01c; font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>29 </span><span class="s2" style="font-variant-ligatures: no-common-ligatures;">plt.savefig(</span><span class="s5" style="color: #c814c9; font-variant-ligatures: no-common-ligatures;">'plot.png'</span><span class="s2" style="font-variant-ligatures: no-common-ligatures;">)</span></p></div></blockquote><div><br /></div><div>If you find one, then you will be using scientific evidence that you can hit the jackpot. If you cannot, then use scientific evidence at a job and you will make a great living. Do not expect though that wishful thinking will get you far.</div><div><br /></div><div>Having hope is great. We all need it. But nothing can replace the scientific method when it comes to making educated decisions.</div>Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-27326336311580254852023-03-07T10:33:00.002-08:002023-03-09T09:23:24.107-08:00Remove web page elements that match a certain xpathTaking for example a bitbucket pull requests page and assuming that we want to hide all PRs tat contain the string JIRA-80 just copy and paste the below to the browser console and press enter
<pre>
// 1. define the text string to search for as content of a tag
// 2. define the xpath string that matches the tr that contains a td that contains 5 nested divs that contain an anchor with tagContent
// 3. define the xpath result object that contains all the ORDERED_NODE_SNAPSHOT_TYPE nodes that match the xpath string
// 4. iterate the xpath result to hide each node in it
var tagContent='JIRA-80';
var xpath="//tr[td[div[div[div[div[div/a[contains(text(),'" + tagContent + "')]]]]]]]";
var xpathResult = document.evaluate(xpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
for (let i = 0; i < xpathResult.snapshotLength; i++) {
const xpathNode = xpathResult.snapshotItem(i);
xpathNode.style.display = 'none';
}
</pre>
Obviously you can inspect the element you want to remove and select the "delete element" option from the chrome inspector "elements tab" but automating the deletion of the elements that you do not want by knowing the xpath of them saves lots of time.Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-34530376062042331052023-02-22T23:46:00.000-08:002023-02-22T23:46:48.125-08:00wipe out all docker files to gain back hdd spaceWarning: Use only if you understand in full what and why you actually need this:
<pre>
docker stop $(docker ps -q)
docker system prune --volumes
</pre>Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-62309818942131166322023-02-17T22:09:00.004-08:002023-02-17T22:10:41.045-08:00On mobile security - prepare in advance to report your stolen or lost phone if that ever happens<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl0kRfvc36x6GXpNLZVIW03Eyp_UjmSDqvZ4h55-mJNmeUoshzHKB7pBbYhtxFO4-j-1ErM3QzRWljunL7TdcQyLlltiO5bXwXlQ5wxrkZ5eX3fujF4F8HgYa5DtdyI6tV3DuDC7vjGAfhr1Hpdjq9baa65gQ6mtc8B8pvEcsX9wlTlQbtZ7E/s1937/Screenshot_20230218-065542.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" height="320" data-original-height="1937" data-original-width="923" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl0kRfvc36x6GXpNLZVIW03Eyp_UjmSDqvZ4h55-mJNmeUoshzHKB7pBbYhtxFO4-j-1ErM3QzRWljunL7TdcQyLlltiO5bXwXlQ5wxrkZ5eX3fujF4F8HgYa5DtdyI6tV3DuDC7vjGAfhr1Hpdjq9baa65gQ6mtc8B8pvEcsX9wlTlQbtZ7E/s320/Screenshot_20230218-065542.png"/></a></div>
<br/>
Open your phone app and "call" *#06#
<br/><br/>
Once you type the last sharp sign you will get important data that uniquely identifies your phone.
<br/><br/>
Make sure to keep a screenshot of that screen handy to share with authorities in case you lose your phone.
Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-2394993877137567082023-01-14T04:27:00.003-08:002023-01-14T04:28:14.495-08:00MAC Terminal scrollbar shows command history instead of past output (which is cut off for each run command)<pre>Terminal | Menu | View | Show/Hide Alternate Screen (shift + command + down/up arrow)</pre>Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-57989713863375229082022-02-23T03:19:00.030-08:002022-02-23T15:52:02.547-08:00 Test case driven issue reporting<div>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiE0rw_i8puU23YSdwWA4tDKt8lcr4za9CsQG0zsVPVf-U2a0yZgR3YaNWwA9RZesyqZgeMqRgOuUwElaHQRiHtVUYfYZ7R1jhcAYlP5HzkpseStiJEMwZmGdNP-tfSjMUmSl4hxsLlnX2UqWzRqWep10pn2jZujyjJcMkQdxiRWY7cBCV4Ke0=s186" style="display: inline-block; padding: 1em 0; text-align: left; clear: left; float: left;"><img alt="" border="0" width="186" data-original-height="108" data-original-width="186" src="https://blogger.googleusercontent.com/img/a/AVvXsEiE0rw_i8puU23YSdwWA4tDKt8lcr4za9CsQG0zsVPVf-U2a0yZgR3YaNWwA9RZesyqZgeMqRgOuUwElaHQRiHtVUYfYZ7R1jhcAYlP5HzkpseStiJEMwZmGdNP-tfSjMUmSl4hxsLlnX2UqWzRqWep10pn2jZujyjJcMkQdxiRWY7cBCV4Ke0=s320"/></a></div><div style="padding: 1em 0;">"It does not work for me. Why? It freezes. Where? In the user details view. How does it look? Let me share a screenshot. I just went there and it rendered for me. Can we get into a screensharing session? ..."</div></div>
<div style="display: inline-block; text-align: left">
<p>
Transaction costs kill productivity. The above neverending dialog can be stopped if we have a bit more appreciation for the written word.
</p>
<p>
Let us all agree on something: <b>Unless you explain in the form of a replicable test case then nobody should even try to help you out</b>.
</p>
<p>
You probably know it but a test case must have the following straightforward form which must be replicable, meaning that it must produce the exact same result no matter how many times we repeat the provided steps.
</p>
<pre>
1. Go to ...
2. Click on select ...
3. Type ...
4. Expected result: ...
5. Actual result: ...
</pre>
The result of this decision? Huge savings for the business. No numbers, sorry, but the dollar value here is, believe me, big enough to get the attention of your CFO.
</div>Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-5469223202204241672022-01-29T04:36:00.000-08:002022-01-29T04:36:02.960-08:00Read only permissions for a GCP GCS bucket<pre>
storage.buckets.get
storage.buckets.list
storage.objects.get
storage.objects.list
</pre>Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-11171302618116722872021-11-17T01:35:00.007-08:002021-11-17T01:35:43.938-08:00Set default python version in ubuntu<pre>
ls -al `which python3`
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1
python --version
</pre>Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-9950465057400991942021-07-06T15:53:00.003-07:002021-07-06T15:53:33.694-07:00Getting git@bitbucket.org: Permission denied (publickey) ?Error looks like:
<blockquote>
$ git pull
git@bitbucket.org: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
</blockquote>
Assuming that you aready confirmed that you added your ~/.ssh/id_rsa.pub or similar to bitbucket personal preferences and that did not help, then you might want to to just try to connect via SSH to bitbucket with the below command which tries to connects to bitbucket.org via SSH with user git without allocating a TTY and in verbose mode:
<pre>
ssh -Tv git@bitbucket.org
</pre>
You should get something similar to the below:
<blockquote>
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
logged in as git
You can use git to connect to Bitbucket. Shell access is disabled
</blockquote>
If that is the case then you you should retry your git commands again because they should work now.Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-80983930170922314742021-05-30T19:20:00.005-07:002021-05-30T19:20:45.450-07:00Find what lines from one file are found in another<pre>grep -f lookupValuesFile contentToLookupFile</pre>Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-81673603319254787492021-04-30T01:37:00.000-07:002021-04-30T01:37:06.644-07:00Unmet dependencies - you have held broken packagesThis issue happens when dependencies get messed up at least in Ubuntu. Here is an example that I corrected today when I could not install vim:
<br/><br/>
<pre>
sudo apt-get install vim
...
The following packages have unmet dependencies:
libpython3.8 : Depends: libpython3.8-stdlib (= 3.8.5-1~20.04.2) but 3.8.6-1 is to be installed
E: Unable to correct problems, you have held broken packages.
</pre>
To resolve it you need to clean, autoclean, autoremove, update, upgrade, remove, and retry install while removing any further broken dependencies:
<pre>
sudo apt-get -y clean
sudo apt-get -y autoclean
sudo apt -y autoremove
sudo apt-get -y update
sudo apt-get -y upgrade
sudo apt-get remove -y libpython3.8-stdlib # game me unmet dependency on libpython3.8-minimal
sudo apt-get remove -y libpython3.8-minimal
sudo apt-get install -y libpython3.8-stdlib
sudo apt-get install -y vim
</pre>Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-54143472163051296832021-04-16T02:23:00.001-07:002021-04-16T06:11:24.533-07:00From fullstack developer (FSD) to fullstack engineer (FSE)If a <a href="https://thinkinginsoftware.blogspot.com/2021/01/the-software-industry-needs-more-full.html">fullstack product owner (FSPO)</a> cannot be found, then try to find a fullstack developer (FSD) that wants to become a fullstack engineer (FSE).
<br/><br/>
FSEs write brainstroming documentation, wireframes and end to end specifications. They interact directly with the stakeholder. They save a whole layer of transaction costs when compared to FSDs, so productivity should be increased at a minimum by 100%. Yes that is right, it doubles (at a minimum) your productivity when it comes to the traditional Stakeholder+PO approach.
<br/><br/>
But what is needed for an FSD to become an FSE? First, attitude. This professional is eager to see financially tangible results. Second, skills. This professional strives for writing specifications and code as Jorge Luis Borges would write a story, as Albert Einstein would pursue his quest to discover the laws of nature, this professional will be <a href="https://thinkinginsoftware.blogspot.com/2017/10/simple-and-precise-problem-definition.html">simple and precise</a>.
<br/><br/>
And what are the rewards? Did I say that such company will be saving a minimum of 50% on the cost to deliver software? Furthermore isn't it clear the reliance of such company on the unmatachable attitude and skills of such Engineer?
<br/><br/>
FSDs and FSEs out there: I leave the math to you.
Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-21871899335958950362021-02-17T16:03:00.004-08:002021-02-17T16:03:59.958-08:00Exporting all fields from a mongodb collection to CSV<script src="https://gist.github.com/nestoru/5e9e98492567100dc9c6a2156f95bcfc.js"></script>Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-77171908119610697742021-01-20T04:09:00.000-08:002021-01-20T04:09:01.892-08:00Why quality first is the only effective approach to delivering software?To answer this question we must ask first a related question: Why any new functionality should affect any previous functionality with which apparently there is no relationship? Because software is a whole instead of just individual parts. The simil here is the human body.
<br/><br/>
When you change something that you might think is not related to something else and suddenly you realize that something else failed, it requires an Engineer if we are talking about software or a Doctor if we are talking about health to actually give you response.
<br/><br/>
Yes, software must be seen as a whole and this is the reason why we have automated tests that look for regressions in the software world, the same way ideally a Doctor will follow up with tests across your body looking for signs of problems after prescribing a solution for any other problem.
<br/><br/>
Lean software teams should recognize that anything we do anywhere can have an effect somewhere else. Whether that is incomprehensible for some or not is irrelevant because it is simply a fact of life.
<br/><br/>
And this is why quality-first is the only effective approach to delivering software. Without it you are probably facing a 45% to 65% defect ratio which is holding your team from delivering more features as you keep fixing the problems you keep introducing as you go. I have found that <a href="https://thinkinginsoftware.blogspot.com/2017/10/simple-and-precise-problem-definition.html" target="_blank">e2e test driven development</a> is an effective way to deliver quality-first software products.Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-67328832250999245582021-01-14T09:24:00.002-08:002021-01-14T09:24:19.025-08:00The Software Industry needs more Full Stack Product Owners (FSPO)What is this term that I have coined as "FSPO" or "Full Stack Product Owner"?
<br/><br/>
An FSPO is an organization member that leaves their usual duties for a given amount of time to focus on delivering software that resolves challenges presented in their daily line of work.
<br/><br/>
An FSPO is a stakeholder first, then a product owner (PO) after, not the reverse. It is wearing these two hats, what makes an FSPO as effective as a Full Stack Developer (FSD). The existence of an FSPO for a minimal marketable feature (MMF) will reduce the number of people involved in providing a solution and with it the transaction costs related to its delivery. I personally have empirically demonstrated that depending on the availability and commitment of stakeholders we can get 5 to 10 times faster deliveries when an FSPO is put in charge of any MMF versus having a Stakeholder and a PO in charge of the same MMF.
<br/><br/>
An FSPO is not needed though when the given MMF can be deployed to production without acceptance from stakeholders. When this happens the PO is enough because the transaction costs are zero. This occurs when the PO is a subject matter expert in the Product or the feature being enhanced and has earned the two qualities that any FSPO must possess: responsibility and authority to deliver the specific MMF.
<br/><br/>
Using the FSPO role saves big dollars in the SDLC, however the challenge is to find people that can perform this job. Just as with finding FSD, this is a scarce resource. The introduction of the FSPO role represents a literal inversion of control (IoC) for product delivery because instead of the traditional "tell me what you want, here is what I understood, here it goes again after teh feddback loop 1, here it goes again after the feedback loop 2 ..." we go with "you tell me to do this and here it is to a T".
<br/><br/>
The FSPO performs a number of duties:
<ol>
<li>Create a wireframe specification (wf-spec) for the very low fidelity conceived UI/UX. This can be influenced by a UI/UX expert but in many cases, specially those related to ongoing applications, such step is not necessary. This is definitely influenced by other stakeholders.</li>
<li>Create an outline of functional and non functional requirements for the MMF. This brainstorming specification (br-spec) is influenced by a number of other stakeholders.</li>
<li>Create end to end specifications (e2e-spec). This will be influenced by software developers as they collectively will need to find ways to implement the assertions being requested.</li>
<li>Review automated e2e-spec implementations (automated e2e tests) delivered by developers often and on demand.</li>
<li>Test the MMF deployed in dev servers often and on demand.</li>
<li>Test the MMF in full when deployed to the test environment and all e2e tests have passed per the continuous integration (CI) service.</li>
<li>Smoke test the MMF when deployed into the production environment.</li>
<li>Classify issues as bugs when the developer did not follow the e2e-spec to a T or defects when the specification itself was faulty.</li>
<li>Keep track of the development pace and find the root cause of slowness. Apply theory of constraints to get the pace back up.</li>
<li>Get back to their organization duties using the features they themselves help to create and collecting the next round of enhancements, calculate their possible return, risk and statistics-backed cost to help with the authorization from the prioritization comittee.
</ol>
A good starting point to hire an FSPO is to present this need to each future organization member who regardless will need to become a stakeholder. A second important point is to have a lean, company wide deployed, process engineering. Usually this means that the CMMI level of the company in question must be high. This should be the case if the company is already using end to end (e2e) test driven development. This is because <a href="https://thinkinginsoftware.blogspot.com/2017/10/simple-and-precise-problem-definition.html" target="_blank">e2e specfications (e2e-spec) solve problems in a simple and precise manner</a> and they are also not difficult to understand for organization members that are experienced in their daily jobs but lacking exposure to develop software.
<br/><br/>
Ultimately all stakeholders that wish to become FSPO will get a big bump in their professional careers as technology continues to increase its importance when it comes to enabling the success of the organization. The introduction therefore of the FSPO role is a win-win for the Organization and the Stakeholder.Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0tag:blogger.com,1999:blog-37642571.post-25293253898588048352021-01-08T11:19:00.002-08:002021-01-08T11:22:44.668-08:00kubectl cp from pod to local<ol>
<li>Get into the pod and make sure you locate the *relative* path of the file. When you run the shell in your pod you might land in root or in some other path so this is important</li>
<li>Use as source of the relative path without "./" in the "kubectl cp" command after the name of the pod and a colon</li>
<li>Use as target the local path (absolute or relative) of the *file* you want to create or replace as the result the "kubectl cp" command. The detination must be a file if the source is a file.</li>
</ol>
For example:
<pre>
kubectl cp mypod:my/relative/path/in/my/pod/file.ext ~/file.ext
</pre>Nestor Urquizahttp://www.blogger.com/profile/12351754666722274569noreply@blogger.com0