-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfeed.xml
8342 lines (6592 loc) · 849 KB
/
feed.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.3">Jekyll</generator><link href="https://vctrsnts.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://vctrsnts.github.io/" rel="alternate" type="text/html" /><updated>2025-01-19T19:48:18+00:00</updated><id>https://vctrsnts.github.io/feed.xml</id><title type="html">Si lo haces, hazlo bien!</title><subtitle></subtitle><entry><title type="html">Historia del cambio de terminal</title><link href="https://vctrsnts.github.io/debian%20gnu/linux/2025/01/13/cambiando-a-wezterm.html" rel="alternate" type="text/html" title="Historia del cambio de terminal" /><published>2025-01-13T00:00:00+00:00</published><updated>2025-01-13T00:00:00+00:00</updated><id>https://vctrsnts.github.io/debian%20gnu/linux/2025/01/13/cambiando-a-wezterm</id><content type="html" xml:base="https://vctrsnts.github.io/debian%20gnu/linux/2025/01/13/cambiando-a-wezterm.html"><![CDATA[<p>Este es un articulo, que como puedes ver, es un articulo muy parecido a los que he ha escrito <strong>Lorenzo</strong>, de <a href="https://atareao.es" target="_blank">Atareao</a>, porque es algo, que si te pones a pensar es una de las aplicaciones que más se utilizan en <em>GNU/Linux</em> pero a la que no se le da mucha impportacia.</p>
<p>Nos estamos refiriendo a la terminal.</p>
<!-- more -->
<p>Esa aplicación, en mi caso, no era una cosa a la que le diera mucha importancia. Siempre usaba la que venia por defecto en el <em>Desktop</em> que instalaba en ese momento, <em>konsole</em> en el caso de <strong>KDE</strong>, <em>xfce4-terminal</em> en el caso de <strong>XFCE</strong>, o sino en el caso de usar los <em>Windows Tiling Manager</em> que el mejor ejemplo, se podria decir que es <strong>i3-WM</strong>, tambien usaba <em>xfce4-terminal</em>. Pero al usar los que venian por defecto, siempre, en mi caso, me encontraba un poco limitado porque si quieres trabajar con diferentes <em>paneles</em> o <em>escritorios</em>, tienes que usar diferentes pestañas y tienes que ir saltando de pestaña en pestaña y eso era un poco rollo.</p>
<p>Pero todo cambio, a partir de un <a href="https://www.youtube.com/watch?v=7gmpjacFoHM" target="_blank">video</a> del <strong>PeladoNerd</strong> donde explicaba el uso de <strong>TMUX</strong>. Un famoso <em>multiplexor</em> donde podias tener varios <em>terminales</em> en la misma ventana.</p>
<p>Esto era una mejora en mi manera de trabajar con respecto a lo que tenia antes. Pero aun habia un pequeño problema que seguia existiendo, que aunque habia logrado una mejora muy sustancial con respecto a lo que tenia antes, tenia que seguir utilizando 2 aplicaciones:</p>
<ul>
<li>La terminal que habia instalado.</li>
<li><em>Tmux</em> para disponer de estas mejoras.</li>
</ul>
<p>Aqui os pongo la configuración del fichero <code class="language-plaintext highlighter-rouge">tmux.conf</code> que estaba usando en ese momento. Nunca se sabe si os puede ser de utilidad:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">## Configuració per defecte</span>
<span class="nb">set</span> <span class="nt">-g</span> assume-paste-time 0
<span class="c"># Iniciem les pestanyes de TMUX per 1 en comptes de 0</span>
<span class="nb">set</span> <span class="nt">-g</span> base-index 1
setw <span class="nt">-g</span> main-pane-width 126
<span class="c">#setw -g aggressive-resize off</span>
<span class="nb">set</span> <span class="nt">-g</span> status on
<span class="nb">set</span> <span class="nt">-g</span> history-limit 10000
<span class="c">#set -g pane-border-format "#P: #{pane_current_command}"</span>
<span class="nb">set</span> <span class="nt">-g</span> mouse on
<span class="c">## Canviem la keybind per defecte</span>
unbind C-b
<span class="nb">set</span> <span class="nt">-g</span> prefix C-a
<span class="nb">bind </span>C-a send-prefix
<span class="c"># custom bindings</span>
bind-key H resize-pane <span class="nt">-L</span> 5
bind-key L resize-pane <span class="nt">-R</span> 5
bind-key j <span class="k">select</span><span class="nt">-pane</span> <span class="nt">-t</span> :.-
bind-key x swap-pane <span class="nt">-t</span> :.0 <span class="se">\;</span> <span class="k">select</span><span class="nt">-pane</span> <span class="nt">-t</span> :.0
bind-key k kill-pane <span class="se">\;</span> <span class="k">select</span><span class="nt">-layout</span> main-vertical
bind-key v split-window <span class="nt">-v</span> <span class="se">\;</span> <span class="k">select</span><span class="nt">-layout</span> main-vertical <span class="se">\;</span> swap-pane <span class="nt">-t</span> :.0 <span class="se">\;</span> <span class="k">select</span><span class="nt">-pane</span> <span class="nt">-t</span> :.0
<span class="c"># EXECUTEM SCRIPT</span>
bind-key r run-shell <span class="s2">"~/.tmux/scripts/resize-adaptable.sh -l main-vertical -p 60"</span>
<span class="c">## Configuracio de diferents accions programades</span>
<span class="c"># Es recarrega la configuració de tmux</span>
bind-key R source-file ~/.tmux.conf <span class="se">\;</span> display-message <span class="s2">"Config reloaded"</span>
<span class="c"># Es pasa a opcio "paste-buffer"</span>
<span class="c">#bind-key p paste-buffer</span>
<span class="c"># Es pasa a opció "copy-mode"</span>
<span class="c">#bind-key c copy-mode</span>
<span class="c">## Configuració del Status Bar</span>
set-window-option <span class="nt">-g</span> window-status-format <span class="s2">""</span>
set-window-option <span class="nt">-g</span> window-status-current-format <span class="s2">""</span>
<span class="c">## Configuració del color del Status Bar</span>
set-option <span class="nt">-g</span> status-bg colour235 <span class="c">#base02</span>
set-option <span class="nt">-g</span> status-fg yellow <span class="c">#yellow</span>
<span class="c">## Es visualitzar la adreça IP</span>
<span class="nb">set</span> <span class="nt">-g</span> status-left-length 178
<span class="c"># Configuració per a la visualització de la adreça IP</span>
<span class="nv">DEFAULT_GW</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span>ip route | <span class="nb">grep</span> <span class="s1">'default'</span> | <span class="nb">awk</span> <span class="s1">'{print $3}'</span><span class="si">)</span><span class="s2">"</span>
<span class="nb">set</span> <span class="nt">-g</span> status-left <span class="s2">"#[fg=green][#P] #[fg=yellow]#(ip address | grep 'enp3s0' | grep 'inet ' | awk '{print </span><span class="se">\"</span><span class="s2">inet </span><span class="se">\"</span><span class="nv">$2</span><span class="s2">}')#[fg=red]#(ip address | grep 'wlp8s0' | grep 'inet ' | awk '{print </span><span class="se">\"</span><span class="s2">inet </span><span class="se">\"</span><span class="nv">$2</span><span class="s2">}') #[fg=white]208.67.222.222 (#(ping -c1 208.67.222.222 | grep time | cut -f4 -d'=')) #[fg=white]#(ip route | grep 'default' | awk '{print </span><span class="se">\"</span><span class="s2">gateway </span><span class="se">\"</span><span class="nv">$3</span><span class="s2">}') (#(ping -c1 </span><span class="nv">$DEFAULT_GW</span><span class="s2"> | grep time | cut -f4 -d'='))"</span>
<span class="nb">set</span> <span class="nt">-g</span> status-right-length 60
<span class="nb">set</span> <span class="nt">-g</span> status-right <span class="s2">"#[fg=yellow]%d %b %Y #[fg=green]%H:%M"</span>
</code></pre></div></div>
<p>Si os fijais, hay un script (que os pongo a continuación) que lo que hacia es redimensionar el tamaño del panel al de la pantalla, porque no habia forma de que esto se hiciera automaticamente:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">lflag</span><span class="o">=</span>
<span class="nv">pflag</span><span class="o">=</span>
<span class="nv">tflag</span><span class="o">=</span>
<span class="k">while </span><span class="nb">getopts </span>l:p:t: name<span class="p">;</span>
<span class="k">do
case</span> <span class="nv">$name</span> <span class="k">in
</span>l<span class="p">)</span> <span class="nv">lflag</span><span class="o">=</span>1
<span class="nv">layout_name</span><span class="o">=</span><span class="nv">$OPTARG</span><span class="p">;;</span>
p<span class="p">)</span> <span class="nv">pflag</span><span class="o">=</span>1
<span class="nv">percentage</span><span class="o">=</span><span class="s2">"</span><span class="nv">$OPTARG</span><span class="s2">"</span><span class="p">;;</span>
t<span class="p">)</span> <span class="nv">tflag</span><span class="o">=</span>1
<span class="nv">target</span><span class="o">=</span><span class="s2">"</span><span class="nv">$OPTARG</span><span class="s2">"</span><span class="p">;;</span>
?<span class="p">)</span> <span class="nb">printf</span> <span class="s2">"Usage: %s: [-l layout-name] [-p percentage] [-t target-window]</span><span class="se">\n</span><span class="s2">"</span> <span class="nv">$0</span>
<span class="nb">exit </span>2<span class="p">;;</span>
<span class="k">esac</span>
<span class="k">done
if</span> <span class="o">[</span> <span class="o">!</span> <span class="nt">-z</span> <span class="s2">"</span><span class="nv">$pflag</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
if</span> <span class="o">!</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$percentage</span><span class="s2">"</span> <span class="nt">-eq</span> <span class="s2">"</span><span class="nv">$percentage</span><span class="s2">"</span> <span class="o">]</span> 2> /dev/null<span class="p">;</span> <span class="k">then
</span><span class="nb">printf</span> <span class="s2">"Percentage (-p) must be an integer"</span> <span class="o">></span>&2
<span class="nb">exit </span>1
<span class="k">fi
fi
if</span> <span class="o">[</span> <span class="o">!</span> <span class="nt">-z</span> <span class="s2">"</span><span class="nv">$lflag</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
if</span> <span class="o">[</span> <span class="nv">$layout_name</span> <span class="o">!=</span> <span class="s1">'main-horizontal'</span> <span class="o">]</span> <span class="o">&&</span> <span class="o">[</span> <span class="nv">$layout_name</span> <span class="o">!=</span> <span class="s1">'main-vertical'</span> <span class="o">]</span> <span class="p">;</span> <span class="k">then
</span><span class="nb">printf</span> <span class="s2">"layout name must be main-horizontal or main-vertical"</span> <span class="o">></span>&2
<span class="nb">exit </span>1
<span class="k">fi
fi
if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$layout_name</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"main-vertical"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
</span><span class="nv">MAIN_PANE_SIZE</span><span class="o">=</span><span class="si">$(</span><span class="nb">expr</span> <span class="si">$(</span>tmux display <span class="nt">-p</span> <span class="s1">'#{window_width}'</span><span class="si">)</span> <span class="se">\*</span> <span class="nv">$percentage</span> <span class="se">\/</span> 100<span class="si">)</span>
<span class="nv">MAIN_SIZE_OPTION</span><span class="o">=</span><span class="s1">'main-pane-width'</span>
<span class="k">fi
if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$layout_name</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"main-horizontal"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
</span><span class="nv">MAIN_PANE_SIZE</span><span class="o">=</span><span class="si">$(</span><span class="nb">expr</span> <span class="si">$(</span>tmux display <span class="nt">-p</span> <span class="s1">'#{window_height}'</span><span class="si">)</span> <span class="se">\*</span> <span class="nv">$percentage</span> <span class="se">\/</span> 100<span class="si">)</span>
<span class="nv">MAIN_SIZE_OPTION</span><span class="o">=</span><span class="s1">'main-pane-height'</span>
<span class="k">fi
if</span> <span class="o">[</span> <span class="o">!</span> <span class="nt">-z</span> <span class="s2">"</span><span class="nv">$target</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
</span>tmux setw <span class="nt">-t</span> <span class="nv">$target</span> <span class="nv">$MAIN_SIZE_OPTION</span> <span class="nv">$MAIN_PANE_SIZE</span><span class="p">;</span> tmux <span class="k">select</span><span class="nt">-layout</span> <span class="nt">-t</span> <span class="nv">$target</span> <span class="nv">$layout_name</span>
<span class="k">else
</span>tmux setw <span class="nv">$MAIN_SIZE_OPTION</span> <span class="nv">$MAIN_PANE_SIZE</span><span class="p">;</span> tmux <span class="k">select</span><span class="nt">-layout</span> <span class="nv">$layout_name</span>
<span class="k">fi
</span><span class="nb">exit </span>0
</code></pre></div></div>
<p>Y con esta configuración estuve un monton de tiempo porque desconocia que más alla de esto habian más cosas.</p>
<p>Todo esto cambio, cuando descubri a <a href="https://atareao.es" target="_blank">Lorenzo</a> donde en uno de sus <a href="https://atareao.es/podcast/kitty-el-mejor-terminal-para-linux" target="_blank">articulos</a> explicaba que habia encontrado una nueva terminal donde todo lo que, en mi caso necesitaba, ya estaba implementado por defecto. Y esta aplicación, no era otra que <a href="https://sw.kovidgoyal.net/kitty" target="_blank">Kitty</a>. Teniendo en cuenta que las opiniones de <strong>Lorenzo</strong> las tengo en muy alta estima, pues decidi probar esta nueva <em>terminal</em>.</p>
<p>Desde el momento que la instale y la configure, aqui teneis el fichero de configuración de <code class="language-plaintext highlighter-rouge">kitty.conf</code>:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># vim:fileencoding=utf-8:ft=conf:foldmethod=marker</span>
<span class="c">#: Fonts {</span>
font_family Fira Code
bold_font auto
italic_font auto
bold_italic_font auto
font_size 10.0
<span class="c">#: }</span>
<span class="c">#: Cursor customization {</span>
cursor <span class="c">#f19618</span>
<span class="c">#: }</span>
<span class="c">#: Scrollback {</span>
scrollback_lines 2000
<span class="c">#: }</span>
<span class="c">#: Mouse {</span>
detect_urls <span class="nb">yes
</span>copy_on_select <span class="nb">yes</span>
<span class="c">#: }</span>
<span class="c">#: Terminal bell {</span>
enable_audio_bell silence
<span class="c">#: }</span>
<span class="c">#: Window layout {</span>
enabled_layouts tall
window_border_width 5.0
window_padding_width 3.0
hide_window_decorations no
<span class="c">#: }</span>
<span class="c">#: Color scheme {</span>
foreground <span class="c">#e5e1cf</span>
background <span class="c">#0e1419</span>
background_opacity 0.8
selection_foreground <span class="c">#0e1419</span>
selection_background <span class="c">#243340</span>
color0 <span class="c">#000000</span>
color8 <span class="c">#323232</span>
<span class="c">#: black</span>
color1 <span class="c">#ff3333</span>
color9 <span class="c">#ff6565</span>
<span class="c">#: red</span>
color2 <span class="c">#b8cc52</span>
color10 <span class="c">#e9fe83</span>
<span class="c">#: green</span>
color3 <span class="c">#e6c446</span>
color11 <span class="c">#fff778</span>
<span class="c">#: yellow</span>
color4 <span class="c">#36a3d9</span>
color12 <span class="c">#68d4ff</span>
<span class="c">#: blue</span>
color5 <span class="c">#f07078</span>
color13 <span class="c">#ffa3aa</span>
<span class="c">#: magenta</span>
color6 <span class="c">#95e5cb</span>
color14 <span class="c">#c7fffc</span>
<span class="c">#: cyan</span>
color7 <span class="c">#ffffff</span>
color15 <span class="c">#ffffff</span>
<span class="c">#: }</span>
<span class="c">#: Advanced {</span>
allow_remote_control <span class="nb">yes</span>
<span class="c">#: }</span>
<span class="c">#: Keyboard shortcuts {</span>
kitty_mod ctrl+shift
<span class="c">#: Clipboard {</span>
map kitty_mod+c copy_to_clipboard
<span class="c">#: }</span>
<span class="c">#: Window management {</span>
map kitty_mod+enter new_window
<span class="c">#: }</span>
<span class="c">#: Font sizes {</span>
map kitty_mod+plus change_font_size all +2.0
map kitty_mod+minus change_font_size all <span class="nt">-2</span>.0
map kitty_mod+backspace change_font_size all 0
<span class="c">#: }</span>
</code></pre></div></div>
<p>Me encanto su funcionamiento y su facilidad de uso, eso si, después de que te hayas acostumbrado a las combinaciones de teclas que se tiene que usar, pero en mi caso, eran pocas, asi que no tuve ningun problema en adaptarme a ellas.</p>
<p>Pero como dice el refran, <em>todo lo bueno se acaba</em> y eso me paso. Un dia, en una actualización de <em>kitty</em>, todo dejo de funcionar. Dejar de funciona no es la palabra correcta, lo que paso, es que todo se fue a la 💩.</p>
<p>El problema que tenia, es que mientras lo estaba usando, me aparecian simbolos en la terminal como si se estuviera pulsando teclas aleatoriamente, sin ningun motivo, cuando esto no era asi. Podia dejar de usar el teclado y los caracteres seguian apareciendo en la pantalla.</p>
<p>Lo primero que hice fue borrar la configuración que tenia hasta el momento, a ver si habia habido algun cambio y por eso tenia este problema, pero todo seguia igual. Tambien borre el paquete y lo volvi a instalar, pero sin ningun cambio.</p>
<p>Busque información, tanto en la web de <em>kitty</em> como en la web de <em>Debian GNU/Linux</em> para ser si alguien habia reportado este fallo. Pero lo unico que encontre es a 2 personas que si que lo habian reportado, pero en una versión anterior a la que yo estaba usando, el problema se habia solucionado, pero eso habia pasado hace un par de años. Asi que esa no era mi solución. Pues viendo los problemas que tenia, me puse a buscar otra terminal que me diera las misma cosas que habia tenido hasta ahora con <em>kitty</em> pero sin este molesto problema.</p>
<p>Que hacemos cuando tienes un problema de este tipo, pues preguntas al profesor, que no es otro de que <strong>Lorenzo</strong>, porque el ya habia hecho una lista de todos los posibles candidatos. Me paso esta pagina web <a href="https://github.com/cdleon/awesome-terminals" target="_blank">web</a>, que a el le habia ayudado mucho en su elección donde podias ver todas las ventajas e inconvenientes de cada opción. Al final me decidi usar <a href="https://github.com/wez/wezterm" target="_blank">wezterm</a> que ofrecia lo mismo que <em>kitty</em>.</p>
<p>La unica pega que tiene es que para instalar el paquete en <em>Debian GNU/Linux</em>, tienes que <a href="https://wezfurlong.org/wezterm/install/linux.html#__tabbed_1_3" target="_blank">instarlo</a> por fuera del sistema. Una cosa que no me gusta mucho. Tambien tienes la opción de instalarlo a traves de <em>AppImage</em>, <em>Flatpak</em>, pero para segun que aplicaciones, las prefiero tener instaladas correctamente en el sistema.</p>
<p>El fichero que uso actualmente de configuración es el siguiente:</p>
<div class="language-lua highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">-- Configuración básica para WezTerm</span>
<span class="kd">local</span> <span class="n">wezterm</span> <span class="o">=</span> <span class="nb">require</span> <span class="s1">'wezterm'</span>
<span class="kd">local</span> <span class="n">act</span> <span class="o">=</span> <span class="n">wezterm</span><span class="p">.</span><span class="n">action</span>
<span class="k">return</span> <span class="p">{</span>
<span class="c1">-- Actualiza la barra de estado cada 1 segundo</span>
<span class="n">status_update_interval</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
<span class="c1">-- Fuente</span>
<span class="n">font</span> <span class="o">=</span> <span class="n">wezterm</span><span class="p">.</span><span class="n">font</span><span class="p">(</span><span class="s2">"Fira Code"</span><span class="p">),</span> <span class="c1">-- Cambia esto a la fuente que prefieras</span>
<span class="n">font_size</span> <span class="o">=</span> <span class="mi">10</span><span class="p">.</span><span class="mi">5</span><span class="p">,</span> <span class="c1">-- Tamaño de la fuente</span>
<span class="n">default_cursor_style</span> <span class="o">=</span> <span class="s2">"BlinkingBar"</span><span class="p">,</span>
<span class="c1">-- Ligaduras tipográficas</span>
<span class="n">font_rules</span> <span class="o">=</span> <span class="p">{</span>
<span class="p">{</span>
<span class="n">intensity</span> <span class="o">=</span> <span class="s2">"Bold"</span><span class="p">,</span>
<span class="n">font</span> <span class="o">=</span> <span class="n">wezterm</span><span class="p">.</span><span class="n">font_with_fallback</span><span class="p">({</span><span class="s2">"Fira Code"</span><span class="p">,</span> <span class="s2">"Monospace"</span><span class="p">})</span>
<span class="p">},</span>
<span class="p">},</span>
<span class="c1">-- Colores</span>
<span class="n">color_scheme</span> <span class="o">=</span> <span class="s2">"Dracula"</span><span class="p">,</span> <span class="c1">-- Cambia esto por el esquema que más te guste</span>
<span class="c1">-- Estilo de la ventana</span>
<span class="n">window_padding</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">left</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span> <span class="c1">-- Espaciado desde la izquierda</span>
<span class="n">right</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span> <span class="c1">-- Espaciado desde la derecha</span>
<span class="n">top</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span> <span class="c1">-- Espaciado superior</span>
<span class="n">bottom</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span> <span class="c1">-- Espaciado inferior</span>
<span class="p">},</span>
<span class="c1">-- Establecer el esquema de la barra de título</span>
<span class="n">window_background_opacity</span> <span class="o">=</span> <span class="mi">0</span><span class="p">.</span><span class="mi">98</span><span class="p">,</span> <span class="c1">-- Opacidad de la ventana</span>
<span class="c1">-- Activar ligaduras de fuentes</span>
<span class="n">use_fancy_tab_bar</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> <span class="c1">-- Mostrar una barra de pestañas con los nombres de las pestañas</span>
<span class="n">tab_bar_at_bottom</span> <span class="o">=</span> <span class="kc">false</span><span class="p">,</span> <span class="c1">-- Coloca la barra de pestañas en la parte superior (cambiar a `true` si prefieres abajo)</span>
<span class="n">hide_tab_bar_if_only_one_tab</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span>
<span class="c1">-- Comportamiento de las pestañas</span>
<span class="n">default_prog</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"/bin/bash"</span><span class="p">},</span> <span class="c1">-- Cambia por tu shell preferido (zsh, fish, etc.)</span>
<span class="n">inactive_pane_hsb</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">saturation</span> <span class="o">=</span> <span class="mi">0</span><span class="p">.</span><span class="mi">8</span><span class="p">,</span>
<span class="n">brightness</span> <span class="o">=</span> <span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">,</span>
<span class="p">},</span>
<span class="c1">-- Teclas de acceso rápido</span>
<span class="n">keys</span> <span class="o">=</span> <span class="p">{</span>
<span class="c1">-- Dividir el terminal</span>
<span class="p">{</span><span class="n">key</span><span class="o">=</span><span class="s2">"v"</span><span class="p">,</span> <span class="n">mods</span><span class="o">=</span><span class="s2">"CTRL|SUPER"</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="n">act</span><span class="p">{</span><span class="n">SplitVertical</span><span class="o">=</span><span class="p">{</span><span class="n">domain</span><span class="o">=</span><span class="s2">"CurrentPaneDomain"</span><span class="p">}}},</span>
<span class="p">{</span><span class="n">key</span><span class="o">=</span><span class="s2">"h"</span><span class="p">,</span> <span class="n">mods</span><span class="o">=</span><span class="s2">"CTRL|SUPER"</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="n">act</span><span class="p">{</span><span class="n">SplitHorizontal</span><span class="o">=</span><span class="p">{</span><span class="n">domain</span><span class="o">=</span><span class="s2">"CurrentPaneDomain"</span><span class="p">}}},</span>
<span class="c1">-- Crear una nueva pestaña</span>
<span class="p">{</span><span class="n">key</span><span class="o">=</span><span class="s2">"t"</span><span class="p">,</span> <span class="n">mods</span><span class="o">=</span><span class="s2">"CTRL|SHIFT"</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="n">wezterm</span><span class="p">.</span><span class="n">action</span><span class="p">{</span><span class="n">SpawnTab</span><span class="o">=</span><span class="s2">"CurrentPaneDomain"</span><span class="p">}},</span>
<span class="c1">-- Cambiar entre pestañas</span>
<span class="p">{</span><span class="n">key</span><span class="o">=</span><span class="s2">"LeftArrow"</span><span class="p">,</span> <span class="n">mods</span><span class="o">=</span><span class="s2">"CTRL|SUPER"</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="n">act</span><span class="p">{</span><span class="n">ActivatePaneDirection</span><span class="o">=</span><span class="s2">"Next"</span><span class="p">}},</span>
<span class="p">{</span><span class="n">key</span><span class="o">=</span><span class="s2">"RightArrow"</span><span class="p">,</span> <span class="n">mods</span><span class="o">=</span><span class="s2">"CTRL|SUPER"</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="n">act</span><span class="p">{</span><span class="n">ActivatePaneDirection</span><span class="o">=</span><span class="s2">"Prev"</span><span class="p">}}</span>
<span class="p">},</span>
<span class="c1">-- Habilitar el "scrollback" (historial de la terminal)</span>
<span class="n">scrollback_lines</span> <span class="o">=</span> <span class="mi">10000</span><span class="p">,</span> <span class="c1">-- Aumenta el número de líneas del historial de la terminal</span>
<span class="c1">-- Configuración avanzada para la terminal</span>
<span class="n">window_decorations</span> <span class="o">=</span> <span class="s2">"NONE"</span><span class="p">,</span> <span class="c1">-- Puedes elegir entre "NONE", "TITLE", "RESIZE", etc.</span>
<span class="n">mouse_bindings</span> <span class="o">=</span> <span class="p">{</span>
<span class="p">{</span><span class="n">event</span><span class="o">=</span><span class="p">{</span><span class="n">Up</span><span class="o">=</span><span class="p">{</span><span class="n">streak</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">button</span><span class="o">=</span><span class="s2">"Right"</span><span class="p">}},</span> <span class="n">mods</span><span class="o">=</span><span class="s2">"NONE"</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="n">wezterm</span><span class="p">.</span><span class="n">action</span><span class="p">{</span><span class="n">PasteFrom</span><span class="o">=</span><span class="s2">"PrimarySelection"</span><span class="p">}},</span>
<span class="p">},</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Y tal como yo lo tengo configurado, me funciona perfectamente para las necesidades que tengo y lo más extraño, es que no tengo los problemas con las pulsaciones fantasma que me ocurria con <em>kitty</em>, porque tambien habia pensado que el portatil se habia roto, pero claro, sino con otra terminal el problema no aparece, pues, el problema esta en <em>kitty</em>.</p>
<p>Aun asi, intente darle una nueva oportunidad a <em>kitty</em>, para ver si con alguna nueva actualización, se habia solucionado el problema de las pulsaciones, pero el problema seguia persistiendo. Hasta intente usar <em>kitty</em> con el fichero minimo de configuración necesario para su funcionamiento, pero ni aun asi, el error seguia.</p>
<p>Asi, que no me quedo otra cosa, que volver a <em>wezterm</em> que tan buen sabor de boca me habia dejado y por eso, aun lo sigo usando hasta este momento y que espero que sea para mucho tiempo.</p>
<h4 id="referencia">Referencia</h4>
<ul>
<li><a href="https://www.youtube.com/watch?v=7gmpjacFoHM" target="_blank">POR QUE LOS SRE USAN MAC ? Mis herramientas de trabajo (Parte 2)</a></li>
<li><a href="https://github.com/tmux/tmux" target="_blank">Tmux</a></li>
<li><a href="https://atareao.es/podcast/kitty-el-mejor-terminal-para-linux" target="_blank">253 - Kitty, el mejor terminal para Linux</a></li>
<li><a href="https://atareao.es/podcast/las-aplicaciones-imprescindibles-en-linux-en-2024" target="_blank">560 - Las aplicaciones imprescindibles en Linux en 2024</a></li>
<li><a href="https://atareao.es/podcast/batalla-de-terminales-en-linux-wezterm" target="_blank">571 - Batalla de terminales en Linux. Wezterm</a></li>
<li><a href="https://github.com/cdleon/awesome-terminals" target="_blank">awesome-terminals</a></li>
<li><a href="https://github.com/wez/wezterm" target="_blank">Wezterm</a></li>
</ul>]]></content><author><name>VSANTOS</name></author><category term="Debian GNU/Linux" /><category term="Debian GNU/Linux" /><summary type="html"><![CDATA[Este es un articulo, que como puedes ver, es un articulo muy parecido a los que he ha escrito Lorenzo, de Atareao, porque es algo, que si te pones a pensar es una de las aplicaciones que más se utilizan en GNU/Linux pero a la que no se le da mucha impportacia. Nos estamos refiriendo a la terminal.]]></summary></entry><entry><title type="html">Propositos 2025</title><link href="https://vctrsnts.github.io/blog/2025/01/11/propositos-2025.html" rel="alternate" type="text/html" title="Propositos 2025" /><published>2025-01-11T00:00:00+00:00</published><updated>2025-01-11T00:00:00+00:00</updated><id>https://vctrsnts.github.io/blog/2025/01/11/propositos-2025</id><content type="html" xml:base="https://vctrsnts.github.io/blog/2025/01/11/propositos-2025.html"><![CDATA[<p>Como a buen principio de año y que me gustaria conversar en los siguientes años, es poner un listado de las cosas que me gustaria conseguir este año con referencia a mi servidor, docker, etc… O sea, todo lo que tiene que ver con el mundo de la tecnologia y la informatica.</p>
<!-- more -->
<p>La lista que me gustaria poder conseguir a finales de este año, seria la siguiente:</p>
<ul>
<li>Conseguir de alguna manera poder escuchar los podcast en mi portatil sin tener que utilizar aplicaciones tan desactualizadas como <strong>gPodder</strong>.
<ul>
<li>Porque he estado buscando otras aplicaciones que tenian buena pinta, pero o que no tienen paquete para <em>Debian GNU/Linux</em> o imagen <em>AppImage</em>. Se que esta la posibilidad de usar <em>snap</em>, pero tener que instalar aplicaciones externas para usar un paquete, que teoricamente lo tiene todo pues no es muy logico.</li>
</ul>
</li>
<li>Mejorar, siempre que sea posible, mi servidor <em>unRaid</em>. No se como lo podria mejorar más, porque tal como esta ahora mismo lo veo perfecto, pero hay algunas cosas, sobretodo con la caja, para más información podeis leer este <a href="/hardware/2024/09/18/modificando-servidor-1.html" target="_blank">articulo</a> porque la sujección al tiny, no me parece muy fiable.
<ul>
<li>Tambien, he pensado en poner más HDD pero para eso, necesitaria añadir una fuente externa para poderlos alimentar estos HDD.</li>
</ul>
</li>
<li>Rezar 😉 para que el portatil no reviente, aunque no es un tema que me preocupe mucho, porque tengo en la reserva un <a href="/thinkcenter/2023/09/11/substitutos-portatil.html" target="_blank">tiny</a>.</li>
<li>Mejorar mi VPS en todo lo que se pueda y sacarle más partido.
<ul>
<li>Aunque ya esta bien tal como esta, pero siempre se puede exprimir todo un poco más.</li>
</ul>
</li>
<li>Tengo en mente, que es una cosa que siempre me ha rondado por la cabeza, es comprar mi propio dominio personal y por ende, tener mi propia pagina web en el VPS.
<ul>
<li>Aunque luego digo que no es necesario, porque tal como lo tengo ahora <strong>gitHub</strong>, tengo más que suficiente para todo lo que yo hago. Pero ahi estamos, con esa idea siempre rondando por la cabeza.</li>
</ul>
</li>
<li>Como habreis visto es este otro <a href="/blog/2024/12/23/nueva-web.html" target="_blank">articulo</a>, ahora mismo, la tengo ubicada como un proyecto más de <strong>gitHub</strong>, anteriormente la habia tenido en <strong>gitLab</strong>.
<ul>
<li>Pero lo he abandonado porque el funcionamiento que tiene no me gusta mucho y después de descubrir este nuevo sitio <a href="https://codeberg.org" target="_blank">Codeberg</a>, estoy pensando es esta nueva web, ubicarla aqui, porque asi aprendemos cosas nuevas.</li>
</ul>
</li>
</ul>
<p>Aqui tenemos la lista que en principio son los puntos fuertes que me gustaria ver cumplido, pero nunca se sabe, porque estas listas son variables y donde digo que me gustaria hacer una cosa, luego no se cumple pero se añade un nuevo tema que me inspara más o ideas que voy viendo escuchando o leyendo los articulos de los podcasters que sigo actualmente:</p>
<ul>
<li><a href="https://atareao.es">Atareao</a></li>
<li><a href="https://elblogdelazaro.org">Lazaro</a></li>
<li><a href="https://ugeek.github.io">uGeek</a></li>
</ul>
<p>A parte de que este mundo de la tecnologia y la informatica, es como una <em>caja de bombones</em>, nunca sabes lo que te va a tocar.</p>
<p>Y sobretodo, a ver cuantas de estos puntos de esta lista, se ven cumplidas a finales de este nuevo año 🤞.</p>
<h4 id="referencia">Referencia</h4>
<ul>
<li><a href="https://codeberg.org">Codeberg</a></li>
<li><a href="https://atareao.es">Atareao</a></li>
<li><a href="https://elblogdelazaro.org">Lazaro</a></li>
<li><a href="https://ugeek.github.io">uGeek</a></li>
</ul>]]></content><author><name>VSANTOS</name></author><category term="Blog" /><category term="Blog" /><summary type="html"><![CDATA[Como a buen principio de año y que me gustaria conversar en los siguientes años, es poner un listado de las cosas que me gustaria conseguir este año con referencia a mi servidor, docker, etc… O sea, todo lo que tiene que ver con el mundo de la tecnologia y la informatica.]]></summary></entry><entry><title type="html">Opinión Personal sobre unRaid - Final</title><link href="https://vctrsnts.github.io/debian%20gnu/linux/unraid/2025/01/03/opini%C3%B3n-unraid-final.html" rel="alternate" type="text/html" title="Opinión Personal sobre unRaid - Final" /><published>2025-01-03T00:00:00+00:00</published><updated>2025-01-03T00:00:00+00:00</updated><id>https://vctrsnts.github.io/debian%20gnu/linux/unraid/2025/01/03/opini%C3%B3n-unraid-final</id><content type="html" xml:base="https://vctrsnts.github.io/debian%20gnu/linux/unraid/2025/01/03/opini%C3%B3n-unraid-final.html"><![CDATA[<p>Como primer articulo de este nuevo año, os pongo el articulo final que me faltaba sobre <strong>mi opinión personal - final</strong> con respecto a <strong>unRaid</strong>, pero he estado un poco liado y por eso me he retrasado un poco, pero ahora vamos al articulo final con respecto a lo que <strong>yo</strong> pienso.</p>
<!-- more -->
<p>Recordad, que veniamos de estos 2 articulos sobre <strong>unRaid</strong>:</p>
<ul>
<li><a href="/unraid/2024/06/13/opinion-unraid-1.html" target="_blank">Opinión Personal sobre unRaid - 1</a></li>
<li><a href="/unraid/2024/06/23/opinion-unraid-2.html" target="_blank">Opinión Personal sobre unRaid - 2</a></li>
</ul>
<p>Donde hablaba de lo bueno y de lo malo que yo le he encontrado y si no me han matado los <em>fanboys</em> de unRaid, voy a dar mi opinión final sobre él.</p>
<p>Lo unico bueno que yo le veo es toda la gestión de los HDD que hace el sistema operativo. En pocas palabras, <strong>MergeFS</strong> que creo que es la manera que usa <em>unRaid</em> para la gestión de los HDD es una maravilla. Tambien esta toda la gestión y toda la información que puedes extraer del sistema ( hardware, HDD, network, temperatura, etc… ) pero ya esta. Y claro, en mi caso, me gustaria obtener, no se más cosas de este sistema que te lo <strong>venden</strong> como <em>el màs mejor de todos</em> los Sistemas Operativos para tener tu propio NAS en casa.</p>
<blockquote>
<p>⚠️ Pero os digo una cosa, si yo puediera replicar esta funcionalidad en cualquier servidor que yo pudiera tener, dejaria de lado <em>unRaid</em> y lo haria, pero entiendo que configurar correctamente <strong>MergeFS</strong>, no debe ser tan facil como parece. Repito, que es lo unico positivo que le veo a todo el sistema.</p>
</blockquote>
<p>A parte, de que en algunos momentos, todo el sistema me decepciona un poco, que puede ser porque me falte investigar más todas las funcionalidades / plugins que hay disponibles para instalar, pero eso tambien es un problema que yo le veo. Hay tantas cosas, tantos plugins, tanto de todo que puedes perderte en este mundo y salir de el sintiendo que has perdido el tiempo.</p>
<p>Porque si, hay muchas cosas que te pueden facilitar la vida, pero que tienes que conocerlas y no hay ningun sitio donde explique todas las posibilidades. Muchos me direis que esta la pagina de plugins de <em>unRaid</em> pero de tantas cosas que hay, te pierdes. Es lo mismo que se dice de <em>Debian GNU/Linux</em>. Que es una de las distribuciones con mayor numero de paquetes. Que por un lado es beneficioso, pero por otro lado de tanto que hay te puedes perder en tantos paquetes y no puedes sacar todo el potencial que da. Pues opino lo mismo de <em>unRaid</em>, tiene tantas cosas que, de tantas que tienes no puedes aprovecharlas.</p>
<p>Otra cosa, que no me parece que sea correcto, es que usen el SO <em>Slackware</em> como base para <em>unRaid</em>. Habiendo de mejores, <em>es mi opinión personal</em>, no entiendo, porque usan este, me lo tendrian que explicar. Seguramente tendran algun motivo, pero no se me ocurre cual podria ser. Y aqui si que no voy a meterme de que si <em>Debian, Ubuntu, Gento, Arch, etc</em>, pero algun motivo tiene que haber para esta elección.</p>
<p>Para finalizar y que es lo que me parece la peor manera de trabajar que se puede usar, es que todo el <strong>SO</strong> este instalado en un <em>USB</em>.</p>
<p>Que alguien me explique el motivo de esto. Seguramente me diran de que el <strong>SO</strong> no esta instalado realmente en el USB, sino que cuando se inicia el sistema, se carga el SO del USB a la memoria ram del servidor para asi ganar en velocidad. Ni las Raspberrys funcionan ya de esta manera.</p>
<p>Al principio, y eso que tengo todos los modelos a excepción de la RPI5, si que funcionaban de esta manera, pero habia un monton de problemas porque no estaban pensadas para ese funcionamiento y la gente se las ingenio para dejar unicamente en la SD el sistema de inicio (que no eran más que 3 ficheros) y el resto en el HDD y con eso se ganaba seguridad de que no estropeabas la SD a menos que estuvieras reiniciando el sistema cada 2 x 3.</p>
<p>Y ahora me vienen los de <em>unRaid</em> y me venden la moto de que este es el mejor sistema de funcionamiento. Como que los USB no se diferencian mucho de las tarjetas SD. Vale no rebentaran cuando hayas echo 1.000 escrituras, sino que rebentaran cuando hayas echo 10.000 y entonces todo a tomar viento.</p>
<p>Tanto cuesta, y más ahora que una disco SSD o un nvme estan tirados de precio. Puedes tener 300 HDD conectados a <em>unRaid</em> haciendo de array, pero no puedes tener uno que haga de sistema operativo, con todo los beneficios que con ello comporta. Que alguien me lo explique, porque no lo entiendo.</p>
<p>Para acabarlo de rematar, pero esto es más cuestion a nivel de empresa, todo el follon que montaron con el tema de las licencias, <em>que si ahora son vitalicias, pues ahora ya no, hay perdon, que nos hemos equivocado, nos referiamos a las nuevas, las antiguas seguiran como estaban</em>.</p>
<p>Esto se parecia al <em>camarote de los hermanos marx</em>. Pero claro, hay que entender que son una empresa y que el aire no paga a los empleados. Aqui se equivocaron tanto la empresa como los usuarios. Unos por decir algo que luego no iban a cumplir y los otros por creerse todo lo que les dicen. O los usuarios que se piensan que lo que digan las empresas van a misa y nunca mienten ni engañan?</p>
<p>Porque si piensan de esta manera, ya puedes empezar a dejar de usar cualquier cosa, porque si te pones a pensar, en cualquier momento, algo que la empresa X dijo que seria para toda la vida, luego va y lo cambia porque le va mejor y da igual lo que dijera en su momento. A mi me interesa, pues lo cambio y si ha alguien no le gusta, ya sabe donde esta la puerta. Y ejemplos de este tipo hay a patadas. O no te ha pasado nunca? Porque yo conozco algunos que primero prometieron <strong>el oro y el moro</strong> y luego donde <strong>dije digo, digo diego</strong>.</p>
<blockquote>
<p>⚠️ Hasta aqui mi opinión personal con respecto a <em>unRaid</em>. Como veis es un pequeño resumen de todo lo que ya habia comentado en los 2 anteriores articulos, las cosas buenas y las cosas malas. Vosotros, seguramente pensareis de una manera diferente a la mia o no, pero en eso consiste ser un a persona. Que cada uno piensa de una manera diferente. Y nunca se sabe, a lo mejor mi manera de ver a <em>unRaid</em> cambia, porque voy descubriendo cosas nuevas que hacen que mi visión vaya cambiando. No consiste en eso el aprender?</p>
</blockquote>
<p>Eso si, tengo que dar las gracias a <strong>Lazaro</strong> de <a href="https://elblogdelazaro.org">El blog de Lázaro</a> porque gracias a el, cada dia voy descubriendo cosas nuevas sobre <strong>unRaid</strong> que van haciendo que poco a poco, muy poco a poco, mi opinión vaya cambiando con respecto a algunas cosas, no todas, pero algunas si. <strong>Gracias Lazaro 👏</strong></p>
<h4 id="referencia">Referencia</h4>
<ul>
<li><a href="https://elblogdelazaro.org/posts/2024-12-02-integrar-metricas-de-unraid-en-homepage">Integrar métricas de Unraid en Homepage</a></li>
<li><a href="https://elblogdelazaro.org/posts/2024-07-29-backrest-backups-en-nubes-s3">Backrest, backups en nubes S3</a></li>
<li><a href="https://elblogdelazaro.org/posts/2019-11-28-restic-backups-bien-hechos">Restic: Backups bien hechos</a></li>
</ul>]]></content><author><name>VSANTOS</name></author><category term="Debian GNU/Linux" /><category term="unRAID" /><category term="Debian GNU/Linux" /><category term="unRAID" /><summary type="html"><![CDATA[Como primer articulo de este nuevo año, os pongo el articulo final que me faltaba sobre mi opinión personal - final con respecto a unRaid, pero he estado un poco liado y por eso me he retrasado un poco, pero ahora vamos al articulo final con respecto a lo que yo pienso.]]></summary></entry><entry><title type="html">Nuevo sitio web</title><link href="https://vctrsnts.github.io/blog/2024/12/23/nueva-web.html" rel="alternate" type="text/html" title="Nuevo sitio web" /><published>2024-12-23T00:00:00+00:00</published><updated>2024-12-23T00:00:00+00:00</updated><id>https://vctrsnts.github.io/blog/2024/12/23/nueva-web</id><content type="html" xml:base="https://vctrsnts.github.io/blog/2024/12/23/nueva-web.html"><![CDATA[<p>Que no cunda el panico ante el titulo de este articulo.</p>
<p>No voy a hacer ningun cambio en este web ni voy a borrarlo todo e irme de hermitaño a una cueva 🤣</p>
<p>Solamente es para informar, que como tenia <strong>wordpress</strong> una pagina web donde iba subiendo los libros que he ido leyendo durante estos años, pues …</p>
<!-- more -->
<p>De la misma manera que me paso antes, cuando di el salto a <strong>GitHub</strong> para tener un poco más de control sobre la web, más que <em>wordpress</em> seguro que lo tengo, pues he hecho lo mismo pero esta vez en <strong>GitLab</strong>.</p>
<p>A parte de toda la creación de los articulos, donde sigo usando <strong>Jekyll</strong> para la generación del sitio estatico, tambien me ha servido para aprender como es el funcionamiento de <strong>GitLab</strong>. Eso si, tengo que decir que es muy diferente a <strong>GitHub</strong> en todo, o en casi todo.</p>
<p>Lo veo todo más lioso y más confuso, me resulto más facil <strong>GitHub</strong>, pero eso si tengo que decir que los <a href="https://elblogdelazaro.org/search/?q=GitLab" target="_blank">articulos</a> de <strong>Lazaro</strong> me sirvieron de punta de lanza para resolver todas las dudas que me iban surgiendo con respecto a funcionamiento y creación de un sitio en <strong>GitLab</strong>.</p>
<p>De nuevo <strong>gracias Lazaro por tus articulos</strong>.</p>
<p>Tambien, tengo que decir que me apoye en <strong>Copilot</strong> (y tengo que decir que me ayudo más que <strong>ChatGPT</strong>), para crear un script que me facilitara el proceso de subir los archivos a mi repositorio, porque siempre lo he encontrado tedioso y complicado.</p>
<p>El script que estoy usando actualmente para subir los archivos resultantes de mi sitio a <strong>GitLab</strong>:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c">#!/bin/bash</span>
<span class="c"># Up2GitLab 0.2</span>
<span class="c"># Actualitzar facil i rapidament el teu repositori de GitLab</span>
<span class="c"># (CC) 2024 Victor Santos</span>
<span class="c"># https://vctrsnts.github.io</span>
<span class="c"># Bajo licencia GNU/GPL</span>
<span class="c"># Mode de fer servir: executal de la següent manera:</span>
<span class="c"># sh up2GitLab.sh</span>
<span class="c"># Actualitzacio del public key amb GitLab perque sempre tenia problemes amb la key</span>
<span class="nb">eval</span> <span class="s2">"</span><span class="si">$(</span>ssh-agent <span class="nt">-s</span><span class="si">)</span><span class="s2">"</span>
ssh-add /root/.ssh/idKeyGitLab
<span class="c"># Validació de que estem 'conectats' a gitlab</span>
ssh <span class="nt">-T</span> [email protected]
<span class="nb">sleep </span>10
<span class="c"># A traves de Docker, actualitzem el fitxer RSS</span>
<span class="c"># docker exec jekyll_book bundle exec jekyll build</span>
<span class="c"># cp ../Gemfile .</span>
docker <span class="nb">exec </span>jekyll_book bundle <span class="nb">exec </span>jekyll build
<span class="nb">sleep </span>10
<span class="nb">cp</span> ../Gemfile <span class="nb">.</span>
<span class="c"># Solicita el mensaje del commit</span>
<span class="nb">read</span> <span class="nt">-p</span> <span class="s2">"Introduce el mensaje del commit: "</span> commit_message
<span class="nb">rm</span> <span class="nt">-rf</span> .fuse<span class="k">*</span>
<span class="c"># Asegúrate de estar en el directorio del repositorio</span>
<span class="nv">repo_dir</span><span class="o">=</span><span class="s2">"directori on esta el _site de jekyll"</span>
<span class="nb">cd</span> <span class="s2">"</span><span class="nv">$repo_dir</span><span class="s2">"</span> <span class="o">||</span> <span class="o">{</span> <span class="nb">echo</span> <span class="s2">"Directorio del repositorio no encontrado"</span><span class="p">;</span> <span class="nb">exit </span>1<span class="p">;</span> <span class="o">}</span>
<span class="c"># Establecer el repositorio remoto (opcional, si no está ya configurado)</span>
<span class="nv">remote_repo</span><span class="o">=</span><span class="s2">"el teu repositori de GitLab"</span>
git remote add origin <span class="s2">"</span><span class="nv">$remote_repo</span><span class="s2">"</span> 2>/dev/null
<span class="c"># Configurar la reconciliación de ramas divergentes</span>
git config <span class="nt">--global</span> pull.rebase <span class="nb">false</span>
<span class="c"># Añade todos los cambios al índice</span>
<span class="k">if</span> <span class="o">!</span> git add .<span class="p">;</span> <span class="k">then
</span><span class="nb">echo</span> <span class="s2">"Error al añadir cambios"</span>
<span class="nb">exit </span>1
<span class="k">fi</span>
<span class="c"># Realiza el commit amb el següent missatge</span>
<span class="k">if</span> <span class="o">!</span> git commit <span class="nt">-m</span> <span class="s2">"</span><span class="nv">$commit_message</span><span class="s2">"</span><span class="p">;</span> <span class="k">then
</span><span class="nb">echo</span> <span class="s2">"Error al realitzar el commit. Verifica que hi hagi canvis per pujar."</span>
<span class="nb">exit </span>1
<span class="k">fi</span>
<span class="c"># Realiza el push a la rama master</span>
<span class="k">if</span> <span class="o">!</span> git push origin main <span class="nt">--force</span><span class="p">;</span> <span class="k">then
</span><span class="nb">echo</span> <span class="s2">"Error al realitzar el push a la rama master"</span>
<span class="nb">exit </span>1
<span class="k">fi</span>
<span class="c"># Registre dactivitats</span>
<span class="nv">log_file</span><span class="o">=</span><span class="s2">"</span><span class="nv">$repo_dir</span><span class="s2">/push_log.txt"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="si">$(</span><span class="nb">date</span><span class="si">)</span><span class="s2">: Commit realitzat amb el missatge '</span><span class="nv">$commit_message</span><span class="s2">' i push a la rama master"</span> <span class="o">>></span> <span class="s2">"</span><span class="nv">$log_file</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"Canvis pujats amb exit a la rama master."</span>
</code></pre></div></div>
<p>Algunos os chocara el porque añado la <strong>key</strong> momentos antes de hacer el <em>push</em>, esto lo hago, porque como tengo a parte del repositorio de <strong>GitLab</strong> tambien tengo el repositorio de <strong>GitHub</strong> y a veces el sistema se volvia loco, no he encontrado explicación a esto, prefiero hacerlo de esta manera y asi me evito problemas y mezclo los ficheros entre los diferentes sitios. No tendria que pasar, pero nunca se sabe. Los caminos del señor son inescrutables 😇.</p>
<p>Asi mismo, tambien tengo un <code class="language-plaintext highlighter-rouge">sleep 10</code> porque de esa manera evito que a la hora de actualitzar mi repositorio me suba un ficher <code class="language-plaintext highlighter-rouge">.fuse*</code> a <strong>GitLab</strong>, pero no funciona del todo bien. Esto es debido, a que antes de actualizar el repositorio, ejecuto <code class="language-plaintext highlighter-rouge">docker exec jekyll_book bundle exec jekyll build</code> para regenerar los siguientes ficheros:</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">feed.xml</code></li>
<li><code class="language-plaintext highlighter-rouge">sitemap.xml</code></li>
<li><code class="language-plaintext highlighter-rouge">robots.txt</code></li>
</ul>
<p>Con la dirección correcta del sitio, porque sino, a la hora de subirlo al repositorio, me lo subia con la ip por defecto de <strong>Jekyll</strong>, que no es otra que <em>http://0.0.0.0:4000</em> y de esta manera, es lo que he encontrado yo, pone la correcta.</p>
<p>Con este script, subo los archivos al repositorio de <strong>GitLab</strong>, espero los 5 minutos de rigor para que se actulize el sistema y ya lo tengo todo actualizado y listo para visitar.</p>
<p>Además como tambien tiene el feed que junto al script que podeis encontrar en este <a href="/debian%20gnu/linux/python/2024/12/10/publicar-redes-sociales.html" target="_blank">articulo</a> voy publicando, eso si en <a href="https://www.tumblr.com/vctrsnts" target="_blank">Tumblr</a>, para no mezclar articulos de diferentes tematicas (informatica, tecnologia, etc..) con los articulos de los libros en Mastodon. Eso si, tengo que pensar si los publico en <a href="https://bsky.app/profile/vctrsnts.bsky.social" target="_blank">BlueSky</a> o no que es más como un <strong>Twitter - X</strong> pero en sus comienzos. A ver cuanto dura.</p>
<p>Y después de todo esto, <a href="https://vctrsnts.gitlab.io" target="_blank">aqui</a> podeis encontrar la nueva pagina web donde voy colgando los libros que he leido.</p>
<blockquote>
<p>Antes de nada, avisar que la web, esta en <strong>Catalán</strong>. Se que un sitio de este estilo, ya de por si, tendra pocas visitas y aun menos si esta en catalán. Y hasta aqui puedo leer, porque sino me encenderia y este no es ni el lugar para eso 🤬 🔥.</p>
</blockquote>
<p>Espero que os sea de utilidad y encontreis libros que os gusten y que yo ya he leido. Si teneis dudas, podeis contactar conmigo, para preguntar sobre alguno en concreto.</p>
<blockquote>
<p>Aun me faltan por añadir unos cuantos más. Es lo malo que tiene de ir a trabajar en Rodalies / Renfe, que tienes mucho tiempo libre 🤣.</p>
</blockquote>
<h4 id="referencia">Referencia</h4>
<ul>
<li><a href="https://elblogdelazaro.org/posts/2018-12-10-sitio-web-estatico-gitlab" target="_blank">Cómo crear un sitio web estático en Gitlab Pages</a></li>
<li><a href="https://elblogdelazaro.org/posts/2017-09-23-jekyll-y-gitlab" target="_blank">Como crear un blog con Jekyll y Gitlab Pages</a></li>
<li><a href="https://vctrsnts.gitlab.io" target="_blank">Parlem de llibres</a></li>
</ul>]]></content><author><name>VSANTOS</name></author><category term="Blog" /><category term="Blog" /><summary type="html"><![CDATA[Que no cunda el panico ante el titulo de este articulo. No voy a hacer ningun cambio en este web ni voy a borrarlo todo e irme de hermitaño a una cueva 🤣 Solamente es para informar, que como tenia wordpress una pagina web donde iba subiendo los libros que he ido leyendo durante estos años, pues …]]></summary></entry><entry><title type="html">Mis aplicaciones por defecto 2024</title><link href="https://vctrsnts.github.io/debian%20gnu/linux/2024/12/11/mis-aplicaciones-2024.html" rel="alternate" type="text/html" title="Mis aplicaciones por defecto 2024" /><published>2024-12-11T00:00:00+00:00</published><updated>2024-12-11T00:00:00+00:00</updated><id>https://vctrsnts.github.io/debian%20gnu/linux/2024/12/11/mis-aplicaciones-2024</id><content type="html" xml:base="https://vctrsnts.github.io/debian%20gnu/linux/2024/12/11/mis-aplicaciones-2024.html"><![CDATA[<p>Siguiendo la iniciativa de <a href="https://elblogdelazaro.org/posts/2024-12-09-mis-aplicaciones-por-defecto-2024" target="_blank">Lazaro</a>, pues tambien pondre mi granito de arena a esta buena idea, porque asi, la gente puede descubrir nuevas aplicaciones que nunca habrias pensado que existieran, y de esta manera, pues…</p>
<!-- more -->
<p>Y es lo que me pasa a mi, que gracias a estos listados, descubro nuevas cosas que me son utiles y que por mi cuenta, nunca habria pensado en ello.</p>
<p>Pero en mi caso, si que se puede decir que son las aplicaciones del 2024, porque un poco más y escribo este articulo en el 2025 😁</p>
<p>Pues aqui esta mi lista:</p>
<ul>
<li>📮 Servidor de correo: Riseup y Google Mail</li>
<li>📨 Cliente de correo: Claws Mail (en escritorio) y K9-Mail (Pixel)</li>
<li>📸 Camara de fotos: Camara del Pixel</li>
<li>🖼️ Gestor de fotos: Immich (autoalojado) y que descubri hace poco gracias a <a href="https://elblogdelazaro.org/posts/2024-11-18-marcos-de-fotos-digitales-con-immich-kiosk">Lazaro</a></li>
<li>🗃️ Copias de seguridad: Backrest y restic (autoalojado) y que descubri gracias a <a href="https://elblogdelazaro.org/posts/2024-06-24-backrest-una-interfaz-web-para-restic-backup">Lazaro</a></li>
<li>🔎 Navegador: Librewolf</li>
<li>💬 Chat: Telegram y WhatsApp</li>
<li>📝 Editor de texto: Geany</li>
<li>🎞️ Ver después: MPlayer o Libreelec (HTC)</li>
<li>☁️ Almacenamiento en la nube: el espacio que me da mi servidor (unRaid)</li>
<li>🎧 Musica: Navidrome (autoalojado), Sonixd (en escritorio) y Tempo (Pixel)</li>
<li>📻 Podcast: AnntenaPod</li>
<li>🔐 Gestor de contraseñas: Bitwarden</li>
<li>📓 Gestión del blog: Geany (Jekyll)</li>
</ul>
<p>Pues este es mi primer articulo de este estilo.</p>
<p>A ver si el año que viene tambien le doy continuación a este tipo de articulos, que considero que son buenos, porque gracias a ellos, la gente puede descubrir nuevas aplicaciones.</p>
<h4 id="referencia">Referencia</h4>
<ul>
<li><a href="https://elblogdelazaro.org/posts/2024-12-09-mis-aplicaciones-por-defecto-2024" target="_blank">Mis aplicaciones por defecto 2024</a></li>
<li><a href="https://thecheis.com/2023/12/05/mis-aplicaciones-por-defecto-en-2023" target="_blank">Mis aplicaciones por defecto en 2023</a></li>
<li><a href="https://elblogdelazaro.org/posts/2024-11-18-marcos-de-fotos-digitales-con-immich-kiosk" target="_blank">Marcos de fotos digitales con Immich Kiosk</a></li>
<li><a href="https://elblogdelazaro.org/posts/2024-06-24-backrest-una-interfaz-web-para-restic-backup" target="_blank">Backrest, una interfaz Web para Restic Backup</a></li>
</ul>]]></content><author><name>VSANTOS</name></author><category term="Debian GNU/Linux" /><category term="Debian GNU/Linux" /><summary type="html"><![CDATA[Siguiendo la iniciativa de Lazaro, pues tambien pondre mi granito de arena a esta buena idea, porque asi, la gente puede descubrir nuevas aplicaciones que nunca habrias pensado que existieran, y de esta manera, pues…]]></summary></entry><entry><title type="html">Publicando nuevos articulos en RRSS</title><link href="https://vctrsnts.github.io/debian%20gnu/linux/python/2024/12/10/publicar-redes-sociales.html" rel="alternate" type="text/html" title="Publicando nuevos articulos en RRSS" /><published>2024-12-10T00:00:00+00:00</published><updated>2024-12-10T00:00:00+00:00</updated><id>https://vctrsnts.github.io/debian%20gnu/linux/python/2024/12/10/publicar-redes-sociales</id><content type="html" xml:base="https://vctrsnts.github.io/debian%20gnu/linux/python/2024/12/10/publicar-redes-sociales.html"><![CDATA[<p>Este nuevo articulo, se puede decir que es la fusión de este <a href="/debian%20gnu/linux/python/2022/11/14/publicar-feed-mastodon.html" target="_blank">articulo</a> y este <a href="/debian%20gnu/linux/python/2024/11/12/publicar-feed-tumblr.html" target="_blank">otro</a> donde explicaba como dar publicidad o informar en las diferentes redes sociales que estoy, <strong>Mastodon</strong>, <strong>Tumblr</strong> y ahora <strong>BlueSky</strong> de los articulos nuevos que voy añadiendo asi como de los antiguos, porque nunca se sabe si algun articulo anterior puede servir de ayuda a alguna persona.</p>
<!-- more -->
<p>Pero después del anuncio que hizo <strong>@Yoyo308</strong> de que se habia apuntado en la nueva red social llamada <a href="https://bsky.app" target="_blank">BlueSky</a> que quiere llegar a ser como la antigua <strong>Twitter</strong> o la nueva <strong>X</strong>. Eso si, espero que no se convierta en lo mismo que es ahora <strong>X</strong>. Lo hice, solamente para <em>reservar</em> mi nombre de usuario.</p>
<p>Eso si, tambien os digo, que la unica que uso actualmente es <strong>Mastodon</strong>. Esto lo digo con conocimiento de causa, porque hace un mes intente volver a <strong>X</strong> y solo dure una semana, todo era 💩. Para que os hagais una idea, una porqueriza esta más limpio que <strong>X</strong>.</p>
<p>Por el mismo motivo tambien me di de alta en <a href="https://www.tumblr.com/vctrsnts" target="_blank">tumblr</a>, prefiero tener el nombre que yo quiero y asi luego no arrepentirme. Ya me paso con <strong>X</strong> y no quiero que me pase lo mismo.</p>
<p>Despues de haberos pegado la chapa con esta explicación, vayamos a por lo importante, porque tengo la sensación de que este articulo sera un poco largo, el script que ahora mismo estoy utilizando para informar de antiguos <strong>articulos articulos</strong> que tengo en mi web para su consulta, pero en este caso, para las 3 redes sociales y a la vez. Se puede decir que es la unión del script de <a href="https://elblogdelazaro.org/posts/2021-08-16-bot-en-python-para-publicar-un-feed-de-forma-aleatorios-en-twitter-y-mastodom">mastodon</a> que nos brindo <a href="https://elblogdelazaro.org">Lazaro</a> pero ampliado, para que funcione tambien en <strong>BlueSky</strong> y <strong>Tumblr</strong> y con mis granitos de sal junto con el condimento de <a href="https://copilot.microsoft.com/onboarding">Copilot</a>, que tengo que decir, que para aclarar dudas y dar ideas nuevas para programar va mejor que <a href="https://chatgpt.com">ChatGpt</a>, me ha salido un script en <em>Python</em> muy majo.</p>
<p>El script en cuestión es el siguiente:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Aquest script, llegeix el FEED RSS del teu blog i publicat un article de forma aleatoria ( Mastodon, Tumblr, BlueSky )
#
# Tens que tindra instalats els següents paquets de python:
# - os
# - feedparser
# - random
# - requests
# - atproto
# - mastodon
# - pytumblr
# - python-dotenv
#
# Modificat per: Victor Santos
# Web: https://vctrsnts.github.io
#
</span><span class="kn">import</span> <span class="n">os</span>
<span class="kn">import</span> <span class="n">random</span>
<span class="kn">import</span> <span class="n">requests</span>
<span class="kn">import</span> <span class="n">feedparser</span>
<span class="kn">from</span> <span class="n">atproto</span> <span class="kn">import</span> <span class="n">Client</span> <span class="k">as</span> <span class="n">BskyClient</span><span class="p">,</span> <span class="n">models</span> <span class="k">as</span> <span class="n">BskyModels</span>
<span class="kn">from</span> <span class="n">mastodon</span> <span class="kn">import</span> <span class="n">Mastodon</span>
<span class="kn">import</span> <span class="n">pytumblr</span>
<span class="kn">from</span> <span class="n">dotenv</span> <span class="kn">import</span> <span class="n">load_dotenv</span>
<span class="k">def</span> <span class="nf">load_environment_variables</span><span class="p">():</span>
<span class="c1"># CARREGA LES VARIABLE D'ENTORN DES DE EL FITXER GENERAL
</span> <span class="nf">load_dotenv</span><span class="p">()</span>
<span class="k">return</span> <span class="p">{</span>
<span class="sh">'</span><span class="s">bsky_user</span><span class="sh">'</span><span class="p">:</span> <span class="n">os</span><span class="p">.</span><span class="nf">getenv</span><span class="p">(</span><span class="sh">'</span><span class="s">BSKY_USER</span><span class="sh">'</span><span class="p">,</span> <span class="bp">False</span><span class="p">),</span>
<span class="sh">'</span><span class="s">bsky_pass</span><span class="sh">'</span><span class="p">:</span> <span class="n">os</span><span class="p">.</span><span class="nf">getenv</span><span class="p">(</span><span class="sh">'</span><span class="s">BSKY_PASS</span><span class="sh">'</span><span class="p">,</span> <span class="sh">""</span><span class="p">),</span>
<span class="sh">'</span><span class="s">mastodon_token</span><span class="sh">'</span><span class="p">:</span> <span class="n">os</span><span class="p">.</span><span class="nf">getenv</span><span class="p">(</span><span class="sh">'</span><span class="s">MASTODON_TOKEN</span><span class="sh">'</span><span class="p">),</span>
<span class="sh">'</span><span class="s">mastodon_url</span><span class="sh">'</span><span class="p">:</span> <span class="n">os</span><span class="p">.</span><span class="nf">getenv</span><span class="p">(</span><span class="sh">'</span><span class="s">MASTODON_URL</span><span class="sh">'</span><span class="p">),</span>
<span class="sh">'</span><span class="s">consumer_key</span><span class="sh">'</span><span class="p">:</span> <span class="n">os</span><span class="p">.</span><span class="nf">getenv</span><span class="p">(</span><span class="sh">'</span><span class="s">CONSUMER_KEY</span><span class="sh">'</span><span class="p">),</span>
<span class="sh">'</span><span class="s">consumer_secret</span><span class="sh">'</span><span class="p">:</span> <span class="n">os</span><span class="p">.</span><span class="nf">getenv</span><span class="p">(</span><span class="sh">'</span><span class="s">CONSUMER_SECRET</span><span class="sh">'</span><span class="p">),</span>
<span class="sh">'</span><span class="s">oauth_token</span><span class="sh">'</span><span class="p">:</span> <span class="n">os</span><span class="p">.</span><span class="nf">getenv</span><span class="p">(</span><span class="sh">'</span><span class="s">OAUTH_TOKEN</span><span class="sh">'</span><span class="p">),</span>
<span class="sh">'</span><span class="s">oauth_secret</span><span class="sh">'</span><span class="p">:</span> <span class="n">os</span><span class="p">.</span><span class="nf">getenv</span><span class="p">(</span><span class="sh">'</span><span class="s">OAUTH_SECRET</span><span class="sh">'</span><span class="p">),</span>
<span class="sh">'</span><span class="s">feed_url</span><span class="sh">'</span><span class="p">:</span> <span class="n">os</span><span class="p">.</span><span class="nf">getenv</span><span class="p">(</span><span class="sh">'</span><span class="s">FEED_URL</span><span class="sh">'</span><span class="p">),</span>
<span class="sh">'</span><span class="s">image_url</span><span class="sh">'</span><span class="p">:</span> <span class="n">os</span><span class="p">.</span><span class="nf">getenv</span><span class="p">(</span><span class="sh">'</span><span class="s">IMAGE_URL</span><span class="sh">'</span><span class="p">),</span>
<span class="sh">'</span><span class="s">blog_name</span><span class="sh">'</span><span class="p">:</span> <span class="n">os</span><span class="p">.</span><span class="nf">getenv</span><span class="p">(</span><span class="sh">'</span><span class="s">BLOG_NAME</span><span class="sh">'</span><span class="p">),</span>
<span class="sh">'</span><span class="s">postBsky</span><span class="sh">'</span><span class="p">:</span> <span class="n">os</span><span class="p">.</span><span class="nf">getenv</span><span class="p">(</span><span class="sh">'</span><span class="s">POST_TO_BSKY</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">false</span><span class="sh">'</span><span class="p">).</span><span class="nf">lower</span><span class="p">()</span> <span class="o">==</span> <span class="sh">'</span><span class="s">true</span><span class="sh">'</span><span class="p">,</span>
<span class="sh">'</span><span class="s">postMastodon</span><span class="sh">'</span><span class="p">:</span> <span class="n">os</span><span class="p">.</span><span class="nf">getenv</span><span class="p">(</span><span class="sh">'</span><span class="s">POST_TO_MASTODON</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">false</span><span class="sh">'</span><span class="p">).</span><span class="nf">lower</span><span class="p">()</span> <span class="o">==</span> <span class="sh">'</span><span class="s">true</span><span class="sh">'</span><span class="p">,</span>
<span class="sh">'</span><span class="s">postTumblr</span><span class="sh">'</span><span class="p">:</span> <span class="n">os</span><span class="p">.</span><span class="nf">getenv</span><span class="p">(</span><span class="sh">'</span><span class="s">POST_TO_TUMBLR</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">false</span><span class="sh">'</span><span class="p">).</span><span class="nf">lower</span><span class="p">()</span> <span class="o">==</span> <span class="sh">'</span><span class="s">true</span><span class="sh">'</span>
<span class="p">}</span>
<span class="k">def</span> <span class="nf">fetch_feed_entries</span><span class="p">(</span><span class="n">feed_url</span><span class="p">):</span>
<span class="c1"># LLEGEIX EL FEED I ENS RETORNAR ELS ITEMS DEL FEED
</span> <span class="n">feed</span> <span class="o">=</span> <span class="n">feedparser</span><span class="p">.</span><span class="nf">parse</span><span class="p">(</span><span class="n">feed_url</span><span class="p">)</span>
<span class="k">return</span> <span class="n">feed</span><span class="p">.</span><span class="n">entries</span><span class="p">,</span> <span class="n">feed</span><span class="p">.</span><span class="n">feed</span><span class="p">.</span><span class="n">title</span>
<span class="k">def</span> <span class="nf">select_random_item</span><span class="p">(</span><span class="n">entries</span><span class="p">):</span>
<span class="c1"># ES SELECCIONAR UN ARTICLE ALEATORI
</span> <span class="k">return</span> <span class="n">random</span><span class="p">.</span><span class="nf">choice</span><span class="p">(</span><span class="n">entries</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">fetch_image_data</span><span class="p">(</span><span class="n">image_url</span><span class="p">):</span>
<span class="c1"># OBTENIM DADES DE LA IMATGE DE LA URL
</span> <span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">image_url</span><span class="p">)</span>
<span class="n">response</span><span class="p">.</span><span class="nf">raise_for_status</span><span class="p">()</span>
<span class="k">return</span> <span class="n">response</span><span class="p">.</span><span class="n">content</span>
<span class="k">def</span> <span class="nf">post_to_bluesky</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">feed_url</span><span class="p">,</span> <span class="n">image_url</span><span class="p">):</span>
<span class="n">client</span> <span class="o">=</span> <span class="nc">BskyClient</span><span class="p">()</span>
<span class="n">client</span><span class="p">.</span><span class="nf">login</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span>
<span class="n">entries</span><span class="p">,</span> <span class="n">feed_title</span> <span class="o">=</span> <span class="nf">fetch_feed_entries</span><span class="p">(</span><span class="n">feed_url</span><span class="p">)</span>
<span class="n">item</span> <span class="o">=</span> <span class="nf">select_random_item</span><span class="p">(</span><span class="n">entries</span><span class="p">)</span>
<span class="n">titulo</span> <span class="o">=</span> <span class="n">item</span><span class="p">.</span><span class="n">title</span>
<span class="n">uri</span> <span class="o">=</span> <span class="n">item</span><span class="p">.</span><span class="n">link</span>
<span class="n">img_data</span> <span class="o">=</span> <span class="nf">fetch_image_data</span><span class="p">(</span><span class="n">image_url</span><span class="p">)</span>
<span class="n">thumb</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="nf">upload_blob</span><span class="p">(</span><span class="n">img_data</span><span class="p">)</span>
<span class="n">embed</span> <span class="o">=</span> <span class="n">BskyModels</span><span class="p">.</span><span class="n">AppBskyEmbedExternal</span><span class="p">.</span><span class="nc">Main</span><span class="p">(</span>
<span class="n">external</span><span class="o">=</span><span class="n">BskyModels</span><span class="p">.</span><span class="n">AppBskyEmbedExternal</span><span class="p">.</span><span class="nc">External</span><span class="p">(</span>
<span class="n">title</span><span class="o">=</span><span class="n">feed_title</span><span class="p">,</span>
<span class="n">description</span><span class="o">=</span><span class="n">titulo</span><span class="p">,</span>
<span class="n">uri</span><span class="o">=</span><span class="n">uri</span><span class="p">,</span>
<span class="n">thumb</span><span class="o">=</span><span class="n">thumb</span><span class="p">.</span><span class="n">blob</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="n">client</span><span class="p">.</span><span class="nf">send_post</span><span class="p">(</span><span class="sh">'</span><span class="s">Recordant articles ja publicats:</span><span class="sh">'</span><span class="p">,</span> <span class="n">embed</span><span class="o">=</span><span class="n">embed</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">fetch_random_article</span><span class="p">(</span><span class="n">feed_url</span><span class="p">):</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">feedparser</span><span class="p">.</span><span class="nf">parse</span><span class="p">(</span><span class="n">feed_url</span><span class="p">)</span>
<span class="n">feedlen</span> <span class="o">=</span> <span class="nf">len</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="sh">'</span><span class="s">entries</span><span class="sh">'</span><span class="p">])</span>
<span class="n">num</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="nf">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">feedlen</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">entry</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="sh">'</span><span class="s">entries</span><span class="sh">'</span><span class="p">][</span><span class="n">num</span><span class="p">]</span>
<span class="n">title</span> <span class="o">=</span> <span class="n">entry</span><span class="p">[</span><span class="sh">'</span><span class="s">title</span><span class="sh">'</span><span class="p">]</span>
<span class="n">link</span> <span class="o">=</span> <span class="n">entry</span><span class="p">[</span><span class="sh">'</span><span class="s">link</span><span class="sh">'</span><span class="p">]</span>
<span class="n">summary</span> <span class="o">=</span> <span class="n">entry</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">summary</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">)</span>
<span class="n">tags</span> <span class="o">=</span> <span class="p">[</span><span class="n">tag</span><span class="p">.</span><span class="n">term</span> <span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">entry</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">tags</span><span class="sh">'</span><span class="p">,</span> <span class="p">[])]</span>
<span class="k">return</span> <span class="n">title</span><span class="p">,</span> <span class="n">link</span><span class="p">,</span> <span class="n">summary</span><span class="p">,</span> <span class="n">tags</span>
<span class="k">def</span> <span class="nf">post_to_mastodon</span><span class="p">(</span><span class="n">token</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">feed_url</span><span class="p">):</span>
<span class="n">mastodon</span> <span class="o">=</span> <span class="nc">Mastodon</span><span class="p">(</span><span class="n">access_token</span><span class="o">=</span><span class="n">token</span><span class="p">,</span> <span class="n">api_base_url</span><span class="o">=</span><span class="n">url</span><span class="p">)</span>
<span class="n">title</span><span class="p">,</span> <span class="n">link</span><span class="p">,</span> <span class="n">summary</span><span class="p">,</span> <span class="n">tags</span> <span class="o">=</span> <span class="nf">fetch_random_article</span><span class="p">(</span><span class="n">feed_url</span><span class="p">)</span>
<span class="n">status</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Recordant articles ja publicats:</span><span class="se">\n</span><span class="si">{</span><span class="n">title</span><span class="si">}</span><span class="se">\n</span><span class="si">{</span><span class="n">link</span><span class="si">}</span><span class="sh">"</span>
<span class="n">mastodon</span><span class="p">.</span><span class="nf">status_post</span><span class="p">(</span><span class="n">status</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">authenticate_tumblr</span><span class="p">(</span><span class="n">client_vars</span><span class="p">):</span>
<span class="n">client</span> <span class="o">=</span> <span class="n">pytumblr</span><span class="p">.</span><span class="nc">TumblrRestClient</span><span class="p">(</span>
<span class="n">client_vars</span><span class="p">[</span><span class="sh">'</span><span class="s">consumer_key</span><span class="sh">'</span><span class="p">],</span>
<span class="n">client_vars</span><span class="p">[</span><span class="sh">'</span><span class="s">consumer_secret</span><span class="sh">'</span><span class="p">],</span>
<span class="n">client_vars</span><span class="p">[</span><span class="sh">'</span><span class="s">oauth_token</span><span class="sh">'</span><span class="p">],</span>
<span class="n">client_vars</span><span class="p">[</span><span class="sh">'</span><span class="s">oauth_secret</span><span class="sh">'</span><span class="p">]</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">client</span>
<span class="k">def</span> <span class="nf">create_tumblr_post</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">blog_name</span><span class="p">,</span> <span class="n">feed_url</span><span class="p">):</span>
<span class="n">title</span><span class="p">,</span> <span class="n">link</span><span class="p">,</span> <span class="n">summary</span><span class="p">,</span> <span class="n">tags</span> <span class="o">=</span> <span class="nf">fetch_random_article</span><span class="p">(</span><span class="n">feed_url</span><span class="p">)</span>
<span class="n">description</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s"><strong>Recordant articles ja publicats:</strong><br></span><span class="si">{</span><span class="n">summary</span><span class="si">}</span><span class="sh">"</span>
<span class="n">client</span><span class="p">.</span><span class="nf">create_link</span><span class="p">(</span>
<span class="n">blog_name</span><span class="p">,</span>
<span class="n">title</span><span class="o">=</span><span class="n">title</span><span class="p">,</span>
<span class="n">url</span><span class="o">=</span><span class="n">link</span><span class="p">,</span>
<span class="n">description</span><span class="o">=</span><span class="n">description</span><span class="p">,</span>
<span class="n">tags</span><span class="o">=</span><span class="n">tags</span>
<span class="p">)</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
<span class="n">env_vars</span> <span class="o">=</span> <span class="nf">load_environment_variables</span><span class="p">()</span>
<span class="k">if</span> <span class="n">env_vars</span><span class="p">[</span><span class="sh">'</span><span class="s">postBsky</span><span class="sh">'</span><span class="p">]:</span>
<span class="nf">post_to_bluesky</span><span class="p">(</span><span class="n">env_vars</span><span class="p">[</span><span class="sh">'</span><span class="s">bsky_user</span><span class="sh">'</span><span class="p">],</span> <span class="n">env_vars</span><span class="p">[</span><span class="sh">'</span><span class="s">bsky_pass</span><span class="sh">'</span><span class="p">],</span> <span class="n">env_vars</span><span class="p">[</span><span class="sh">'</span><span class="s">feed_url</span><span class="sh">'</span><span class="p">],</span> <span class="n">env_vars</span><span class="p">[</span><span class="sh">'</span><span class="s">image_url</span><span class="sh">'</span><span class="p">])</span>
<span class="k">if</span> <span class="n">env_vars</span><span class="p">[</span><span class="sh">'</span><span class="s">postMastodon</span><span class="sh">'</span><span class="p">]:</span>
<span class="nf">post_to_mastodon</span><span class="p">(</span><span class="n">env_vars</span><span class="p">[</span><span class="sh">'</span><span class="s">mastodon_token</span><span class="sh">'</span><span class="p">],</span> <span class="n">env_vars</span><span class="p">[</span><span class="sh">'</span><span class="s">mastodon_url</span><span class="sh">'</span><span class="p">],</span> <span class="n">env_vars</span><span class="p">[</span><span class="sh">'</span><span class="s">feed_url</span><span class="sh">'</span><span class="p">])</span>
<span class="k">if</span> <span class="n">env_vars</span><span class="p">[</span><span class="sh">'</span><span class="s">postTumblr</span><span class="sh">'</span><span class="p">]:</span>
<span class="n">client</span> <span class="o">=</span> <span class="nf">authenticate_tumblr</span><span class="p">(</span><span class="n">env_vars</span><span class="p">)</span>
<span class="nf">create_tumblr_post</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">env_vars</span><span class="p">[</span><span class="sh">'</span><span class="s">blog_name</span><span class="sh">'</span><span class="p">],</span> <span class="n">env_vars</span><span class="p">[</span><span class="sh">'</span><span class="s">feed_url</span><span class="sh">'</span><span class="p">])</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="sh">"</span><span class="s">__main__</span><span class="sh">"</span><span class="p">:</span>
<span class="nf">main</span><span class="p">()</span>
</code></pre></div></div>
<p>A continuación, os explico lo que hace cada función ( más o menos ):</p>
<h4 id="main">main()</h4>
<p>Función de inició y la que se encarga de:</p>
<ul>
<li>Cargar las variables del fichero general <code class="language-plaintext highlighter-rouge">load_environment_variables()</code></li>
<li>Verifica si <code class="language-plaintext highlighter-rouge">postBsky</code>, <code class="language-plaintext highlighter-rouge">postMastodon</code>, <code class="language-plaintext highlighter-rouge">postTumblr</code> es <code class="language-plaintext highlighter-rouge">true</code>, porque si es <code class="language-plaintext highlighter-rouge">false</code>, la función de postear un mensaje en la red social correspondiente (Mastodon, Tumblr o BlueSky), no se ejecutaria.</li>
</ul>
<h4 id="create_tumblr_postclient-blog_name-feed_url">create_tumblr_post(client, blog_name, feed_url)</h4>
<p>Función que se encarga de enviar un post a <strong>Tumblr</strong>, necesita:</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">Client</code>, la conexión con <strong>Tumblr</strong>.</li>
<li><code class="language-plaintext highlighter-rouge">blog_name</code>, nombre de tu blog en esta red social, esto es asi, porque puedes tener más de uno.</li>
<li><code class="language-plaintext highlighter-rouge">feed_url</code>, archivo RSS de nuestra web.</li>
</ul>
<h4 id="authenticate_tumblrclient_vars">authenticate_tumblr(client_vars)</h4>
<p>Función que por decirlo de alguna manera, se encarga de hacer la conexión con <strong>Tumblr</strong>.</p>
<h4 id="post_to_mastodontoken-url-feed_url">post_to_mastodon(token, url, feed_url)</h4>
<p>Función que se encarga de postear los mensajes a <strong>Mastodon</strong>, necesita:</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">token</code>, validación con <strong>Mastodon</strong>.</li>
<li><code class="language-plaintext highlighter-rouge">url</code>, instancia que utilizamos.</li>
<li><code class="language-plaintext highlighter-rouge">feed_url</code>, archivo RSS de nuestra web.</li>
</ul>
<h4 id="fetch_random_articlefeed_url">fetch_random_article(feed_url)</h4>
<p>Función que se encarga de seleccionar aleatoriamente un articulo para postear en las redes que tengo configuradas en este momento (Mastodon y Tumblr), no se usa para <strong>BlueSky</strong> porque esta funciona de una manera diferente. El fin es el mismo, pero 😅</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">feed_url</code>, archivo RSS de nuestra web.</li>
</ul>
<h4 id="post_to_blueskyuser-password-feed_url-image_url">post_to_bluesky(user, password, feed_url, image_url)</h4>
<p>Función que se encarga de posterar los mensajes a <strong>BlueSky</strong>, necesita:</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">user</code>, <code class="language-plaintext highlighter-rouge">password</code>, usuario y password de validación.</li>
<li><code class="language-plaintext highlighter-rouge">feed_url</code>, archivo RSS de nuestra web.</li>
<li><code class="language-plaintext highlighter-rouge">image_url</code>, imagen que queremos que acompañe a nuestro post.</li>
</ul>
<h4 id="fetch_image_dataimage_url">fetch_image_data(image_url)</h4>
<p>Función que se encarga de obtener la información de la imagen que quieres que acompañe al post de <strong>BlueSky</strong>.</p>
<h4 id="select_random_itementries">select_random_item(entries)</h4>
<p>Función que se encarga de seleccionar aleatoriamente un articulo pero para <strong>BlueSky</strong>.</p>
<h4 id="fetch_feed_entriesfeed_url">fetch_feed_entries(feed_url)</h4>
<p>Función que se encarga de cargar todos los items / articulos del fichero RSS.</p>
<h4 id="load_environment_variables">load_environment_variables()</h4>
<p>Función que se encarga de cargar todas las variables necesarias para el correcto funcionamiento del script, que en este caso son las siguientes:</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">BSKY_USER</code>, <code class="language-plaintext highlighter-rouge">BSKY_PASS</code> usuario y password para <strong>BlueSky</strong></li>
<li><code class="language-plaintext highlighter-rouge">MASTODON_TOKEN</code>, <code class="language-plaintext highlighter-rouge">MASTODON_URL</code> token y dirección del servidor para <strong>Mastodon</strong></li>
<li><code class="language-plaintext highlighter-rouge">CONSUMER_KEY</code>, <code class="language-plaintext highlighter-rouge">CONSUMER_SECRET</code>, <code class="language-plaintext highlighter-rouge">OAUTH_TOKEN</code>, <code class="language-plaintext highlighter-rouge">OAUTH_SECRET</code>, las validaciones de credenciales para <strong>Tumblr</strong>.</li>
<li><code class="language-plaintext highlighter-rouge">FEED_URL</code>, dirección del <code class="language-plaintext highlighter-rouge">feed</code> de nuestra pagina web.</li>
<li><code class="language-plaintext highlighter-rouge">IMAGE_URL</code>, dirección de la imagen que queremos que se visualize en <strong>BlueSky</strong></li>
<li><code class="language-plaintext highlighter-rouge">BLOG_NAME</code>, nombre del blog que usamos en <strong>Tumblr</strong>.</li>
<li><code class="language-plaintext highlighter-rouge">POST_TO_BSKY</code>, <code class="language-plaintext highlighter-rouge">POST_TO_MASTODON</code>, <code class="language-plaintext highlighter-rouge">POST_TO_TUMBLR</code>, en que redes sociales queremos postear. Tiene que ser <code class="language-plaintext highlighter-rouge">true</code> para que se <em>activen</em>.</li>
</ul>
<p>Solo nos falta, antes de nada probarlo. Que en mi caso, fue en un <em>entorno virtual</em> de pruebas que tiene <strong>Python</strong>, no sabia que eso existia, y se hace de la siguiente manera:</p>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">usuari@debian:~$</span><span class="w"> </span>python <span class="nt">-m</span> venv .venv
<span class="gp">usuari@debian:~$</span><span class="w"> </span><span class="nb">source</span> .venv/bin/activate
</code></pre></div></div>
<p>Ahora si que podemos hacer todas las pruebas que queramos si necesidad de estropear o ensuciar nuestro sistema, porque una vez que hemos acabado, se desactiva y todo queda igual de limpio que antes de empezar las pruebas.</p>
<p>Eso si, para hacer funcionar el script, tenemos que tener instalados los siguientes paquetes o modulos de <strong>Python</strong>:</p>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">usuari@debian:~$</span><span class="w"> </span>pip3.9 <span class="nb">install </span>feedparser twython Mastodon.py PyTumblr python-dotenv atproto requests
</code></pre></div></div>
<p>Por ultimo, ahora si, nos queda añadir este script en nuestro servidor, que en mi caso es <em>unRaid</em> para que cada noche se ejecute (vendito modulo <strong>user_scripts</strong>) y ya lo tendriamos todo listo y funcionando.</p>
<h4 id="referencia">Referencia</h4>
<ul>
<li><a href="https://elblogdelazaro.org/posts/2021-08-16-bot-en-python-para-publicar-un-feed-de-forma-aleatorios-en-twitter-y-mastodom" target="_blank">Script de Python para publicar un Feed de forma aleatoria en Twitter y Mastodom</a></li>
<li><a href="https://chatgpt.com" target="_blank">ChatGpt</a></li>
<li><a href="https://copilot.microsoft.com/onboarding" target="_blank">Copilot</a></li>
</ul>]]></content><author><name>VSANTOS</name></author><category term="Debian GNU/Linux" /><category term="Python" /><category term="Debian GNU/Linux" /><category term="Python" /><summary type="html"><![CDATA[Este nuevo articulo, se puede decir que es la fusión de este articulo y este otro donde explicaba como dar publicidad o informar en las diferentes redes sociales que estoy, Mastodon, Tumblr y ahora BlueSky de los articulos nuevos que voy añadiendo asi como de los antiguos, porque nunca se sabe si algun articulo anterior puede servir de ayuda a alguna persona.]]></summary></entry><entry><title type="html">Publicar feed en Tumblr</title><link href="https://vctrsnts.github.io/debian%20gnu/linux/python/2024/11/12/publicar-feed-tumblr.html" rel="alternate" type="text/html" title="Publicar feed en Tumblr" /><published>2024-11-12T00:00:00+00:00</published><updated>2024-11-12T00:00:00+00:00</updated><id>https://vctrsnts.github.io/debian%20gnu/linux/python/2024/11/12/publicar-feed-tumblr</id><content type="html" xml:base="https://vctrsnts.github.io/debian%20gnu/linux/python/2024/11/12/publicar-feed-tumblr.html"><![CDATA[<p>Este articulo, podria decirse que es una continuación de este <a href="/debian%20gnu/linux/python/2022/11/14/publicar-feed-mastodon.html" target="_blank">articulo</a> pero en este caso, es para <a href="https://www.tumblr.com" target="_blank">Tumblr</a>.</p>
<p>La idea es la misma, pero para otra red social. Eso si, más pequeña y desconocida o al menos para mi. Nunca habia oido de ella, pero nunca se sabe y asi ya estoy en ella, aunque sea solamente para publicar los articulos que voy añadiendo a mi web / blog.</p>
<!-- more -->
<p>Partimos de la base que antes de empezar tenemos que tener instalado:</p>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">usuari@debian:~$</span><span class="w"> </span>pip <span class="nb">install</span> <span class="nt">--user</span> pytumblr
</code></pre></div></div>
<p>Tambien tenemos que tener <code class="language-plaintext highlighter-rouge">feedparser</code> que se usa para el tratamiento de los <em>XML</em> que si tienes este mismo <strong>script</strong> pero para <em>Mastodon</em>, seguramente ya lo tienes. Sino te tocara instalarlo.</p>
<p>El siguiente paso, es dar de alta <em>tu aplicación</em> en el <em>API</em> de <em>Tumblr</em>. Esto es un poco confuso, porque es dificil de encontrar, pero son los siguientes:</p>
<ul>
<li><a href="https://www.tumblr.com/oauth/register" target="_blank">Darse de alta</a></li>
<li><a href="https://api.tumblr.com/console/calls/user/info" target="_blank">Autentificar la aplicació</a></li>
</ul>
<p>Tener en cuenta una cosa, primero os aconsejo que os creeis la cuenta en <em>Tumblr</em> y que luego accedais a estos links, sino os pedira usuario y password.</p>
<p>En el momento de dar de alta la aplicación se obtiene:</p>
<ul>
<li><em>Consumer_key</em></li>
<li><em>Consumer_secret</em></li>
</ul>
<p>Luego, cuando se autentifica la aplicación se obtiene:</p>
<ul>
<li><em>Oauth_token</em></li>
<li><em>Oauth_token_secret</em></li>
</ul>
<p>Para poder publicar en esta red. Después solamente tienes que tener el <em>script</em> en <code class="language-plaintext highlighter-rouge">Python</code> para publicar.</p>
<p>En este caso, pondre el que yo estoy utilizando ahora mismo, aunque estoy estudiando hacerle unos cambios para añadir más información. Pero con esto ya teneis un principio.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c1">#!/usr/bin/env python
</span> <span class="c1"># -*- coding: utf-8 -*-
</span>
<span class="c1"># script que lee el feed rss de un blog y publica un articulo de forma aleatoria en twitter y mastodon
</span>
<span class="c1"># Tienes que tener instaladas las librerias feedparser, Twython, Mastodon
</span>
<span class="c1"># Autor: Victor Santos y un poco de ChatGPT
</span> <span class="c1"># https://vctrsnts.github.io
</span>
<span class="c1"># Llama a los modulos Python
</span> <span class="kn">import</span> <span class="n">feedparser</span>
<span class="kn">import</span> <span class="n">pytumblr</span>
<span class="kn">import</span> <span class="n">random</span>
<span class="kn">import</span> <span class="n">xml.etree.ElementTree</span> <span class="k">as</span> <span class="n">ET</span>
<span class="n">consumer_key</span> <span class="o">=</span> <span class="sh">'</span><span class="s">xxxxxxxxxxxxxxx</span><span class="sh">'</span>
<span class="n">consumer_secret</span> <span class="o">=</span> <span class="sh">'</span><span class="s">xxxxxxxxxxxxxxx</span><span class="sh">'</span>
<span class="n">oauth_token</span> <span class="o">=</span> <span class="sh">'</span><span class="s">xxxxxxxxxxxxxxx</span><span class="sh">'</span>
<span class="n">oauth_secret</span> <span class="o">=</span> <span class="sh">'</span><span class="s">xxxxxxxxxxxxxxx</span><span class="sh">'</span>
<span class="c1"># Authenticate and create a client
</span> <span class="n">client</span> <span class="o">=</span> <span class="n">pytumblr</span><span class="p">.</span><span class="nc">TumblrRestClient</span><span class="p">(</span>
<span class="n">consumer_key</span><span class="p">,</span>
<span class="n">consumer_secret</span><span class="p">,</span>
<span class="n">oauth_token</span><span class="p">,</span>
<span class="n">oauth_secret</span>
<span class="p">)</span>
<span class="c1"># Per extreure les categories del Feed
</span> <span class="k">def</span> <span class="nf">extract_categories_from_specific_entry</span><span class="p">(</span><span class="n">feed_url</span><span class="p">,</span> <span class="n">entry_index</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="c1"># Parse the feed using feedparser
</span> <span class="n">feed</span> <span class="o">=</span> <span class="n">feedparser</span><span class="p">.</span><span class="nf">parse</span><span class="p">(</span><span class="n">feed_url</span><span class="p">)</span>
<span class="c1"># If feed.entries is empty, we attempt to return categories from the first entry (index 0)
</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">feed</span><span class="p">.</span><span class="n">entries</span><span class="p">:</span>
<span class="k">return</span> <span class="nf">get_categories_from_entry</span><span class="p">(</span><span class="n">feed</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="c1"># Return categories from index 0, if possible
</span>
<span class="c1"># If the feed has entries, extract from the specified index
</span> <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">feed</span><span class="p">.</span><span class="n">entries</span><span class="p">)</span> <span class="o">></span> <span class="n">entry_index</span><span class="p">:</span>
<span class="n">entry</span> <span class="o">=</span> <span class="n">feed</span><span class="p">.</span><span class="n">entries</span><span class="p">[</span><span class="n">entry_index</span><span class="p">]</span>
<span class="c1"># Extract categories (tags) from the entry and add '"' around each category
</span> <span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="n">category</span><span class="p">.</span><span class="n">term</span> <span class="k">for</span> <span class="n">category</span> <span class="ow">in</span> <span class="n">entry</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">tags</span><span class="sh">'</span><span class="p">,</span> <span class="p">[])]</span>
<span class="k">return</span> <span class="sh">"</span><span class="s">,</span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">categories</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error: Feed has less than </span><span class="si">{</span><span class="n">entry_index</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s"> entries, returning categories from index 0.</span><span class="sh">"</span><span class="p">)</span>
<span class="k">return</span> <span class="nf">get_categories_from_entry</span><span class="p">(</span><span class="n">feed</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="c1"># Return categories from index 0
</span>
<span class="c1"># Helper function to get categories from the first entry (index 0)
</span> <span class="k">def</span> <span class="nf">get_categories_from_entry</span><span class="p">(</span><span class="n">feed</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
<span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">feed</span><span class="p">.</span><span class="n">entries</span><span class="p">)</span> <span class="o">></span> <span class="n">index</span><span class="p">:</span>
<span class="n">entry</span> <span class="o">=</span> <span class="n">feed</span><span class="p">.</span><span class="n">entries</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
<span class="c1"># Extract categories (tags) from the entry and add '"' around each category
</span> <span class="n">categories</span> <span class="o">=</span> <span class="p">[</span><span class="n">category</span><span class="p">.</span><span class="n">term</span> <span class="k">for</span> <span class="n">category</span> <span class="ow">in</span> <span class="n">entry</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">'</span><span class="s">tags</span><span class="sh">'</span><span class="p">,</span> <span class="p">[])]</span>
<span class="k">return</span> <span class="sh">"</span><span class="s">,</span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">categories</span><span class="p">)</span>
<span class="k">return</span> <span class="sh">""</span> <span class="c1"># Return empty string if no tags found
</span>
<span class="c1"># Seleccionamos el Feed
</span> <span class="n">feed</span> <span class="o">=</span> <span class="sh">'</span><span class="s">tu dirección web hacia el feed.xml</span><span class="sh">'</span>
<span class="c1"># Parseamos el Feed
</span> <span class="n">d</span> <span class="o">=</span> <span class="n">feedparser</span><span class="p">.</span><span class="nf">parse</span><span class="p">(</span><span class="n">feed</span><span class="p">)</span>
<span class="c1"># Extrae la longitud del Feed y aleatoreamente selecciona un articulo
</span> <span class="n">feedlen</span> <span class="o">=</span> <span class="nf">len</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="sh">'</span><span class="s">entries</span><span class="sh">'</span><span class="p">])</span>
<span class="n">num</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="nf">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">feedlen</span><span class="p">)</span>
<span class="c1"># Inicializa la API de Twitter, escribe el nuevo estado y salimos d['entries'][0] es el último articulo publicado
</span> <span class="n">link</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="sh">'</span><span class="s">entries</span><span class="sh">'</span><span class="p">][</span><span class="n">num</span><span class="p">][</span><span class="sh">'</span><span class="s">link</span><span class="sh">'</span><span class="p">]</span>
<span class="n">title</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="sh">'</span><span class="s">entries</span><span class="sh">'</span><span class="p">][</span><span class="n">num</span><span class="p">][</span><span class="sh">'</span><span class="s">title</span><span class="sh">'</span><span class="p">]</span>
<span class="n">status_text</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="sh">'</span><span class="s">entries</span><span class="sh">'</span><span class="p">][</span><span class="n">num</span><span class="p">][</span><span class="sh">'</span><span class="s">summary_detail</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">value</span><span class="sh">'</span><span class="p">]</span>
<span class="n">description</span> <span class="o">=</span> <span class="p">(</span><span class="sh">"</span><span class="s"><strong>Recordando articulos publicados:</strong></span><span class="sh">"</span> <span class="o">+</span> <span class="sh">"</span><span class="s"><br></span><span class="sh">"</span> <span class="o">+</span> <span class="n">status_text</span><span class="p">)</span>
<span class="n">tags</span> <span class="o">=</span> <span class="nf">extract_categories_from_specific_entry</span><span class="p">(</span><span class="n">feed</span><span class="p">,</span> <span class="n">num</span><span class="p">)</span>
<span class="c1"># Replace 'your-blog-name' with your actual Tumblr blog name
</span> <span class="n">blogName</span> <span class="o">=</span> <span class="sh">"</span><span class="s">tuNombreDeBlog</span><span class="sh">"</span>
<span class="c1"># Create the post
</span> <span class="n">client</span><span class="p">.</span><span class="nf">create_link</span><span class="p">(</span>
<span class="n">blogName</span><span class="p">,</span>
<span class="n">title</span><span class="o">=</span><span class="n">title</span><span class="p">,</span>
<span class="n">url</span><span class="o">=</span><span class="n">link</span><span class="p">,</span>
<span class="n">description</span><span class="o">=</span><span class="n">description</span><span class="p">,</span>
<span class="n">tags</span><span class="o">=</span><span class="p">[</span><span class="n">tag</span> <span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">tags</span><span class="p">.</span><span class="nf">split</span><span class="p">(</span><span class="sh">"</span><span class="s">,</span><span class="sh">"</span><span class="p">)]</span>
<span class="p">)</span>
</code></pre></div></div>
<p>En este <em>script</em> hay que tener en cuenta unas cosas:</p>
<ul>
<li><em>blogName</em>: Cuando te distes de alta en este red social, el nombre de usuario, es el nombre de tu blog y es el que tienes que poner aqui.</li>
<li><em>feed</em>: Es el fichero <em>xml</em> que quieres usar</li>
<li><em>consumer_key</em>: La primera clave que necesitas</li>
<li><em>consumer_secret</em>: La segunda clave que necesitas</li>
<li><em>oauth_token</em>: La tercera clave que necesitas</li>
<li><em>oauth_token_secret</em>: La ultima de las 4 claves que necesitas</li>
</ul>
<p>Una vez, tengas el fichero creado, si quieres hacer pruebas, tienes que hacerlo de la siguiente manera:</p>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> usuari@debian:~$</span><span class="w"> </span>python3 nombreDelArchivo.py
</code></pre></div></div>
<p>Entonces, si no has tenido ningun problema, a tu cuenta de <em>Tumblr</em> te llegara un articulo aleatorio de tu web.</p>
<p>Como he dicho, aun lo tengo que mejorar, porque quiero añadir la imagen de la web, etc… Pero esto esta en estudio.</p>
<p>Después de hacer las pruebas que creas oportunas, solo te quedara configurar el cron, para que se ejecute cuando tu quieras.</p>
<p>Tambien, tengo otro <em>script</em> que publica el ultimo articulo publicado. Se puede utilizar este mismo script, pero tienes que hacer algunas modificaciones:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Aixo ja no fa falta</span>
import random
<span class="c"># Aixo tampoc fa falta</span>
feedlen <span class="o">=</span> len<span class="o">(</span>d[<span class="s1">'entries'</span><span class="o">])</span>
num <span class="o">=</span> random.randint<span class="o">(</span>0, feedlen<span class="o">)</span>
<span class="c">#Aqui en comptes de 'num' ha de ser '0' quedan aixi</span>
status_text <span class="o">=</span> d[<span class="s1">'entries'</span><span class="o">][</span>0][<span class="s1">'title'</span><span class="o">]</span> + <span class="s1">'<br>'</span> + d[<span class="s1">'entries'</span><span class="o">][</span>0][<span class="s1">'link'</span><span class="o">]</span>
articulo <span class="o">=</span> <span class="o">(</span><span class="s2">"<trong>Ultimo artículo publicado:</strong>"</span> + <span class="s1">'<br>'</span> + status_text<span class="o">)</span>
</code></pre></div></div>
<p>El resto de codigo para publicar es el mismo.</p>
<h4 id="referencia">Referencia</h4>
<ul>
<li><a href="https://github.com/tumblr/pytumblr" target="_blank">tumblr/pytumblr</a></li>
<li><a href="https://pypi.org/project/PyTumblr2" target="_blank">PyTumblr2 0.2.4</a></li>
</ul>]]></content><author><name>VSANTOS</name></author><category term="Debian GNU/Linux" /><category term="Python" /><category term="Debian GNU/Linux" /><category term="Python" /><summary type="html"><![CDATA[Este articulo, podria decirse que es una continuación de este articulo pero en este caso, es para Tumblr. La idea es la misma, pero para otra red social. Eso si, más pequeña y desconocida o al menos para mi. Nunca habia oido de ella, pero nunca se sabe y asi ya estoy en ella, aunque sea solamente para publicar los articulos que voy añadiendo a mi web / blog.]]></summary></entry><entry><title type="html">Servicio para actualizar imagenes docker</title><link href="https://vctrsnts.github.io/docker/vps/2024/10/28/script-actualizar-docker.html" rel="alternate" type="text/html" title="Servicio para actualizar imagenes docker" /><published>2024-10-28T00:00:00+00:00</published><updated>2024-10-28T00:00:00+00:00</updated><id>https://vctrsnts.github.io/docker/vps/2024/10/28/script-actualizar-docker</id><content type="html" xml:base="https://vctrsnts.github.io/docker/vps/2024/10/28/script-actualizar-docker.html"><![CDATA[<p>Como he tenido malas experencias a la hora de usar servicios para mantener las imagenes actualizadas, he cambiado el servició que tenia actualmente <strong>whatsup</strong> por <strong>cup</strong>.</p>
<!-- more -->
<p>En estos 3 articulos donde explico todo el proceso:</p>
<ul>
<li><a href="/debian%20gnu/linux/docker/2023/01/25/usando-watchtower.html" target="_blank">Usando watchtower</a></li>
<li><a href="/docker/2023/02/19/actualizacion-watchtower.html" target="_blank">Cambiando watchtower por diun</a></li>
<li><a href="/docker/2023/04/29/donde-dije-digo-digo-diego.html" target="_blank">Donde digo dije, digo Diego</a></li>
</ul>
<p>Pero no me hacia mucha gracia, asi que cambie a <strong>Whatsup</strong>, pero me volvia un poco loco y buscaba algo más facil y simple, que simplemente me informara de lo que hay, sin tantas complicaciones como me daba <strong>Whatsup</strong>.</p>
<p>Hasta que encontre este <a href="https://elblogdelazaro.org/posts/2024-10-04-comprueba-las-actualizaciones-de-tus-imagenes-docker-con-cup-docker" target="_blank">articulo</a> en el <strong>blog de lazaro</strong> donde daba una alternativa a <strong>Whatsup</strong>. Este nuevo servicio es <a href="https://github.com/sergi0g/cup" target="_blank">cup</a>, donde el funcionamiento es muy parecido a <strong>Whatsup</strong> pero más simple.</p>
<p>Asi que me lei el articulo y me resulto muy interesante asi que lo he instalado en mi servidor y me ha gustado mucho y lo he dejado instalado porque me parece muy interesante. Aunque tiene algunos errores, ten en cuenta, que este servicio esta en construcción, asi que a lo mejor cuando uses tu, el error que tengo yo (no puedo cambiar el tema de la web), puede que este ya solucionado, pero…</p>