[{"categories":[],"content":" Suggested Reading Links/Posts ¶ Tokyo street photography moments — Tokyo Times ↗ https://www.steele.blue/microlighter/ ↗ My Links ¶ My blog ↗ My newsletter ↗ My Ph portfolio ↗ Support me ↗ ","date":"6 September 2026","description":"Personal notes for week 36 of 2026","tags":["weeknote"],"title":"Week Note Nº 36/2026","uri":"/weeknotes/2026/36/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ U is for uv - Python A to Z : Juha-Matti Santala ↗ My new favorite Terminal [splitbrain.org] ↗ Organising my blog categories - with words, wonder ↗ Subscriber rot ↗ New post from my blog ¶ Red Metro ↗ Moving to Django 6.X ↗ My Links ¶ My blog ↗ My newsletter ↗ My Ph portfolio ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 119 Total anime watched time: 762h 46m Total anime watched episodes: 1849 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 270 Total manga read chapters: 27553 Total manga read volumes: 654 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"30 August 2026","description":"Personal notes for week 35 of 2026","tags":["weeknote"],"title":"Week Note Nº 35/2026","uri":"/weeknotes/2026/35/"},{"categories":[],"content":"A little red metro sign from Paris. I love this estetic and I need to go there with a better camera and take a lot of pic every where.\n","date":"28 August 2026","description":"","tags":[],"title":"Red Metro","uri":"/photos/2026/red-metro/"},{"categories":["dev"],"content":"A long time ago I start my personal server in Django (a lot of the stuff from Django tricks were coded for my personal Django stuff) and some days ago I decide to upgrade to 6.1 or more. Why?\nNew things in 6.0 and 6.1 ¶ The main thing in Django 6.0 is the Django Tasks Frameworks ↗ . Having a unique framework for the async task is a beautifull thing and made me clean a lot of code and make it more pythonic in multiple way.\nI update my code for the Task Framework because I need it (I was using a Redis integration) but I want to change the backend without edit all my code so this is the best way to do it because the Django integration for multiple backend are easy to implement and update if needed.1\nI also love the new Model Field Fetch Modes ↗ . This is cleaner that my abuse of prefetch_related and add the FETCH_RAISE which raise error if you fetch data in the wrong section of your code. I don’t know if the last one is usefull for me but I do understand the needed for this.\nThe last thing I was waiting in Django are the Template Partials ↗ . I use something similar a lot on GoHugo for this blog and I understand how a Django module can use it and why I want something so simple but also so usefull for not duplicate code in the frontend.\nI also know that the template partials are usefull BUT aren’t Htmx2 so you can mixit with the Template Partials to make easyer manage your frontend and backend.\nI also thing that the deprecation of PostgreSQL 14 is needed and can fix some vulnerability of my Django project.\nSo do I upgrade without problem? ¶ Yes, I haven’t got any problem with the upgrade and the migration (PostgreSql14 was my db… Now I upgrade it a lot…) and all my dipendency are updated too…\nIn the end I am happy of the upgrade. I have less query in the db (I did a lot of not well optimize query) and the cleaner task code is a god sent for update or debugging. Ok I need to debug an async code (same problem of all the async code) but now I have a larger community for answer (yes, I can ask to an AI but I find a lot of the answer inside other blog or StackOverflow so, I can not use an AI, I don’t uset it) than than the old module I was using.\nDo you upgrade or do you wait more time for the upgrade?\nI am using django-tasks-redis ↗ as the backend ↩︎\nAnother blog post about Django and Htmx Django Table, Filter and Export With Htmx  ↩︎\n","date":"24 August 2026","description":"Why I upgrade to Django 6.x and why I need it now","tags":["django","python"],"title":"Moving to Django 6.X","uri":"/post/2026/moving-to-django-6-x/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Hugo, Caddy and Github actions to publish my website - Guy Evans ↗ Rubenerd: Answering Hacker News: Retro motherboard rack ↗ GitHub Was Never About the Source Code | Matthias Endler ↗ New post from my blog ¶ Framing Photos With Python ↗ My Links ¶ My blog ↗ My newsletter ↗ My Ph portfolio ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 119 Total anime watched time: 762h 46m Total anime watched episodes: 1849 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 270 Total manga read chapters: 27553 Total manga read volumes: 654 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"23 August 2026","description":"Personal notes for week 34 of 2026","tags":["weeknote"],"title":"Week Note Nº 34/2026","uri":"/weeknotes/2026/34/"},{"categories":["fingerfood","tinkering"],"content":"Some time ago I decide to make a photo exhibition in my city and, before doing it, I make some research of what I need to do. So I made the photo exhibition with some errors here and there but I love it.1\nSo I find a lot of photographeres having a white or black framing of the pic2 so I do it while printing (read as the source file has not framing but he printed one has one) but I want to have the source file with a frame and some info about the pic. So I search the web for something usefull.\nWhat I need and want ¶ I have this pic and I want to add the frame and some text under the pic but inside the frame.\nFor a pic like this I want info inside the frame:\nCamera info (camera model and companyß I taked the pic) Lens info (lens model and company) Camera and lens settings (aperture, iso, framerate ) Camera and Lens info need to be clear and not a string of serial code The text under the pic is easy to read and don’t take attention from the pic Must look professional I need to elaborate single picture but having also a directory mode is a good thing. First solution: make yourself with Photoshop or similar ¶ First thing I fount are tutorial for Photoshop or other tool for this result. I hate this solution and it isn’t batch ready. I also find this method slow and prone to make me angry or paranoic about errors.\nSecond solution: web page with a tool ¶ After more searching I found some external tool ↗ . It generates a good framing for the pic but has something I didn’t like.\nThis is a online tool and I don’t like to upload the photos and has some limit/problem when you upload big or a lot photos at the same time. And this is not a problem for a single site but a limitation you need to have for all the free tools.\nThe best solution: coding ¶ So in the end I wrote this little script:\nset the font and fit its size get the exif data (the lens, camera, …) add the frame add the text if present use click for having a interactive cli for getting the input needed with this packages as dipendency\npip install pillow piexif click and the final code is this\nimport os import sys from PIL import Image, ImageDraw, ImageFont import piexif import click FONT_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), \"fonts\") BUNDLED_FONT = os.path.join(FONT_DIR, \"Montserrat-Variable.ttf\") FALLBACK_FONTS = [ \"/System/Library/Fonts/Avenir Next.ttc\", # macOS \"/System/Library/Fonts/HelveticaNeue.ttc\", # macOS \"/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf\", # Linux \"/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf\", # Linux \"C:\\\\Windows\\\\Fonts\\\\segoeui.ttf\", # Windows \"arial.ttf\", ] CAMERA_WEIGHT = 600 CONFIG_WEIGHT = 400 CONFIG_SIZE_RATIO = 0.85 def load_font(size, weight): \"\"\"Load a font for the shot info, falling back to elegant alternatives.\"\"\" try: font = ImageFont.truetype(BUNDLED_FONT, size) font.set_variation_by_axes([weight]) return font except Exception: pass for path in FALLBACK_FONTS: try: return ImageFont.truetype(path, size) except (IOError, OSError): continue return ImageFont.load_default(size=size) def fit_font(draw, text, size, weight, max_width, min_size=10): \"\"\"Shrink the font size until the text fits within max_width.\"\"\" font = load_font(size, weight) if not text: return font text_width = draw.textlength(text, font=font) if text_width \u003c= max_width or size \u003c= min_size: return font smaller_size = max(min_size, int(size * max_width / text_width)) return load_font(smaller_size, weight) def get_exif_data(image_path): \"\"\"Extract the main EXIF shot data from the image.\"\"\" exif_data = { \"make\": \"\", \"model\": \"\", \"lens\": \"\", \"fstop\": \"\", \"shutter\": \"\", \"iso\": \"\", \"focal\": \"\", } try: exif_dict = piexif.load(image_path) # Camera if \"0th\" in exif_dict: ifd0 = exif_dict[\"0th\"] if piexif.ImageIFD.Make in ifd0: exif_data[\"make\"] = ( ifd0[piexif.ImageIFD.Make].decode(\"utf-8\", errors=\"ignore\").strip() ) if piexif.ImageIFD.Model in ifd0: exif_data[\"model\"] = ( ifd0[piexif.ImageIFD.Model].decode(\"utf-8\", errors=\"ignore\").strip() ) if \"Exif\" in exif_dict: exif = exif_dict[\"Exif\"] # Lens if piexif.ExifIFD.LensModel in exif: exif_data[\"lens\"] = ( exif[piexif.ExifIFD.LensModel] .decode(\"utf-8\", errors=\"ignore\") .strip() ) # Aperture (F-Number) if piexif.ExifIFD.FNumber in exif: fnum = exif[piexif.ExifIFD.FNumber] if isinstance(fnum, tuple) and fnum[1] != 0: exif_data[\"fstop\"] = f\"f/{fnum[0] / fnum[1]:.1f}\" # Shutter Speed if piexif.ExifIFD.ExposureTime in exif: exp = exif[piexif.ExifIFD.ExposureTime] if isinstance(exp, tuple) and exp[1] != 0: if exp[0] \u003e= exp[1]: exif_data[\"shutter\"] = f\"{int(exp[0] / exp[1])}s\" else: exif_data[\"shutter\"] = f\"{exp[0]}/{exp[1]}s\" # ISO if piexif.ExifIFD.ISOSpeedRatings in exif: exif_data[\"iso\"] = f\"ISO {exif[piexif.ExifIFD.ISOSpeedRatings]}\" # Focal Length if piexif.ExifIFD.FocalLength in exif: focal = exif[piexif.ExifIFD.FocalLength] if isinstance(focal, tuple) and focal[1] != 0: exif_data[\"focal\"] = f\"{int(focal[0] / focal[1])}mm\" except Exception: # Silent if there is no EXIF data, fields remain empty pass return exif_data def build_camera_label(make, model): \"\"\"Combine make and model while avoiding duplication (e.g. 'Canon EOS R5').\"\"\" make = make.strip() model = model.strip() if not model: return make if not make or model.lower().startswith(make.lower()): return model return f\"{make} {model}\" def process_single_image(image_path, output_path, border_size_pct, bottom_border_pct): \"\"\"Add the white border and EXIF data to a single image. Returns \"ok\", \"skipped\" (no EXIF data) or \"error\". \"\"\" try: img = Image.open(image_path) if img.mode != \"RGB\": img = img.convert(\"RGB\") except Exception as e: click.echo(f\"Error opening {image_path}: {e}\", err=True) return \"error\" exif = get_exif_data(image_path) if not any(exif.values()): click.echo(f\"No EXIF data found, skipping: {image_path}\") return \"skipped\" width, height = img.size # Compute border size in pixels border_px = int(min(width, height) * border_size_pct) bottom_px = int(min(width, height) * bottom_border_pct) # New overall dimensions new_width = width + (border_px * 2) new_height = height + border_px + bottom_px # Create the white canvas canvas = Image.new(\"RGB\", (new_width, new_height), \"white\") canvas.paste(img, (border_px, border_px)) # Build the text strings: make/model (+ lens) on the left, config on the right camera_parts = [build_camera_label(exif[\"make\"], exif[\"model\"]), exif[\"lens\"]] camera_text = \" - \".join(p for p in camera_parts if p) config_parts = [exif[\"focal\"], exif[\"fstop\"], exif[\"shutter\"], exif[\"iso\"]] config_text = \" - \".join(p for p in config_parts if p) draw = ImageDraw.Draw(canvas) font_size = max(1, int(bottom_px * 0.32)) config_size = max(1, int(font_size * CONFIG_SIZE_RATIO)) available_width = new_width - 2 * border_px gap = int(bottom_px * 0.2) camera_font = load_font(font_size, CAMERA_WEIGHT) config_font = load_font(config_size, CONFIG_WEIGHT) camera_w = draw.textlength(camera_text, font=camera_font) if camera_text else 0 config_w = draw.textlength(config_text, font=config_font) if config_text else 0 x_left = border_px x_right = new_width - border_px if camera_text and config_text and camera_w + gap + config_w \u003e available_width: # Don't fit side by side: stack them on two lines to avoid overlap camera_font = fit_font( draw, camera_text, font_size, CAMERA_WEIGHT, available_width ) config_font = fit_font( draw, config_text, config_size, CONFIG_WEIGHT, available_width ) y_top = height + border_px + int(bottom_px * 0.35) y_bottom = height + border_px + int(bottom_px * 0.7) draw.text( (x_left, y_top), camera_text, fill=(30, 30, 30), font=camera_font, anchor=\"lm\", ) draw.text( (x_left, y_bottom), config_text, fill=(100, 100, 100), font=config_font, anchor=\"lm\", ) else: y_center = height + border_px + bottom_px // 2 if camera_text: draw.text( (x_left, y_center), camera_text, fill=(30, 30, 30), font=camera_font, anchor=\"lm\", ) if config_text: draw.text( (x_right, y_center), config_text, fill=(100, 100, 100), font=config_font, anchor=\"rm\", ) # Save the result canvas.save(output_path, \"JPEG\", quality=95) return \"ok\" @click.command() @click.argument( \"path\", type=click.Path(exists=True, file_okay=True, dir_okay=True, readable=True) ) @click.option( \"--output\", \"-o\", type=click.Path(), help=\"Destination file or folder. If omitted, creates an 'output' folder.\", ) @click.option( \"--border\", \"-b\", default=0.05, type=float, help=\"Side/top border thickness as a percentage (e.g. 0.05 = 5%).\", ) @click.option( \"--bottom\", \"-bt\", default=0.12, type=float, help=\"Bottom border thickness for the text as a percentage (e.g. 0.12 = 12%).\", ) def main(path, output, border, bottom): \"\"\"Add white borders and EXIF info to your photos. PATH can be the path to a single image file or a folder. Images with no EXIF data are skipped (no border added). \"\"\" extensions = (\".jpg\", \".jpeg\", \".png\", \".tiff\", \".webp\") # Handle a single FILE input if os.path.isfile(path): if not path.lower().endswith(extensions): click.echo(\"The given file is not a supported image.\", err=True) sys.exit(1) if not output: dirname, filename = os.path.split(path) output = os.path.join(dirname, f\"bordered_{filename}\") elif os.path.isdir(output): output = os.path.join(output, os.path.basename(path)) click.echo(f\"Processing file: {path}\") result = process_single_image(path, output, border, bottom) if result == \"ok\": click.echo(f\"Saved successfully to: {output}\") # Handle a FOLDER input elif os.path.isdir(path): if not output: output = os.path.join(path, \"output_bordered\") os.makedirs(output, exist_ok=True) # List all valid files in the folder files = [f for f in os.listdir(path) if f.lower().endswith(extensions)] if not files: click.echo(\"No valid images found in the folder.\") sys.exit(0) click.echo( f\"Found {len(files)} images in the folder. Starting processing...\" ) skipped = 0 errors = 0 with click.progressbar(files, label=\"Progress\") as bar: for file_name in bar: input_file_path = os.path.join(path, file_name) output_file_path = os.path.join(output, file_name) result = process_single_image( input_file_path, output_file_path, border, bottom ) if result == \"skipped\": skipped += 1 elif result == \"error\": errors += 1 click.echo(f\"All images have been saved to the folder: {output}\") if skipped: click.echo(f\"{skipped} images skipped (no EXIF data).\") if errors: click.echo(f\"{errors} images failed to process due to errors.\", err=True) if __name__ == \"__main__\": main() And this is the script output from the example pic.\nI will change something because I not full ok with how the text is print on the frame (font size etc…) but this is the best I have in this moment.\nIf you want to see it you can find the info at this site ↗ . ↩︎\nNot all type of pic, only the colored one, not the black and white’s one ↩︎\n","date":"20 August 2026","description":"How to frame your photos with python with all the data you want","tags":["python","automation"],"title":"Framing Photos With Python","uri":"/post/2026/framing-photos-with-python/"},{"categories":[],"content":" New post from my blog ¶ Week Note Nº 33/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ My Ph portfolio ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 119 Total anime watched time: 762h 46m Total anime watched episodes: 1849 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 270 Total manga read chapters: 27553 Total manga read volumes: 654 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"16 August 2026","description":"Personal notes for week 33 of 2026","tags":["weeknote"],"title":"Week Note Nº 33/2026","uri":"/weeknotes/2026/33/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Using GoToSocial as the Social Layer for Your Apps ↗ New post from my blog ¶ Week Note Nº 32/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ My Ph portfolio ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 119 Total anime watched time: 762h 46m Total anime watched episodes: 1849 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 270 Total manga read chapters: 27553 Total manga read volumes: 654 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"9 August 2026","description":"Personal notes for week 32 of 2026","tags":["weeknote"],"title":"Week Note Nº 32/2026","uri":"/weeknotes/2026/32/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Why Book Corners won’t sync contributions back to OpenStreetMap ↗ Micro app 21: ghosthunter CLI ↗ Tokyo people and their homes — Tokyo Times ↗ New post from my blog ¶ Week Note Nº 31/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ My Ph portfolio ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 119 Total anime watched time: 762h 46m Total anime watched episodes: 1849 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 270 Total manga read chapters: 27553 Total manga read volumes: 654 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"2 August 2026","description":"Personal notes for week 31 of 2026","tags":["weeknote"],"title":"Week Note Nº 31/2026","uri":"/weeknotes/2026/31/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Jeff Triplett ↗ What’s the Best Everyday Stationery Bag? My Own Considerations and 5 Options for Pen Show Season — The Gentleman Stationer ↗ Example Domain ↗ New post from my blog ¶ Standing Up Alone - In Piedi da Solo ↗ Week Note Nº 30/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ My Ph portfolio ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 119 Total anime watched time: 762h 46m Total anime watched episodes: 1849 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 270 Total manga read chapters: 27553 Total manga read volumes: 654 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"26 July 2026","description":"Personal notes for week 30 of 2026","tags":["weeknote"],"title":"Week Note Nº 30/2026","uri":"/weeknotes/2026/30/"},{"categories":[],"content":" Photography ¶ With my Canon camera I am going to some ComicCon near my place and taking a lot of photo of cosplayers. Some of them are share in my Cosplays’ Instagram Account ↗ .\nI have also a FujiFilm Camera and I make some Urban Photography and post here in this site and some of them I share in my Personal Instagram Account ↗ .\nI also made some edit but nothing I wish to share for now.\nI have a little exposition of my works here ↗ but only my Urban photography.\nDev stuff ¶ I love Django, LaTeX and making bot or automation for my personal stuff so I am allways studing and trying new stuff. In particular I am trying Django Waytail for my personal curiosity and I am implement Webmention and other Indieweb stuff for my blogs.\nI also maintain some open source project and my personal VS Code Theme ↗ Meetup ¶ I am part of tech association called BacaroTech ↗ and we organize some mettup. I also go to local meetup about programming and data science near me.\nStationary ¶ I work a lot with stationary like fountain pens, travelers notebook and bulletjournal tecnique so I have some expirience and knowledge with ink, paper and fountain pen. And I love legal pad so I have a lot of them and I try a lot of type of them.\nI also use a lot of post-it and other little piece of paper for store information and store in my notebook. And I have an archive of my old notebook and similar stuff.\nI also work with ink stamp and wax seal in my personal life with firends, whom also love them.\nTea ¶ I also love tea and I make sperimentation with it as drink, as ingridient for food, as dessert. I also have a lot of cup and teapot for making tea in some different ways.\nI also trying to make my personal blend of tea for personal use. For now I only have a good cold tea blend and I am working on a hot tea blend with less success.\n88x31 Badges ¶ I started a collection of web-badge 88x31 pix because I am old and a long time ago I had a big collection of them here and there and now I want to make a thing in my blog.\nMy public stuff ¶ I also have some public stuff I love to share\nFundor333 ↗ - This blog make with Hugo and love. The Css framework change somethime. You can find more info in the colophon page DigitalTeaRoom ↗ - My blog about Tea and other stuff i like/love in the form of a newsletter in italian Matteo Scarpa ↗ - My blog with my expositions Dotfiles ↗ - My configuration for a Mac, a Windows or a Linux installation. ","date":"26 July 2026","description":"","tags":[],"title":"Now 2026/07/26","uri":"/now/2026/07/26/2026-07-26/"},{"categories":[],"content":"And the next month I will have a little photographic exhibition in Venice, Italy.\nHere the flyer for the exhibition and here ↗ is the link at the webpage\n","date":"20 July 2026","description":"","tags":["photography","urban"],"title":"Standing Up Alone - In Piedi da Solo","uri":"/micro/2026/07/standing-up-alone/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Moved the blog from GitLab to GitHub ↗ It’s hard to find objective advice about text editors ↗ Quick note on EMR pens for the Supernote ↗ A perfect editor ↗ I’ve Moved Back to GitHub - Kev Quirk ↗ Rate limit exceeded. ↗ MARK’S 2026-2027 Calendars + Planners– Omoi Life Goods ↗ What’s Up with Sailor Studio Inks? – The Well-Appointed Desk ↗ Tokyo rainy season scenery — Tokyo Times ↗ A Git hook to prevent committing directly to main – alexwlchan ↗ New post from my blog ¶ Week Note Nº 29/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ My Ph portfolio ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 119 Total anime watched time: 762h 46m Total anime watched episodes: 1849 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 270 Total manga read chapters: 27553 Total manga read volumes: 654 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"19 July 2026","description":"Personal notes for week 29 of 2026","tags":["weeknote"],"title":"Week Note Nº 29/2026","uri":"/weeknotes/2026/29/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Inside Pages: June 2026 - by Chelsea Park ↗ Rubenerd: Spammers abusing Google Analytics reports ↗ ESC.VTOR Cyberdeck — Dual Screen ROV Ops Deck | Cyberdeck Cafe — THE CYBERDECK CAFE ↗ I made a /heuristics/ page ↗ Portraits from a traditional Shinjuku festival — Tokyo Times ↗ Mid-Year Techo Kaigi – The Well-Appointed Desk ↗ Roll 019 (2026) — baty.net ↗ My Links ¶ My blog ↗ My newsletter ↗ My Ph portfolio ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 119 Total anime watched time: 762h 46m Total anime watched episodes: 1849 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 270 Total manga read chapters: 27553 Total manga read volumes: 654 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"12 July 2026","description":"Personal notes for week 28 of 2026","tags":["weeknote"],"title":"Week Note Nº 28/2026","uri":"/weeknotes/2026/28/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Inside Pages: June 2026 - by Chelsea Park ↗ Rubenerd: Spammers abusing Google Analytics reports ↗ ESC.VTOR Cyberdeck — Dual Screen ROV Ops Deck | Cyberdeck Cafe — THE CYBERDECK CAFE ↗ I made a /heuristics/ page ↗ Portraits from a traditional Shinjuku festival — Tokyo Times ↗ Mid-Year Techo Kaigi – The Well-Appointed Desk ↗ Roll 019 (2026) — baty.net ↗ Trunk \u0026 Tidbits, May 2026 - Mastodon Blog ↗ Random, everyday Tokyo street scenes — Tokyo Times ↗ New post from my blog ¶ Week Note Nº 28/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ My Ph portfolio ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 119 Total anime watched time: 762h 46m Total anime watched episodes: 1849 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 270 Total manga read chapters: 27553 Total manga read volumes: 654 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"5 July 2026","description":"Personal notes for week 27 of 2026","tags":["weeknote"],"title":"Week Note Nº 27/2026","uri":"/weeknotes/2026/27/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Inside Pages: June 2026 - by Chelsea Park ↗ Rubenerd: Spammers abusing Google Analytics reports ↗ ESC.VTOR Cyberdeck — Dual Screen ROV Ops Deck | Cyberdeck Cafe — THE CYBERDECK CAFE ↗ I made a /heuristics/ page ↗ Portraits from a traditional Shinjuku festival — Tokyo Times ↗ Mid-Year Techo Kaigi – The Well-Appointed Desk ↗ Roll 019 (2026) — baty.net ↗ Trunk \u0026 Tidbits, May 2026 - Mastodon Blog ↗ Random, everyday Tokyo street scenes — Tokyo Times ↗ MonoLisa, my favorite monospaced font ever, released v3 ↗ Scenes from a long, north Tokyo meander — Tokyo Times ↗ New post from my blog ¶ Week Note Nº 28/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ My Ph portfolio ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 119 Total anime watched time: 762h 46m Total anime watched episodes: 1849 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 270 Total manga read chapters: 27553 Total manga read volumes: 654 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"28 June 2026","description":"Personal notes for week 26 of 2026","tags":["weeknote"],"title":"Week Note Nº 26/2026","uri":"/weeknotes/2026/26/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Inside Pages: June 2026 - by Chelsea Park ↗ Rubenerd: Spammers abusing Google Analytics reports ↗ ESC.VTOR Cyberdeck — Dual Screen ROV Ops Deck | Cyberdeck Cafe — THE CYBERDECK CAFE ↗ I made a /heuristics/ page ↗ Portraits from a traditional Shinjuku festival — Tokyo Times ↗ Mid-Year Techo Kaigi – The Well-Appointed Desk ↗ Roll 019 (2026) — baty.net ↗ Trunk \u0026 Tidbits, May 2026 - Mastodon Blog ↗ Random, everyday Tokyo street scenes — Tokyo Times ↗ MonoLisa, my favorite monospaced font ever, released v3 ↗ Scenes from a long, north Tokyo meander — Tokyo Times ↗ What can wonky APIs tell us about the web? – alexwlchan ↗ Walking New York POPS — Ridgeline issue 230 ↗ The Nest and Travel Souvenir - David Revoy ↗ Sliding Doors: ten years of RSS-Parser - Marco Gomiero ↗ Piper Trading Company Ink Review — The Pen Addict ↗ Visit to Office Vender Stationery Forest in Sendai, Japan – Inkcredible Colours ↗ Context-aware headings in HTML - Manuel Matuzovic ↗ Bloggers, can we make better titles for our posts? - Kev Quirk ↗ New post from my blog ¶ Week Note Nº 28/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ My Ph portfolio ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 119 Total anime watched time: 762h 46m Total anime watched episodes: 1849 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 270 Total manga read chapters: 27553 Total manga read volumes: 654 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"21 June 2026","description":"Personal notes for week 25 of 2026","tags":["weeknote"],"title":"Week Note Nº 25/2026","uri":"/weeknotes/2026/25/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Digital minimalism - James’ Coffee Blog ↗ Several interconnected Shinjuku alleyways documented over a decade — Tokyo Times ↗ Rubenerd: #Vietnam2026 Ho Chi Minh City wanderings ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 117 Total anime watched time: 753h 58m Total anime watched episodes: 1827 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 270 Total manga read chapters: 27553 Total manga read volumes: 654 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"14 June 2026","description":"Personal notes for week 24 of 2026","tags":["weeknote"],"title":"Week Note Nº 24/2026","uri":"/weeknotes/2026/24/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ | Chris Aldrich ↗ My Top 5 Stationery Favorites for 2026 (so far) – The Well-Appointed Desk ↗ 💌 End of Spring at Paper Blogging ↗ #13 last week’s pens: week 22 of 2026 — a fleeting ripple ↗ Japan Trip Journal: Ink Shopping in Tokyo — The Gentleman Stationer ↗ Wearingeul The Autumn Night After a Thousand Years Ink Review — The Pen Addict ↗ Encyclical Letter of His Holiness Leo XIV Magnifica Humanitas (15 May 2026) ↗ The Stationery of Spring - by Daniela - Journaling Dan ↗ Tokyo: The Quiet Side of This Trip ↗ Pictures of Tokyo photo booths — Tokyo Times ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 117 Total anime watched time: 753h 58m Total anime watched episodes: 1827 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 270 Total manga read chapters: 27553 Total manga read volumes: 654 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"7 June 2026","description":"Personal notes for week 23 of 2026","tags":["weeknote"],"title":"Week Note Nº 23/2026","uri":"/weeknotes/2026/23/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Cult Pens Anniversary Mystery Box Review • Robb Knight ↗ Guida di Google all’ottimizzazione per le funzionalità di AI generativa nella Ricerca Google | Google Search Central | Documentation | Google for Developers ↗ Holiday Weekend Reading, May 25, 2026 (Japan Edition!) — The Gentleman Stationer ↗ Misfill, Mini Printer Edition — The Pen Addict ↗ New post from my blog ¶ Week Note Nº 22/2026 ↗ Wellcome to Monsignor Abat Jour ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 115 Total anime watched time: 748h 22m Total anime watched episodes: 1813 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 270 Total manga read chapters: 27553 Total manga read volumes: 654 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"31 May 2026","description":"Personal notes for week 22 of 2026","tags":["weeknote"],"title":"Week Note Nº 22/2026","uri":"/weeknotes/2026/22/"},{"categories":[],"content":"A little pic from a cosplay event I went as ph\n","date":"26 May 2026","description":"","tags":["photography","cosplay","pic"],"title":"Wellcome to Monsignor Abat Jour","uri":"/micro/2026/05/wellcome-to-monsignor-abat-jour/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Announcing logbasset 0.5.0 ↗ Who knows that you blog? | Forking Mad+ ↗ In Japan, the Stationery Finds You. - by Daniela ↗ New post from my blog ¶ Week Note Nº 21/2026 ↗ Who Knows That I Blog ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 115 Total anime watched time: 747h 34m Total anime watched episodes: 1811 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 270 Total manga read chapters: 27546 Total manga read volumes: 654 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"24 May 2026","description":"Personal notes for week 21 of 2026","tags":["weeknote"],"title":"Week Note Nº 21/2026","uri":"/weeknotes/2026/21/"},{"categories":["rant"],"content":" Question for the audience: Do you tell people you blog?\nYes… No… It depend. It is not a thing I talk about my blog in my every day life. And I have more than one blog so…\nSo I tell people about my blog? ¶ Yes I tell but not unprompted. I told people while talking about the argument of my blog, like if I have a post about what we are talking or if the topic of the blog can be usefull for the discussion.\nAm I anonymous when blogging? ¶ I appreciate some people like to be anonymous when blogging. That’s their choice. I am an open book. You can ask me anything and I will reply honestly, as long as it conforms to my town-square rule.\nIn my case is not so black and white. This blog url and title is Fundor333. This is my online alias. If you find somewhere fundor333 you find one of my account. So I am well know as Fundor333. So I am “anonymous” when I blog (as I don’t use my real name) but I don’t hide my alias.\nConclusion ¶ So I tell people I blog but not at random and I don’t hide my blog. But is not one of my opening line when talking with someone.\n","date":"23 May 2026","description":"A response to the question \"Who knows that you blog?\"","tags":["blog","blogging"],"title":"Who Knows That I Blog ","uri":"/post/2026/who-knows-that-i-blog-/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ No. 18: Tending to My Creative Self - by Chelsea Park ↗ Platinum Classic Lavender Black Ink Review — The Pen Addict ↗ An old Tokyo wander with added urban greenery — Tokyo Times ↗ Colorverse Erebus Crater Ink Review — The Pen Addict ↗ Watching for file changes on macOS – alexwlchan ↗ New post from my blog ¶ Week Note Nº 20/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 115 Total anime watched time: 747h 34m Total anime watched episodes: 1811 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27525 Total manga read volumes: 650 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"17 May 2026","description":"Personal notes for week 20 of 2026","tags":["weeknote"],"title":"Week Note Nº 20/2026","uri":"/weeknotes/2026/20/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Lamy Safari 2026 Neon Pink and Neon Yellow • Robb Knight ↗ Colorverse Colorvent Calendar 2025 Top 3 Ink \u0026 Fountain Pen Set Giveaway — The Pen Addict ↗ Intermezzo bag - macwright.com ↗ Micro app 16: Quick Reads Backstage ↗ Scenes of older Tokyo in the rain — Tokyo Times ↗ New post from my blog ¶ Week Note Nº 19/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 113 Total anime watched time: 740h 46m Total anime watched episodes: 1794 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27522 Total manga read volumes: 650 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"10 May 2026","description":"Personal notes for week 19 of 2026","tags":["weeknote"],"title":"Week Note Nº 19/2026","uri":"/weeknotes/2026/19/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ No. 17: A Stationery Outing - by Chelsea Park ↗ What MkDocs 2.0 means for your documentation projects - Material for MkDocs ↗ Recommended Spots: The Bread Room– Omoi Life Goods ↗ How to use headless browsers with scrapy? - Scrapfly Blog ↗ LAMY noto Teal Ballpoint Pen Review — The Pen Addict ↗ New post from my blog ¶ Week Note Nº 18/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 112 Total anime watched time: 739h 10m Total anime watched episodes: 1790 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27504 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"3 May 2026","description":"Personal notes for week 18 of 2026","tags":["weeknote"],"title":"Week Note Nº 18/2026","uri":"/weeknotes/2026/18/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Misfill, Scripted Edition — The Pen Addict ↗ [RSS Club] How do you preserve an RSS feed? – Terence Eden’s Blog ↗ Pairings Party: Kakimori Frost Violet Fountain Pen, Taccia Aomurasaki — The Pen Addict ↗ More Tokyo people and places — Tokyo Times ↗ | Chris Aldrich ↗ No. 16: Making Memories at SF Stationery Fest ↗ New post from my blog ¶ Week Note Nº 17/2026 ↗ Issn for a Blog ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 112 Total anime watched time: 739h 10m Total anime watched episodes: 1790 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27504 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"26 April 2026","description":"Personal notes for week 17 of 2026","tags":["weeknote"],"title":"Week Note Nº 17/2026","uri":"/weeknotes/2026/17/"},{"categories":[],"content":"How to add ISSN metadata to a web page ↗ is a good idea. Why not register your blog in the ISSN ? I am looking to do it\n","date":"22 April 2026","description":"","tags":["blogging","issn","blog"],"title":"Issn for a Blog ","uri":"/micro/2026/04/issn-for-a-blog-/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Choose a camera that fits your needs — aows ↗ I bought a new printer for printing pictures | Clint McMahon ↗ Belzebubs - The dot ↗ I May Have Killed My Framework 13 - Kev Quirk ↗ Pentel Graph 1000 for Pro Drafting Pencil Review — The Pen Addict ↗ Davinci Resolve for RAW photo editing — baty.net ↗ The disappearance of old Tokyo businesses — Tokyo Times ↗ New post from my blog ¶ Week Note Nº 16/2026 ↗ Hacking My Kobo with KOReader ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 110 Total anime watched time: 735h 10m Total anime watched episodes: 1780 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27504 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"19 April 2026","description":"Personal notes for week 16 of 2026","tags":["weeknote"],"title":"Week Note Nº 16/2026","uri":"/weeknotes/2026/16/"},{"categories":["tinkering","Hacking stuffs"],"content":"A long long time ago I start using a EBook Reader, the first Kindle PaperWhite (2012) and I never stop using EReader.\nThe last one I own is a Kobo Clara Colour, this one.\nI love it and the fact I can read in color comics, manga, web comics and graphic novel everywhere is a plus.\nBut more and more I use Ebook Readers more and more I want to customize it. Like I have in the pic.\nWhat can I do? What do I want to do with my Kobo? ¶ I have some task and prerequisite for my Ebook Reader so I check an Hack which resolve all:\nI need to sync with Calibre: I have an huge Calibre Library and I want to keep it Change the default cover: I want my cover, not the default covers Integration with GoodRead or Hardcover: I want to sync with GoodRead or Hardover the data from my ebook reader. Open Source software: I want to use an Open Source project because I can code so if i need something I can code it. So I did some research on the web and find KoReader1.\nIt is a software which, after installing on the ereader, it add support for plugins and custom covers… So I start with it.\nHow to install it? ¶ Searching for the wiki page for starting/installing I found some tread about the installation2 and I follow them. Here I rewrite all the steps with newer link for the stuff needed and rewrote some step because the two treads aren’t clear enough for me.\nCheck if your device support the software Download the last version of what you want to install. In this case Last version of KoReader ↗ is what I want and support on my device Put all the zip/archive you download in a new directory without unarchive anything Download the installer script (Windows version ↗ , Mac version ↗ , Linux version ↗ ) and put in the same directory as all the other stuff downloaded in 2 Plug in the Kobo and check if you can read and write file inside it If needed fix the permission for execute the installer download at step 3 Follow the on-screen instruction and close the terminal when done Safely eject your Kobo, watch it process (it look like in some way a glitching and crashing device but it need to look like that) and waite for the end of the reboot. If you have doubt, here is a screenshot of what the terminal look like in step 6 if you did all in the right way.\nAfter the reboot of the device I start to add the plugins for some customization\nAdding stuff ¶ I add some KoReader Plugin, which you need to install.\nAll the plugin are installed in the same way:\nYou need to download the plugin You need to extract the plugin_name.koplugin Edit any config file for the plugin (only some plugin required this) Put the koplugin folder in the path for the device (in Kobo case is .adds/koreader/plugins) Restart KOReader ProjectTitle KOReader ↗ for a better looking homepage for KOReader (needed) Customisable Sleep Screen ↗ for having a customisable sleep screen (as the name of the plugin say) Hardcover.app for KOReader ↗ for sync the data with my HardCover ↗ account I also create some image with trasparent background for having this type of cover, where you can see under the sleep-screen what are you reading.\nAnd I did more ¶ I did a lot of configuration inside of KOReader for this or that component and I don’t want to lose all. So, after asking Reddit How can I make a backup? ↗ and make this script.\n#!/usr/bin/env python3 import os import sys import shutil from datetime import datetime KOREADER_DIR = \".adds\" BACKUP_DESTINATION = \"~/BackUp/KoReader\" BACKUP_FILENAME = \"koreader_backup_{date}.zip\" def find_kobo_device(): \"\"\"Find the path to the Kobo\"\"\" volumes_path = \"/Volumes\" if os.path.exists(volumes_path): for entry in os.listdir(volumes_path): full_path = os.path.join(volumes_path, entry) if os.path.isdir(full_path): try: contents = os.listdir(full_path) if \".kobo\" in contents: return full_path except PermissionError: continue return None def get_koreader_path(kobo_path): \"\"\"Returns the path to KoReader on the Kobo.\"\"\" return os.path.join(kobo_path, KOREADER_DIR) def create_backup(source_path, backup_destination): \"\"\"Creates a zip backup of KoReader.\"\"\" if not os.path.exists(source_path): print(f\"Error: KoReader not found in {source_path}\") return False print(f\"Creating backup from: {source_path}\") date_str = datetime.now().strftime(\"%Y%m%d_%H%M%S\") backup_filename = BACKUP_FILENAME.format(date=date_str) backup_path = os.path.join(backup_destination, backup_filename) print(f\"Backup to: {backup_path}\") try: shutil.make_archive( backup_path.replace(\".zip\", \"\"), \"zip\", root_dir=source_path, base_dir=\".\" ) print(f\"Backup created: {backup_path}\") return True except Exception as e: print(f\"Error during backup creation: {e}\") return False def main(): kobo_path = find_kobo_device() if not kobo_path: print(\"Kobo not found. Connect the device and try again.\") sys.exit(1) print(f\"Kobo found at: {kobo_path}\") koreader_path = get_koreader_path(kobo_path) backup_destination = os.path.expanduser(BACKUP_DESTINATION) os.makedirs(backup_destination, exist_ok=True) success = create_backup(koreader_path, backup_destination) if success: print(\"Backup completed successfully!\") else: print(\"Backup failed.\") sys.exit(1) if __name__ == \"__main__\": main() This Python script is run every time I connect to my computer with the Kobo and copy the .adds in a specific path with a new folder tagged with the timestamp.\nSo if I break my KOReader config, I can reset all and copy the .adds for restore the KOReader.\nConclusion ¶ For now this is what I did with my Kobo but I am thinking new stuff so if I will do something new I will write about it.\nKoReader ↗ Github official page ↩︎\nInstall Tread part1 ↗ and Install Tread part2 ↗  ↩︎\n","date":"13 April 2026","description":"A little diary about my expirience ","tags":["kobo","koreader","ebook","ereader","kindle"],"title":"Hacking My Kobo with KOReader","uri":"/post/2026/hacking-my-kobo/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ High fantasy map of tech writing (AI edition) - passo.uno ↗ Moving From a Franken-Bujo to a Wonderland222 Planner – The Well-Appointed Desk ↗ Link Love: Stellar Journeys – The Well-Appointed Desk ↗ The Golden Twenty Dice - David Revoy ↗ Rubenerd: Assembling a new study desk from shelves ↗ Rubenerd: The NMS Ceefax teletext reproduction! ↗ Visit to Bungu no Mori in Osaka, Japan – Inkcredible Colours ↗ Obfuscating My Contact Email - Kev Quirk ↗ Abandoned Japan on film — Tokyo Times ↗ New post from my blog ¶ Week Note Nº 15/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 110 Total anime watched time: 734h 46m Total anime watched episodes: 1779 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27498 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"12 April 2026","description":"Personal notes for week 15 of 2026","tags":["weeknote"],"title":"Week Note Nº 15/2026","uri":"/weeknotes/2026/15/"},{"categories":[],"content":"And some day ago I find that I am in the Kagi Small Web ↗ and I love the blog selection\n","date":"5 April 2026","description":"","tags":["small-web","kagi-small-web","indieweb"],"title":"And Now I Am in Love With the Kagi Small Web","uri":"/micro/2026/04/and-now-i-am-in-love-with-the-kagi-small-web/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Tom’s Studio #60 Pigment Black — Inkdependence ↗ Unpacking the Inaugual San Francisco Stationery Fest (Literally and Figuratively), Plus Save the Date for On The Paper Trail Live in Nashville! — The Gentleman Stationer ↗ A couple of music devices — baty.net ↗ Welcome to RSS Club! – Terence Eden’s Blog ↗ Attention Required! | Cloudflare ↗ Ken’s Night Chinese Soup – pea pods – – Inkcredible Colours ↗ Peek Inside My Reading Journal – The Well-Appointed Desk ↗ Tokyo people and various places — Tokyo Times ↗ Old Osaka shopping street changes and continuity — Tokyo Times ↗ stephvee.ca - How Safe Are Our RSS Feeds From AI Data Scrapers? ↗ Just a moment… ↗ The Local Alternative - David Revoy ↗ What is the Small Web? – Aral Balkan ↗ Guide ↗ The small web is beautiful ↗ Rediscovering the Small Web - Neustadt.fr ↗ Kagi Blog - Small Web Just Got Bigger ↗ https://www.reddit.com/r/iosapps/s/oNmfOM8uyw ↗ Links with Tips and Advice for Public Speaking – a post by Marc Thiele ↗ Apple at 50: my most memorable product announcements ↗ What we need to save Tokyo’s public baths - by Sam Holden ↗ After a year of “vibe coding,” AI still can’t replace effort \u0026 expertise ↗ Stainless - Blog - Escaping Maven dependency hell ↗ 2026 SF Stationery Fest in the books - by April Wu ↗ What Is Too Minimal? - Carl Barenbrug ↗ Soon, everything will be an iPad ↗ Rubenerd: Trans Day of Visibility 2026 🏳️‍⚧️ ↗ Rubenerd: Initial thoughts about the ThinkPad E14: wow! ↗ New post from my blog ¶ And Now I Am in Love With the Kagi Small Web ↗ Week Note Nº 14/2026 ↗ Django Table, Filter and Export With Htmx ↗ And Now Java ↗ Starting My Home Automation Experiment ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 105 Total anime watched time: 706h 22m Total anime watched episodes: 1708 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27385 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"5 April 2026","description":"Personal notes for week 14 of 2026","tags":["weeknote"],"title":"Week Note Nº 14/2026","uri":"/weeknotes/2026/14/"},{"categories":["dev","fingerfood"],"content":"Some time ago I wrote a blog post about Htmx and Django-table2 and all went well…\nNo he didn’t work as I wanted so I did some editing of the code here and there.\nThe old one ¶ We start with the code I didn’t change:\nFirst the model\n# blog/model.py class Post(models.Model): title = models.CharField(max_length=400) slug = models.SlugField(max_length=400, unique=True, blank=True) content = models.TextAreaField() date = models.DateTimeField(auto_now_add=True) The table\n# blog/tables.py import django_tables2 as tables from blog.models import Post class PostTable(tables.Table): class Meta: model = Post order_by = (\"-date\", \"title\") fields = [\"date\", \"title\", \"slug\"] This two fragment are perfect as is so I didn’t touch them. But all the other part I reworked as I needed.\nThe new parts ¶ I need to have a “universal table” for show data, with filter and export the data. And I need to have an “universal template” for all the combination Table-Export-Filter…\nSo I wrote one\nFirst thing (after the model and the table) I need view with filter and exporter support. And using django-table21 all was easy.2\nSo I wrote this class which support all I need for using it as Htmx endpoint.\n# blog/views.py from django_tables2 import SingleTableMixin from django_tables2.export import ExportMixin, TableExport from django_filters.views import FilterView from blog.model import Post class DataHtmx(ExportMixin, SingleTableMixin, FilterView): model = Post template_name = \"generic/table2.html\" table_class = PostTable filterset_fields = [\"title\",\"slug\", \"date\"] export_formats = ( TableExport.CSV, TableExport.XLS, TableExport.XLSX, TableExport.ODS, ) def get_export_filename(self, export_format): return f\"Export Data.{export_format}\" ExportMixin, with the export_formats are the the export part of the view SingleTableMixin is the table part of the view FilterView is the filter part of the view, with filterset_fields as the field you can filter. You can also haave a filterset_class if you need Done this I need a template. More generic template because I don’t want to rewrite the same code every time…\nSo here is it!\n# templates/generic/table.html {% load render_table from django_tables2 %} {% load export_url from django_tables2 %} {% load django_bootstrap5 %} {% if filter %} {% if 'hide_filter' not in request.GET %} \u003cdiv class=\"col-12 col-md-9\"\u003e \u003cdiv class=\"card mb-4\"\u003e \u003cdiv class=\"card-header\"\u003e \u003cbutton class=\"btn btn-section\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#filterCollapse\"\u003e \u003ci class=\"fa-solid fa-filter\"\u003e\u003c/i\u003e Filtri \u003ci class=\"fa-solid fa-chevron-down\"\u003e\u003c/i\u003e \u003c/button\u003e \u003c/div\u003e \u003cdiv id=\"filterCollapse\" class=\"collapse\"\u003e \u003cdiv class=\"card-body\"\u003e \u003cform method=\"get\" class=\"row\"\u003e {% load django_bootstrap5 %} {% bootstrap_form filter.form layout='floating' %} {% include 'generic/_btn_search.html' %} \u003c/form\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e {% endif %} {% endif %} \u003cdiv class=\"row\"\u003e {% if 'hide_export' not in request.GET %} {% for format in view.export_formats %} \u003ca class=\"btn col col-sm\" href=\"{{ request.path }}{% export_url format %}\" target=\"_blank\"\u003e \u003ci class=\"fa-duotone fa-regular fa-download\"\u003e\u003c/i\u003e \u003ccode\u003e{{ format }}\u003c/code\u003e \u003c/a\u003e {% endfor %} {% endif %} \u003chr\u003e {% render_table table %} \u003c/div\u003e This template work if you have filters, export or not.\nthe load are for django-table2 and boostrap (the last is for me, is not needed for the code) ‘hide_filter’ not in request.GET check if the url has the params for hide_filter. If it is present, the template hides the filters ‘hide_export’ not in request.GET check if the url has the params for hide_export. If it is present, the template hides the exports One example for the Htmx code is the following.\n\u003cdiv hx-get=\"{% url 'blog:post_htmx' %}?date_at={{ query_date | date:\"Y-m-d\" }}\u0026hide_filter\" hx-trigger=\"load\"\u003e In this example I had the filter set (with data form the template) and with hide_filter which hide the filters but not the exports button.\nI thing this will be a stable of my django code and it can be move in a custom module for share and easy import.\nDjango-table2 ↗  ↩︎\nI also use tablib ↗ for the export and django-filter ↗ for the filtering. ↩︎\n","date":"3 April 2026","description":"A little code fragment for show how to use in the same project Htmx, Django-table2 e Django-filters","tags":["django","export","htmx","django-table2","django-filters","django-filters"],"title":"Django Table, Filter and Export With Htmx","uri":"/post/2026/django-table-filter-export-with-htmx/"},{"categories":[],"content":"And now I start some Java gramming… Wish me luck\n","date":"1 April 2026","description":"","tags":["java"],"title":"And Now Java","uri":"/micro/2026/04/and-now-java/"},{"categories":["tinkering"],"content":"And some time ago I installed the Fiber1 in my home and I want to use in the best way, so I start to rework all my local network and I think about adding some home automation.\nxkcd #1931 — Virtual Assistant If you ask it to please turn off that feature, it apologizes a whole bunch and promises to try to be quieter, then switches to a slightly lower-volume version of the clip with \"sorry!\" after the louder sounds. What do I need? ¶ First I search for understand what I need to have for build my personal home automation. So serching on the web I found I need:\nA brain/core/server for coordinate all the stuffs A software for the brain, for the automation and other stuff A router for adding the brain to the network for update and other stuff Dongle/sensor/tech for connectivity with the sensors and smart stuff (one for protocol) The smart stuff (light bulb, sensor, timer, endpoint api…) So I need to choose which protocol I want in my home… And I don’t know…\nSo I change the point of view:\nI want to use good smart stuff but I don’t want to pay too much I want something Open Source so I am not bind to a company I want something offline or/and on MY HOME SERVER The protocols ¶ Searching for the protocols I choose Thread2 and Zigbee3. One reason is because they are the most used protocol for communication and more easy to find online (Amazon) and offline (Ikea and othe local shop).\nFor starting I will implement only Thread because the more easy tech for me are all Matter over Thread so I start with Thread.\nFrom the infographic I found, I need to implement Matter4 also because Matter is the top stuff for an Home Assistant. The software ¶ Now I want a software, Open Source, which I can support Thread and Matter (and also Zigbee) and I found a software (Open Source) wich support all I need: Home Assistant5.\nIt support Matter6, Thread7 and Zigbee8 and I can put it in a RaspberryPi or other server.\nHardware ¶ So I start to make a list of what I have and what I need. Some things I buy online, some things come from some tech market and some come form the shoes box of my old stuff…\nI only write about the real things but if I use cable or other “standard stuff” I don’t write about it. So yes I bought some usb extention and some network cable but they aren’t important for this post.\nCore/Brain Stuff ¶ First I need the Brain for the project\nFrom what I read in the Home Assistant5 documentation I need some type of server with some gadget connected to them.\nSo I search and got a RaspberryPi 4B9. I also bought a microSD with 64GB of memory (I am on a budget for this project) as an Hard Disk for the “server”.\nSearching in my closet and in some shoes boxes I found a case10 for RaspberryPi with active cooling system (and LGB light)\nSo I flash the microSD with the Home Assistant software. Thanks to the Raspberry Pi Software11 choosing the right iso and flash it in the SD was a walk in the park.\nAfter the flashing I set it up and add to my local network and check for update.\nSo the brain is ready!\nSensor form Ikea ¶ I went to Ikea for some stuff and some Swedish meatballs and I came back with an Ikea Alpstuga12.\nIt is a timer, air sensor with CO2 and PM2.5 sensor and output all of them and an Air Quality value.\nThe only bad thing about it is the color but for the price I don’t complain.\nSo after coming home I found it didn’t work.\nAs is the RaspberryPi 4B do not support Thread or Zigbee without some type of specialized antenna… I was understanding that the software use the wifi module of the RaspberryPi as a Zigbee/Thread emitter/reciver but no so I search on Amazon for the dongle for Thread.\nAntenna ¶ I bought a Usb dongle13 for connecting the RaspberryPi and the other gadget in the house (for now only the Ikea one)\n13\nThis antenna is a little special: you can flash it for changing it form Zigbee to Thread and vice versa so I start to config it.\nSetup the Antenna ¶ First I flash the antenna. I need to port from Zigbee to Thread14 and with the online tool it was so easy I thought I did something wrong.\nAfter this I connect the dongle and start to config the Home Assistant.\nFirst I need to have installed Thread from “Add Integration” and it showed an empty list of device. This is correct because I didn’t have a Thread router installed.\nSo we add a OpenRouter. How? Installing from the officials app of mine Home Assistant.\nAfter this I edit the config in this way (the device was auto-finded) and I set this for my device. 15\nFor checking if all was ok I went and seach in the log for the OpenThread for a specific line.\nAfter this I went to check if the Thread integration showed the Ikea sensor and it didn’t show… Why? Because I am STUPID.\nSetup the last little things ¶ Alpstuga (my air sensor) is not Thread, is Matter over Thread, so I need to add the thing with the Matter integration. And with this last integration the system worked!\nI am happy of this system? No. Why? I have the wrong time on the Alpstuga.\nThis thing I don’t understand so I search online for understand how can I fix the time on the device.\nI find this is a common problem with the Alpstuga device and someone made a Hacs16 plugin17 wich add a cron and a button for sync the Home Assistant’s clock. I also add the plugin for integrate my Playstation Network in my Home Assistant18.\nConclusion ¶ For now this is what I had done but I want to have automation (for now I don’t have any) and some stuff for lower the gas bill so there will be more post about my smart home.\nI pay a company to install it and I clean after. ↩︎\nThread Standard ↗  ↩︎\nZigbee Standard ↗  ↩︎\nMatter Standard ↗  ↩︎\nHome Assistant ↗  ↩︎ ↩︎\nHome Assistant Matter ↗  ↩︎\nHome Assistant Thread ↗  ↩︎\nZigbee Home Automation ↗  ↩︎\nRaspberryPi 4B ↗  ↩︎\nRaspberry Pi 4B Case from Owootecc ↗  ↩︎\nRaspberry Pi software ↗  ↩︎\nIkea Alpstuga ↗  ↩︎\nSONOFF Zigbee 3.0 USB Dongle Plus MG24 ↗  ↩︎ ↩︎\nSonoff dongle flasher/ ↗  ↩︎\nThis config work for me, it can not work for you ↩︎\nHome Assistant Hacs ↗  ↩︎\nMatter time synk ↗  ↩︎\nPlayStation Network Home Assistant ↗  ↩︎\n","date":"31 March 2026","description":"I am starting a Home Automation in my home and this is how I start it","tags":["home-automation","hacking","self-hosting","raspberry-pi","home-assistant"],"title":"Starting My Home Automation Experiment","uri":"/post/2026/starting-my-home-automation-experiment/"},{"categories":[],"content":" New post from my blog ¶ Week Note Nº 13/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 105 Total anime watched time: 706h 22m Total anime watched episodes: 1708 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27385 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"29 March 2026","description":"Personal notes for week 13 of 2026","tags":["weeknote"],"title":"Week Note Nº 13/2026","uri":"/weeknotes/2026/13/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Simon Collison | Return to Tokyo, Part 2 ↗ | Chris Aldrich ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 105 Total anime watched time: 706h 22m Total anime watched episodes: 1708 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27382 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"22 March 2026","description":"Personal notes for week 12 of 2026","tags":["weeknote"],"title":"Week Note Nº 12/2026","uri":"/weeknotes/2026/12/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ How to Use Chronodex - on MD Product ↗ Innamorarsi costa poco, 9,99 al mese - by Lorenzo Prattico ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 102 Total anime watched time: 693h 10m Total anime watched episodes: 1675 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27230 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"15 March 2026","description":"Personal notes for week 11 of 2026","tags":["weeknote"],"title":"Week Note Nº 11/2026","uri":"/weeknotes/2026/11/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ #6 reading trouble: oxford flashcards — a fleeting ripple ↗ Pyrefly vs. ty: Comparing Python’s Two New Rust-Based Type Checkers | Edward Li’s Blog ↗ htmx Infinite Scroll | Alchemists ↗ New post from my blog ¶ Week Note Nº 10/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 102 Total anime watched time: 693h 10m Total anime watched episodes: 1675 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27230 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"8 March 2026","description":"Personal notes for week 10 of 2026","tags":["weeknote"],"title":"Week Note Nº 10/2026","uri":"/weeknotes/2026/10/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ The Deluxe Steelcase Field Notes Notebooks Archive | Chris Aldrich ↗ #4 a-live: diamine zeugma fountain pen ink — a fleeting ripple ↗ Stamped Quarterly: An Experimental Mail Club ↗ The world is still so full of dinosaurs • Robin Rendle ↗ Journaling a Trip – The Well-Appointed Desk ↗ New Arrivals: More Index Cards, and Introducing Notsu Dot Grid Sticky Notes! — The Gentleman Stationer ↗ New post from my blog ¶ Week Note Nº 9/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 102 Total anime watched time: 693h 10m Total anime watched episodes: 1675 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27230 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"1 March 2026","description":"Personal notes for week 9 of 2026","tags":["weeknote"],"title":"Week Note Nº 9/2026","uri":"/weeknotes/2026/9/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Just a moment… ↗ The bare minimum for syncing Git repos – alexwlchan ↗ New post from my blog ¶ Week Note Nº 8/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 102 Total anime watched time: 693h 10m Total anime watched episodes: 1675 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27230 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"22 February 2026","description":"Personal notes for week 8 of 2026","tags":["weeknote"],"title":"Week Note Nº 8/2026","uri":"/weeknotes/2026/8/"},{"categories":[],"content":" I am a new work and I love some of the work but not all Suggested Reading Links/Posts ¶ Thursday Drops: 2026 Lamy AL-Stars in Pine and Flamingo, Tom’s Studio Inks, and More! — The Gentleman Stationer ↗ Tè verdi giapponesi: scopri tutte le qualità e le caratteristiche - Blog Peter’s Tea House ↗ New post from my blog ¶ Week Note Nº 7/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 102 Total anime watched time: 693h 10m Total anime watched episodes: 1675 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27230 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"15 February 2026","description":"Personal notes for week 7 of 2026","tags":["weeknote"],"title":"Week Note Nº 7/2026","uri":"/weeknotes/2026/7/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ The Complete Guide to pyproject.toml · devsjc blogs // ↗ How uv Helps Me to Not Hate Python · devsjc blogs // ↗ New post from my blog ¶ Week Note Nº 6/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 102 Total anime watched time: 693h 10m Total anime watched episodes: 1675 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27230 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"8 February 2026","description":"Personal notes for week 6 of 2026","tags":["weeknote"],"title":"Week Note Nº 6/2026","uri":"/weeknotes/2026/6/"},{"categories":[],"content":" Working on the site of the association Suggested Reading Links/Posts ¶ Will They Inherit Our Blogs? | Kev Quirk ↗ Loopwerk: Tim Cook sold Apple’s soul ↗ Magical things happen when you disconnect - by April Wu ↗ | Chris Aldrich ↗ How to police your agents - Duarte O.Carmo ↗ Scroll vīgintī quīnque ↗ New post from my blog ¶ Week Note Nº 5/2026 ↗ Making Htmx Stuffs ↗ Why Do I Disinstall Poetry and Use Only Uv ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 102 Total anime watched time: 693h 10m Total anime watched episodes: 1675 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27230 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"1 February 2026","description":"","tags":["weeknote"],"title":"Week Note Nº 5/2026","uri":"/weeknotes/2026/5/"},{"categories":[],"content":"I am developing more and more with Htmx in my Django project and I love it. I have a lot less code and more clean code with Htmx than the traditional Jinja2 stuff.\n","date":"27 January 2026","description":"Rant about Htmx","tags":["dev","htmx"],"title":"Making Htmx Stuffs","uri":"/micro/2026/01/making-htmx-stuffs/"},{"categories":["dev","fingerfood"],"content":"558 days ago (yes I count them), I wrote a follow-up article called Why Do I Disinstall Pipenv and Use Only Poetry? and now I remake mine dev space, for building python project.\nSome of the arguments are old, some are new but all come from my dev stack.\nBuild a .venv ¶ For every Python project I wrote, I code all the project with a Virtual Env or .venv. It is a local “installation” of Python for the folder and it keep all the dependency inside it.\nIt is the best way to develop python project because you can have any number of Python project, with different version of Python and/or different version of the dipendency for each project.\nBecause I use git I need a good way to lock and commit the dipendency of my project. Some time ago I was using Poetry but now I use UV for build, update and manage the Virtual Env\nCreating a .env file ¶ Every python project I create, I always add a .env file, where I store all the environment variable for the project but I don’t add them to the repo because It is not necessary add the local config for dev in a repo.\nYou can also automatically use the .env file in Uv so every time you are inside the .venv, you also have all the variables.\nUsing UV ¶ So after some time I was using Poetry and Pipenv, I find UV ↗ , a tool write in Rust for locking dipendnecy, set up and manage the .venv and create package for the publication in one tool.\nYou can easly start a procjet with a simple command\nuv init which create the pyproject.toml and the .venv with all the dipendency.\nWith some other command you can easily add, remove and update the dipendency or import in a easy way your .env file.\nuv run --env-file=.env I move to UV because I can use a single tool for all my python necessity and it is faster and less bugged.\nEditor Config ¶ We have the .venv, we have the .env, we have the dependency manager so I add the Editor Config file for the style of the code. The Editor Config file ↗ is a file where you define the style for the type of file you write in your repo.\nI have mine made year after year but I start with the example ↗ in the site because it is easy and with all the stuff you need.\nMakefile it ¶ So, after adding stuff over stuff to the repo, I add a makefile where yu have all the aliases for a python project, 1.\nMy basic makefile is something like this\nSHELL := /bin/bash RUNNER := uv run --env-file=.env .PHONY: help help: ## Show this help @egrep -h '\\s##\\s' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = \":.*?## \"}; {printf \"\\033[36m%-20s\\033[0m %s\\n\", $$1, $$2}' .PHONY: install install: ## Make venv and install requirements @uv sync @$(RUNNER) pre-commit install @pre-commit autoupdate .PHONY: update update: ## Update requirements @uv lock --upgrade @$(RUNNER) pre-commit autoupdate precommit: ## Run pre-commit hooks @git add . \u0026 uv run --env-file=.env pre-commit run --all-files The help command come form a blog post2 and describe better at my other post3\nI write a makefile for all my project because I forgot a lot of the command and parameters, so a makefile is a good way to have an “deploy” command or a “test” command for the project and forgot all the task needed for run a “test” or a “deploy”.\nI also put all the test command into the makefile because sometime the test command is too long to remember…\nPre commit and some automation ¶ This is my personal safety net for the commits. Some time I wrote and push without any work or thing about what I am doing… For this reason I add pre-commit4 for autofix and check all this minor error.\nThe took launch a lot of test BEFORE I can save the commit so I can find the error or getting a big fat NOPE for the commit, which I need to review for the problem.\nConclusion ¶ This is the stack I work with and I love it. It can be something custom and old style for some of the older tecnology but I find it complete for what I do.\nI wrote an article about makefile caller The Team Makefile ↗  ↩︎\nHow to create a self-documenting Makefile ↗  ↩︎\nThe Team Makefile ↗  ↩︎\nUsing pre-commit hooks to write better code ↗  ↩︎\n","date":"26 January 2026","description":"","tags":["poetry","pipenv","pyproject","pyenv","uv","makefile","make","precommit"],"title":"Why Do I Disinstall Poetry and Use Only Uv ","uri":"/post/2026/why-do-i-disinstall-poetry-and-use-only-uv-/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Subscribing to local news with a web reader | James’ Coffee Blog ↗ Announcing Artemis Roll-up | James’ Coffee Blog ↗ Loopwerk: Django 6.0 Tasks: a framework without a worker ↗ New Book: Vibe Coding Video Games with Python - Mouse Vs Python ↗ New post from my blog ¶ Week Note Nº 4/2026 ↗ Htmx Django and Django Table2 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 102 Total anime watched time: 693h 10m Total anime watched episodes: 1675 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27230 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"25 January 2026","description":"","tags":["weeknote"],"title":"Week Note Nº 4/2026","uri":"/weeknotes/2026/4/"},{"categories":["rant","dev"],"content":"For some time I am developing my personal Django server. It keeps some data for me and it is my automation server. And I want to test a Htmx code on Django so I make a little thing in my personal django project.\nWhat I have ¶ I have a MonthArchiveView with render a table list with a lot of function I need: add element, change month show, exports query as files, etc…\nI also don’t like to reload all the page for change the month I am seeing on the page. So I start to implement what I need.\nAnd, from some comment from the web and some friends, I want less code and more clean one.\nWhat I used ¶ For this project I used:\nDjango the framework used1 Django Table2 a module for easy creation of table for Django2 Django Htmx a module for easy support of Htmx3 Tablib a module for exporting the table as multiple file type4 The Py code ¶ So I start with the code for the model. It need to have a DateTimeField or a DateField (this becose I want to have an MonthArchiveView view).\n# blog/model.py class Post(models.Model): title = models.CharField(max_length=400) slug = models.SlugField(max_length=400, unique=True, blank=True) content = models.TextAreaField() date = models.DateTimeField(auto_now_add=True) and after I add the code for the table with the ordering of the data\n# blog/tables.py import django_tables2 as tables from blog.models import Post class PostTable(tables.Table): class Meta: model = Post order_by = (\"-date\", \"title\") fields = [\"date\", \"title\", \"slug\"] After the model and the table we need the view called by the HTMX code.\nI set all the config for choose the right data field and which is the format for month and year, followed for the export types’ settings.\n# blog/views.py from django.views.generic import ListView from django.contrib.auth.mixins import LoginRequiredMixin from django_tables2 import SingleTableView, tables from blog.models import Post from blog.tables import PostTable class PostMonthArchiveHtmx(LoginRequiredMixin, ExportMixin, SingleTableMixin, MonthArchiveView): model = Post template_name = \"generic/table2_with_export.html\" table_class = PostTable date_field = \"date\" allow_future = True month_format = \"%m\" year_format = \"%Y\" allow_empty = True export_formats = ( TableExport.CSV, TableExport.XLS, TableExport.XLSX, TableExport.ODS,) def get_month(self): try: month = super().get_month() except Http404: month = now().strftime(self.get_month_format()) return month def get_year(self): try: year = super().get_year() except Http404: year = now().strftime(self.get_year_format()) return year def get_export_filename(self, export_format): return f\"Export Post {self.get_year()}-{self.get_month()}.{export_format}\" I added a function for changing the name of the output file (because I like filename with date reference) and two functions for setting month and year if not given (we need them later for the Htmx part).\nThe Jinja part ¶ After the python code I wrote this generic template for all my django-table2 table (in this case with the export code)\n# templates/generic/table2_with_export.html {% load render_table from django_tables2 %} {% load export_url from django_tables2 %} \u003cdiv\u003e {% for format in view.export_formats %} \u003ca href=\"{{ request.path }}{% export_url format %}\" target=\"_blank\"\u003e \u003ccode\u003e{{ format }}\u003c/code\u003e \u003c/a\u003e {% endfor %} \u003chr\u003e {% render_table table %} \u003c/div\u003e I take out all the css stuff so you can add your style and/or css classes.\nAt this point we have all we need to have a html page with the table and the exports we need. We only need to add this view into the urls…\nFor example this is a generic example for a urls file for this project\n# blog/urls.py from django.urls import path from blog.views import ( PostMonthArchiveHtmx, ) app_name = \"blog\" urlpatterns = [ path(\"htmx/post\", PostMonthArchiveHtmx.as_view(month_format=\"%m\",name=\"htmx-post\")), ] You can see that I didn’t add the code for having the month and the year in the url. This is because I had a lot of problems with the next part and this is the cleanest way I found to code this.\nThe Htmx fragment ¶ I will assume that you have done the quickstart form Htmx’s site5 because I don’t want to write about Htmx…\nSo for using inside a Django project for calling the page with Htmx we need to add the csrf token inside the header of the request so I added inside the main tag for my project.\nIt resembles this fragment.\n\u003c!-- template/base.html --\u003e \u003c!-- Other part of the template--\u003e \u003cdiv hx-headers='{\"x-csrftoken\": \"{{ csrf_token }}\"}'\u003e {% block content %} (no content) {% endblock %} \u003c/div\u003e \u003c!-- Other part of the template--\u003e So now I need to write the div for the Htmx. And this is what I wrote:\n\u003cdiv hx-get=\"{% url 'blog:htmx-post' %}?year={{ month|date:\"Y\" }}\u0026month={{ month|date:\"m\" }}\u0026{{ request.GET.urlencode }}\" hx-trigger=\"load\"\u003eThis will be replaced.\u003c/div\u003e I build the url in the hx-get in a strange way because I need to add the query input for the MonthArchiveView (the \u0026month and \u0026year field in the url) and add all the other field. In this way I also have the sorting links in the header of the table working.\nConclusion ¶ This is how I have combine this 3 libs for my personal project and if you find it useful share it. Thanks!\nDjango is a high-level Python web framework that encourages rapid development and clean, pragmatic design. Built by experienced developers, it takes care of much of the hassle of web development, so you can focus on writing your app without needing to reinvent the wheel. It’s free and open source ↗  ↩︎\ndjango-tables2 - An app for creating HTML tables ↗  ↩︎\ndjango-htmx Extensions for using Django with htmx ↗  ↩︎\nTablib: format-agnostic tabular dataset library ↗  ↩︎\nhtmx in a Nutshell ↗  ↩︎\n","date":"19 January 2026","description":"How I use Htmx for showing in a Django project a django-table2 filled with data from a MonthArchiveView","tags":["django","htmx","django-table2","montharchiveview"],"title":"Htmx Django and Django Table2","uri":"/post/2026/htmx-django-and-django-table2/"},{"categories":[],"content":" Making some test with Django-Table2 and love it Suggested Reading Links/Posts ¶ Visit to Zenrindo Shintoshin in Okinawa, Japan – Inkcredible Colours ↗ New post from my blog ¶ Week Note Nº 3/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 102 Total anime watched time: 693h 10m Total anime watched episodes: 1675 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27230 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"18 January 2026","description":"","tags":["weeknote"],"title":"Week Note Nº 3/2026","uri":"/weeknotes/2026/3/"},{"categories":[],"content":" Adding more stuff on my personal server Suggested Reading Links/Posts ¶ Mermaid charts! ↗ uv run for running tests on versions of Python ↗ Adding Type Hints to my Blog ↗ Publishing my citation preferences | James’ Coffee Blog ↗ Hardcover’s Book API: A great Goodreads alternative ↗ New post from my blog ¶ Week Note Nº 2/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 102 Total anime watched time: 691h 10m Total anime watched episodes: 1670 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27222 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"11 January 2026","description":"","tags":["weeknote"],"title":"Week Note Nº 2/2026","uri":"/weeknotes/2026/2/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Rubenerd: Tea over coffee first thing has worked oddly well ↗ The Value of Blogging | Canion dot Blog ↗ New post from my blog ¶ Week Note Nº 1/2026 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 101 Total anime watched time: 687h 58m Total anime watched episodes: 1662 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27215 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"4 January 2026","description":"Personal notes for week 1 of 2026","tags":["weeknote"],"title":"Week Note Nº 1/2026","uri":"/weeknotes/2026/1/"},{"categories":[],"content":" And I am tinkering with an old Typewriter New post from my blog ¶ Week Note Nº 52/2025 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 101 Total anime watched time: 687h 58m Total anime watched episodes: 1662 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27213 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"28 December 2025","description":"Personal notes for week 52 of 2025","tags":["weeknote"],"title":"Week Note Nº 52/2025","uri":"/weeknotes/2025/52/"},{"categories":[],"content":" Make some db cleaning of my personal server Suggested Reading Links/Posts ¶ A fruitful year of creative journaling in the Take a Note Planner ↗ Times New Roman, Calibri, and who accessibility is for (hint: all of us) ↗ New post from my blog ¶ Week Note Nº 51/2025 ↗ Working and Pydata ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 100 Total anime watched time: 684h 22m Total anime watched episodes: 1653 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27202 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"21 December 2025","description":"Personal notes for week 51 of 2025","tags":["weeknote"],"title":"Week Note Nº 51/2025","uri":"/weeknotes/2025/51/"},{"categories":[],"content":"And today afterwork I will go to PyData Venezia… With or without the rain\n","date":"18 December 2025","description":"","tags":["pydata","work"],"title":"Working and Pydata","uri":"/micro/2025/12/working-and-pydata/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Calibri: is this really the world’s wokest font? | Typography | The Guardian ↗ Why RSS matters ↗ Baty.net • Adding an article length indicator to the blog ↗ Where are we going, IndieWeb? : Juha-Matti Santala ↗ No, RSS isn’t dead! - Andrew Blackman ↗ My favorite terminal emulator, Ghostty, is now a non-profit ↗ New post from my blog ¶ Week Note Nº 50/2025 ↗ 2025 12 10 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 100 Total anime watched time: 683h 34m Total anime watched episodes: 1651 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27199 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"14 December 2025","description":"Personal notes for week 50 of 2025","tags":["weeknote"],"title":"Week Note Nº 50/2025","uri":"/weeknotes/2025/50/"},{"categories":[],"content":" Photography ¶ With my Canon camera I am going to some ComicCon near my place and taking a lot of photo of cosplayers. Some of them are share in my Cosplays’ Instagram Account ↗ .\nI have also a FujiFilm Camera and I make some Urban Photography and post here in this site and some of them I share in my Personal Instagram Account ↗ .\nI also made some edit but nothing I wish to share for now.\nI am also testing photography with the flash light.\nDev stuff ¶ I love Django, LaTeX and making bot or automation for my personal stuff so I am allways studing and trying new stuff. In particular I am trying Django Waytail for my personal curiosity and I am implement Webmention and other Indieweb stuff for my blogs.\nI also maintain some open source project and my personal VS Code Theme ↗ Meetup ¶ I am part of tech association called BacaroTech ↗ and we organize some mettup. I also go to local meetup about programming and data science near me.\nStationary ¶ I work a lot with stationary like fountain pens, travelers notebook and bulletjournal tecnique so I have some expirience and knowledge with ink, paper and fountain pen.\nI also use a lot of post-it and other little piece of paper for store information and store in my notebook. And I have an archive of my old notebook and similar stuff.\nI also work with ink stamp and wax seal in my personal life with firends, whom also love them.\nTea ¶ I also love tea and I make sperimentation with it as drink, as ingridient for food, as dessert. I also have a lot of cup and teapot for making tea in some different ways.\nI also trying to make my personal blend of tea for personal use.\nMy public stuff ¶ I also have some public stuff I love to share\nFundor333 ↗ - This blog make with Hugo and love. The Css framework change somethime. You can find more info in the colophon page DigitalTeaRoom ↗ - My blog about Tea and other stuff i like/love in the form of a newsletter in italian Dotfiles ↗ - My configuration for a Mac, a Windows or a Linux installation. ","date":"10 December 2025","description":"","tags":[],"title":"Now 2025/12/10","uri":"/now/2025/12/10/2025-12-10/"},{"categories":[],"content":" And second day… No problem for this And we start with the Advent of Code… And start with some problem Suggested Reading Links/Posts ¶ https://renecoignard.com/bye-fediverse/ ↗ Django 6.0 released | Weblog | Django ↗ I built a tiny RSS generator for my Advent of Code solutions : Juha-Matti Santala ↗ Index: Techo Kaigi 2026 - by Chelsea Park ↗ New post from my blog ¶ Week Note Nº 49/2025 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 100 Total anime watched time: 683h 10m Total anime watched episodes: 1650 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27190 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"7 December 2025","description":"Personal notes for week 49 of 2025","tags":["weeknote"],"title":"Week Note Nº 49/2025","uri":"/weeknotes/2025/49/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Django: implement HTTP bearer authentication - Adam Johnson ↗ Improve your programming skills with Advent of Code : Juha-Matti Santala ↗ New post from my blog ¶ Week Note Nº 48/2025 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 100 Total anime watched time: 681h 36m Total anime watched episodes: 1646 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27178 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"30 November 2025","description":"Personal notes for week 48 of 2025","tags":["weeknote"],"title":"Week Note Nº 48/2025","uri":"/weeknotes/2025/48/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Daggerheart’s First Expansion: Hope \u0026 Fear for Players and GMs! – Darrington Press ↗ Can you take an ox to Oxford? – alexwlchan ↗ Stationery Addict takes on Tokyo International Pen Show 2025 ↗ New post from my blog ¶ Week Note Nº 47/2025 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 99 Total anime watched time: 678h 53m Total anime watched episodes: 1639 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 269 Total manga read chapters: 27171 Total manga read volumes: 612 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"23 November 2025","description":"Personal notes for week 47 of 2025","tags":["weeknote"],"title":"Week Note Nº 47/2025","uri":"/weeknotes/2025/47/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Why I Don’t Need a Steam Machine | Brain Baking ↗ 20+ Years of Jeff Tweedy Driving - by Adam Webb ↗ Just a moment… ↗ New post from my blog ¶ Week Note Nº 46/2025 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 92 Total anime watched time: 645h 4m Total anime watched episodes: 1559 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 268 Total manga read chapters: 26971 Total manga read volumes: 597 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"16 November 2025","description":"Personal notes for week 46 of 2025","tags":["weeknote"],"title":"Week Note Nº 46/2025","uri":"/weeknotes/2025/46/"},{"categories":[],"content":" And I watch in one day all Arcane and love it… Fuck the world I was nerding out Starting editing photo from lucca comics Suggested Reading Links/Posts ¶ Fountain Pen Day Prep, Part II: An Overview of Fountain Pen Inks — The Gentleman Stationer ↗ Mastodon 4.5 for Developers - Mastodon Blog ↗ New post from my blog ¶ Week Note Nº 45/2025 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 92 Total anime watched time: 645h 4m Total anime watched episodes: 1559 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 268 Total manga read chapters: 26971 Total manga read volumes: 597 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"9 November 2025","description":"Personal notes for week 45 of 2025","tags":["weeknote"],"title":"Week Note Nº 45/2025","uri":"/weeknotes/2025/45/"},{"categories":[],"content":" New post from my blog ¶ Week Note Nº 44/2025 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 91 Total anime watched time: 648h 28m Total anime watched episodes: 1568 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 268 Total manga read chapters: 26971 Total manga read volumes: 597 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"2 November 2025","description":"Personal notes for week 44 of 2025","tags":["weeknote"],"title":"Week Note Nº 44/2025","uri":"/weeknotes/2025/44/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ What’s in my Fountain Pen Ink Journal? — Analog From Here ↗ Zettelkasten for Programmers: Pick a Title. It’s Okay to Change Later • Christian Tietze ↗ Kobe Ink University Romanesque Blue Ink Review — The Pen Addict ↗ The London Autumn Pen Show 2025: my haul. | Fountain pen blog ↗ Ink Overview: Kuretake Art Nouveau Collection – The Well-Appointed Desk ↗ Teranishi Guitar Night Time Soda Fountain Pen Ink Review — The Pen Addict ↗ New post from my blog ¶ Week Note Nº 43/2025 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 91 Total anime watched time: 648h 28m Total anime watched episodes: 1568 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 268 Total manga read chapters: 26971 Total manga read volumes: 597 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"26 October 2025","description":"Personal notes for week 43 of 2025","tags":["weeknote"],"title":"Week Note Nº 43/2025","uri":"/weeknotes/2025/43/"},{"categories":[],"content":"And now I am playing Leggend Pokemon ZA…\n","date":"19 October 2025","description":"","tags":["videogame","gaming","pokemon"],"title":"And Now Pokemon ZA","uri":"/micro/2025/10/and-now-pokemon-za/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Was my website mentioned in a GitHub issue? – Terence Eden’s Blog ↗ Pokémon Legends Z-a might be a winner ↗ Compressed Fluid Typography · Matthias Ott ↗ Sunday, October 12, 2025 | Baty.net ↗ LAMY Balloon Fountain Pen Giveaway — The Pen Addict ↗ New post from my blog ¶ And Now Pokemon ZA ↗ Week Note Nº 42/2025 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 91 Total anime watched time: 648h 28m Total anime watched episodes: 1568 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 268 Total manga read chapters: 26971 Total manga read volumes: 597 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"19 October 2025","description":"Personal notes for week 42 of 2025","tags":["weeknote"],"title":"Week Note Nº 42/2025","uri":"/weeknotes/2025/42/"},{"categories":[],"content":" And today i was taking photo at cosplayers at San Dona Fumetto, a Con near my city Suggested Reading Links/Posts ¶ Add a GitHub Style Calendar Heatmap Widget to your Blog ↗ An /intro to Python 3.14’s New Features - Mouse Vs Python ↗ | Chris Aldrich ↗ | Chris Aldrich ↗ Ink Review #2850: KWZ Grapefruit — Mountain of Ink ↗ Rubenerd: Fully-adhesive sticky notes from Muji ↗ Django: one ORM to rule all databases 💍 ↗ New post from my blog ¶ Week Note Nº 41/2025 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 635h 40m Total anime watched episodes: 1536 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 268 Total manga read chapters: 26971 Total manga read volumes: 597 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"12 October 2025","description":"Personal notes for week 41 of 2025","tags":["weeknote"],"title":"Week Note Nº 41/2025","uri":"/weeknotes/2025/41/"},{"categories":[],"content":" Searcing open data for Pollin of my city Some automation for my blog from MeetUp Suggested Reading Links/Posts ¶ Goodbye, the “good old days” of Game Pass ↗ | Chris Aldrich ↗ Book Review: Streaming Wars – How Getting Everything We Wanted Changed Entertainment Forever by Charlotte Henry – Terence Eden’s Blog ↗ Trying out health tracking spreads in the Hobonichi Weeks ↗ New post from my blog ¶ Week Note Nº 40/2025 ↗ Fog Machine ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 635h 40m Total anime watched episodes: 1536 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 268 Total manga read chapters: 26971 Total manga read volumes: 597 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"5 October 2025","description":"Personal notes for week 40 of 2025","tags":["weeknote"],"title":"Week Note Nº 40/2025","uri":"/weeknotes/2025/40/"},{"categories":[],"content":" Experimental ¶ Some test with a fog machine and a sword… I love the result\n","date":"29 September 2025","description":"","tags":[],"title":"Fog Machine","uri":"/photos/2025/fog-machine/"},{"categories":[],"content":"Spread the love for open source with #Hacktoberfest, a month-long celebration of open-source projects, their maintainers, and the entire community of contributors. https://hacktoberfest.com ↗ ","date":"28 September 2025","description":"","tags":["dev","hacktoberfest","coding"],"title":"Hacktoberfest 2025","uri":"/micro/2025/09/hacktoberfest-2025/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Rate limit exceeded. ↗ New post from my blog ¶ Lucca Comics 2025 Tf ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 635h 40m Total anime watched episodes: 1536 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 268 Total manga read chapters: 26963 Total manga read volumes: 597 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"28 September 2025","description":"Personal notes for week 39 of 2025","tags":["weeknote"],"title":"Week Note Nº 39/2025","uri":"/weeknotes/2025/39/"},{"categories":[],"content":"E anche quest’anno vedo al Lucca Comics and Games. E faccio foto in TF. Se qualcuno é interessato mi contatti in privato\n","date":"24 September 2025","description":"","tags":["cosplay","photography","luccacomics"],"title":"Lucca Comics 2025 Tf","uri":"/micro/2025/09/lucca-comics-2025/"},{"categories":[],"content":" Learning AWS for personal project Suggested Reading Links/Posts ¶ Winnie Lim » preserving and growing our energy capacity ↗ Web Syndication ↗ How to have only one blog | Baty.net ↗ Cooking with glasses - macwright.com ↗ I do believe the number of headphones Jasper says I need ↗ Five Boutique Paper Brands I’m Watching Closely and Why — The Gentleman Stationer ↗ switch and restore are now Official in Git 2.51 ↗ Git Stashes | Alchemists ↗ New post from my blog ¶ Week Note Nº 38/2025 ↗ Searching for a Job ↗ Is Silksong an Horror ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 635h 40m Total anime watched episodes: 1536 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 268 Total manga read chapters: 26961 Total manga read volumes: 597 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"21 September 2025","description":"Personal notes for week 38 of 2025","tags":["weeknote"],"title":"Week Note Nº 38/2025","uri":"/weeknotes/2025/38/"},{"categories":[],"content":"Hello FedVerse! I am searching for a job ad a Backend Developer.\nI am a 6 year Python-Django Developer form Italy with also some familiarity with Flask, FastApi and Tornado. I am also familiar with Postgresql and web scraping and type of Api (Rest, Soap, GraphQL) and coding middleware.\nPlease PM me for resume information.\n","date":"16 September 2025","description":"","tags":["jobsofmastodon","fedihire","jobsearching","python"],"title":"Searching for a Job","uri":"/micro/2025/09/searching-for-a-job/"},{"categories":[],"content":"Is SilkSong an horror game?\n","date":"15 September 2025","description":"","tags":["silksong","videogame","gaming"],"title":"Is Silksong an Horror ","uri":"/micro/2025/09/is-silksong-an-horror-/"},{"categories":[],"content":" Working on a new section of the blog: event section Making some interviews for a new job Some fix for the code of my blog for some optimization and a lower generating time Suggested Reading Links/Posts ¶ Planner-izing and Realizing - Line Variation ↗ Diamine Herbert – Inkcredible Colours ↗ A Brief Summer Check in - by Daniela - Journaling Dan ↗ My Hobonichi 2026 order ↗ Typewriter Walking and Singing: Improving Typewriter Performance with Mats, Pads, Rubber Feet, Felt, Recovered Platens, and More | Chris Aldrich ↗ New post from my blog ¶ Week Note Nº 37/2025 ↗ Silksong Skip ↗ Addio Stefano Benni ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 635h 40m Total anime watched episodes: 1536 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 267 Total manga read chapters: 26858 Total manga read volumes: 597 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"14 September 2025","description":"Personal notes for week 37 of 2025","tags":["weeknote"],"title":"Week Note Nº 37/2025","uri":"/weeknotes/2025/37/"},{"categories":[],"content":"And I skip a boss without knowing\n","date":"10 September 2025","description":"","tags":["gaming","silksong","videogame"],"title":"Silksong Skip","uri":"/micro/2025/09/silksong-skip/"},{"categories":[],"content":"Oggi é venuto a mancare uno dei miei autori preferiti Stefano Benni. Io vorrei ricordarlo cosi, con una delle piú belle descrizioni di sempre del lecchino\n“Ero pronto a tutto, quando entrammo nel sotterraneo dove era custodito l’Archivio Zero. Ma quello che mi trovai di fronte era la peggior disgrazia che potessi immaginare. Un leccapiedi. Non esiste arma più terribile in dotazione a un Regime. Il suo intuito nel giudicare chi conta e chi non conta è infallibile. È difficile corromperlo perché sa chi può dargli di più. Non può essere adulato, perché l’adulazione è il suo terreno privilegiato. Non può essere spaventato, perché sa chi può proteggerlo. Sa chi sale e chi scende le scale delle gerarchie: una sua occhiata di disprezzo è la prova più sicura di una carriera finita.”\nStefano Benni, Baol. Una tranquilla notte di regime\n","date":"9 September 2025","description":"","tags":["StefanoBenni","Libri","Baol,"],"title":"Addio Stefano Benni","uri":"/micro/2025/09/addio-stefano-benni/"},{"categories":[],"content":"This is the only thing I HATE about SilkSong: the red flowers with the new pogo mechanic!!!\n","date":"8 September 2025","description":"","tags":["silksong","videogame","gaming"],"title":"I Love Silksong but Hate This Red Things","uri":"/micro/2025/09/i-love-silksong-but-hate-this-red-things/"},{"categories":[],"content":"And I love more and more Silksong (not the red stuff in the game)\n","date":"8 September 2025","description":"And more love to Silksong","tags":["gaming","silksong","videogame"],"title":"More love to Silksong","uri":"/micro/2025/09/more-love-silksong/"},{"categories":[],"content":" Some fix for the code of my blog for some optimization and a lower generating time I make more testing with LLM, Ollama and Python And now I generate summary for dataset with AI New post on my blog because I am restart playing with Jupyter Notebook Suggested Reading Links/Posts ¶ Common misconceptions about AI - Duarte O.Carmo ↗ Using Ollama with Python: Step-by-Step Guide - Cohorte Projects ↗ A little oddity in the way curl deals with old dates – Terence Eden’s Blog ↗ New post from my blog ¶ More love to Silksong ↗ Week Note Nº 36/2025 ↗ And More More Llm but This Time at Esc Summer Camp ↗ And Now Silksong! ↗ And Now I Study Ollama ↗ Generate Dataframe Summaries With Python ↗ Hugo Blog With Jupyter Notebook ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 635h 40m Total anime watched episodes: 1536 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 267 Total manga read chapters: 26835 Total manga read volumes: 597 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"7 September 2025","description":"Personal notes for week 36 of 2025","tags":["weeknote"],"title":"Week Note Nº 36/2025","uri":"/weeknotes/2025/36/"},{"categories":[],"content":"And now with the stuff from Esc Summer Camp and PyVenice I am making more testing and trying of LLM and understand what is a Stochastic parrot\n","date":"6 September 2025","description":"","tags":["escsummercamp","dev","llm","ollama","pyvenice"],"title":"And More More Llm but This Time at Esc Summer Camp","uri":"/micro/2025/09/and-more-more-llm-but-this-time-at-/"},{"categories":[],"content":"And now I will hide from the world for some day…\n","date":"4 September 2025","description":"And now I will hide from the world for some day...","tags":["videogame","silksong","gaming"],"title":"And Now Silksong!","uri":"/micro/2025/09/and-now-silksong/"},{"categories":[],"content":"And now I am studing Ollama with Python for implementing LLM in some of mine tools\n","date":"4 September 2025","description":"Studing a new tool Ollama","tags":["ollama","ai","llm","python"],"title":"And Now I Study Ollama","uri":"/micro/2025/09/and-now-i-study-ollama/"},{"categories":["dev"],"content":"How much time do you spend with making summaries of dataset? Too much and I don’t like doing it so I search to do it with the AI. So this is my sperimentation with some medical data see at PyDataVe 22nd event and Mistral model.\nThe code for the inizializzation ¶ For start I need to install some dipendency\nlangchain\u003e=0.3.27 langchain-ollama\u003e=0.3.7 pandas\u003e=2.3.2 import pandas as pd from langchain_ollama import ChatOllama from typing import Literal df = pd.read_csv(\"data/test.csv\") print(\"-*-\" * 20) print(f\"Dataset shape: {df.shape}\") print(\"-*-\" * 20) print(\"Missing value stats:\") print(df.isnull().sum()) -*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*- Dataset shape: (418, 20) -*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*- Missing value stats: ID 0 N_Days 0 Status 0 Drug 106 Age 0 Sex 0 Ascites 106 Hepatomegaly 106 Spiders 106 Edema 0 Bilirubin 0 Cholesterol 134 Albumin 0 Copper 108 Alk_Phos 106 SGOT 106 Tryglicerides 136 Platelets 11 Prothrombin 2 Stage 6 dtype: int64 This is a section of the dataset and what is missing value of the stats.\nNow we will start with the AI. In my case I user Ollama with Mistral model. I install the model with\nollama run mistral And prepare the code for use the model. First you need to make a connection with the local LLM instance. This code use Mistral but you can pass any local LLM instance you have.\ndef get_llm(model_name: str = \"mistral:latest\") -\u003e ChatOllama: \"\"\" Create and configure a ChatOllama instance for local LLM inference. This function initializes a ChatOllama client configured to connect to a local Ollama server. The client is set up with deterministic output (temperature=0) for consistent responses across multiple calls with the same input. Parameters ---------- model_name : str, optional The name of the Ollama model to use for chat completions. Must be a valid model name that is available on the local Ollama installation. Default is \"mistral:latest\". Returns ------- ChatOllama A configured ChatOllama instance ready for chat completions. \"\"\" return ChatOllama( model=model_name, base_url=\"http://localhost:11434\", temperature=0 ) If you want to test the connection you can use this command\nprint(get_llm().invoke(\"test\").content) Hallo! Wie geht es Ihnen? Ich bin hier, um Ihnen zu helfen. Was möchten Sie heute tun? Ich kann Ihnen beispielsweise helfen: * Fragen beantworten * Informationen suchen * Aufgaben lösen * und vieles mehr! Welche Aufgabe haben wir heute vor uns? Make a context ¶ Now we need to generate a context for the LLM. If you do this function with all the necessary data you can relaunch this script every time you need a new README/summary of the dataset. This is better to be a dataset with a fixed schema and a date which change every year like medical data (this), monthly sell report, census data…\ndef get_summary_context_message(df: pd.DataFrame, dataset_name:str) -\u003e str: # Basic application statistics total_analisys = len(df) # Gender distribution gender_counts = df[\"Sex\"].value_counts() male_count = gender_counts.get(\"M\", 0) female_count = gender_counts.get(\"F\", 0) # Stage Statistics stage_data = df[\"Stage\"].dropna() stage_avg = stage_data.mean() stage_25th = stage_data.quantile(0.25) stage_50th = stage_data.quantile(0.50) stage_75th = stage_data.quantile(0.75) # NDays Statistics days_data = df[\"N_Days\"].dropna() days_avg = days_data.mean() days_25th = days_data.quantile(0.25) days_50th = days_data.quantile(0.50) days_75th = days_data.quantile(0.75) def status_category(exp): if pd.isna(exp): return \"Unkown\" elif exp == \"C\": return \"Censored\" elif exp == \"CL\": return \"Censored due to Lever tx\" elif exp == \"D\": return \"Death\" else: return \"Unkow\" df['Status Str']= df['Status'].apply(status_category) status_str_stats = [] for category in [\"Censored\", \"Censored due to Lever tx\", \"Death\",]: category_data = df[df[\"Status Str\"] == category] if len(category_data) \u003e 0: male = len(category_data[category_data[\"Sex\"] == \"M\"]) female = len(category_data[category_data[\"Sex\"] == \"F\"]) total = len(category_data) rate_m = (male / total) * 100 rate_f = (female / total) * 100 status_str_stats.append((category, male, female, total, rate_m, rate_f)) summary =f\"\"\"{dataset_name} Total Analisys: {total_analisys:,} Gender Distribution: - Male applicants: {male_count:,} ({male_count/total_analisys*100:.1f}%) - Female applicants: {female_count:,} ({female_count/total_analisys*100:.1f}%) Stage Statistics: - Average Stage: {stage_avg:.2f} - 25th percentile: {stage_25th:.2f} - 50th percentile (median): {stage_50th:.2f} - 75th percentile: {stage_75th:.2f} N Day Statistics: - N Days Stage: {days_avg:.2f} - 25th percentile: {days_25th:.2f} - 50th percentile (median): {days_50th:.2f} - 75th percentile: {days_75th:.2f} \"\"\" summary += \"\\n\\nStatus Rates by Sex:\" for category, male, female, total, rate_m, rate_f in status_str_stats: summary += ( f\"\\n- {category}: {male}/{total} Male ({rate_m:.1f}% rate)\"+ f\"\\n- {category}: {female}/{total} Female ({rate_f:.1f}% rate)\" ) return summary Make a report ¶ After checking all you need to have a template for the repo of the dataset.\nSUMMARIZE_DATAFRAME_PROMPT = \"\"\" You are an expert data analyst and data summarizer. Your task is to take in complex datasets and return user-friendly descriptions and findings. You were given this dataset: - Name: {dataset_name} - Source: {dataset_source} This dataset was analyzed in a pipeline before it was given to you. These are the findings returned by the analysis pipeline: \u003ccontext\u003e {context} \u003c/context\u003e Based on these findings, write a detailed report in {report_format} format. Give the report a meaningful title and separate findings into sections with headings and subheadings. Output only the report in {report_format} and nothing else. Report: \"\"\" This prompt and a lot of the code of this article are from this post ↗ .\nAfter this we need a function that take the dataset df, the prompt SUMMARIZE_DATAFRAME_PROMPT with the needed info and return the content of the report.\ndef get_report_summary( dataset: pd.DataFrame, dataset_name: str, dataset_source: str, report_format: Literal[\"markdown\", \"html\"] = \"markdown\", ) -\u003e str: context_message = get_summary_context_message(df=dataset, dataset_name=dataset_name) prompt = SUMMARIZE_DATAFRAME_PROMPT.format( dataset_name=dataset_name, dataset_source=dataset_source, context=context_message, report_format=report_format, ) return get_llm().invoke(input=prompt).content In our case we launch it as\nmd_report = get_report_summary( dataset=df, dataset_name=\"Cirrhosis Patient Survival Prediction\", dataset_source=\"https://www.kaggle.com/datasets/joebeachcapital/cirrhosis-patient-survival-prediction/data\" ) print(md_report) # Cirrhosis Patient Survival Prediction Analysis Report ## Overview The dataset analyzed consists of 418 records related to cirrhosis patients, sourced from [Kaggle](https://www.kaggle.com/datasets/joebeachcapital/cirrhosis-patient-survival-prediction/data). The data provides information about the patient's gender, stage of cirrhosis, number of days since diagnosis, and final status (censored or death). ## Demographics ### Gender Distribution The dataset shows a significant imbalance in gender distribution with 89.5% female applicants (374) and only 10.5% male applicants (44). ## Cirrhosis Stage Statistics ### Average Stage The average stage of cirrhosis for the analyzed patients is 3.02, indicating a severe level of liver damage. ### Percentiles - **25th percentile**: The cirrhosis stage is at least 2.00 for 25% of the patients. - **Median (50th percentile)**: Half of the patients have a cirrhosis stage of 3.00. - **75th percentile**: For 75% of the patients, the cirrhosis stage is 4.00 or lower. ## N Days Statistics ### N Days Stage The average number of days since diagnosis for the analyzed patients is 1917.78 days. ### Percentiles - **25th percentile**: The minimum number of days since diagnosis for 25% of the patients is 1092.75 days. - **Median (50th percentile)**: Half of the patients have been diagnosed with cirrhosis for at least 1730.00 days. - **75th percentile**: For 75% of the patients, the number of days since diagnosis is 2613.50 days or less. ## Status Rates by Sex The following table shows the rates of different statuses (censored due to Lever tx and death) for both male and female applicants: | | Male Applicants | Female Applicants | |---------------------|-----------------|-------------------| | Censored | 17/232 (7.3%) | 215/232 (92.7%) | | Censored due to Lever tx | 3/25 (12.0%) | 22/25 (88.0%) | | Death | 24/161 (14.9%) | 137/161 (85.1%) | The analysis indicates that female applicants are more likely to have their status censored, either due to the lack of information or other factors, while male applicants are more likely to experience death. However, it's important to note that the sample size for male applicants is significantly smaller than that of female applicants. ","date":"3 September 2025","description":"How to generate dataframe summaries with python and AI for a type of dataset","tags":["datascience","dataframe","pandas","llm","Ollama","mistral"],"title":"Generate Dataframe Summaries With Python","uri":"/post/2025/generate-dataframe-summaries-with-python/"},{"categories":["dev"],"content":"A long time ago, I wrote a post about writing a post for the Pelican static site generator made with a Jupyter Notebook. I did it because, at the time, I was a huge fan of the Notebooks and I had the blog generated by Pelican so…\nAnd now, after a PyDataVe (the 22nd event), I make a Jupyter Notebook after a lot of time and I feel the need to have a solution for make a Jupyter Notebook one of the post of my blog so I find a way to do it. This time in Hugo\nJupyter in my Hugo ¶ So first I search for a way to convert a Jupyter Notebook to a Markdown file with the headers for Hugo. So I find a python module ↗ to generate a Notebook with a starting metadata for my blog. All the metadata are inside the first cell set as a Markdown type cell.\nAll this is made by launching this command for generate the notebook\nhugo_nbnew content/post/test-hugo-page And at the end of all the writing I launch this command\nhugo_nbconvert content/post/test-hugo-page/index.ipynb for generate/updating the markdown file for Hugo.\nOther little things I have done ¶ After testing all of this stuff I make some script for my personal writing pipeline (if I don’t make some automation I feel bad) I fix some CSS of my site for the code part. I am a Backend Dev, so I don’t share my CSS edit because it is something working but not so pretty to share…\nAfter that I find myself wanting to have some way to cite a part of the post with a link (because I want to share a specific part of the post as a response to post/tweet/tooth on the web) and I search for something clean and usefull.\nSo I find a JS script ↗ for adding deep anchor links to my post and I set it to add a deep anchor for every paragraph of the posts.\nAnd after all I check if I implement the meta tag for journalism for Mastodon ↗ because I share a lot of stuff on Mastodon.\nFinal consideration ¶ I like my new configuration with the possibility to add Jupyter Notebook in my blog and this is the first Notebook I had to my Hugo Blog. I also like the idea that I can work for something else, make a Notebook and, only changing the data, make multiple article about something with the updated data every time I need to add the blog with the latest report for the dataset.\n","date":"1 September 2025","description":"How to integrate a Jupyter Notebook to your Hugo Blog","tags":["hugo","juppyter","notebook","datascience","pydatave"],"title":"Hugo Blog With Jupyter Notebook","uri":"/post/2025/hugo-blog-with-jupyter-notebook/"},{"categories":[],"content":" New post on my blog because I am restart playing with Jupyter Notebook I went to PyDataVe 22 edition and I love it. A workshop about analysing data with Klib and other tools Suggested Reading Links/Posts ¶ the Hexploration Kit | Dyson’s Dodecahedron ↗ Loopwerk: How I write Django views ↗ No. 11: Accessorizing Accessories - by Chelsea Park ↗ Shortcut to add link to today’s note in Obsidian : Juha-Matti Santala ↗ Migrate your Typepad blog to Pagecord - Pagecord Updates ↗ The Grindification of Hobbies (Alistair on YouTube) | Baty.net ↗ Simon Collison | This Is What You Get ↗ Ink Review: Colorverse Blue Dragon Collection — Mountain of Ink ↗ #971226 is my colour in the web : Juha-Matti Santala ↗ New post from my blog ¶ Week Note Nº 35/2025 ↗ Alchool at Pydatave ↗ At PyDataVe ↗ Going to Pydatave ↗ I Hate Js ↗ PydataVe 22 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 633h 16m Total anime watched episodes: 1530 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 263 Total manga read chapters: 26168 Total manga read volumes: 597 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"31 August 2025","description":"Random notes for week 35 of 2025","tags":["week note"],"title":"Week Note Nº 35/2025","uri":"/weeknotes/2025/35/"},{"categories":[],"content":"And now we have alchool at PyDataVes\n","date":"28 August 2025","description":"","tags":["data","pydata","pydatave"],"title":"Alchool at Pydatave","uri":"/micro/2025/08/alchool-at-pydatave/"},{"categories":[],"content":"And now I m at the PyDataVe\n","date":"28 August 2025","description":"","tags":["pydata","pydatave","python"],"title":"At PyDataVe","uri":"/micro/2025/08/at-pydatave/"},{"categories":[],"content":"Going to PyDataVe. I am curiosus of the tech we will see and try\n","date":"28 August 2025","description":"","tags":["pydata","pydatave","python","data"],"title":"Going to Pydatave","uri":"/micro/2025/08/going-to-pydatave/"},{"categories":[],"content":"I hate JS. We can develop a better web scripting language for work with the DOM?\n","date":"28 August 2025","description":"","tags":[],"title":"I Hate Js ","uri":"/micro/2025/08/i-hate-js-/"},{"categories":[],"content":"Waiting for tomorrow when I am going to the PyData Event in Venice 🐍👨🏻‍💻🐍\nhttps://www.meetup.com/pydata-venice/events/310339068/?eventOrigin=home_page_upcoming_events%24all ↗ ","date":"27 August 2025","description":"Waiting for the new event","tags":["pydatave","event","python","data","pydata","venice"],"title":"PydataVe 22","uri":"/micro/2025/08/pydata-venezia-2025/"},{"categories":[],"content":" To hot for doing anything and after that to much storm here Suggested Reading Links/Posts ¶ Ask TGS: How Do You Recommend Fountain Pens to New Users? — The Gentleman Stationer ↗ Linking to books online : Juha-Matti Santala ↗ What about using rel=”share-url” to expose sharing intents? – Terence Eden’s Blog ↗ 12 Pen Person Questions | Olive Octopus ↗ Is a city alive? - by Sam Holden ↗ Thursday Drops: B5 and B6 Roterfaden Taschenbegleiters, Correspondence Cards, and More! — The Gentleman Stationer ↗ The Pen Addict Podcast: Episode 679 - Brad’s Big Day Out — The Pen Addict ↗ Quick Setup: Second Device (Linux) For Blogging With Hugo ↗ Multi Pen Versatility: Combining the Pilot 4+1 Multi Pen with the Uni Style Fit Gel Refill — The Gentleman Stationer ↗ New post from my blog ¶ Week Note Nº 34/2025 ↗ Square of Textures ↗ Red Orange Red Light ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 633h 16m Total anime watched episodes: 1530 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 263 Total manga read chapters: 26168 Total manga read volumes: 597 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"24 August 2025","description":"Random notes for week 34 of 2025","tags":["week note"],"title":"Week Note Nº 34/2025","uri":"/weeknotes/2025/34/"},{"categories":[],"content":"Some texture on the wall of one of the ramen shop I went. A lovely wall and I hate not having my camera and I need to start having my camera every where I go. Again.\n","date":"23 August 2025","description":"","tags":[],"title":"Square of Textures","uri":"/photos/2025/square-of-textures/"},{"categories":[],"content":"Little shot take with my phone. I hate not having my camera and I need to start having my camera every where I go.\nI love this type of light and every time I find I take photo of them.\n","date":"21 August 2025","description":"Some light from a ramen take away in Venice","tags":[],"title":"Red Orange Red Light","uri":"/photos/2025/red-orange-red-light/"},{"categories":[],"content":" Suggested Reading Links/Posts ¶ Sunday Reading for August 17, 2025 — The Gentleman Stationer ↗ Claude Code Status Line Script ↗ The Pen Addict Podcast: Episode 678 - Where Forth How You Been? — The Pen Addict ↗ Designing a mobile-first HTML editor | James’ Coffee Blog ↗ New Lamy Safari and AL-Star Pens: Introducing Dark Dusk and Mint! — The Gentleman Stationer ↗ Ink Review: Teranishi Guitar Taisho Roman Haikara Innocent Mauve Ink – The Well-Appointed Desk ↗ GitHub Pages Alternative: SourceHut Builds + Bunny.net ↗ Paper Test: Wonderland 222 New Planner Paper for 2026 – The Well-Appointed Desk ↗ Misfill, Notebooks From Italy Edition — The Pen Addict ↗ 📷 Five Notebooks from Italy - by Adam Webb ↗ 25 years of blogging | Baty.net ↗ New post from my blog ¶ Week Note Nº 33/2025 ↗ Federation Hosting Code ↗ Hot Hot Too Hot ↗ New post from my newsletter ¶ My Tiny Cozy Bookshop ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 633h 16m Total anime watched episodes: 1530 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 263 Total manga read chapters: 26168 Total manga read volumes: 597 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"17 August 2025","description":"Random notes for week 33 of 2025","tags":["week note"],"title":"Week Note Nº 33/2025","uri":"/weeknotes/2025/33/"},{"categories":[],"content":"And now Github will be develop by Microsoft AI Team so… Exist a software for hosting code (like Gitea) with a federation implementation (like mastodon) for users?\n","date":"14 August 2025","description":"","tags":["repository","federate","github","gitea"],"title":"Federation Hosting Code","uri":"/micro/2025/08/federation-hosting-code/"},{"categories":[],"content":"It is too hot to do anything here so I will close myself inside a fridge and wait for the autumn\n","date":"11 August 2025","description":"","tags":[],"title":"Hot Hot Too Hot","uri":"/micro/2025/08/hot-hot-too-hot/"},{"categories":[],"content":" Studing more slashpages for my blog Update now template, now is something like a sub blog about my personal life Suggested Reading Links/Posts ¶ 2025 Washington DC Fountain Pen Supershow | Olive Octopus ↗ Dominant Industry Takasago Ink Swatch Paper Review — The Pen Addict ↗ Paperian Flat Checklist A5 Notepad Review — The Pen Addict ↗ Simon Collison | Eighty years ↗ I still get that powerful feeling that anything is possible when I open a web browser — it’s not as strong as it was 20 years ago, but it’s still there. - Geoff Graham ↗ Dotfiles feel too intimate and personal to share : Juha-Matti Santala ↗ Bring your custom toolkit to REPL sessions : Juha-Matti Santala ↗ USPS x Pantone = What ink color is that? – The Well-Appointed Desk ↗ Naming devices is fun : Juha-Matti Santala ↗ In Defense of the Card Catalog | Folger Shakespeare Library ↗ Ghost 6.0! ↗ Best Free Synthesizer Plugins in 2025 · Matthias Ott ↗ Adding a Dynamic Now Page in Jekyll ↗ New post from my blog ¶ Week Note Nº 32/2025 ↗ 2025 08 05 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 633h 16m Total anime watched episodes: 1530 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 263 Total manga read chapters: 26168 Total manga read volumes: 597 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"10 August 2025","description":"Random notes for week 32 of 2025","tags":["week note"],"title":"Week Note Nº 32/2025","uri":"/weeknotes/2025/32/"},{"categories":[],"content":" Photography ¶ With my Canon camera I am going to some ComicCon near my place and taking a lot of photo of cosplayers. Some of them are share in my Cosplays’ Instagram Account ↗ .\nI have also a FujiFilm Camera and I make some Urban Photography and post here in this site and some of them I share in my Personal Instagram Account ↗ .\nI also made some edit but nothing I wish to share.\nDev stuff ¶ I love Django, LaTeX and making bot or automation for my personal stuff so I am allways studing and trying new stuff. In particular I am trying Django Waytail for my personal curiosity and I am implement Webmention and other Indieweb stuff for my blogs.\nStationary ¶ I work a lot with stationary like fountain pens, travelers notebook and bulletjournal tecnique so I have some expirience and knowledge with ink, paper and fountain pen. I also use a lot of post-it and other little piece of paper for store information and store in my notebook. And I have an archive of my old notebook and similar stuff.\nI also work with ink stamp and wax seal in my personal life with firends, whom also love them.\nTea ¶ I also love tea and I make sperimentation with it as drink, as ingridient for food, as dessert. I also have a lot of cup and teapot for making tea in some different ways.\nMy public stuff ¶ Fundor333 ↗ - This blog make with Hugo and love. The Css framework change somethime. Now it’s boostrap 4 with font awesome DigitalTeaRoom ↗ - My blog about Tea and other stuff i like/love DTR Newsletter ↗ - My newsletter, Italian Dotfiles ↗ - My configuration for a Mac, a Windows or a Linux installation. ","date":"5 August 2025","description":"","tags":[],"title":"Now 2025/08/05","uri":"/now/2025/08/05/2025-08-05/"},{"categories":[],"content":" Learning to use the FuroshikI Suggested Reading Links/Posts ¶ A receipt printer cured my procrastination [ADHD] ↗ Sono tre anni che uso un laptop incredibile: ode al mio Thinkpad x270 · Grab The Blaster ↗ Loopwerk: Announcing django-generic-notifications 1.0.0 ↗ “You can’t pause an online game” — how childhood gaming formed my work preferences : Juha-Matti Santala ↗ Django: write a custom URL path converter to match given strings - Adam Johnson ↗ Step-by-Step Guide: How to Wrap a Gift with a Bandana - Walnut ↗ Top 3 Games for Upscale Lobbies and Waiting Rooms - Walnut ↗ How to Wrap Gifts with a Bandana (The Japanese Art of Furoshiki) - Walnut ↗ Migrating from Pelican to Hugo using Claude Code ↗ Leaving GitHub Pages for Bunny.net: My New Static Site Host - Burgeon Lab ↗ Loopwerk: Automate Python package releases ↗ Say Hi To Pierre | Brain Baking ↗ Pelikan Style Fountain Pen – The Well-Appointed Desk ↗ Il tè d’estate: freschezza e gusto anche con il caldo - Blog Peter’s Tea House ↗ Switching my website from Hugo to Quarto – Nicola Rennie ↗ I’m never going back to Matrix – Terence Eden’s Blog ↗ Tattooing Your Leather Traveler’s Notebook with StazOn Ink ↗ | Chris Aldrich ↗ 📝 Week Notes, No. 30.25 - So It Goes… ↗ Run Any Project with ‘r’ ↗ Releasing Log Basset: an open source CLI to access Scalyr logs ↗ New post from my blog ¶ Week Note Nº 31/2025 ↗ Minature on a Shelf ↗ Furoshiki ↗ Barnaba at Sunset ↗ Ghostty VScode ↗ Ghostty ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 633h 16m Total anime watched episodes: 1530 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 263 Total manga read chapters: 26168 Total manga read volumes: 597 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"3 August 2025","description":"Random notes for week 31 of 2025","tags":["week note"],"title":"Week Note Nº 31/2025","uri":"/weeknotes/2025/31/"},{"categories":[],"content":"Some experiment with a natural light at a club I go with some friends. I love some paint work on this props and love the undead theme…\nIs it Warhammer 40k? Warhammer Fantasy? I don’t know but I love the style\n","date":"2 August 2025","description":"Some minature on a clud shelf","tags":[],"title":"Minature on a Shelf","uri":"/photos/2025/minature-on-a-shelf/"},{"categories":[],"content":"Learning how to use a furoshiki for making more realistic bento\n","date":"1 August 2025","description":"","tags":["furoshiki","bento"],"title":"Furoshiki","uri":"/micro/2025/08/furoshiki/"},{"categories":[],"content":"Sometime I walk around my city at strange hours and I catch some lovly picture with lovly colors\n","date":"29 July 2025","description":"A sunset at Campo San Barnaba","tags":[],"title":"Barnaba at Sunset","uri":"/photos/2025/barnaba-at-sunset/"},{"categories":[],"content":"And this is how I use Ghostty and Catppucino in my stack\n","date":"28 July 2025","description":"","tags":["terminal","ghostty","terminalporn","catppuccin"],"title":"Ghostty VScode","uri":"/micro/2025/07/ghostty-matcha-vscode/"},{"categories":[],"content":"And reworking my dev stack with Ghostty and Catppuccin… And love the matcha color palet\n","date":"28 July 2025","description":"","tags":["terminal","ghostty","terminalporn","catppuccin"],"title":"Ghostty","uri":"/micro/2025/07/ghosttly/"},{"categories":[],"content":"Thanks for linking my blog in your blogrool F333\n","date":"27 July 2025","description":"","tags":["webmention"],"title":"Re: An incomplete list of blogs that use WebMention","uri":"/micro/2025/07/re-/"},{"categories":[],"content":"So you think that is only now thing? So in more time more people become decentralized users? I don’t know. I find difficult or confusing some mastodon part as web gui user (like follow from other server) but I will love a more decentralized world\n","date":"27 July 2025","description":"","tags":[],"title":"Re Webmentions Are Not Dying","uri":"/micro/2025/07/re-webmentions-are-not-dying/"},{"categories":[],"content":" Testing Ghosttly as my main terminal Reworking my dotfile and cleaning some old stuff Making a notebook with some of my photo and studing all the errors Suggested Reading Links/Posts ¶ Pen and Notebook frustrations | Baty.net ↗ Ghostty is the hot new terminal and it’s out now ↗ My lil’ Ghostty terminal config ↗ Minifying HTML on my Jekyll website – alexwlchan ↗ Building my new website: A modern approach to font fallbacks with font property adjustments - Nic Chan ↗ | Chris Aldrich ↗ Django: iterate through all registered URL patterns - Adam Johnson ↗ TIL: Making My First Pull Request on GitHub - Burgeon Lab ↗ Kobe Ginza Gold Sepia Fountain Pen Ink Review — The Pen Addict ↗ New post from my blog ¶ Re ↗ Re Webmentions Are Not Dying ↗ Week Note Nº 30/2025 ↗ Response to Response Dnd ↗ Dnd Response ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 633h 16m Total anime watched episodes: 1530 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 263 Total manga read chapters: 26168 Total manga read volumes: 597 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"27 July 2025","description":"Random notes for week 30 of 2025","tags":["week note"],"title":"Week Note Nº 30/2025","uri":"/weeknotes/2025/30/"},{"categories":[],"content":"Thanks, I will testing it and I will share something if is a good thing for my dnd group\n","date":"26 July 2025","description":"","tags":["dnd","self-hosting"],"title":"Response to Response Dnd","uri":"/micro/2025/07/response-to-response-dnd/"},{"categories":[],"content":" Testing some of the hugo query for stuff Suggested Reading Links/Posts ¶ No. 10: My Analogue Station - by Chelsea Park ↗ Summer Pen Show Schedule and D.C. and San Francisco Pen Show Details — The Gentleman Stationer ↗ How to Customize ReText: Python Markdown Editor - Burgeon Lab ↗ Futures for the web | James’ Coffee Blog ↗ Communicating the indie web | James’ Coffee Blog ↗ Building a Personal Monorepo for Writing · Andrew Stiefel ↗ Book Review: Problems Have No Sex – Caroline Haslett (1949) – Terence Eden’s Blog ↗ Custom CLI tool to link Mastodon posts and blog posts : Juha-Matti Santala ↗ Comparing Claude Code vs OpenCode (and testing different models) ↗ The Mad Scientist Method of Mixing Your Own Fountain Pen Ink Colors – The Well-Appointed Desk ↗ Tattooing Your Traveler’s Notebook: Leather Emboss (A Personal Story) ↗ Moving On in 2025: Reclaiming My Creative Journey with Chronodex ↗ Designing Your Own Life: From Reaction to Intention ↗ Leveling Up with Tea | Olive Octopus ↗ Dominant Industry Ink Archiving Book | Olive Octopus ↗ Dominant Industry Ink Archiving Book: A Log of Elixir | Olive Octopus ↗ 120 Col-o-dex Cards | Olive Octopus ↗ New post from my blog ¶ Week Note Nº 29/2025 ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 633h 16m Total anime watched episodes: 1530 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 244 Total manga read chapters: 24936 Total manga read volumes: 617 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"20 July 2025","description":"Random notes for week 29 of 2025","tags":["week note"],"title":"Week Note Nº 29/2025","uri":"/weeknotes/2025/29/"},{"categories":[],"content":" Buy and start a new Bullet Journal (Leuchtturm1917 A5 - Dotted - Sagge color) Make some test on Wagtail for future development And re-start #finalfantasyvii and #finalfantasyviii on my #swithch2 Suggested Reading Links/Posts ¶ It is 1939 and you want to use public-key cryptography – Terence Eden’s Blog ↗ How to use git worktree effectively with Python projects ↗ Graphing the connections between my blog posts – Terence Eden’s Blog ↗ Comprehensive Python Cheatsheet ↗ Vacation Prep: What I’m Taking and What to Expect Next Week — The Gentleman Stationer ↗ Using terminal-notifier in Claude Code to get custom notifications ↗ Hugo (Static Site Generator) CMS: Tips and Tricks - Burgeon Lab ↗ Loopwerk: Trying out PDM (and comparing it with Poetry and uv) ↗ Travel journals, photos and more! – The Well-Appointed Desk ↗ Open Graph Meta Tags on Hugo and WordPress Blogs - Burgeon Lab ↗ Moving my Glitch apps to my own web server – alexwlchan ↗ How to Migrate your Python \u0026 Django Projects to uv | Caktus Group ↗ New post from my blog ¶ Week Note Nº 28/2025 ↗ Hugo Optimization ↗ Generate Post With Img for Hugo ↗ Open Graph Stuffs ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 633h 16m Total anime watched episodes: 1530 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 244 Total manga read chapters: 24936 Total manga read volumes: 617 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"13 July 2025","description":"Random notes for week 28 of 2025","tags":["week note"],"title":"Week Note Nº 28/2025","uri":"/weeknotes/2025/28/"},{"categories":[],"content":"I use a lot of them but I don’t use the Whitespace Trimming because in production I have a Minify option active for the Html\n","date":"13 July 2025","description":"","tags":[],"title":"Hugo Optimization","uri":"/micro/2025/07/hugo-optimization/"},{"categories":["dev","fingerfood"],"content":"Some days ago I find a new post from a blog I follow about “Open Graph Meta Tags on Hugo and WordPress Blogs ↗ ” as a toot\nNaty S\n@eclecticpassions@fosstodon.org New #blogpost\n➡️ https://www.burgeonlab.com/blog/hugo-and-wordpress-open-graph-meta-tags/\nI often see bloggers on Mastodon with no images for their blog links or sometimes no link card at all (this was me not too long ago).\nI've been sorting out Open Graph meta tags for my three blogs (Hugo and WordPress) and I'm happy to say it's all working great now! Read my post to get some tips! 👆 #BurgeonLab\n#blog #blogging #blogs #hugo #wordpress #webdev #opengraph\n3:18 PM · 8 Jul 2025 and I find I do the same thing and some more. I generate a default cover because I prefer to have a “standard” generated image or a specific image as the feature image. The image set in the settings is a default, a “if all other image fall use this” kind of stuff.\nHow I generate the post? ¶ When I write a post I launch a makefile command and it launch two command for me:\nGenerate a new post with hugo new Generate a cover with my python script Some code ¶ For this project I use a font (Futura Book font ↗ ) and a image where put the title and other thing of the post (for now only the title). This is the image “clean”, without the text.\nfrom PIL import Image, ImageDraw, ImageFont # 👉️ Import modules from PIL def generate_img(message: str, path: str): font_path = \"Futura Book font.ttf\" # 👉️ Font .ttf Path font_size = 100 # 👉️ Font Size img = Image.open(\"cover-blank.jpg\") # 👉️ Open Image dr = ImageDraw.Draw(img) # 👉️ Create New Image my_font = ImageFont.truetype(font_path, font_size) # 👉️ Initialize Font text_x = (img.width) // 2 text_y = (img.height) // 2 dr.text((text_x, text_y), message, font=my_font, fill=(255, 255, 255), anchor=\"mm\") print(\"Generated content/\" + path + \"/cover.png\") img.save(\"content/\" + path + \"/cover.png\") This script use Python (the library is PIL) and I set the fill parameters for a standard size OpenGraph image.\nIf you use a python script for generate new post you can implement this code inside of the script or you can add some code to make a command line to launch after your “new post” command.\n","date":"12 July 2025","description":"How I create new post on Hugo and generate an image as cover","tags":["image","hugo","script","hacking"],"title":"Generate Post With Img for Hugo","uri":"/post/2025/generate-post-with-img-for-hugo/"},{"categories":[],"content":"For some post type I generate the featured image with a script, so If I don’t have a specific image for the post I have something custom for this specific type of post\nI am writing a post about it\n","date":"8 July 2025","description":"Little response to post","tags":["Open graph"],"title":"Open Graph Stuffs","uri":"/micro/2025/07/open-graph-stuffs/"},{"categories":[],"content":" OK why is KPop Demon Hunters so good? More and more ink named after Chocolate… Why? Now is too hot to do anything And today I am trying to cook a Katsudon Suggested Reading Links/Posts ¶ Before you buy a domain name, first check to see if it’s haunted | Bryan Braun - Frontend Developer ↗ My thoughts about InCoWriMo ↗ Humanity hates people. ↗ Making My Own Hacktoberfest T-Shirts – Terence Eden’s Blog ↗ Python eBook Fourth of July Sale - Mouse Vs Python ↗ Why do I want to post? ↗ Cloudflare to introduce pay-per-crawl for AI bots | Nicola Iarocci ↗ Trunk \u0026 Tidbits, May 2025 - Mastodon Blog ↗ Mastodon Comments ↗ Creating a Website with Sphinx and Markdown - Mouse Vs Python ↗ Rubenerd: Ceasing my use of Creative Commons ↗ New post from my blog ¶ Week Note Nº 27/2025 ↗ Hunted Domain ↗ Making a Katsudon ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 633h 16m Total anime watched episodes: 1530 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 244 Total manga read chapters: 24936 Total manga read volumes: 617 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"6 July 2025","description":"Random notes for week 27 of 2025","tags":["week note"],"title":"Week Note Nº 27/2025","uri":"/weeknotes/2025/27/"},{"categories":[],"content":"So now we have haunted domain? Thanks for the info and waiting for the book from Stephen King about it\nhttps://www.bryanbraun.com/2024/10/25/before-you-buy-a-domain-name-first-check-to-see-if-its-haunted/ ↗ ","date":"6 July 2025","description":"Haunted domain","tags":["haunt","domain"],"title":"Hunted Domain","uri":"/micro/2025/07/hunted-domain/"},{"categories":[],"content":"Trying cooking new food.\nThis is my Katsudon\n","date":"1 July 2025","description":"","tags":["cooking","katsudon"],"title":"Making a Katsudon","uri":"/micro/2025/07/making-a-katsudon/"},{"categories":[],"content":" Less feed to read. Is it too hot to write? Reading Dracula: June 24 from draculadaily Restarting writing with LaTeX Suggested Reading Links/Posts ¶ OS platforms have a responsibility to do age verification ↗ On Age Verification and “Porn” ↗ Ink Review: Esterbrook x TheCoffeeMonstersCo Forgotten Iced Coffee - The Well-Appointed Desk ↗ An Intro to ty - The Extremely Fast Python type checker - Mouse Vs Python ↗ Dracula: June 24 - by DraculaDaily - Dracula Daily ↗ New post from my blog ¶ Week Note Nº 26/2025 ↗ Why Instagram ↗ Ghost Blogging ↗ Too Hot For ↗ Latex Reprise ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 633h 16m Total anime watched episodes: 1530 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 244 Total manga read chapters: 24936 Total manga read volumes: 617 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"29 June 2025","description":"Random notes for week 26 of 2025","tags":["week note"],"title":"Week Note Nº 26/2025","uri":"/weeknotes/2025/26/"},{"categories":[],"content":"E questa é la dimostrazione che Instagram da piú peso ai real che alle immagini\nAnd this is the proof that Instagram like more real than img\n","date":"26 June 2025","description":"","tags":["Instagram"],"title":"Why Instagram","uri":"/micro/2025/06/why-instagram/"},{"categories":[],"content":"Blogging with Ghost, with Wordpress and with Hugo but I only don’t like Wordpress’s expirience. Waiting for the ActivityPub into Ghost (not testing like now)\n","date":"25 June 2025","description":"","tags":["blogging","ghost","gohugo","wordpress"],"title":"Ghost Blogging","uri":"/micro/2025/06/ghost-blogging/"},{"categories":[],"content":"It is me or it is too hot for doing anything? Like I have less feed news to read, like half of the amount of the Winter’s months\n","date":"24 June 2025","description":"","tags":["blogging","hot"],"title":"Too Hot For","uri":"/micro/2025/06/too-hot-for/"},{"categories":[],"content":"And now restart work with LaTeX… I love it!\n","date":"23 June 2025","description":"","tags":["LaTeX","coding"],"title":"Latex Reprise","uri":"/micro/2025/06/latex-reprise/"},{"categories":[],"content":" Talking with a friend for a new blog (not mine) Thinking about creating a new hugo theme for my site Add more code for syndication adn mastodon support into my blog And now I better support Mastodon as comments in my personal blog Suggested Reading Links/Posts ¶ Go Fast With Django · Matt Layman ↗ Stationery For Your Worst Enemy | Rachel’s Reflections ↗ Ink Review: Dominant Industry Log of Elixir/Log of Atlantis Inks - The Well-Appointed Desk ↗ Fediverse: a New Era of Social Media – The video – Cubicgarden.com… ↗ XPLRA 1.0 Concept Device Wants You to Catch ‘Em All in the Real World - Yanko Design ↗ Colophon - Burgeon Lab ↗ AI coding is less fun | Nicola Iarocci ↗ Top 10 Scandinavian-Inspired Homes That Perfectly Capture Nordic Design \u0026 Architecture - Yanko Design ↗ Ovalware Collection brings elegant functionality to coffee and tea brewing process - Yanko Design ↗ GitHub’s CEO on the ‘Key for Winning’ With AI Coding Tools - Business Insider ↗ Marp, the markdown presentation ecosystem | Nicola Iarocci ↗ DIY Handheld PC Makes Room for Analog Doodles and Sticky Notes - Yanko Design ↗ My Blogging Workflow ↗ Exploring via Public Transit | Brandon Rozek ↗ Blogs are still a thing | Nicola Iarocci ↗ Blogs are still a thing - 82MHz ↗ New post from my blog ¶ Week Note Nº 25/2025 ↗ Blogging From 2012 ↗ Pocket Is Dead ↗ Feedverse ↗ Webmention Is Dying ↗ Testing New Stuff ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 633h 16m Total anime watched episodes: 1530 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 244 Total manga read chapters: 24936 Total manga read volumes: 617 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"22 June 2025","description":"Random notes for week 25 of 2025","tags":["week note"],"title":"Week Note Nº 25/2025","uri":"/weeknotes/2025/25/"},{"categories":["rant"],"content":"And today I find that I blog from 2012… I am feeling old… And my blog is from 2016… Next year is 10 years of fundor333.com …\n","date":"21 June 2025","description":"","tags":["blogging"],"title":"Blogging From 2012","uri":"/micro/2025/06/blogging-from-2012/"},{"categories":[],"content":"Pocket is dead and in the next few days they will be delete forever. So I wrote my Django app for this (my personal Pocket) but if you are note a coder or you don’t want to support this code you can use other software.\nI suggest Shiori (https://github.com/go-shiori/shiori ↗ ) with PikaPods (https://www.pikapods.com/ ↗ ) as hosting.\nThis is not sponsored by anyone but a real dev who had a problem and fixs it\n","date":"19 June 2025","description":"","tags":["opensource","pocket","shiori","django","pikapods"],"title":"Pocket Is Dead","uri":"/micro/2025/06/pocket-is-dead/"},{"categories":[],"content":"More stuff added into the fediverse so you are more connect here on the fediverse than anywhere else\n","date":"17 June 2025","description":"","tags":["fediverse","threads"],"title":"Feedverse","uri":"/micro/2025/06/feedverse/"},{"categories":[],"content":"More and more time pass, more views my blog has and less and less webmention I get. They are dying? Or what? Do you have any idea about it?\n","date":"17 June 2025","description":"","tags":["webmention","indieweb"],"title":"Webmention Is Dying ","uri":"/micro/2025/06/webmention-is-dying-/"},{"categories":[],"content":"Trying more stuff for having an automation syndication stuff\n","date":"16 June 2025","description":"","tags":["hugo","syndication"],"title":"Testing New Stuff","uri":"/micro/2025/06/testing-new-stuff/"},{"categories":[],"content":"Thanks and i like the new querystring tag\n","date":"16 June 2025","description":"","tags":["django"],"title":"Django Response","uri":"/micro/2025/06/django-response/"},{"categories":["rant"],"content":"I need a place online where put my character sheet with some check (like auto calc bonus for int/char/str/etc..) but all the automatism are behoind the paywall.\nI need to write one for my party?\n","date":"16 June 2025","description":"Where can I host my dnd character sheet?","tags":["dnd","hosting","gdr"],"title":"Dnd Hosting","uri":"/micro/2025/06/dnd-hosting/"},{"categories":["dev","fingerfood"],"content":"More and more time I need some little thing for templating:\nThe date fild of a form with the right input type for the page A link with all the get parameters of the current page (form, paginator, etc…) and one added The Code ¶ This little code is mine but you can use it on all your project without thinking. If you find an error comment or webmention or replay with activity pub to my toot\nDate Field for Django Form ¶ This is the widget I add to the django form for adding the right input type.\nfrom django.forms import TextInput class DateInput(TextInput): input_type = \"date\" I need this because the css/js framework I use add a data picker if you fill the input_type\nTag for change/keep a field ¶ Sometime I need to edit or add a get parameter in a link, like when you change the view from list to grid (for example). So I coded this simple tag.\nfrom django import template register = template.Library() @register.simple_tag def url_replace(request, field, value): dict_ = request.GET.copy() dict_[field] = value return dict_.urlencode() the only thing it does is change or add a value into the list of existing value.\nFor example\n\u003ca href:\"https://fundor333.com?{% url_replace_diff request 'page' page_obj.page_number %}\"\u003eLink\u003c/a\u003e In this one I pass the pagination number to the new page. Why? Because I need to have the current page and all the serch filter also in the new page and this is the cleaner way WITHOUT using Js (I need control and Js is not controll)\n","date":"15 June 2025","description":"Some code I use in my django project for having some utility","tags":["django","coding"],"title":"Add Minor Things to Django for templating","uri":"/post/2025/add-minor-things-to-django/"},{"categories":[],"content":" Setup Umami for my personals’ sites Changing my personal robots.txt Searching for open source software for editing and other things with pdf Suggested Reading Links/Posts ¶ Rubenerd: A wholistic spam review ↗ Potentially Useful | Weeknote for 2025-W24 ↗ People won’t use IDEs anymore | Nicola Iarocci ↗ How GitHub engineers tackle platform problems - The GitHub Blog ↗ Organizing and Decluttering 10 years worth of Stationery ↗ Chasing Visitors - The Web Analytics Rabbit Hole | Kev Quirk ↗ Bots Are Eating My Blog for Lunch | ruk.ca ↗ Bots Are Eating My Blog for Lunch | Kev Quirk ↗ Never. Let. AI. Write. Your. Tests. (Changelog News #148) ↗ I Have a Phone Case Addiction ↗ New post from my blog ¶ Django Response ↗ Dnd Hosting ↗ Add Minor Things to Django for templating ↗ Week Note Nº 24/2025 ↗ Umami Start ↗ New post from my newsletter ¶ La fine della guerra delle console, l’inizio della guerra delle console ibride ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 628h 28m Total anime watched episodes: 1518 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 244 Total manga read chapters: 24936 Total manga read volumes: 617 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"15 June 2025","description":"Random notes for week 24 of 2025","tags":["week note"],"title":"Week Note Nº 24/2025","uri":"/weeknotes/2025/24/"},{"categories":[],"content":"Staarting moving to Umami for analytics because I don’t want to not having control of my data\n","date":"14 June 2025","description":"I start a Umami server","tags":["umami","opensource","analytics"],"title":"Umami Start","uri":"/micro/2025/06/umami-start/"},{"categories":[],"content":" And I went to vote for the Referendum And now we have the Nintendo Switch 2. Do we need it? Yes. At this price? No, but it become the standard price because inflation, tariffs and Playstation and XBox new prices Making some DnD stuff with a LaTeX template Suggested Reading Links/Posts ¶ About RSS Feeds - Burgeon Lab ↗ New post from my blog ¶ Week Note Nº 23/2025 ↗ Dnd Colorcoding ↗ Taxidermy ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 628h 28m Total anime watched episodes: 1518 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 244 Total manga read chapters: 24936 Total manga read volumes: 617 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"8 June 2025","description":"Random notes for week 23 of 2025","tags":["week note"],"title":"Week Note Nº 23/2025","uri":"/weeknotes/2025/23/"},{"categories":[],"content":" And now I am colorcoding in the middle of the night the note from DnD… This is my new fun time!\n","date":"5 June 2025","description":"Dnd Colorcoding notes","tags":["dnd","note","colorcoding"],"title":"Dnd Colorcoding","uri":"/micro/2025/06/dnd-colorcoding/"},{"categories":[],"content":"Why not share the taxidermy??? Why not?\n","date":"2 June 2025","description":"","tags":[],"title":"Taxidermy","uri":"/micro/2025/06/taxidermy/"},{"categories":[],"content":" Making some videoediting for a friend I add Jsonfeed and atom to my blog Understand difference between Atom and Rss Suggested Reading Links/Posts ¶ mutantCybernetics ↗ Adding an Atom feed to your Ghost Blog | Dev Blog ↗ A request for developers of feed reader apps and services | Multiline Comment ↗ Converting my Hugo instance to Atom syndication - Infrastructure Never Sleeps ↗ Peter Babič - Using UUID in an Atom feed ↗ Sudden Influx of New Gear - Burgeon Lab ↗ Booting DietPi from SSD on a Raspberry Pi 4B 8GB - Burgeon Lab ↗ Buying a Seven Year Old Refurbished Kobo eReader ↗ How to migrate from Evernote to Obsidian in a few clicks ↗ SSH into KOreader (Kobo eReader) from macOS - Burgeon Lab ↗ As a developer, my most important tools are a pen and a notebook : Juha-Matti Santala ↗ 🤖 When AI Agents Start Panicking: Wild Emails from a Failing Vending Business - Jeff Triplett’s Micro.blog ↗ Pocket is saying goodbye - What you need to know | Pocket Help ↗ Mozilla is shutting down Pocket, what next? : Juha-Matti Santala ↗ New post from my blog ¶ Week Note Nº 22/2025 ↗ So This Is Why I Sometime Reset the Feed Reader of Friends ↗ Too Many Rss Items ↗ Question About Echofeed ↗ Pocket Is Closing ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 626h 28m Total anime watched episodes: 1513 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 244 Total manga read chapters: 24936 Total manga read volumes: 617 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"1 June 2025","description":"Random notes for week 22 of 2025","tags":["week note"],"title":"Week Note Nº 22/2025","uri":"/weeknotes/2025/22/"},{"categories":["rant"],"content":"I have a friend who read my blog using my feed. And sometime he pings me for some problem with the feed, like a drop of all the article as new\nRobb Knight\n@robb@social.lol When I open my RSS reader and it has over 200 unread items, I know one of you has messed up your rss feeds\n📌 https://rknight.me/notes/202501190902/\n9:04 AM · 19 Jan 2025 Andrea Grandi 🦕\n@andreagrandi@mastodon.social @robb I think my friend @fundor333 ears must be burning right now :D\n10:51 AM · 19 Jan 2025 And after read some other post with the same problem ( Robb Knight problem with feed reader ↗ Kev other problem with feed reader ↗ ) I understand a little this: Atom is newer and superior than Rss.\nAtom vs Rss ¶ Atom is the newer one, born after the RSS and after fix a lot of the RSS bugs like:\nYou have a strict format for checking and validation in Atom RSS is simpler but less strict and it is riddled with ambiguities which lead to inconsistency of interpretation You have a unique id for the feed in Atom The last one is the one I was searching…\nThe Answer ¶ The feed reader find the new feed (new because you change the url or you change the serverside code) and check:\nAtom Feed: the reader find the same ID so is the same feed RSS Feed: the reader don’t find the ID and find something different not in the items part so it is a new one So I add the JsonFeed and AtomFeed to the blog for give the reader multiple option for the feed!\nYou can find all at this link ","date":"31 May 2025","description":"I find something I didn't know abouts feed rss and atom","tags":["feed","atom","rss","coding"],"title":"So This Is Why I Sometime Reset the Feed Reader of Friends","uri":"/post/2025/so-this-is-why-i-sometime-reset-the-feed-reader-of-friends/"},{"categories":[],"content":"I am not the only one who fuck up the feed of a blog\nhttps://kevquirk.com/notes/20250528-1702 ↗ ","date":"29 May 2025","description":"","tags":[],"title":"Too Many Rss Items","uri":"/micro/2025/05/too-many-rss-items/"},{"categories":[],"content":"@robb@social.lol I trying echofeed but I don’t understand one thing in the content - variables: hashtags???\nWhich type of feed/tag I need to use/add for this content-variable?\nThanks\n","date":"29 May 2025","description":"","tags":["automation","mastodon","webmention","syndicated"],"title":"Question About Echofeed","uri":"/micro/2025/05/question-about-echofeed/"},{"categories":[],"content":"#Pocket is closing and I had rework all the stuff I got into my personal #Django server. Do you want to read about this implementation?\n","date":"27 May 2025","description":"Pocket is closing","tags":["pocket","rant"],"title":"Pocket Is Closing","uri":"/micro/2025/05/pocket-is-closing/"},{"categories":[],"content":" Changing some metadata for better control of what brid.gy publish from my site More coding metadata for my personal site… And more hastag code for my site Can the battle strategies of my DnD mage be rappresented as a Finite-state machine? Suggested Reading Links/Posts ¶ There’s No Good Reason To Buy A Yeti Mic - Aftermath ↗ Start of a Zettel: Modern UICollectionView • Christian Tietze ↗ /now merveilles — ▲ ↗ How to Be a Teapot in Django - Adam Johnson ↗ Git: list checked-in symlinks - Adam Johnson ↗ Chris Aldrich | BoffoSocko ↗ Building an edit button browser extension | James’ Coffee Blog ↗ New post from my blog ¶ Week Note Nº 21/2025 ↗ Having a Webring Into 2025 ↗ Django Webring ↗ Dnd and Finite State Machine ↗ Response to Christian ↗ Update Brid Gy ↗ Django Generate Barcode With Reportlab ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 85 Total anime watched time: 626h 4m Total anime watched episodes: 1512 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 244 Total manga read chapters: 24935 Total manga read volumes: 617 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"25 May 2025","description":"Random notes for week 21 of 2025","tags":["week note"],"title":"Week Note Nº 21/2025","uri":"/weeknotes/2025/21/"},{"categories":["rant"],"content":"Once upon a time Internet was different. No social media, no search engine, no fiber… So how people find new site? Because the internet users share link into the blogs.\nAnd one of the best way to share other blog without filling a webpage with links was the WebRing.\nWebRing? ¶ For Wikipedia ↗ a Webring is\nA webring (or web ring) is a collection of websites linked together in a circular structure, usually organized around a specific theme, and often educational or social.[1] They were popular in the 1990s and early 2000s, particularly among amateur websites.\nToday, with the Search Engin owned by the big tec and the AI being part of the mayor Search Engine we need more than ever list of human web pages to read and less AI generated post.\nFor example? ¶ Some example of WebRing? This are some type of WebRing\nA themed WebRing Like a WebRing about Python ↗ An Inspirational WebRing Like one for dev and artist ↗ One for Group of People Like one for onl;y personal site ↗ One for a Community Like one about IndieWeb ↗ If you don’t find a WebRing for your “community”, you can create a new one with a tutorial ( A Webring Kit ↗ ) and a framework for making WebRing ( GitHub Repo from A Webring Kit ↗ )\nRemember, this is a free way to have more traffic inside your site and for build your community\n","date":"24 May 2025","description":"What are the webrings and why you need to be in one into 2025","tags":["webring","indieweb"],"title":"Having a Webring Into 2025","uri":"/post/2025/webring-into-2025/"},{"categories":["rant"],"content":"And now I am into the #djangowebring … It is a April Fool’s Day joke ? Maybe but Flask was also a April Fool’s Day joke…\n","date":"23 May 2025","description":"","tags":["django","webring","djangowebring","flask"],"title":"Django Webring","uri":"/micro/2025/05/django-webring/"},{"categories":["rant"],"content":"I deow this flowchart for the next DnD session (we have a boss battle).\nCan I make a finite-state machine out of this? I will try\n","date":"23 May 2025","description":"Can I have a Finite-state machine for the action of my dnd character?","tags":["dnd","finitestatemachine","gdr"],"title":"Dnd and Finite State Machine","uri":"/micro/2025/05/dnd-and-finite-state-machine/"},{"categories":[],"content":"Thanks! I am in the IndieWeb for some time now and I love a lot of it but now I try to combine with ActivityPub ↗ ","date":"20 May 2025","description":"","tags":["indieweb"],"title":"Response to Christian","uri":"/micro/2025/05/response-to-christian/"},{"categories":[],"content":"Adding new code for better control Brid.gy ↗ for post and micro stuffs.\nThis one is a test for the new code\n","date":"20 May 2025","description":"","tags":["webmention","bridgy"],"title":"Update Brid Gy","uri":"/micro/2025/05/update-brid-gy/"},{"categories":["dev"],"content":"After Django With Barcode and Qrcode ↗ and Django Return Pdf With Reportlab ↗ I need something new in my Django server. I need a barcode generator for labeling stuffs.\nThe problem ¶ Every code is a solution to a pratical problem. In this case I need to make the barcode labels with text for keep an inventory. The basic solution is generate a pdf/img file to print into sticker’s paper and cut it after.\nSo, I need the data to convert into lable (the string on top to the barcode) and the barcode (or the qrcode) as in the screenshot, so I wrote this code for do it for pages and ready to print and stick it all around the world!\nCode ¶ The view ¶ This code is the view for generating download link for the pdf with all the barcode.\nfrom django.views.generic import View class ExampleBarcodePdf(View): bar_height = None position_text_y = None filename = \"ExampleBarCode.pdf\" def get(self, request, *args, **kwargs): super().get(request, *args, **kwargs) response = HttpResponse(content_type=\"application/pdf\") response[\"Content-Disposition\"] = ( 'attachment; filename=\"' + self.filename + '\"' ) a4p = A4PrinterBarcode() pdf = a4p.get_pdf( buffer=BytesIO(), datas=[{barcode:\"0000000000000\", \"label\"}, {\"999999999999\", \"other label\"}], bar_height=self.bar_height, position_text_y=self.position_text_y, ) response.write(pdf) return response The pdf generator ¶ This is the “printer” the code for generate pdf. After the import you find the constant with define the pdf.ß\nfrom reportlab.graphics.barcode.eanbc import Ean13BarcodeWidget from reportlab.graphics.shapes import Drawing from reportlab.graphics.shapes import String from reportlab.lib.pagesizes import A4 from reportlab.pdfgen import canvas PAGESIZE = A4 NUM_LABELS_X = 3 NUM_LABELS_Y = 8 BAR_WIDTH = 1.5 BAR_HEIGHT = 51.0 TEXT_Y = 80 BARCODE_Y = 17 FONT_SIZE = 8 LABEL_WIDTH = PAGESIZE[0] / NUM_LABELS_X LABEL_HEIGHT = PAGESIZE[1] / NUM_LABELS_Y SHEET_TOP = PAGESIZE[1] class A4PrinterBarcode: def generate_label( self, ean13: str, description: str, label_w: float = 0.0, label_h: float = 0.0, bar_with: float = BAR_WIDTH, bar_height: float = BAR_HEIGHT, postion_text_y: float = TEXT_Y, font_size: int = FONT_SIZE, ) -\u003e Drawing: \"\"\" Generate a drawing with EAN-13 barcode and descriptive text. :param ean13: The EAN-13 Code. :type ean13: str :param description: Short product description. :type description: str :return: Drawing with barcode and description :rtype: Drawing \"\"\" if label_w == 0.0: label_w = A4[0] / NUM_LABELS_X if label_h == 0.0: label_h = A4[1] / NUM_LABELS_Y text = String( 0, postion_text_y, description, fontName=\"Helvetica\", fontSize=font_size, textAnchor=\"middle\", ) text.x = label_w / 2 barcode = Ean13BarcodeWidget(ean13) barcode.barWidth = bar_with barcode.barHeight = bar_height _, _, bw, _ = barcode.getBounds() barcode.x = (label_w - bw) / 2 # center barcode barcode.y = 18 # spacing from label bottom (pt) label_drawing = Drawing(label_w, label_h) label_drawing.add(text) label_drawing.add(barcode) return label_drawing def get_pdf( self, buffer, datas: list, bar_height: float = None, position_text_y: float = None, ) -\u003e bytes: if bar_height is None or bar_height \u003c 0: bar_height = BAR_HEIGHT if position_text_y is None or position_text_y \u003c 0: position_text_y = TEXT_Y p = canvas.Canvas(buffer) j = 0 for _ in range(len(datas) // (NUM_LABELS_X * NUM_LABELS_Y) + 1): for u in range(0, NUM_LABELS_Y): for i in range(0, NUM_LABELS_X): if j \u003c len(datas): data = datas[j] cb = data.barcode desc = data.label try: label = self.generate_label( ean13=cb, description=desc, bar_height=bar_height, postion_text_y=position_text_y, ) x = i * LABEL_WIDTH y = SHEET_TOP - LABEL_HEIGHT - u * LABEL_HEIGHT label.drawOn(p, x, y) except AttributeError: pass j += 1 p.showPage() p.save() pdf = buffer.getvalue() buffer.close() return pdf So how do A4PrinterBarcode work ? ¶ The main concept of this class is to generate the “labels” (barcode and text) and put them into a grid pattern. So we have two function:\ngenerate_label generate the single “label”, one of the time get_pdf generate the pdf putting the “labels” in a grid pattern If you need, this class can be used without Django, in something like a tool for terminal ↗ ","date":"19 May 2025","description":"Tutorial to build pages and pages of barcode for labeling stuffs","tags":["reportlab","django","barcode","qrcode"],"title":"Django Generate Barcode With Reportlab","uri":"/post/2025/django-generate-barcode-with-reportlab/"},{"categories":[],"content":" More and more I work on my Instagram profile and more I understand that Instagram is becoming a video-social first I was thinking about WebMention and ActivityPub and this I made a new post as the result of all my thinking I add more check for syndication on the automation for my personal blog Suggested Reading Links/Posts ¶ High Availability, Replication, and Failover Explained with Stuffed Animals ↗ Elton John brands government ‘absolute losers’ over AI copyright plans ↗ Mastodon ↗ Adding comments to your static blog with Mastodon ↗ The best new features and fixes in Python 3.14 | InfoWorld ↗ Shell startup scripts — flowblok’s blog ↗ Why I’m excited about Ghost getting ActivityPub support ↗ Rubenerd: Building a new home server? ↗ Did I just sell a passion? - Andrea Contino - Go With The Flow ↗ Who is this? ↗ Fountain Pen Review - Kakimori Frost Fountain Pen in Violet - The Well-Appointed Desk ↗ New post from my blog ¶ Week Note Nº 20/2025 ↗ Activitypub vs Webmention Do You Need Them ? ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 84 Total anime watched time: 625h 16m Total anime watched episodes: 1510 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 239 Total manga read chapters: 24554 Total manga read volumes: 617 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"18 May 2025","description":"","tags":["week note"],"title":"Week Note Nº 20/2025","uri":"/weeknotes/2025/20/"},{"categories":["rant","dev"],"content":"I have a lot of article about webmention because I implement them on my site/blog. And I use them ad comment, like sistem and more. But more I read about ActivityPub and the Feedverse more I thing it can be a good think to implement it insite your site for your content and for share to the Feedverse.\nWhy do it? ¶ One of the best arguments for having a personal ActivityPub site/server is you having a unique identity, don’t fragmenting your identity1 on multiple Feedverse accounts.\nBut I implemented Webmention and stuff like Brid ↗ for having the likes, comments and all the stuff I have in the ActivityPub about my posts. So why I need to do it?\nIf I need more reference to your post/article on the Feedverse, Mastodon has a function2 for show your account under your link making a link to your profile. It also easy to set up and some platform has a plugin for it (like for Wordpress) or easy articole online for your favorite platfome (for example this is for Ghost ↗ ).\nBut if you aren’t in the FeedVerse you are loosing in a way in to a social media moviment which is groing with major players studing and testing the ground (Meta, Tumblr, with also X/Twitter looking without public testing) and more and more time pass, more and more service integrate the ActivityPub in their social/site/service.\nI also have a lot of attention from the tech blogger, where if you don’t write about excitement3 you are writing about how to implement ActivityPub on your site[^4].\nAnd so? I need to integrate this new stuff into my site? ¶ No and yes. If you want a presence in the FeedVerse you need to be active also there but no with a integration with the ActivityPub protocol: you can share it like the “old days”.\nAlso having a ActivityPub implementation somewhere is a resource draining server so you need to think about how much money and time you want to spend on it.\nIn the end Webmention and ActivityPub are two way to have more interaction with your site but you also need to now which interaction is better for your site.\nTwo article about it Federated/Fragmentated and Who is this? ↗  ↩︎\nPost about it Highlighting journalism on Mastodon ↗  ↩︎\nSome article about excitement Why I’m excited about Ghost getting ActivityPub support ↗ The federated One Man \u0026 His Blog ↗ [^4] For example this article A Guide to Implementing ActivityPub in a Static Site (or Any Website) - Q1 2025 Updates ↗  ↩︎\n","date":"16 May 2025","description":"Some personal thinking about webmention and activitypub and how to use/combine them","tags":["webmention","activitypub","indieweb"],"title":"Activitypub vs Webmention Do You Need Them ?","uri":"/post/2025/activitypub-vs-webmention-do-you-need-them/"},{"categories":[],"content":" And after taking a lot of photo at VeneziaComics, I start editing them. I love some of this take Make my personal server print pages and pages of barcode from csv for a friend. Different sizes of barcode but all with the laber over them Suggested Reading Links/Posts ¶ Facebook and Instagram are not your website! ↗ Finally, Dildos are Getting Safety Standards ↗ Rubenerd: #Japan2025 Ikebukuro and home ↗ Rubenerd: #Japan2025 Exploring Akiba and Kinshichō ↗ Goodbye Fosstodon | Kev Quirk ↗ Extending my edit web page bookmarklet | James’ Coffee Blog ↗ Extending my edit web page bookmarklet | James’ Coffee Blog ↗ Plotter Walkthrough: How I Use My Plotter Binders (Video) — The Gentleman Stationer ↗ Keyboards ↗ ActivityPub And Me, Part 1 of ? | Endgame Viable ↗ Writing notes helps you remember — and forget : Juha-Matti Santala ↗ Rubenerd: #Japan2025 Toyama Port and Glass Art Museum ↗ pre-commit: install with uv - Adam Johnson ↗ Fan-in to a single required GitHub Action - Jake Wharton ↗ Experiences writing an ActivityPub server in Python with Django | Check my working ↗ Thoughts on Fosstodon - coreysnipes.com ↗ My Thoughts on the Fosstodon Drama | Kev Quirk ↗ Fosstodon is NOT Shutting Down ↗ Rubenerd: #Japan2025 Toyama wanderings ↗ Rubenerd: #Japan2025 Ending up in Shin-Takaoka ↗ Colorverse Maryland Blue Crab Ink Review — The Pen Addict ↗ New post from my blog ¶ Week Note Nº 19/2025 ↗ Green With Flower ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 83 Total anime watched time: 617h 19m Total anime watched episodes: 1490 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 238 Total manga read chapters: 24458 Total manga read volumes: 617 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"11 May 2025","description":"","tags":["week note"],"title":"Week Note Nº 19/2025","uri":"/weeknotes/2025/19/"},{"categories":[],"content":"Waiting at the Venice Con, I find this beautifull shot of the green near me.\n","date":"5 May 2025","description":"A little green patch with a little beautifull flower","tags":[],"title":"Green With Flower","uri":"/photos/2025/green-with-flower/"},{"categories":[],"content":" I made with my friend a site with all the data and people of our DnD campain because we want to do it XD Making multiple photo set at VeneziaComics, a Comicon in Italy. Too much sun This night I was outside and take a lot of photo of the night city without people ( l LOVE empty urban photos) Suggested Links/Posts ¶ Rubenerd: #Japan2025 Hida Folk Village… eventually! ↗ Houston, we have a stationery problem - by April Wu ↗ Rubenerd: #Japan2025 Exploring Takayama ↗ Python type hints: mixin classes - Adam Johnson ↗ Rubenerd: #Japan2025 The Nagoya Brother Museum ↗ Winnie Lim » textures and scenes from tainan ↗ Typewriter Letter-Writing at The Paper Mouse: a Fun Event! — Paper Blogging ↗ New post from my blog ¶ Orange Pub With Light ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 80 Total anime watched time: 602h 36m Total anime watched episodes: 1453 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 238 Total manga read chapters: 24450 Total manga read volumes: 617 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"4 May 2025","description":"Random notes for week 18 of 2025","tags":["week note"],"title":"Week Note Nº 18/2025","uri":"/weeknotes/2025/18/"},{"categories":[],"content":"Returning home I find this pub closing, and I take this photo before they close the pub. I love the pallet colors with this light.\n","date":"2 May 2025","description":"An red-orange pub with some beautifull light","tags":[],"title":"Orange Pub With Light","uri":"/photos/2025/orange-pub-with-light/"},{"categories":[],"content":" Now I save content of the post I saved into Markdown. The way I do it is some of the worsted spaghetti code I done Strarting a site for our DnD campain. For now I only making the CSS but we will add some functions for stuffs I make an upgrade to my personal pen with the new color of the lamy and I love it. I also buy the petroil ink they remake for my petroil pen. I clean more of the dead feeds I have in my feedreader. I need more work, more cleaning… Saving in my personal server my data about Anilist Suggested Links/Posts ¶ Rubenerd: #Japan2025 Nagoya for the first time ↗ Rubenerd: #Japan2025 Nagoya Castle and the Palace ↗ iOS 19 Redesign Now Widely Rumored - MacRumors ↗ Introducing the blogroll - macwright.com ↗ God Google now demands sacrifices “in the name of SEO” ↗ Chicago Stationery Fest 2025 Recap - The Well-Appointed Desk ↗ Multiline Comment • The online journal of Ashur Cabrera. ↗ Link Love: Washi Tape Swatching - The Well-Appointed Desk ↗ Winnie Lim » random scenes and words from taichung ↗ Succumb To Us, Heretic! | Brain Baking ↗ Simon Collison | Coffee fix ↗ Rubenerd: #Japan2025 Cameras, and Ninomae Ina’nis ↗ Rubenerd: #Japan2025 Around Jinbōchō and Akihabara ↗ OpenAI’s new reasoning AI models hallucinate more | TechCrunch ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 79 Total anime watched time: 594h 12m Total anime watched episodes: 1432 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 240 Total manga read chapters: 24589 Total manga read volumes: 617 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"27 April 2025","description":"Random notes for week 17 of 2025","tags":["week note"],"title":"Week Note Nº 17/2025","uri":"/weeknotes/2025/17/"},{"categories":[],"content":" Add a Series page in my blog where I list all the posts interconnected. I will make a post about it and pot some Series into the photos posts, for sorting and collect them. I added a Github Action for generate a weeknote of the week and publish it on my blog. All with my personal api on my server and Github Action I was today years old when I find how many types of CSV exists. Why? WHY??? And why we use CSV when we have json files? Working for adding lunr as search for my personal blog… I hate it but i need it Suggested Links/Posts ¶ The easier way to use lunr search with Hugo | Almost Secure ↗ Add Search to Hugo Static Sites with Lunr ↗ The IndieWeb for Everyone | Max Böck ↗ How You Might Build a Modern Day Webring | CSS-Tricks ↗ GitHub: render GitHub-Flavored Markdown with the API - Adam Johnson ↗ stow thy dotfiles ↗ How audible is this URL? | James’ Coffee Blog ↗ Rubenerd: Does your site refresh still have RSS? ↗ Rubenerd: Using “Re:” in blog titles ↗ Rubenerd: Replacing the blogroll with an aggregator ↗ Shorthand Shop Visit — The Pen Addict ↗ New post from my blog ¶ Csv From Django ↗ Re:Using ‘Re:’ in Blog Titles ↗ DMC by Netflix Has Mine Spotify Playlist ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 79 Total anime watched time: 594h 12m Total anime watched episodes: 1432 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 239 Total manga read chapters: 24544 Total manga read volumes: 617 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"20 April 2025","description":"","tags":["week note"],"title":"Week Note Nº 16/2025","uri":"/weeknotes/2025/16/"},{"categories":["dev","fingerfood"],"content":"Some time you need to export a file into a specific format for some use like upload to the old system. In this case I need to have a CSV file which another software fill.\nThe code ¶ I wrote a ClassView for this case, this class. 1\nclass CsvCarsDownload(View): def get(self, request, *args, **kwargs): response = HttpResponse(content_type=\"text/csv\") response[\"Content-Disposition\"] = 'attachment; filename=\"cars.csv\"' my_dict = [{ \"brand\": \"Ford\", \"model\": \"Mustang\", \"year\": 1964 }] writer = csv.DictWriter( response, dialect=\"excel\", fieldnames=my_dict[0].keys() ) writer.writeheader() for element in my_dict: writer.writerow(element) return response You can change the type of the the CSV changing the dialect with one of the type of the CSV dialect (excel, excel_tab, unix_dialect) and changing the my_dict with any type of list of dict.\nWith this code you can use any Class Mixin from others module for add other functions like permission supports or loggeer configurations.\nI don’t like coding functional view so I only code ClassViews ↩︎\n","date":"18 April 2025","description":"A little class view for return CSV","tags":["csv","django"],"title":"Csv From Django","uri":"/post/2025/csv-from-django/"},{"categories":[],"content":" Web ¶ Fundor333 ↗ - This blog make with Hugo and love. The Css framework change somethime. Now it’s boostrap 4 with font awesome DigitalTeaRoom ↗ - My blog about Tea and other stuff i like/love DTR Newsletter ↗ - My newsletter, Italian Hardware ¶ Rioba project ↗ - Project about a sensors’ system for have a numeric value of the well being of the people in the Venice’s area Bots and automations ¶ MareaBot ↗ - Bot for read the HighWater Api of Comune di Venezia and, if there is an allert, post it on a channel on telegram. Written in Python\nPolliniVeneziaBot ↗ - Bot for read the Pollins and Spore Api for the City of Venice and, if there is an allert of any level, post it on a channel on telegram. Written in Python\nHubot tea timer ↗ - The last Hubot tea timer you’ll ever need\nMinor utilities and other toys ¶ Dotfiles ↗ - My configuration for a Mac, a Windows or a Linux installation.\nCrontab Dotbot ↗ - Plugin for Dotbot for managing crontab\nDocker Hugo ↗ - A Docker image for the static sites generated Hugo\nBofh Oh-My-Zsh ↗ - Plugin for ohmyszh for adding a fortune style message from a BOFH\nSmile Oh-My-Zsh ↗ - An oh-my-zsh plugin for printing smile\n","date":"15 April 2025","description":"","tags":[],"title":"Now 2025/04/15","uri":"/now/2025/04/15/2025-04-15/"},{"categories":["rant"],"content":"Following the post from Ruben ↗ I start imitating this idea and expand on it.\n“Imitation is the sincerest form of flattery that mediocrity can pay to greatness.”\nOscar Wilde\nThe basic idea come from a post by Brandon’s Journal ↗ where Brandon response to an article and use the Re: prefix, like a email threads in the title of the post…\nAnd I add a microformat following the IndieWeb stuff for the response tags. So my post which are a “Re:” will have a u-in-reply-to in the class of the links for implementing the IndieWeb, like in this article.\n","date":"14 April 2025","description":"Blogpost about how to write a post response","tags":["microformat","indieweb"],"title":"Re:Using 'Re:' in Blog Titles","uri":"/post/2025/re-using-re-in-blog-titles/"},{"categories":[],"content":"I finish Devil May Cry (the tv serie by Netflix) and I find the soundtrack lovely before find I have all the song in my day to day playlist on Spotify… All the songs…\n","date":"14 April 2025","description":"A comment to DMC sound track","tags":["rant","devilmaycry"],"title":"DMC by Netflix Has Mine Spotify Playlist","uri":"/micro/2025/40/dmc-by-netflix-has-mine-spotify-playlist/"},{"categories":["rant"],"content":"Sometime Netflix make a good serie. The Devil May Cry is a very good one\n","date":"14 April 2025","description":"DMC, a Netflix wanderfull original","tags":["tv series"],"title":"Devil May Cry by Netflix","uri":"/micro/2025/40/devil-may-cry-by-netflix/"},{"categories":[],"content":" I read too many old blog post from my archive so this week the link section is HUGE! I clean my personal feed reader and update the blogroll of my blog. I need more time for cleaning ALL my personal feed reader but making some cleaning every day my feed reader will be without dead ones Suggested Links/Posts ¶ Winnie Lim » taipei after 7 years ↗ Moritz F. Fürst – How Silica Gel Took Over the World ↗ Did you know, that you can style RSS Feeds? | BLEEPBLOOP.studio ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 79 Total anime watched time: 601h 24m Total anime watched episodes: 1450 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 239 Total manga read chapters: 24542 Total manga read volumes: 617 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"13 April 2025","description":"Random notes for week 15 of 2025","tags":["week note"],"title":"Week Note Nº 15/2025","uri":"/weeknotes/2025/15/"},{"categories":["rant"],"content":"More and more blog I read and more and more I find that a lot of the dev blog and personal blog on the web has a lot of common pages but not the old About or Contacts so I make this list of interesting pages types.\nBlogroll ¶ One of the best page I find on a blog. This is a page where the blogger show a link of site/blog (a html page or a Opml file) of interesting stuff.\nI find iteresting because I can have an idea about the blogger interest and I can find new and different source of post.\nMine is here Connect ¶ Half of the old About Us page. In this page the blog put all the link needed to follow and/or contact the author on the classic way (email,…) and the new social way (mastodon, twitter, etc…)\nMine is here Feeds ¶ Inspired by this post ↗ the feeds page is the most functional page for user on a site. This page has all the feeds’ links for the blog and other service the blogger is showing. Sometime some feeds aren’t from the blog but from other platform of the blogger.\nMine is here Now ¶ The other half of the About Us page. It come from an idea ↗ about having a space (in this case a page on a site) about what are you doing with your life and interest. In this way you can also use it for showing off your little project or have a space for fundraising your project.\nSometime I search on Google now pages for find new project and others things.\nMine is here Uses ¶ The strange page (for me). There is a uses site ↗ where you can send your Uses link where you share what tech you use every day or for the project. In this way you can check what tech other people use and for what.\nIn this type of pages I love to check what kind of coding and photo set up they have.\nMine is here So? ¶ So I suggest to have some of this pages on your blog if you thing of your blog as a personal blog. It can be usefull for start a conversation online or for having a place to send people for answer about your works and your stuffs.\n","date":"6 April 2025","description":"There are some page you need to have in your blog if your blog is for human","tags":["dev"],"title":"Pages You Need in Your Blog","uri":"/post/2025/pages-you-need-in-your-blog/"},{"categories":[],"content":" Updating the site with some new static pages and update the content of the old ones. I also wrote a blog post about the statics pages I edited and how much they can be usefull. Some cleaning and updating of my django server Appletune. Some migrations are necessary in the near future Studing some api for some automation for my django server (Appletune) where I can read the fav article on Feedbin and backup them on my server. I find a js project i like: Postlight Parser. I “lost” some time trying it and thing about how to use it Suggested Links/Posts ¶ It’s always something new each spring - by April Wu ↗ The Best Programmers I Know | Matthias Endler ↗ 💍 Announcing The Great Django Webring - Jeff Triplett’s Micro.blog ↗ Unique Travel Journal Ideas – 11 Ways To Make a Travel Diary Memorable ↗ Introducing the blogroll - macwright.com ↗ New post from my blog ¶ Pages You Need in Your Blog ↗ New post from my newsletter ¶ Media per la tecnodistopia che stiamo vivendo: Il Neuromante ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ Anime and manga’s stats ¶ Anime ¶ Total anime watched: 79 Total anime watched time: 600h 36m Total anime watched episodes: 1448 Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama Manga ¶ Total manga read: 239 Total manga read chapters: 24541 Total manga read volumes: 617 Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama ","date":"6 April 2025","description":"Random notes for week 14 of 2025","tags":["week note"],"title":"Week Note Nº 14/2025","uri":"/weeknotes/2025/14/"},{"categories":[],"content":"Strange slow week\nStarting an example of a desktop app make in Rust-GTK for making a to-do list. I don’t know if I develop my idea/app in Python or Rust. Adding some code into my personal server for automation with feeds and rss. It is a personal implementation but it can be part of the desktop app/idea Read a lot of blog about deploy an app with Brew, Flatpack and others tools Searching for more data to put into this type of blogpost Suggested Links/Posts ¶ Goodbye Kindle, I don’t think I’ll miss you. - Duarte O.Carmo ↗ A Jaunt to Chi-town for Chicago Stationery Fest ↗ Chicago Stationery Fest 2025 Recap - The Well-Appointed Desk ↗ Midori Knitted Book Band Review — The Pen Addict ↗ How I create static websites for tiny archives – alexwlchan ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ","date":"30 March 2025","description":"","tags":["week note"],"title":"Week Note Nº 13/2025","uri":"/weeknotes/2025/13/"},{"categories":[],"content":"And I start doing the Weekly Note. This week I did more study than other things:\nStart editing the photo of BiComics. A lot of them are similar so I don’t need to have a lot of work but they are more than 800 photo to select and edit I am cleaning my RSS feed because I have too much post I don’t read in my inbox and I want to make a clean Blogroll for my blog Some reading about Flatpak and the development of app for Linux (no for now I don’t have an app to deploy but maybe…) LOVING Monster Hunter Wild (videogame) and love how it work Reading material for the next post of my newsletter. This time is about tecnology and dystopia (I follow the news and I feel too much in a distopia) Build a little tool for generate WeekNote ↗ like this from feeds and links Post Recommendation ¶ Matcha \u0026 Photography: calligraph coffee ↗ My tiny little corner ↗ Using uv to install Python and create a virtual environment ↗ My Links ¶ My blog ↗ My newsletter ↗ Support me ↗ Currently Reading ¶ ↗ ↗ ","date":"23 March 2025","description":"Random notes for week 12 of 2025","tags":["week note"],"title":"Week Note Nº 12/2025","uri":"/weeknotes/2025/12/"},{"categories":[],"content":"Another photo made walking around after midnight. I love to find this type of light games.\n","date":"23 February 2025","description":"A tunnel make from light poles and trees","tags":[],"title":"Light and Tree","uri":"/photos/2025/light-and-tree/"},{"categories":["rant"],"content":"E ho deciso di aprire una newsletter in italiano sulla mia vita di tutti i giorni e su cosa uso nella vita di tutti i giorni\nLink alla newsletter ↗ ","date":"18 February 2025","description":"E ora ho una newsletter","tags":["post"],"title":"Newsletter!","uri":"/micro/2025/20/newsletter/"},{"categories":["dev"],"content":"There are more and more post about the Indieweb and what you can find in a indiweb site/blog1 but I didn’t find an easy tutorial for starting with IndiWeb. But first: What is the IndieWeb?\nIndieWeb the definition ¶ I thing that, to explain IndieWeb we need two definition: one from a more “anthropological” point of view and one from a “tecnical/it” point of view\nAnthropological definition ¶ The #IndieWeb is for everyone, everyone who wants to be part of the world-wide-web of interconnected people. The social internet of people, a network of networks of people, connected peer-to-peer in human-scale groups, communities of locality and affinity.\nTecnical/It definition ¶ The IndieWeb is a community of independent and personal websites connected by open standards, based on the principles of: owning your domain and using it as your primary online identity, publishing on your own site first (optionally elsewhere), and owning your content.\nSo, why I need to be in the Indieweb? ¶ You don’t need to be in. You need to choose red pill or blue pill\nRed Pill: If you want to have a look inside the mirror and, because you have something to say online, you need to have a personal domain and a space where you have the control and own your content and\nYou stay in Wonderland and I show you how deep the rabbit hole goes\nBlue Pill: You keep the social network account you have and\nThe story ends, you wake up in your bed and believe whatever you want to believe\nRed Pill, now what? ¶ There are multiple things to do and tools to choose for you if you want to start with IndieWeb so I suggest a site which help you understand what you need to do and what to choose.\nThis site is Unplatform ↗ from the people of the fromthesuperhighway .\nThis is a simple way to understand and start with the red pill and with a complete explanation for every tool you choose so you can have the easyest way to became an IndieWeb user.\nHave a nice IndieWeb expirience\nIndiweb ↗ , The IndieWeb is a people-focused alternative to the “corporate web” ↗ , I have joined the IndieWeb ↗ , The IndieWeb is for Developers ↗ , The indieweb is for everyone ↗  ↩︎\n","date":"31 January 2025","description":"A tool to start a life on the IndieWeb leaving the social media behind","tags":["blogging","indiweb"],"title":"An Easy Way to Start a Life in the IndieWeb","uri":"/post/2025/an-easy-way-to-start-a-life-in-the-indieweb/"},{"categories":[],"content":"Ready for a storm, I see this brick building and I like the color of it and like the color of the sky but LOVE the two color side by side\n","date":"28 January 2025","description":"Some brick building before the storm","tags":[],"title":"Brick and Storm","uri":"/photos/2025/brick-and-storm/"},{"categories":["dev","rant"],"content":"I am first and most a Developer and a Coder and I think that coding and developing software (site, app, AI, etc…) need to be a share experience. So I think a dev must share knowledge in the web. Somebody help people on StackOverflow and someone (like me) blogs.\nIn the last X years1 I understand the important of blogging and why a dev or a coder need to write a blog/newsletter/magazine about what is doing2 and how big time sink is developing and maintaining a custom blog so I have this question:\nFor sharing Dev/Coding experiences is better Medium or StackOverflow?3\nWe need a “generic” Dev! ¶ This is Bob. Bob is a BackEnd Developer, a Python Developer and he is learning some FrontEnd stuffs. So he wants to write about what he knows, what is learning and his doubts.\nWhat a Dev need to share in a post ¶ Bob need to share fragments of the code he writes, some screenshot (images) and a lot of texts. The latest are a simple request because it is the minimum requirements for all the blogging platform.\nThe code part is the “difficult” one.\nThe best situation is if the code is highlighted something like this\nprint(\"Hello World!\") and the platform need to support all the types of the files Bob’s code but we only need the highlight for the languages… If Bob needs to blog about Cobol or Pascal4\nCustoming and theming ¶ Bob need to have a solid site/blog with a mobile and a desktop layout (more and more people read blog only with the tablet or the phone) and he need to make no changes or as little as possible for making HIS SITE/BLOG.\nHe also need a notification system for the followers (newsletters, feed, app with notification, …) and a SEO integration (analytics, meta, etc…) for becoming someone on the web.\nLess edit he must do for posting better the platform is.\nMoney ¶ Bob is a developer for money so he doesn’t want to spend money so… The all budget is 10€ (all needed for the domain) so the platform is a good one if it is free but is better if pay Bob.\nSo he needs a free platform5 and some way to make money from the posts (advertising, subscriptions, etc…)\nAnd now the platforms ¶ Now we know what Bob needs and wants, we find some platforms.\nWordpress, Jekill, Ghost, GoHugo and some other platforms aren’t the “right one” because they aren’t a “out of the box” expirience. You need to customized it and you need to have time for the updating of the platform soo we have SubStack and Medium as the platform.\nMedium ¶ The old one, Medium is the platform which is trying to become a blogging space for magazine and journal’ blogs. He is online from the 2012 and have all the need for a writer, with tool for automatic sharing, automatic posting and seo tools Medium is a complete platform.\nSubStack ¶ The new one, SubStack is the platform with two faces: one is a blogging space and the other is the mail-list space. SubStack out of the box way to work is a mail list for your followers, but the site part is not a bad one. It has automatic sharing, automatic posting and a micro-blogging part. But for SEO and promotion it all on you.\nIt also has one of the better subscribe platform of the web, where you can set some post to pay to read and some free to read.\nSome other considerations ¶ After all this considerations I need to show somethings behind the curtain : Medium has a lot of negative attention[^mediumproblem] because they have a lot of low quality post6 and SubStack has its share of problem with the paywall on the newsletters and some problems for the authors.7\nIn my opinion, if you want to blog about what are you doing, do it and this two platform can be a good starting point for start with your blogging journey but if it become something more you need to invest time in something more tailor to your need and understand what you need and what the platform give you.\nIf someone make me choose one between Medium and SubStack, I will choose SubStack because I love the idea of having a newsletters but I also feel the limitation of the close platform, bacause I had years and years of blogging on platform I hacked every way.\nFor example this blog is a GoHugo installation with a out of the box theme but I put so many changing in the code I have something more similar of the Monster of Frankenstein than a well coded theme…\nWhere X is a big but not too big number ↩︎\nThis is also explained in one of my old post  ↩︎\nThis is my blog/webspace so I say my opinion (coder for more than 5 year) ↩︎\nCobol and Pascal are two of the oldest languages and almost every highlighter in a generic blogging platform don’t support them, so you need to use a more professional blogging platform and lost time with the custumizations ↩︎\nSome function can be hidden by a paywall but if all the needed function are free, the platform is a good one ↩︎\nPlease stop writing tutorials/tech articles on Medium ↗  ↩︎\nSubstack Is Both Great and Terrible for Authors ↗  ↩︎\n","date":"27 January 2025","description":"If you are a developer where do you blog better? Medium or Substack?","tags":["medium","substack","blogging"],"title":"Substack vs Medium: What Is Better for a Coder?","uri":"/post/2025/substack-vs-medium-what-is-better-for-a-coder/"},{"categories":[],"content":"This week is a foggy week in my city (Venice) and I toke a lot of photos of the light in the fogs… Some of the foto has the best light effects I ever saw in a foggy day\n#photography #fog #venice\n","date":"26 January 2025","description":"","tags":[],"title":"Fog, Fog, Fog","uri":"/micro/2025/10/fog-fog-fog/"},{"categories":[],"content":"Talk brid.gy to me\n","date":"24 January 2025","description":"","tags":[],"title":"Testing Bridge","uri":"/micro/2025/10/testing-bridge/"},{"categories":[],"content":"And now I have automatic Syndication link for my static blog… This is a little success I love it\n#microblogging #syndicationlink #webmention #blogging\n","date":"24 January 2025","description":"","tags":[],"title":"And Now I Have Syndication Link","uri":"/micro/2025/10/and-now-i-have-syndication-link/"},{"categories":["dev"],"content":"A lot of time ago I implement the Webmention in my site following a lot of blogpost.\nOne of them was a bigger ispiration for my implementation1 and I have some chat with the author of the post over Mastodon for the implementation of the syndications link in a static site2 and how to implement it.\nFundor333\n@fundor333@mastodon.social @chringel How do you fill the syndications' links? By hand?\n10:56 AM · 2 Aug 2022 Christian 👼\n@chringel@fosstodon.org @fundor333 Yeah, unfortunately that‘s how I do it.\n1. Publish a post on my blog\n2. Post the link on Twitter/Mastodon/…\n3. Update syndication param in front matter and republish\nHaven‘t found another way yet.\n6:15 PM · 2 Aug 2022 After 3 years I find the solution in a post about webmetions!\nThe input ¶ Paul Kinlan wrote an article in the 2019 which flow under my radar and I didn’read it untile recently3.\nIn this post he use a Github action to write the webmention into a data folder for his GoHugo implementation. He has a script which download the data and put into file (the name of the file is the hash of the url of the post) which are use to render the webpage interested by the webmention. And all of this into Github Actions…\nSo I start thinking about it more and more… What can I have the syndications links into a file for url? Like the webmention in this post? I need to read the urls form the social media and other stuff.\nBut now with X/Twitter in bad shape and Facebook/Meta only good for share photos I only use Mastodon so it is easy read them and write a file for url…\nA implementation I find is this one by Brandon Rozek4 that I like in a lot of way but I change it because I don’t use Medium…\nThe implementation ¶ So I start with the development:\nI need a file type/data structure standard for the Syndication I need a script (or more) that find the syndication’s links I need to edit/add to the template some code for the render of it Structure data ¶ First are the data structure: json, with the name of the file is an hash of the url\n{ \"syndication\": [ \"https://mastodon.social/@fundor333/113809667070052761\" ] } For example this is my data for this post . I choose Json because I can make check on it and it is a beautiful format for data\nThe Scraper script ¶ In this case I find that Mastodon generate a feed for every public profile so I only implementa a reader (class MastodonFinder) which read the feed and save the toots url if find a link to my domain, and a writer class (WriterSyndication) which run all the other class (in this case only the Mastodon one) and write the output as a look-a-like of the json show before.\nimport feedparser from pathlib import Path import os import json import hashlib domain = \"https://fundor333.com\" rss_url_mastodon = \"https://mastodon.social/@fundor333.rss\" def clean_slug(slug: str): return hashlib.md5( (slug.split(\"?\")[0]).encode(\"utf-8\"), usedforsecurity=False ).hexdigest() class MastodonFinder: def find_urls(self, string): x = string.split('\"') res = [] for i in x: if i.startswith(\"https:\") or i.startswith(\"http:\"): res.append(i) return res def run(self, rss_url: str, domain: str, output: dict): feed = feedparser.parse(rss_url) if feed.status == 200: for entry in feed.entries: link = entry.get(\"link\") for e in self.find_urls(entry.get(\"description\")): if domain in e: e = clean_slug(e) if output.get(e, False): output[e].append(link) else: output[e] = [link.strip()] else: print(\"Failed to get RSS feed. Status code:\", feed.status) class WriterSyndication: def __init__(self, rss_url_mastodon: str, domain: str): self.output = {} self.rss_url_mastodon = rss_url_mastodon self.domain = domain def data_gathering(self): m = MastodonFinder() m.run(self.rss_url_mastodon, self.domain, self.output) def write(self): for key in self.output.keys(): path_folder = os.path.join(\"data\", \"syndication\") Path(path_folder).mkdir(parents=True, exist_ok=True) path_file = os.path.join(path_folder, key) with open(path_file + \".json\", \"w\") as fp: json.dump({\"syndication\": self.output[key]}, fp) def run(self): self.data_gathering() self.write() w = WriterSyndication(rss_url_mastodon, domain) w.run() I wrote in this way because I can change the readers or add new one but all the rest of the code remain the same.\nTODO one bug ¶ Only thing is I need to implement some code for reading all the old file and add to them and not create a new data file if there is an old one.\nThe GitHub Action ¶ I run it as a Github Action with this parameters.\nname: Syndication Link on: schedule: - cron: \"0 */2 * * *\" workflow_dispatch: jobs: webmentions: runs-on: ubuntu-latest steps: - name: Check out repository uses: actions/checkout@master - name: Set up Python uses: actions/setup-python@v5 with: python-version: \"3.13\" cache: \"pip\" # caching pip dependencies - name: Install Pip dependencies run: pip install -r requirements.txt - name: Fetch Syndication run: python ./action_script/syndication-collector.py - name: Commit to repository env: GITHUB_TOKEN: ${{ secrets.TOKEN }} COMMIT_MSG: | 👾Fetch webmentions skip-checks: true run: | git config user.email \"git@fundor333.com\" git config user.name \"fundor333\" git remote set-url origin https://x-access-token:${GITHUB_TOKEN}@github.com/fundor333/fundor333.github.io.git git checkout main git add . git diff --quiet \u0026\u0026 git diff --staged --quiet || (git commit -m \"${COMMIT_MSG}\"; git push origin main) I always put “workflow_dispatch” as one of the running condiction for having a manual button for running it.\nThe template ¶ This is the template fragment I use to show the syndication of one of the post. It return a single line of text with all the link of the syndication label as the host of the service (as if it is a mastodon.social/xxxx/xxxx link, the label will be mastodon.social).\n{{ $urlized := .Page.Permalink | md5 }} {{ if index .Site.Data.syndication $urlized }} \u003chr\u003e \u003cbr\u003e \u003cdiv class=\"syndication\"\u003e \u003ci class=\"fas fa-link\"\u003e\u003c/i\u003e This post was also syndicated to: {{ $data:= index .Site.Data.syndication $urlized }} {{ $data:= $data.syndication }} {{ range $index, $url := $data}} {{- $parsed_url := urls.Parse $url -}} {{- if $index }}, {{- end }} \u003ca class=\"u-syndication\" href=\"{{ $url }}\" rel=\"syndication\"\u003e{{ $parsed_url.Host }}\u003c/a\u003e {{ end }} \u003c/div\u003e \u003cbr\u003e {{ end }} I also add the microformat2 tags because all my site has them.\nConclusion ¶ I love this way and I am happy because I resolve a problem I had with my blog for 3 years\nIndiewebify me! And don’t forget my webmentions! ↗  ↩︎\ndev with the same problem ↗  ↩︎\nUsing Web Mentions in a static site (Hugo) ↗  ↩︎\nSyndicating Hugo Posts to Medium ↗  ↩︎\n","date":"23 January 2025","description":"How I have syndications'links fill by the machine","tags":["hugo","github","github actiom"],"title":"Github Action for Syndication Links","uri":"/post/2025/github-action-for-syndication-links/"},{"categories":[],"content":"Dark Early and all the shop open with light all over. I LOVE winter\n","date":"21 January 2025","description":"","tags":[],"title":"Dark Early","uri":"/micro/2025/10/dark-early/"},{"categories":["rant"],"content":"Instagram is a social network based on images and more recently on short format video (TikTok style) called stories. But the base concept of Instagram was allways the images first and from the start Instagram’ photos were squared.\nFirst problem ¶ After some time Instagram adds other size and format of image1 but the profile grid was based on square image.\nWith this sizing some of the more creative instagram user create design base on the grid of image for making multiple post making a unique photo.\nThis trend continue with the creation of some app which create the posts’ images from one single image\nAnd now Instagram has portrait profile grid photo, breaking a lot of profile. All of this because:\n4:5 is the best ratio for video\nOfficial Instagram Storie about the update\nSecond problem ¶ Meta now has community note not fact checking2. So if i post a photo of my cat flying and I have a big community, I can say in the community note\nCat can fly on Friday Afternoon but only when Mars is in the Fishes\nby Community Note\nWhy????\nThird problem ¶ Instagram is pushing videos/reals every time they can. They want to be TikTok but they don’t find the right way to do it…\nI don’t find the Instagram reals so interesting as the TikTok video so, if I want to see video I go to TikTok. If I want to see photo I go to Instagram\nConclusion without a solution ¶ All of this and the “success” of PiXelfed3 Instagram is loosing his apeal and more and more user aren’t satisfied with the new “feature” they are implementing.\nI know it isn’t a solution but more and more if we want to become indipendent from the social network you need to have a blog with our domain so you have the control of your internet’s presence\nOriginal announcment Introducing Landscape and Portrait Formats on Instagram ↗  ↩︎\nMeta now has community note not fact check ↗  ↩︎\nSocial network ↗ based on ActivityPub protocol ↗  ↩︎\n","date":"21 January 2025","description":"","tags":["social","instagram"],"title":"This Is Why Instagram Ruin Itself","uri":"/post/2025/this-is-why-instagram-ruin-itself/"},{"categories":[],"content":"And now I searching a way to take my toots and find all my syndication link for my blog\n#microblogging #gohugo #mastodon #microformat #syndicationlinks\n","date":"20 January 2025","description":"","tags":[],"title":"Scraping the Web for the Syndication Link","uri":"/micro/2025/10/scraping-the-web-for-the-syndication-link/"},{"categories":[],"content":"Another blog using Webmentions, creating and indipendent network between sites/blogs without the needs of social networks\n","date":"20 January 2025","description":"","tags":[],"title":"And Another Blog Is Powered by Webmention!","uri":"/micro/2025/10/and-another-blog-is-powered-by-webmention/"},{"categories":[],"content":" The TikTok ban, the Musk Twitter takeover, the Facebook moderation policy changes, the Republicans’ rapidly intensifying crackdowns on speech… let these be the proof you needed to move anything you care about online to a space you control.\nDigital sovereignty is more important than ever.\nMolly White ↗ This is why you need to have your domain with your blog. The blog is YOUR blog and no-one can do what they are doing in the social\n","date":"19 January 2025","description":"","tags":["blogging"],"title":"This Is Why You Need a Domain","uri":"/micro/2025/10/this-is-why-you-need-a-domain/"},{"categories":[],"content":"And today I find a new shop near my home. It is a tearoom with comics, manga and table top game…\nI LOVE IT\n#nerd #tearoom #teashop #manga #comics #nerdshop\n","date":"18 January 2025","description":"","tags":[],"title":"My New Favorite Shop","uri":"/micro/2025/10/my-new-favorite-shop/"},{"categories":[],"content":" Sometime the best things are the little things like some comment under your photo (in my free time I am a photographer)\n#littlethings #microblogging\n","date":"18 January 2025","description":"Sometime the little things are the best one","tags":[],"title":"The Little Thing","uri":"/micro/2025/10/the-little-thing/"},{"categories":[],"content":"Testing new way of posting\n#blogging #microblogging #social\n","date":"18 January 2025","description":"","tags":[],"title":"Testing the Hashtags","uri":"/micro/2025/10/testing-the-hashtags/"},{"categories":[],"content":"More reworking of my personal site and the social network connected with it\n","date":"18 January 2025","description":"","tags":[],"title":"Reworking of the Site","uri":"/micro/2025/10/reworking-of-the-site/"},{"categories":["dev","fingerfood"],"content":"For social pression of some blogger I follow (Andrea Grandi ↗ ,Nicola Iarocci ↗ , Chris DeLuca ↗ ) I follow with the history of my terminal (ZSH)\n90 git 49 38 open 34 poetry 27 make 26 hugo 26 brew 24 cd 18 npm 14 pipenv As a dev the first command is git… The second command is a bad habits I have… Spam new line in the terminal… I don’t find ls and I find it strange…\nHere the command I used\nhistory | awk '{print $1}' | sort | uniq --count | sort --numeric-sort --reverse | head -10 ","date":"17 January 2025","description":"And I print my ZSH History","tags":["dev","zsh"],"title":"My Zsh Command History","uri":"/post/2025/my-zsh-command-history/"},{"categories":["dev"],"content":"A lot of time ago I was an active user of DevianArt1 where I share my photos.\nOne of the things I loved of the site are the meta-data under the photo. If you share any digital media with metadata, the site show them (example ↗ ) and because of them I learn something of photography.\nBut now DeviantArt is a zombie ↗ and Instagram is not in a good place so I want to build my own photo space.\nSearching for Theme ¶ So I search something like a GoHugo Theme with photo gallery and single page info. Every theme I found with this support I didn’t like it.\nOne has the gallery but not the single page, one was only gallery no posts, one was single photo or video… So I change my mind and start reading the doc for Gohugo and some article find on google about GoHugo and photos…\nThe Solution ¶ Searching I find an article about EXIF data show under a photo in a GoHugo site2 so I search for the code for this and I found a second blog post with the implementation for a gallery (a list view for GoHugo) and a render for show the meta data for every photos connect with the new type of post3\nSo I recreate something I liked with the data show but now I am searching for some icons to put near the value, likely the standard icons which you can find in your camera, because it is easy to read and understand. Some code ¶ In my case I don’t need the list view so I don’t have a custom code for that. I only have a custom type of content and a template.\nSo this is the markdown for the post of the screenshot\n--- title: \"Near Indiana Johns Library\" date: 2024-08-30T12:43:56+02:00 description: \"Sometime in Venice you need to pass under an house. This is one of them\" images: ['DSCF0070.jpg'] resources: - title: \"Near Indiana Johns Library\" src: 'DSCF0070.jpg' --- Heavily edited with the IA from Lightroom for cleaning, I love this photo but if you print in big format can have problems... I need to work more on the night setting for having less editing. In the header of the markdown you need to have all the image you want to render in the page in the variabile images so GoHugo find them and work with them.\n{{ with .Resources.ByType \"image\" }} \u003cdiv\u003e {{ range . }} {{ $image := .Fit \"1024x1024\" }} \u003cfigure\u003e \u003cimg loading=\"lazy\" src=\"{{ $image.RelPermalink }}\" width=\"{{ $image.Width }}\" height=\"{{ $image.Height }}\" alt=\"{{ $.Description }}\"\u003e \u003cfigcaption class=\"figure-caption\"\u003e{{ $.Description }} - \u003ca href=\"{{ $.Site.BaseURL }}\"\u003e{{$.Site.Params.Author.name }}\u003c/a\u003e\u003c/figcaption\u003e \u003c/figure\u003e {{ with .Exif }} \u003ctable\u003e {{ with $image.Title }} \u003ctr\u003e \u003cth scope=\"col\"\u003eTitle\u003c/th\u003e \u003ctd\u003e{{ . }}\u003c/td\u003e \u003c/tr\u003e {{ end }} {{ with .Date }} \u003ctr\u003e \u003cth scope=\"col\"\u003eDate\u003c/th\u003e \u003ctd\u003e{{ . }}\u003c/td\u003e \u003c/tr\u003e {{ end }} {{ if isset .Tags \"Model\" }} \u003ctr\u003e \u003cth\u003eCamera\u003c/th\u003e \u003ctd\u003e{{ .Tags.Model }}\u003c/td\u003e \u003c/tr\u003e {{ end }} {{ if isset .Tags \"LensModel\" }} \u003ctr\u003e \u003cth\u003eLens\u003c/th\u003e \u003ctd\u003e{{ .Tags.LensModel }}\u003c/td\u003e \u003c/tr\u003e {{ end }} {{ if isset .Tags \"ExposureTime\" }} \u003ctr\u003e \u003cth\u003eExposure Time\u003c/th\u003e \u003ctd\u003e{{ .Tags.ExposureTime }}\u003c/td\u003e \u003c/tr\u003e {{ end }} {{ if isset .Tags \"FNumber\" }} \u003ctr\u003e \u003cth\u003eF Number\u003c/th\u003e \u003ctd\u003e{{ .Tags.FNumber }}\u003c/td\u003e \u003c/tr\u003e {{ end }} {{ if isset .Tags \"ISOSpeedRatings\" }} \u003ctr\u003e \u003cth\u003eISO\u003c/th\u003e \u003ctd\u003e{{ .Tags.ISOSpeedRatings }}\u003c/td\u003e \u003c/tr\u003e {{ end }} {{ if isset .Tags \"FocalLength\" }} \u003ctr\u003e \u003cth\u003eFocal Length\u003c/th\u003e \u003ctd\u003e{{ .Tags.FocalLength }}\u003c/td\u003e \u003c/tr\u003e {{ end }} {{ if isset .Tags \"ExposureMode\" }} \u003ctr\u003e \u003cth\u003eExposure Mode\u003c/th\u003e \u003ctd\u003e {{ with (eq .Tags.ExposureMode 1) }}Manual{{ end }} {{ with (eq .Tags.ExposureMode 0) }}Auto{{ end }} \u003c/td\u003e \u003c/tr\u003e {{ end }} {{ if isset .Tags \"ExposureProgram\" }} \u003ctr\u003e \u003cth\u003eExposure Program\u003c/th\u003e \u003ctd\u003e {{ with (eq .Tags.WhiteBalance 1) }}Manual{{ end }} {{ with (eq .Tags.WhiteBalance 0) }}Auto{{ end }} \u003c/td\u003e \u003c/tr\u003e {{ end }} {{ with .Tags.ExposureBiasValue }} \u003ctr\u003e \u003cth\u003eExposure Compensation\u003c/th\u003e \u003ctd\u003e{{ . }}\u003c/td\u003e \u003c/tr\u003e {{ end }} {{ if isset .Tags \"WhiteBalance\" }} \u003ctr\u003e \u003cth\u003eWhite Balance\u003c/th\u003e \u003ctd\u003e {{ with (eq .Tags.WhiteBalance 1) }}Manual{{ end }} {{ with (eq .Tags.WhiteBalance 0) }}Auto{{ end }} \u003c/td\u003e \u003c/tr\u003e {{ end }} {{ if isset .Tags \"MeteringMode\" }} \u003ctr\u003e \u003cth\u003eMetering Mode\u003c/th\u003e \u003ctd\u003e {{ with (eq .Tags.MeteringMode 0) }}Unknown{{ end }} {{ with (eq .Tags.MeteringMode 1) }}Average{{ end }} {{ with (eq .Tags.MeteringMode 2) }}Center Weighted Average{{ end }} {{ with (eq .Tags.MeteringMode 3) }}Spot{{ end }} {{ with (eq .Tags.MeteringMode 4) }}MultiSpot{{ end }} {{ with (eq .Tags.MeteringMode 5) }}Pattern{{ end }} {{ with (eq .Tags.MeteringMode 6) }}Partial{{ end }} {{ with (eq .Tags.MeteringMode 255) }}other{{ end }} \u003c/td\u003e \u003c/tr\u003e {{ end }} \u003c/table\u003e \u003chr\u003e \u003cbr\u003e {{ end }} {{ end }} {{ end }} \u003cdiv\u003e {{- .Content }} \u003c/div\u003e \u003c/div\u003e In this template the first thing we do is find all resources which are image and render with a loop. After render the image in a figure tag we search the file for metadata EXIF. All the value EXIF we find we show them. Some are inside a “switch case” because we need something more human readible for some of them.\nIf you want to see this code in action you can browser my site in the Photography area where I use the same list view for the post but this code you can find used on the single photos post.\nA social media site for artists. Here ↗ is my old profile ↩︎\nHugo photos with EXIF data ↗  ↩︎\nCreating a Photography Gallery with Hugo ↗  ↩︎\n","date":"16 January 2025","description":"Some time ago I add a new post type to my blog: photography","tags":["hugo","dev","photography"],"title":"Add Photo Page in your Hugo Site","uri":"/post/2025/add-photo-page-in-your-hugo-site/"},{"categories":[],"content":" ","date":"11 January 2025","description":"More square ceiling that I love","tags":[],"title":"Square Square Square and Square","uri":"/photos/2025/square-square-square-and-square/"},{"categories":[],"content":"At the airport I find this ceiling and I love it\n","date":"10 January 2025","description":"One day I find a square on the sealing and I love it","tags":[],"title":"Square Tile","uri":"/photos/2025/square-tile/"},{"categories":[],"content":"A single Olive find lap dancing over a “briccola” at Venice. I am sorry that in this moment I hadn’t my proper camera, only my phone.\n","date":"5 January 2025","description":"One Olive find at night at Venice","tags":[],"title":"Olive at the Night","uri":"/photos/2025/olive-at-the-night/"},{"categories":[],"content":"A do a lot of walk at night and I love to find some strange “light works” around the city like this\n","date":"23 December 2024","description":"A red house find at night walking home","tags":[],"title":"Light on the Red House","uri":"/photos/2024/light-on-the-red-house/"},{"categories":[],"content":"Sometime Venice had some beautifull colors… In this one there are too much pink\n","date":"17 September 2024","description":"Walking with friends we find this view","tags":[],"title":"Pink on the Water","uri":"/photos/2024/pink-on-the-water/"},{"categories":[],"content":"Another orange photo, this time about an orange church in Venice Murano. It easy to take orange photo in Venice because all over the city you can find something orange\n","date":"12 September 2024","description":"A church in the Murano island","tags":[],"title":"Murano Church Also Orange","uri":"/photos/2024/murano-church-also-orange/"},{"categories":[],"content":"You can’t have a building in Venice straight. It always be a little not straight? A little gay ? XD\nAnd this is another orange photo… Lovely\n","date":"9 September 2024","description":"On of the 'campanili' of Murano, a Venice's Island","tags":[],"title":"Campanile From Murano Orange","uri":"/photos/2024/campanile-from-murano-orange/"},{"categories":[],"content":"More night photo because I love them and it isn’t hot in the summer night.\nIn this photo I love the orange from the walls.\n","date":"3 September 2024","description":"Walking in the night sometime you find a dark street","tags":[],"title":"Street Night and Darkness","uri":"/photos/2024/street-night-and-darkness/"},{"categories":[],"content":"This is one of my experiments with light in the night. In this case I remove some color and add some other colors.\n","date":"1 September 2024","description":"In Venice there is a vegetable shop on a boat. One of the 'briccole' which keep the boat in place has this sign.","tags":[],"title":"Hunting at Night in Venice","uri":"/photos/2024/hunting-at-night-in-venice/"},{"categories":[],"content":" Night near the Indiana Johns Library\n","date":"30 August 2024","description":"Sometime in Venice you need to pass under an house. This is one of them","tags":[],"title":"Near Indiana Johns Library","uri":"/photos/2024/near-indiana-johns-library/"},{"categories":[],"content":"Walking after midnight near my favorite bar.\nThe street are empty and here I find dome light turn on and no other living thing so I toke the photo.\n","date":"25 August 2024","description":"Street of Venice by Night (and by Light) with only light and no one to be seen","tags":[],"title":"Only Light in the Street","uri":"/photos/2024/only-light-in-the-street/"},{"categories":[],"content":" Challenge ¶ This was a test photo for show smoke from the teapot or tea cup…\nI can’t take a photo of smoke or keep a tea cup warm enough to have smoke. Or maybe steam is not the right thing for a photo without the right light.\n","date":"22 August 2024","description":"Green tea pot for my black tea","tags":[],"title":"Green Teapot","uri":"/photos/2024/green-teapot/"},{"categories":[],"content":"This photo come out from a photo set at Milan. It is a Ramen shop lokking like a Japanese street shop.\nI love it and I love the food.\nProblem ¶ WOST LIGHT EVER! I don’t like the multiple type of light they have inside so you need to be good with feeling the light changing at every corner\n","date":"20 August 2024","description":"Sometime a Ramen Shop try the Japanese aesthetic but this look like a real Japan's Ramen","tags":[],"title":"Waiting for Ramen in a Restaurant","uri":"/photos/2024/waiting-for-ramen-in-a-restaurant/"},{"categories":[],"content":"Near my highschool you can find this church. I always love the statues, holding the weight of the church (or the world)\n","date":"19 August 2024","description":"Chiesa dell Ospedaletto in Venice","tags":[],"title":"On the Shoulders of Giants","uri":"/photos/2024/on-the-shoulders-of-giants/"},{"categories":[],"content":"Walking in your city at night is one of the best way to fell your city without thinking or hurry.\nIn the summer, with the hot days, I love to go out after dark and take picture of the sleeping city around me.\nThis was one of the best night\n","date":"19 August 2024","description":"While walking sometime the moon hide behind the shadows and this is one of the photo of this type of moment","tags":[],"title":"Moon Palace and Still Water","uri":"/photos/2024/moon-palace-and-still-water/"},{"categories":[],"content":"Walking in my city sometime I find something “strange” like this all orange composion\n","date":"18 August 2024","description":"Sun set on orange boats and orange houses","tags":[],"title":"Orange Boats","uri":"/photos/2024/orange-boats/"},{"categories":[],"content":"I LOVE to walk after dark but I am not very good with the astronomical photo\nChallenge ¶ I am studing how to take a photo of the moon or the stars. In this one I use some filters to get a better image the day after.\n","date":"17 August 2024","description":"Photo of the moon 'sleeping' inside the clouds in a hot summer night in Venice","tags":[],"title":"Moon of Middle Summer","uri":"/photos/2024/moon-of-middle-summer/"},{"categories":["dev","fingerfood"],"content":" The story so far ¶ Some time ago I wrote a post about lazy loading and WebP in Hugo 1 and how I implemented it.\nWhen you add image in your Hugo’s site you also launch some script for some image optimization. Some problems come from the custom script for the build, were you need to have other code install in your machine or wherever you compile your static site.\nIt was a good implementation and a fast one but some time after I find a better way to implement better way to serve img in a static site, so I wrote a new article 2 where I describe the implementation with a “Hugo’s way” with a internal pipeline.\nIn this implementation I combine as find in a blog post 3 the srv html tag 4 in the picture tag 5 without the Avif format file6\nI don’t like this way because it is inside the theme. I want to have this function like something I can import in any of my Hugo projects without copy and pasting the same code any time.\nSo I search for something like a package for Hugo so I find the Hugo Module ↗ GoHugo Module ¶ Hugo is write in GoLang so the dev implement a way to use a golang module as add-on for your Hugo site.\nIn my module Macia Image ↗ 7 I implemented a ‘partial theme’ which the only think it does is optimize the image of the posts like the one done for the second post 2\nCode ¶ So this is my code form the path layouts/_default/_markup/render-image.html in the theme from the old way 2 but now it is at the new path of the module layouts/_default/_markup/render-image.html where I build the images INSIDE the post.\n{{/* Original code from: https://laurakalbag.com/processing-responsive-images-with-hugo/ */}} {{/* Just modified a bit to work with render_image hook and output webp images */}} {{/* get file that matches the filename as specified as src=\"\" */}} {{ $src := .Page.Resources.GetMatch (printf \"%s\" (.Destination | safeURL)) }} {{ $alt := .PlainText | safeHTML }} {{/* So for posts that aren't setup in the page bundles, it doesn't fail */}} {{ if $src }} {{ $format := cond (eq $src.MediaType.SubType \"gif\") \"\" \"webp\" -}} {{ $xs := .Page.Site.Params.maciaimage.tiny }} {{ $s := .Page.Site.Params.maciaimage.small }} {{ $m := .Page.Site.Params.maciaimage.medium }} {{ $l := .Page.Site.Params.maciaimage.large }} {{ $tinyw := default (printf \"%s %s\" $xs $format) }} {{ $smallw := default (printf \"%s %s\" $s $format) }} {{ $mediumw := default (printf \"%s %s\" $m $format) }} {{ $largew := default (printf \"%s %s\" $l $format) }} {{/* resize the src image to the given sizes */}} {{/* We create a a temp scratch because it`s not available in this context */}} {{ $data := newScratch }} {{ $data.Set \"tiny\" ($src.Resize $tinyw) }} {{ $data.Set \"small\" ($src.Resize $smallw) }} {{ $data.Set \"medium\" ($src.Resize $mediumw) }} {{ $data.Set \"large\" ($src.Resize $largew) }} {{/* add the processed images to the scratch */}} {{ $tiny := $data.Get \"tiny\" }} {{ $small := $data.Get \"small\" }} {{ $medium := $data.Get \"medium\" }} {{ $large := $data.Get \"large\" }} {{/* only use images smaller than or equal to the src (original) image size, as Hugo will upscale small images */}} \u003ca href=\"{{ $src.RelPermalink }}\"\u003e \u003cpicture\u003e \u003csource media=\"(max-width: 376px)\" srcset=\"{{with $tiny.RelPermalink }}{{.}}{{ end }}\"\u003e \u003csource media=\"(max-width: 992px)\" srcset=\"{{with $small.RelPermalink }}{{.}}{{ end }}\"\u003e \u003csource media=\"(max-width: 1400px)\" srcset=\"{{with $medium.RelPermalink }}{{.}}{{ end }}\"\u003e \u003csource media=\"(min-width: 1600px)\" srcset=\"{{with $large.RelPermalink }}{{.}}{{ end }}\"\u003e \u003cimg alt=\"{{ $alt }}\" title=\"{{ $alt }}\" src=\"{{ $src }}\" loading=\"lazy\" decoding=\"async\" height=\"{{ $src.Height}}\" width=\"{{ $src.Width }}\" class=\"{{.Page.Site.Params.maciaimage.imgclass}}\"\u003e \u003c/picture\u003e \u003c/a\u003e {{/* Since I do image-response class, the only thing that really matters is the height and width matches the image aspect ratio */}} {{ end }} In this code I set some values from the configs of the site so you can customize it in your theme and import it when ever you need it.\nNB ¶ This code, unlike the old one 2, support the Gif file format and output only file as WebP and a lot of them. As you can see in the script, the code generate 4 copy of the original image with 4 different image size (configurable in the config of the site).\nWhen the Hugo’s Team add support for Avif3 I will add it into the module for generate all the image with the config setting which format image will be outputting.\nFundor333 - Hugo With Lazy Loading and Webp  ↩︎\nFundor333 - Generate WebP and AVIF with Hugo  ↩︎ ↩︎ ↩︎ ↩︎\nFrom Bennett Notes - Hugo Responsive Images With Markdown Render Hook ↗  ↩︎ ↩︎\nMozilla wiki - Src set ↗  ↩︎\nMozilla wiki - Tag HTML picture ↗  ↩︎\nGitHub issue - Add image processing support for AVIF ↗  ↩︎\nMacia (like the tea) is the name of all my Hugo’s module and Image for the scope of the project ↩︎\n","date":"28 July 2024","description":"The new way to elaborate image for the site generation of the site with Hugo Module","tags":["blogging","devops","hugo","module"],"title":"New Render Image For Hugo","uri":"/post/2024/new-render-image-for-hugo/"},{"categories":["rant"],"content":"I am a HUGE RSS reader so sometime I find something interesting and I want to read the full post. This time I find some article about this toot about personal website in the era of social network. 1 2\nJason Brewster :python:\n@JasonBrewster@fosstodon.org @kev I like it!\nI am always a little curious as to the point of a personal webpage when you can rely on social media for a presence. What is your primary motivator for investing the time and effort?\n8:02 PM · 28 Jun 2024 The strange thing is I was thinking about it when working on my Instagram ↗ because some change on Instagram I now have less visibility.\nSo this is my point of view.\nThe problem with the Social Media ¶ This is the era of Fast Social Media, your social media experience change every year. TikTok, YouTube Short and Instagram Reals are now the new standard, a short type of format which is eating away the other type of post (text, photo, long video) and for now they are the standard.\nBut now with the AI generating content there will be a change of the type of the post you need to make for the algorithm god.\nSo the main problem of the Social Media is:\nYou don’t have control of the social media so you don’t have control of what is good or not for the algorithm god One day this is a good post3 and now it isn’t If you make some custom work with the gui of the app/site it will work unless the social media change the gui. Why Have a Personal Site Instead of Social Media? ↗ the original post which is a response to the mastodon twoot ↩︎\nWhy a personal site rather than social media presence? ↗ a response of the original post ↩︎\nGood post is a post which the algorithm god share with a lot of people ↩︎\n","date":"16 July 2024","description":"","tags":["dev","rant","blogging"],"title":"Why Have a Blog in the Fast Social Media Era","uri":"/post/2024/why-have-a-blog-in-the-fast-social-media-era/"},{"categories":["dev","fingerfood"],"content":" ⚠️ This post is obsolete. ⚠️\nI suggest to go to the newest post from the Python’s Reptile Env series Some time ago I wrote about my preference to write Terminal Commands for what I need 1 and thant was not the end of it.\nSometime More than often I need to build the same basic structure for code a Terminal Command and I usualy use a makefile2 for the building of the project or the command specific for this particolar project3.\nBut I don’t like to repeate the same thing over and over so I develop with git and pyproject a “blank” project as template for my personal python project (there is also a Django Blank Template but I use it less and less).\nThe main idea of the template is to build something with all I need for python, not only the “booring stuff” but also some cool stuff like automation. I toke some ispiration from other post and project of mine 4 5 for the base of the template.\nStarting the .venv ¶ If you are coding in Python you must use a virtual env for easy dev and testing so I search for tools.\nI love the .venv and all the cleaner workspace which came with it but I choose, at the begginning, the wrong tool for automation of the venv.\nIn the beginning, I wrote all my project with a pipfile6 in mind which is a good idea for a deploy, not for a package.\nIf it is a personal project you need to run only on your machine and not relese anyware else it is a great tool because Pipenv is build for deploy only.\nBut with the new white hairs on my head I change my mind.\nIf I want to become something bigger than a little dev I find usefull have all the code and the test ready for mass distribuition or having a simpler system to install on a pc or server as a command like a Click program. So I search more and find pyproject and I want to try it.\nBut PyProject without a tool is horrible, no other words… It’s easy to read but you need to know all the parameters and keywords for editing or updating soo… No, I don’t like it, but maybe there are some tools for edit pyproject in a easy way so I search for something more funtional and easy to use and poetry was suggested to me. 7\nPoetry ¶ Poetry is a terminal tool for creating and manipolation of venv and pyproject.toml’s files. With some expirience I add more stuff in the pyproject for the basic.\nOne the best thing of poetry is the clean way you can edit the settings of the project and build, clean and upgrade your venv.\nPS: usually I have the .venv inside the project thanks to this command\npoetry config --local virtualenvs.in-project true Editor config ¶ With poetry we have the venv so now we need to define the style of the code and check if the code is following it.\nSo I find Editor config ↗ , one of the best thing I found on the web.\nIt is a tool split in two part:\nA config file (.editorconfig) with the indication for all the type of the file of the project and how they must be formatted8 A checker (something implemented in an IDE, an IDE Plugin, CI) which format or check the code following the .editorconfig file configuration. In my case every time I save something the editor (VSCode in my case) will reformatting the code following the .editorconfig settings.\nI feel the need for this tool because I worked with some developer who wrote Spaghetti Code every day so or I kill him or I use this tool…\nPre-Commit ¶ This is something I use as safety net for myself. Some time I work at night or with time restriction I make error or make something not python-like but spaghetti-like and this is bad, very bad.\nFor this reason I add pre-commit9 for autofix and check all this minor error. And because I add pre-commit I add more dotfiles for configurations of all the parts of the project and the tools for make more check and fix some of the problems.\nIf you set pre-commit in the right way for your project, you have an automatic way to make your local machine check your code and valitated the new code without pushing and “waysting” CI cycles 10 and fix the problems before the CI say “Wrong, wrong, wrong, wrong, You are WRONG”.\nConclusion ¶ This is the consempt for a generic python project but you can do it for all the type of projects and make your personal templating repo of Github ↗ and add other stuff, for example a blank template for Kubernates with some type of checker of the config (maybe with pre-commit).\nYou can also expand the idea adding some dotfile for the IDE, like the config for running the project with multiple setting (dev mod, presentation, online, staging) or the default config four your prefer CI tool.\nWhy I Stop Making Script and Start to Make Bash Terminal Commands  ↩︎\nThe team makefile  ↩︎\nHow to create a self-documenting Makefile ↗  ↩︎\nDotfiles, bot and yaml files  ↩︎\nFrom DevOps to GitOps  ↩︎\nPipenv e come tutto è in uno  ↩︎\nBeautifull article about Poetry over others I move from pipenv to poetry in 2023 - Am I right ? ↗  ↩︎\nI have a multifile format file done by me but if you need to start you can generate your own here ↗  ↩︎\nUsing pre-commit hooks to write better code ↗  ↩︎\nSometime you have a slow CI or a “premium” CI so the cycles are a fine resource to keep. ↩︎\n","date":"10 July 2024","description":"I choose to don't use pipenv and move to poetry and pyproject and other stuff for dev with python","tags":["poetry","pipenv","pyproject","pyenv"],"title":"Why Do I Disinstall Pipenv and Use Only Poetry?","uri":"/post/2024/why-do-i-disinstall-pipenv-and-use-only-poetry/"},{"categories":["dev","fingerfood"],"content":"Some time ago, for work, I need to add a row (or more) at the END of a google sheet in an automatic way.\nSearching on-line I did’t find any post or StackOverflow about adding row at the end of the sheet so here we are.\nBefore you start ¶ This tutorial expect you to have follow the Google prerequisit’s post ↗ so please follow it.\nIn our case we need:\na API Key with writing power the email for the project (create with the app) a gsheet with data You need to add the email of the project as editor for the gsheet\nThe code ¶ Fist we need to import all the library and have a setup of the constant of the script. In this case\nimport datetime import logging from typing import List import pygsheets SCOPES = [ \"https://www.googleapis.com/auth/spreadsheets\", ] SERVICE_ACCOUNT_FILE = \"account.json\" So we need a function insert my data in the gsheet so I declered a function and define the gsheet as sheet\ndef add_to_sheet(spreadsheet_id: int, worksheet_title:str, data=list[dict]): client = pygsheets.authorize(service_file=SERVICE_ACCOUNT_FILE) sheet = client.open_by_key(spreadsheet_id) Now I need to set a pointer (in this case i) at the first row empty (k.a.k. the one after the last wrote row)\nwks = sheet.worksheet_by_title(worksheet_title) all_values = wks.get_all_values() i = 0 for e in all_values: if \"\".join(e) != \"\": i += 1 After all this preparation you can cycle through your data for the writing phase and we have\nfor element in data: wks.insert_rows( i, values=[ element['col1'], element['col2'], element['col3'], element['col4'], ], inherit=True, ) done.append(element.id) i += 1 If you did all right now you have a function for write at the end of your gsheet data.You can use as is or you can combine it with other in to bigger project.\nConclusions ¶ For easy access this is the full code, write me if you have problems\nimport datetime import logging from typing import List import pygsheets SCOPES = [ \"https://www.googleapis.com/auth/spreadsheets\", ] SERVICE_ACCOUNT_FILE = \"account.json\" def add_to_sheet(spreadsheet_id: int, worksheet_title:str, data=list[dict]): client = pygsheets.authorize(service_file=SERVICE_ACCOUNT_FILE) sheet = client.open_by_key(spreadsheet_id) wks = sheet.worksheet_by_title(worksheet_title) all_values = wks.get_all_values() i = 0 for e in all_values: if \"\".join(e) != \"\": i += 1 for element in data: wks.insert_rows( i, values=[ element['col1'], element['col2'], element['col3'], element['col4'], ], inherit=True, ) done.append(element.id) i += 1 ","date":"25 July 2023","description":"How I write a row of data at the end of a Google Sheet with Python Api","tags":["script","google drive","google api"],"title":"Add Data at the End of the Google Sheet","uri":"/post/2023/add-data-at-the-end-of-the-google-sheet/"},{"categories":["dev","fingerfood"],"content":"At the time of the writing I am at the PyconIt 20231, in Florence, and I have a problem.\nAll the other Pycon I went, I saved all the user how tweet the official hashtag for the event. This year I won’t do it because of the pricing of the Twitter Api, so I was unhappy about of it.\nSo I decide to implement something similar for Mastodon.\nThe theory of the toot ¶ I need to break the task in little steeps for easyer development:\nI need to get all the Toots with the hashtag: pycoit2023 I need to collet the users of the toots Follow all the users (you need to follow someone to add to a list) Add all the users in the list PyconIt2023 So I wrote this code for a commandline\nfrom typing import Annotated import typer import requests from rich.console import Console from rich.table import Table import logging logger = logging.getLogger(__name__) app = typer.Typer() class MastodonSocial: def __init__(self, token: str, domain: str) -\u003e None: self.token = token self.domain = domain def follow(self, account_id: str) -\u003e None: url = f\"https://{self.domain}/api/v1/accounts/{account_id}/follow\" headers = {\"Authorization\": f\"Bearer {self.token}\"} response = requests.post(url, headers=headers) if response.status_code == 200: logger.info(\"Success\") def get_users_from_hashtags(self, hashtag: str) -\u003e None: url = f\"https://{self.domain}/api/v1/timelines/tag/{hashtag}\" headers = {\"Authorization\": f\"Bearer {self.token}\"} response = requests.get(url, headers=headers) if response.status_code == 200: return list({user[\"account\"][\"id\"] for user in response.json()}) else: raise Exception(\"Error\") def get_list(self) -\u003e list[dict]: url = f\"https://{self.domain}/api/v1/lists\" headers = {\"Authorization\": f\"Bearer {self.token}\"} response = requests.get(url, headers=headers) if response.status_code == 200: return response.json() else: raise Exception(\"Error\") def run_hashtag_follow(self, hashtag: str) -\u003e None: users = self.get_users_from_hashtags(hashtag) for user in users: self.follow(user) def add_user_to_list(self, list_id: str, list_users_id: list[str]) -\u003e None: url = f\"https://{self.domain}/api/v1/lists/{list_id}/accounts\" headers = {\"Authorization\": f\"Bearer {self.token}\"} response = requests.get(url, headers=headers) present = {user[\"id\"] for user in response.json()} list_users_id = list(set(list_users_id) - present) url = f\"https://{self.domain}/api/v1/lists/{list_id}/accounts\" headers = {\"Authorization\": f\"Bearer {self.token}\"} response = requests.post( url, headers=headers, json={\"account_ids\": list_users_id} ) if response.status_code == 200: logger.info(\"Success\") else: logger.error(response.json()) raise Exception(\"Error\") def run_hashtag_follow_list(self, hashtag: str, list_id: str) -\u003e None: users = self.get_users_from_hashtags(hashtag) self.add_user_to_list(list_id, users) @app.command() def get_lists( token: Annotated[str, typer.Argument(help=\"Token for Mastodon\")], domain: Annotated[ str, typer.Argument(help=\"Mastodon Server\") ] = \"mastodon.social\", ): ms = MastodonSocial(token=token, domain=domain) console = Console() table = Table() table.add_column(\"Id\") table.add_column(\"Title\") for e in ms.get_list(): table.add_row(e[\"id\"], e[\"title\"]) console.print(table) @app.command() def add_list_from_hashtag( token: Annotated[str, typer.Argument(help=\"Token for Mastodon\")], hashtag: Annotated[ str, typer.Argument(help=\"The hash tag to find the followers\") ], list_id: Annotated[ str, typer.Argument(help=\"The id of the list to add the followers\") ], domain: Annotated[ str, typer.Argument(help=\"Mastodon Server\") ] = \"mastodon.social\", ): ms = MastodonSocial(token=token, domain=domain) users = ms.get_users_from_hashtags(hashtag) ms.add_user_to_list(list_id, users) @app.command() def follow_from_hashtag( token: Annotated[str, typer.Argument(help=\"Token for Mastodon\")], hashtag: Annotated[ str, typer.Argument(help=\"The hash tag to find the followers\") ], domain: Annotated[ str, typer.Argument(help=\"Mastodon Server\") ] = \"mastodon.social\", ): ms = MastodonSocial(token=token, domain=domain) ms.run_hashtag_follow(hashtag=hashtag) if __name__ == \"__main__\": app() With this simple script2 now I can populate my Mastodon’s List with all the user Tooting about pyconit\nLink at the event ↗  ↩︎\nRepo Github ↗  ↩︎\n","date":"26 May 2023","description":"How I follow all who Toots about PyconIt2023","tags":["pyhton","mastodon","pyconit"],"title":"Following the Elephant's Toots With the Python","uri":"/post/2023/following-the-elephant-toots-with-the-python/"},{"categories":["dev","fingerfood"],"content":" The script folder of DOOM ¶ I am a developer from a long time and, like other developer I know, I have the script/dump folder where I copy all the usefull script I find online or I wrote with blood and stackoverflow. And this toolbox of scripts became big and bigger more script I add.\nSo last week I made some changes. I merge some script (python in my case) in one bigger script/project and convert it in a tool for my command line. For example I merge some script which check DNS, server status and NS statud in a unique terminal program so i can launch some command like dnstool check_ns –target fundor333.com and it check the NS of site I want. And If I don’t remember the parameters I have an help command for the man of the app.\nIn this way I can’t forget what a command do or how many parameters I need to use for the specific command.\nWhat do I use for the commands? Bash, SH, Perl, Python? ¶ For the commands I implements I use Typer ↗ a python library to build CLIs.\nI find easyer than Click ↗ 1 and if you install the full package has also Rich ↗ 2\nFor example I need to check some DNS configuration and I call the dog program for the checks.\nimport subprocess from typing import List import typer from rich.table import Table from rich.console import Console app = typer.Typer() @app.command() def dns_check( url: str, dns: List[str] = [\"8.8.8.8\",\"8.8.4.4\"], type: str = 'A', ): table = Table() table.add_column(\"Type\", justify=\"right\", style=\"cyan\", no_wrap=True) table.add_column(\"Url\", style=\"magenta\") table.add_column(\"Time\", justify=\"right\") table.add_column(\"Record\", justify=\"right\", style=\"green\") for e in dns: result = subprocess.run(['dog', url, f'@{e}', type], stdout=subprocess.PIPE) for a in result.stdout.decode('utf-8').split('\\n'): print(a) table.add_row(*a.split()) console = Console() console.print(table) if __name__ == \"__main__\": app() After some time I need to have something which can query multiple site for the https. So I added some code inside the command\nfrom urllib.parse import urlparse import http.client import sys @app.command() def check_https(url:str): url = urlparse(url) conn = http.client.HTTPConnection(url.netloc) conn.request('HEAD', url.path) console = Console() if conn.getresponse(): console.print(f\"[green]{url}\") else: console.print(f\"[red]{url}\") With this command added the cli become more compless with a help autogenerate. At the end the script/cli will look like some like this\nimport subprocess from typing import List import typer from rich.table import Table from rich.console import Console from urllib.parse import urlparse import http.client import sys app = typer.Typer() @app.command() def dns_check( url: str, dns: List[str] = [\"8.8.8.8\",\"8.8.4.4\"], type: str = 'A', ): table = Table() table.add_column(\"Type\", justify=\"right\", style=\"cyan\", no_wrap=True) table.add_column(\"Url\", style=\"magenta\") table.add_column(\"Time\", justify=\"right\") table.add_column(\"Record\", justify=\"right\", style=\"green\") for e in dns: result = subprocess.run(['dog', url, f'@{e}', type], stdout=subprocess.PIPE) for a in result.stdout.decode('utf-8').split('\\n'): print(a) table.add_row(*a.split()) console = Console() console.print(table) @app.command() def check_https(url:str): url = urlparse(url) conn = http.client.HTTPConnection(url.netloc) conn.request('HEAD', url.path) console = Console() if conn.getresponse(): console.print(f\"[green]{url}\") else: console.print(f\"[red]{url}\") if __name__ == \"__main__\": app() Like this I have multiple other CLI for email, printers, networks, servers, etc and I have something more clean and organize than a bin of scripts.\nAt the end of the day having a lot of script can be a growing problem but if you can convert them in cli operation and command you can have some sort of order for your scripts.\nHave nice time making your CLI\nUpdate ¶ Here you can find some update about the way I write code and my personal utility\nFamous CLI library for python ↩︎\nPython library for writing rich text to the terminal and show advance content ↩︎\n","date":"19 May 2023","description":"","tags":["script","bash","command line"],"title":"Why I Stop Making Script and Start to Make Bash Terminal Commands","uri":"/post/2023/why-i-stop-making-script-and-start-to-make-bash-terminal-commands/"},{"categories":["dev"],"content":"After my first work on Micropub, Microformat and WebMention (you can find more here ) I change some things here and there.\nI change the code because I find some cleaner solution for some of the implementations or I add new function in my stack of the blog.\nWebmention ¶ I rework how I render all the microposts on my blog. So I have some template partial for my site and add more custumization on the single type of webmentions.\nManage the webmention ¶ This is the basic template for the webmention. Every type of webmention has his “hugo partials”1 /layouts/partials/webmention.html\n\u003cdiv id=\"webmentions\" class=\"row\"\u003e {{ $dataJ := getJSON (print \"https://webmention.io/api/mentions.jf2?target=\" .Site.Params.HostName .RelPermalink ) }} \u003cdiv class=\"container-fluid\"\u003e {{ range $dataJ.children }} {{if eq (index . \"wm-property\") \"in-reply-to\"}} {{ partial \"webmention/in-reply-to.html\" . }} {{end}} {{end}} \u003c/div\u003e \u003cdiv class=\"row\"\u003e {{ range $dataJ.children }} {{if eq (index . \"wm-property\") \"like-of\"}} {{ partial \"webmention/like-of.html\" . }} {{end}} {{if eq (index . \"wm-property\") \"repost-of\"}} {{ partial \"webmention/repost-of.html\" . }} {{end}} {{if eq (index . \"wm-property\") \"bookmark-of\"}} {{ partial \"webmention/bookmark-of.html\" . }} {{end}} {{end}} \u003c/div\u003e \u003cdiv class=\"row\"\u003e {{ range $dataJ.children }} {{if eq (index . \"wm-property\") \"mention-of\"}} {{ partial \"webmention/mention-of.html\" . }} {{end}} {{end}} \u003c/div\u003e {{ range $dataJ.children }} \u003cdiv class=\"row\"\u003e \u003cdiv class=\"col\"\u003e \u003cp\u003e {{if eq (index . \"wm-property\") \"rsvp\"}} {{ partial \"webmention/rsvp.html\" . }} {{end}} \u003c/p\u003e \u003c/div\u003e \u003c/div\u003e {{end}} \u003c/div\u003e NB: this code work only because I use GoHugo and I have webmention.io ↗ as endpoint for my webmention and I use the api for get the json format of the webmention.\nIf you use somethings else you need to change the code.\nSome single example ¶ With this under all my post/article/stuff I can render all the webmentions I receive. Here are some of the single partial templates with booostrap5 as css:\nBookmarks ¶ \u003c!-- /layouts/partials/webmention/bookmark-of.html --\u003e \u003cdiv class=\"col-2\"\u003e \u003ca class=\"reaction\" rel=\"nofollow ugc\" title=\"{{.author.name}} replied\" href=\"{{.url}}\"\u003e \u003cimg src=\"{{.author.photo}}\" loading=\"lazy\" decoding=\"async\" alt=\"{{.author.name}}\"\u003e🔖 \u003c/a\u003e \u003c/div\u003e In replay ¶ \u003c!-- /layouts/partials/webmention/in-reply-to.html --\u003e \u003cdiv class=\"row\"\u003e \u003cdiv class=\"col-2\"\u003e \u003ca class=\"reaction\" rel=\"nofollow ugc\" title=\"{{.author.name}} replied\" href=\"{{.url}}\"\u003e \u003cimg src=\"{{.author.photo}}\" loading=\"lazy\" decoding=\"async\" alt=\"{{.author.name}}\"\u003e \u003c/a\u003e \u003c/div\u003e \u003cdiv class=\"col text-start\"\u003e \u003ca class=\"source\" rel=\"nofollow ugc\" href=\"{{.url}}\"\u003e💬 {{.author.name}} - {{index . \"wm-received\" | time.Format \"2006-01-02 15:04:05\" }} \u003c/a\u003e \u003cp class=\"text\"\u003e{{.content.html |safeHTML}}\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e Like of ¶ \u003c!-- /layouts/partials/webmention/like-of.html --\u003e \u003cdiv class=\"col-2\"\u003e \u003ca class=\"reaction\" rel=\"nofollow ugc\" title=\"{{.author.name}} replied\" href=\"{{.url}}\"\u003e \u003cimg src=\"{{.author.photo}}\" loading=\"lazy\" decoding=\"async\" alt=\"{{.author.name}}\"\u003e❤️ \u003c/a\u003e \u003c/div\u003e Mention ¶ \u003c!-- /layouts/partials/webmention/mention-of.html --\u003e \u003cdiv class=\"row\"\u003e \u003cdiv class=\"col-2\"\u003e \u003ca class=\"reaction\" rel=\"nofollow ugc\" title=\"{{.author.name}} replied\" href=\"{{.url}}\"\u003e \u003cimg src=\"{{.author.photo}}\" loading=\"lazy\" decoding=\"async\" alt=\"{{.author.name}}\"\u003e \u003c/a\u003e \u003c/div\u003e \u003cdiv class=\"col text-start\"\u003e \u003ca class=\"source\" rel=\"nofollow ugc\" href=\"{{.url}}\"\u003e✨ {{.author.name}} - {{index . \"wm-received\" | time.Format \"2006-01-02 15:04:05\" }} \u003c/a\u003e \u003cp class=\"text\"\u003e{{.content.html |safeHTML | truncate 300}}\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e Repost ¶ \u003c!-- /layouts/partials/webmention/repost-of.html --\u003e \u003cdiv class=\"col-2\"\u003e \u003ca class=\"reaction\" rel=\"nofollow ugc\" title=\"{{.author.name}} replied\" href=\"{{.url}}\"\u003e \u003cimg src=\"{{.author.photo}}\" loading=\"lazy\" decoding=\"async\" alt=\"{{.author.name}}\"\u003e🔁 \u003c/a\u003e \u003c/div\u003e Brid.gy ¶ After reading the Chrinngel’s post ↗ about his experience with webmention and some toot ↗ with him I decide to rework my POSSE2 pipeline with Brid.gy ↗ and other tools.\nIn Brid.gy ↗ you can setup autopublish for your posts/articles/stuff if you put a link to brid.gy and send a webmention of the page.\nIf all are setup in the right way you have something like this:\nIf you set all in the right way Brid.gy will post what you want and generate the webmentions from the social like Twitter3, Mastodon and Github.\nMicropub ¶ I implement a Micropub server with Django for some of my necessities like creating a endpoint/gui for add article, post or other thing and implement POSSE2\nThis is Appletune, my magical Django server named after a Grass/Dragon pokemon which look like an apple pie on a dinosaur.4\nWith this little server and more money I will conquer the galaxy but for now I use it with Micropublish.Net ↗ for publish stuff on the go.\nI am thnking about develop more stuff for my server but I don’t know when I have the time to do it…\nHugo partial template ↗ explain in the official documentations ↩︎\nPublish on your Own Site Syndacate Elsewhere ↗  ↩︎ ↩︎\nI don’t know if with the new Twitter Api Brid.gy will keep the twitter integrations but for now it is working. ↩︎\nI copy the idea from this ↗ blog. The article is OLD but the idea is good so I take it and implement it. ↩︎\n","date":"12 February 2023","description":"I implement and code more stuff from webmention, micropub and brid.gy","tags":["webmention","micropub","microformat","bridgy","hugo"],"title":"More Stuff I Do With Webmention, Micropub and Brid.gy","uri":"/post/2023/more-stuff-i-do-with-webmention-micropub-and-bridgy/"},{"categories":["dev","fingerfood"],"content":"It is some time I start working with Tornado, and I have to say that I really like it. It is a very powerful framework, and it is very easy to use. But, as any other framework, it has its own way to do things, and it is not always easy to find the right way to do things. One of the things that I found difficult to find was how to test a Tornado application. I found a lot of examples, but they were not very clear, and I had to do a lot of research to find the right way to do it. In this post, I will try to explain how to test a Tornado application.\nExample of the Tornado application ¶ This is a simple Tornado application that I will use to explain how to test it. It is a simple application that returns “Hello, World” or “Hello Name” if name param is fill. It is a very simple application, but it is enough to show how to test tornado code.\nimport asyncio import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): name = self.get_query_argument(\"name\", \"World\") self.write(f\"Hello, {name}\") def make_app(): return tornado.web.Application([ (r\"/\", MainHandler), ]) async def main(): app = make_app() app.listen(8888) await asyncio.Event().wait() if __name__ == \"__main__\": asyncio.run(main()) The core of this Tornado app is the “MainHandler” class. It is a very simple class that inherits from “tornado.web.RequestHandler”. It has a “get” method that will be call and handle the get request. The “make_app” function is a function that creates the Tornado application. It also manages the routes of the application. In this case, it only has one route, the “root” route, that will be handled by the “MainHandler” class.\nAll the remaining code is just to start the Tornado application. It is not important for the test, only for the application to run in production. I will not explain it in detail, but if you want to know more about it, you can read the Tornado documentation ↗ .\nTesting the Tornado application ¶ Now that we have the Tornado application, we can start testing it. The first thing that we need to do is to create a test file. I will call it “test_main.py”. In this file, we will create a test class that will inherit from “tornado.testing.AsyncHTTPTestCase”. This class will allow us to test the Tornado application.\nimport example from tornado.testing import AsyncHTTPTestCase class TestHelloApp(AsyncHTTPTestCase): def get_app(self): return example.make_app() def test_homepage(self): response = self.fetch(\"/\") self.assertEqual(response.code, 200) self.assertEqual(response.body, b\"Hello, World\") response = self.fetch(\"/?name=John\") self.assertEqual(response.code, 200) self.assertEqual(response.body, b\"Hello, John\") In the TestHelloApp you need to implement the “get_app” method. This method will return the Tornado application that we want to test. In this case, it will return the application that we created in the “make_app” function but you can build custom routes for the tests but in this case we use the production’s application.\nAfter that, we can write the tests. You need to create a test method that will start with “test_” (in this case test_homepage). In this method, you can use the “self.fetch” method to make a request to the application. This method will return a “Response” object that you can use to check the response of the application. In this case, we are checking that the response is 200 and that the body of the response is the correct string.\nRunning the tests ¶ After writing the tests, we can run them. To run the tests, we need to run the “unittest” module. We can do it in two ways.\nThe first one is to use the “pytest” module. In this case, we need to install the “pytest-tornado” module. After that, we can run the “pytest” module and it will find the tests in the test file. The second one is to use tox to run the tests. In this case, we need to create a “pyproject.toml” file with the following content1:\n[build-system] requires = [ \"setuptools \u003e= 35.0.2\", \"wheel \u003e= 0.29.0\"] build-backend = \"setuptools.build_meta\" [tool.tox] legacy_tox_ini = \"\"\" [tox] envlist = py27,py36 [testenv] deps = pytest \u003e= 3.0.0, \u003c4 commands = pytest [testenv:black] basepython = python3 deps = black commands = black --skip-string-normalization -t py39 . [flake8] exclude = .venv,.git,.tox,dist,doc,*egg,build \"\"\" With this file you can run the tests with the “tox” command. You can use it with CI or locally to run the tests.\nGood luck with your testing!\nThis is the new way with pyproject.toml to define the dependencies of the project. You can read more about it in the PEP 518 ↗ and for tox part in the tox documentation ↗ . ↩︎\n","date":"18 September 2022","description":"How to test a Tornado application","tags":["python","tornado","testing","tox"],"title":"Testing With Tornado","uri":"/post/2022/testing-with-tornado/"},{"categories":["rant"],"content":"I was writing another post for my blog with VS Code when Github Copilot write all the introduction for me.\nAnd now make more scary suggestion for this post\nThis is scary in more than one way\n","date":"17 September 2022","description":"How Github Copilot write my post and scare me two times","tags":["blogging","github copilot"],"title":"Github Copilot Write My Post","uri":"/post/2022/github-copilot-write-my-post/"},{"categories":["dev"],"content":" Some history of this blog ¶ When I start blogging, I was using a blog engine called WordPress ↗ but I wasn’t ok with the way it was designed. I wanted to be able to write my posts in a way that was easy to read and edit. I want to have a lightweight blog engine so I change to Pelican ↗ and I use for sometime. Sometime later, not happy with the tags and categories, I decided to switch to Hugo ↗ and I’m happier with it.\nBut I feet some time I wasn’t happy with Hugo so I search something else. After some time I find an article about Independent website ↗ and the tecnology for make a independent website.\nIn this article I discover:\nTwtxt ↗ a protocol for instances for a decentralized timeline experience Webmention and an easy implementation ↗ for it IndieWeb ↗ for POSSE, an abbreviation for Publish (on your) Own Site, Syndicate Elsewhere So I decided to study them for adding in my blog.\nTwtxt ¶ First tecnology I read about and I found it strange.\nIt call himself decentralises, minimalist microblogging service for hackers but it is only a txt file in your domain. Something like this:\n2016-02-04T13:30:00+01:00 You can really go crazy here! ┐(ﾟ∀ﾟ)┌ 2016-02-03T23:05:00+01:00 @\u003cexample \u003chttp://example.org/twtxt.txt\u003e\u003e welcome to twtxt! 2016-02-01T11:00:00+01:00 This is just another example. 2015-12-12T12:00:00+01:00 Fiat lux! You can “tweet” from your domain to the world… It is a good idea but I don’t like it.\nI was using it for a time but I prefer to use mastodon ↗ or webmention.\nAlso it isn’t compatible with my stack for the blog (my github pages builder aren’t compatible with twtxt without rewrite all my stack) and I don’t like the way it is implemented: it is a good idea to have a decentralized timeline but I prefere something easy to use anda update with a mobile phone or a tablet unlike twtxt.\nSo I decided to study the others tecnologies.\nWebmention ¶ My favorite tecnology of the article.\nWebmention is a simple way to notify any URL when you mention it on your site. From the receiver’s perspective, it’s a way to request notifications when other sites mention it.\nWebmention w3c specification ↗ This is a wonderfull way to interact between two websites. You can use it to send a notification to a third party when you mention it on your site or to send a notification to your site when you mention it on a third party site.\nYou can use to check also interaction with your twitter, mastodon, reddit and github with some tools like Bridgy ↗ .\nImplementation ¶ Thanks to Jamie’s post ↗ ,Jamie’s post ↗ and Paul’s post ↗ I implemented my own display section for the webmentions.\nI wrote and rewrote the code for the display section but now it’s something simple:\nfor getting the webmentions from Webmention.io ↗ I use the js package PlaidWeb/webmention.js ↗ with some changes for the rendering.\ntheme/layouts/partials/webmentions.html ¶ \u003cscript src=\"/webmention.min.js\" data-wordcount=\"100\" async=\"\" data-add-urls=\"https://fundor333.com{{ .RelPermalink}}\"\u003e \u003c/script\u003e \u003cdiv id=\"webmentions\" class=\"row\"\u003e \u003c/div\u003e I suggest to download and edit the webmention.min.js ↗ file for adding some customizations for the rendering and add some CSS because the basic theme is minimal.\nWith this code imported, you can show the webmention feed on your site in real time.\nIndiweb ¶ Realy the big thing and the last thing I studied and implement. It is “a people-focused alternative to the corporate web” and it has three core concepts:\nYour content is yours You are better connected You are in control I ♥ it.\nSo I rewrote all my templates to implement the Indiweb concept:\nFind a domain for my space Adding an h-card/microformat ↗ to my homepage Adding an h-card/microformat ↗ to my posts’ articles Adding the social media profiles for implementing the IndieAuth identity ↗ Adding RSS feeds and/or other type of feeds After one or two month of work on my template the work was done and I was happy. And I search for more posts about indiweb and webmentions because I WANT MORE, so I find a lot of articles, posts and tweet about this stack of tecnologies.\nOne of my favorite posts about indiweb is AM I ON THE INDIEWEB YET? by Miriam Suzanne ↗ .\nHere are some more articles I find about webmentions:\nAdding Webmention Support to a Static Site ↗ Adding Webmentions to My Static Hugo Site ↗ Adding Webmentions to my blog ↗ Adding Webmentions to My Static Hugo Site ↗ Microblogging ↗ ","date":"16 June 2022","description":"Adding Indieweb and Webmention in my blog","tags":["indiweb","webmention","h-entry","hugo","twtxt"],"title":"How I implement Indieweb, Webmention and H Entry in My Blog","uri":"/post/2022/indieweb-webmention-and-h-entry-in-my-blog/"},{"categories":["dev","fingerfood"],"content":"Sometime you need to send an allert/message from your Django project to the user, like a popup or a gui message for an user interaction (“Sent the mail”, “Done the task”, …) and you want to make it with style (Boostrap in this case).\nSo this is my code.\nBasic setup settings.py ¶ Check if in the settings you have:\ndjango.contrib.messages is in INSTALLED_APPS django.contrib.sessions.middleware.SessionMiddleware and django.contrib.messages.middleware.MessageMiddleware are in MIDDLEWARE The context_processors option of the DjangoTemplates backend defined in your TEMPLATES setting contains django.contrib.messages.context_processors.messages This is the standard configuration for django messages 1 and we need to add some config for Boostrap.\nWe need to add the config for the class css for mapping the Boostrap allert with the Django messages. You can also add more messages level if you need.\nfrom django.contrib.messages import constants as messages MESSAGE_TAGS = { messages.DEBUG: 'alert-secondary', messages.INFO: 'alert-info', messages.SUCCESS: 'alert-success', messages.WARNING: 'alert-warning', messages.ERROR: 'alert-danger', } Adding a Template ¶ We need some html for the templates. I wrote this code and add in the top part of all my pages so I can show messages everywhere in my project\n{% for message in messages %} \u003cdiv class=\"container-fluid p-0\"\u003e \u003cdiv class=\"alert {{ message.tags }} alert-dismissible fade show\" role=\"alert\"\u003e {{ message }} \u003cbutton type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"\u003e\u003c/button\u003e \u003c/div\u003e \u003c/div\u003e {% endfor %} This fragment use Boostrap5 allerts2 but you can use your favorite CSS framework for your code\nOfficial Django messages documentation ↗  ↩︎\nBoostrap5 Allerts ↗  ↩︎\n","date":"2 May 2022","description":"How to use Django messages with Boostrap5","tags":["django","coding","boostrap"],"title":"Message and Allert With Django and Boostrap","uri":"/post/2022/message-and-allert-with-django-and-boostrap/"},{"categories":["dev","fingerfood"],"content":"Sometime you want to have infinite scrolling in a Django ListView. And there are good post about this topic on the internet like this one ↗ but nothing about infinite scrolling with filters.\nBasic setup ¶ In this tutorial I assume you have a Product django model and a class view like this:\nmodel.py ¶ from django.db import model class Product(models.Model): title = models.CharField(max_length=250) description = models.TextField() def __str__(self): return self.title views.py ¶ from django.views.generic.list import ListView class ProductsView(ListView): model = Product paginate_by = 2 context_object_name = 'products' template_name = 'product.html' ordering = ['title'] Following the post by thepylot1 this is a template for the list view:\ntemplates/product_list.html ¶ \u003cdiv class=\"container\"\u003e \u003cdiv class=\"row infinite-container\"\u003e {% for product in products %} \u003cdiv class=\"col-md-6 infinite-item\"\u003e \u003cdiv class=\"card mb-4 shadow-sm\"\u003e \u003cdiv class=\"card-body\"\u003e \u003ch5\u003e{{product.title}}\u003c/h5\u003e \u003cp class=\"card-text\"\u003e {{product.description}} \u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e {% endfor %} \u003c/div\u003e {% if page_obj.has_next %} \u003ca class=\"infinite-more-link\" href=\"?page={{ page_obj.next_page_number }}\"\u003e\u003c/a\u003e {% endif %} \u003c/div\u003e \u003cscript src=\"/static/js/jquery-2.2.4.min.js\"\u003e\u003c/script\u003e \u003cscript src=\"/static/js/jquery.waypoints.min.js\"\u003e\u003c/script\u003e \u003cscript src=\"/static/js/infinite.min.js\"\u003e\u003c/script\u003e \u003cscript\u003e var infinite = new Waypoint.Infinite({ element: $('.infinite-container')[0], handler: function(direction) {}, offset: 'bottom-in-view', onBeforePageLoad: function () {$('.spinner-border').show();}, onAfterPageLoad: function () {$('.spinner-border').hide();} }); \u003c/script\u003e The js import here is all from Waypoints ↗ and works. But it return the “normal” pagination. If I add a DjangoFilter2 this code not work with it. You need to edit the get parameters of the url.\nThe important parts are:\n.infinite-more-link is matching the “Next Page” url for the pagination .infinite-item is a selector string for the singolar item in the list So for the filter to work we need to change the infinite-more-link link with the parameters of the filter.\nAdding my stuff ¶ We need to create a new tag for add or edit the get parameters of the url.\ntemplatetags/app_tags.py ¶ from django import template register = template.Library() @register.simple_tag def url_replace_diff(request, field, value): \"\"\" Give a field and a value and it's update the post parameter for the url accordly \"\"\" dict_ = request.GET.copy() dict_[field] = value return dict_.urlencode() So you need to change the template like this:\ntemplates/product_list.html ¶ \u003cdiv class=\"container\"\u003e \u003cdiv class=\"row infinite-container\"\u003e {% for product in products %} \u003cdiv class=\"col-md-6 infinite-item\"\u003e \u003cdiv class=\"card mb-4 shadow-sm\"\u003e \u003cdiv class=\"card-body\"\u003e \u003ch5\u003e{{product.title}}\u003c/h5\u003e \u003cp class=\"card-text\"\u003e {{product.description}} \u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e {% endfor %} \u003c/div\u003e {% if page_obj.has_next %} {% load app_tags %} \u003ca class=\"infinite-more-link\" href=\"?{% url_replace_diff request 'page' page_obj.next_page_number %}\"\u003e\u003c/a\u003e {% endif %} \u003c/div\u003e \u003cscript src=\"/static/js/jquery-2.2.4.min.js\"\u003e\u003c/script\u003e \u003cscript src=\"/static/js/jquery.waypoints.min.js\"\u003e\u003c/script\u003e \u003cscript src=\"/static/js/infinite.min.js\"\u003e\u003c/script\u003e \u003cscript\u003e var infinite = new Waypoint.Infinite({ element: $('.infinite-container')[0], handler: function(direction) {}, offset: 'bottom-in-view', onBeforePageLoad: function () {$('.spinner-border').show();}, onAfterPageLoad: function () {$('.spinner-border').hide();} }); \u003c/script\u003e I change the .infinite-more-link url with the new tag for edit the parameters of the filter. In this way you can have infinite scrolling with Django Filter and Django Pagination.\nThis is the easy way to do it. Or at least it’s the easiest way I can find.\nIf you can find a better way to do it, please let me know (tweet, email, post with webmention, …) thanks.\nInfinite scroll with django ↗  ↩︎\nDjango Filter Module ↗  ↩︎\n","date":"23 April 2022","description":"How to have infinite scrolling in Django FilterView","tags":["django","coding","python","django filter"],"title":"Django List View With Show More","uri":"/post/2022/django-filter-list-view-with-show-more/"},{"categories":["dev","fingerfood"],"content":"Sometime you need to print a pdf from your site or your web app with some custom data. In Python you can make pdf with ReportLab12 and some other module but I LOVE ReportLab3.\nWhat do I need? ¶ You only need Django and ReportLab\npip install django pip install reportlab Write the pdf ¶ When you have the requirements you can write the code for the pdf. For example this is a example of a class for printing A6 pdf\nfrom reportlab.lib.pagesizes import A6, landscape from reportlab.lib.styles import getSampleStyleSheet from reportlab.platypus import Paragraph from reportlab.platypus import SimpleDocTemplate class CustomDocTemplate(SimpleDocTemplate): def __init__( self, filename, right_margin=7, left_margin=7, top_margin=7, bottom_margin=7, pagesize=landscape(A6), **kw, ): super().__init__(filename, **kw) self.rightMargin = right_margin self.leftMargin = left_margin self.topMargin = top_margin self.bottomMargin = bottom_margin self.pagesize = pagesize class A6Printer: def get_pdf(self, buffer): self.buffer = buffer styles = getSampleStyleSheet() doc = CustomDocTemplate(buffer) elements = [] elements.append(Paragraph(\"Title of the PDF\", style=styles[\"Heading2\"])) elements.append(Paragraph(\"Heading\", style=styles[\"Heading4\"])) elements.append(Paragraph(\"Text inside the pdf\", style=styles[\"BodyText\"])) doc.build(elements) pdf = buffer.getvalue() buffer.close() return pdf Make the view ¶ Now we need a view for Django. Usualy I write ClassView so this is an example for the printer define in the last example.\nfrom django.views import View class A6View(View): def get(self, request, *args, **kwargs): response = HttpResponse(content_type=\"application/pdf\") response[\"Content-Disposition\"] = f'attachment; filename=\"Example.pdf\"' a6p = A6Printer() pdf = a6p.get_pdf(BytesIO()) response.write(pdf) return response With this ClassView you can download a generated pdf with static data, dinamic data or some static and some dynamic data. I am working on more post about Reportlab so if you have some suggestion or question Tweet me. Thanks\nOfficial site of ReportLab ↗  ↩︎\nFamous library for python. I wrote an article about it some time ago Letterhead With ReportLab  ↩︎\nYou can read more ReportLab: PDF Processing with Python ↗  ↩︎\n","date":"28 February 2022","description":"How to print a pdf with Django and return it from url","tags":["coding","django","reportlab"],"title":"Django Return Pdf With Reportlab","uri":"/post/2022/django-return-pdf-with-reportlab/"},{"categories":["dev","fingerfood"],"content":"For work I need to implement a strange usercase: I need to have a form with QRCode and BarCode input.\nThe short story: I need to read the info from a BarCode and find the book.\nThe long story: I need to read the barcode with a phone/tablet/something with a camera and post it in a django form. So I search on the web and find some solution.\nThe premium solution ¶ First solution I found is a premium solution. I find the Dynamsoft ↗ ’s tutorial ↗ where you can build a script for read QrCode, BarCode, etc… but you need a license for your code to work. It’s an easy way IF you have the budget and I don’t have it. So I need something different. An AI?\nThe AI solution ¶ After more searching I find some Google and Amazon solution for reading BarCode with AI but\nIt isn’t free, it is a premium services It’s hard for the server (CPU intensive) and you need to send the photo to the server You can run the code on the client but you need to make an app (iOS or Android) So I need another solution.\nOther solution ¶ I find a Perl solution (a big no no for me), some more Python solution (but you need to know where the BarCode is) and some magic tricks find in StackOverflow.\nAnd searching in StackOverflow I found the solution: an JS solution.\nSo I search some JS library and find a library: Html5-QRcode ↗ The final solution ¶ Making this template for the form you can scan the BarCode from the cam of the pc/phone/table and push the form with the info read.\n\u003cscript src=\"https://unpkg.com/html5-qrcode\" type=\"text/javascript\"\u003e \u003cdiv id=\"reader\" width=\"600px\" height=\"600px\"\u003e\u003c/div\u003e \u003cform id=\"form_isbn\" method=\"post\"\u003e {% csrf_token %} {{ form.as_p }} \u003cinput type=\"submit\" value=\"Submit\"\u003e \u003c/form\u003e \u003cscript\u003e function onScanSuccess(decodedText, decodedResult) { // handle the scanned code as you like, for example: console.log(`Code matched = ${decodedText}`, decodedResult); document.getElementById('id_isbn').value = decodedText; document.getElementById('form_isbn').submit(); } function onScanFailure(error) { // handle scan failure, usually better to ignore and keep scanning. // for example: console.warn(`Code scan error = ${error}`); } let html5QrcodeScanner = new Html5QrcodeScanner( \"reader\", { fps: 10, qrbox: {width: 250, height: 250} }, /* verbose= */ false); html5QrcodeScanner.render(onScanSuccess, onScanFailure); \u003c/script\u003e This code fragment is indipendent from the django version and the software installed in the server. It’s also all client side code so the server get only the string inside the BarCode/QrCode.\n","date":"22 February 2022","description":"How to make a django form for reading BarCode and QRCode","tags":["django","hacking","api","qrcode","barcode"],"title":"Django With Barcode and Qrcode","uri":"/post/2022/django-with-barcode-and-qrcode/"},{"categories":["fingerfood","dev"],"content":" The touchbar ¶ Sometime you need to do some task. If you have a MacBook Pro you can have a touchbar. Sometime Works sometime Freezes. And it freezes in the most Murphy’s way1 possible.\nIn my personal experience it stops when play a bad song on Spotify.\nWhat’s happened? ¶ Your touch bar can be in one of this three state:\nA working touch bar which is the natural state of the Mac A frozen touch bar which is a crashed state of the touch bar of the Mac A blank touch bar which is my favourite state of the touch bar of the Mac So can I fix it? Yes!\nFixing it ¶ An user logout sometime fix the problem. Sometime not allways will fix it. Restart the Mac will allways fix the problem but sometime you can’t restart the machine for a minor fix so you need something else for the fix. Something like a command.\nBash for the win ¶ If you need to restart the touch bar without restarting your Mac you can use this bash fragment.\nsudo pkill TouchBarServer; sudo killall \"ControlStrip\"; Your welcome\nMurphy’s law ↗ Anything that can possibly go wrong, does Something like googling “mac touch bar not working” or “mac touch bar freezes” ↩︎\n","date":"10 December 2021","description":"Sometime you need to fix your frozen Mac TouchBar","tags":["hacking","rant"],"title":"Frozen Mac Touchbar","uri":"/post/2021/frozen-mac-touchbar/"},{"categories":["fingerfood","dev"],"content":" In the last episode ¶ Some time ago I wrote about Hugo, WebP, AVIF and the lazy loading1.\nIn the main time I read more about it and find more about the Hugo’s render hook and the picture and img tag2 3.\nI did like this way because I don’t find a “elegant solution” for the Avif/WebP generation problem. I don’t like my way of generating Avif/WebP with a code outsite the Hugo pipeline like my old post1 or my ispiration4.\nI need a better way to do it.\nAnd one day I recive an issiue5 on Github about an implementation with more responsive implementation6 (and more clean).\nSo I rewrote all the render hook.\nI will make the WebP image\nPut the code for the AVIF7 because now Hugo don’t support AVIF\nAdd support for multiple img size The code ¶ So this is my code form the path layouts/_default/_markup/render-image.html where I build the images INSIDE the post.\n{{ $src := .Page.Resources.GetMatch (printf \"%s\" (.Destination | safeURL)) }} {{ if $src }} \u003cpicture\u003e \u003c!-- AVIF --\u003e {{ $tinyw := default \"500x avif\" }} {{ $smallw := default \"800x avif\" }} {{ $mediumw := default \"1200x avif\" }} {{ $largew := default \"1500x avif\" }} {{ $data := newScratch }} {{ $data.Set \"tiny\" ($src.Resize $tinyw) }} {{ $data.Set \"small\" ($src.Resize $smallw) }} {{ $data.Set \"medium\" ($src.Resize $mediumw) }} {{ $data.Set \"large\" ($src.Resize $largew) }} {{ $tiny := $data.Get \"tiny\" }} {{ $small := $data.Get \"small\" }} {{ $medium := $data.Get \"medium\" }} {{ $large := $data.Get \"large\" }} \u003csource media=\"(max-width: 376px)\" srcset=\"{{with $tiny.RelPermalink }}{{.}}{{ end }}\"\u003e \u003csource media=\"(max-width: 992px)\" srcset=\"{{with $small.RelPermalink }}{{.}}{{ end }}\"\u003e \u003csource media=\"(max-width: 1400px)\" srcset=\"{{with $medium.RelPermalink }}{{.}}{{ end }}\"\u003e \u003csource media=\"(min-width: 1600px)\" srcset=\"{{with $large.RelPermalink }}{{.}}{{ end }}\"\u003e \u003c!-- WebP --\u003e {{ $tinyw := default \"500x webp\" }} {{ $smallw := default \"800x webp\" }} {{ $mediumw := default \"1200x webp\" }} {{ $largew := default \"1500x webp\" }} {{ $data := newScratch }} {{ $data.Set \"tiny\" ($src.Resize $tinyw) }} {{ $data.Set \"small\" ($src.Resize $smallw) }} {{ $data.Set \"medium\" ($src.Resize $mediumw) }} {{ $data.Set \"large\" ($src.Resize $largew) }} {{ $tiny := $data.Get \"tiny\" }} {{ $small := $data.Get \"small\" }} {{ $medium := $data.Get \"medium\" }} {{ $large := $data.Get \"large\" }} \u003csource media=\"(max-width: 376px)\" srcset=\"{{with $tiny.RelPermalink }}{{.}}{{ end }}\"\u003e \u003csource media=\"(max-width: 992px)\" srcset=\"{{with $small.RelPermalink }}{{.}}{{ end }}\"\u003e \u003csource media=\"(max-width: 1400px)\" srcset=\"{{with $medium.RelPermalink }}{{.}}{{ end }}\"\u003e \u003csource media=\"(min-width: 1600px)\" srcset=\"{{with $large.RelPermalink }}{{.}}{{ end }}\"\u003e \u003cimg class=\"img-post u-photo\" src=\"{{ .Destination | safeURL }}\" alt=\"{{ .Text }}\" loading=\"lazy\" decoding=\"async\" width=\"{{ $src.Width }}\" height=\"{{ $src.Height }}\" /\u003e \u003c/picture\u003e {{end}} In this code I mix some of code of my old post, some of else code and some of new code.\nAnd when the Hugo team will implement the AVIF we will be ready for it.\nConclusion ¶ This magic code will be easy to read and has:\nWebP Support AVIF Support Loading Lazy Image size support MicroFormat support So it is Internet ready and easy to forget and you can write a good post with all the optimization done for you.\nHugo with lazy loading and webp  ↩︎ ↩︎\nSrc set ↗  ↩︎\nTag HTML picture ↗  ↩︎\nWebP and AVIF images on a Hugo website ↗  ↩︎\nTHE ISSIUE ↗  ↩︎\nHugo Responsive Images With Markdown Render Hook ↗  ↩︎\nAdd image processing support for AVIF ↗  ↩︎\n","date":"4 November 2021","description":"Generate WebP and AVIF with Hugo","tags":["hugo","devops"],"title":"WebP and Avif With Hugo's Static Site Generator","uri":"/post/2021/webp-and-avif-with-hugo-generator/"},{"categories":["dev"],"content":" Introduction ¶ In this blog I wrote a lot about automation and devops1 and now I am studying GitOps.\nWhat is GitOps? ¶ GitOps is an evolution of DevOps.\nDevOps is a set of practices that combines software development and IT Operations. It aims to shorten the systems development life cycle and provide continuous delivery with high software quality\nWikipedia\nUsually this is done with script and automation (tools, code, ape with a keyboard…) and remove some human error.\nDevOps is a deployment practices, in other way is a philosophy. In any way you have a concept without an implementation.\nDevOps define a way of working and we need something more practical for the world.\nWith DevOps in mind we can make an implementation of this set of steps:\nCoding writing code Building code automatic build or similar application specific Testing code in automatic way and you don’t have bug on the deploy Approving with issue and merge requests Packaging code read for production Releasing the deploy of the software Configuring the software and all the other stuffs Monitoring check if the software crash, use all the rams, eat some people… And write an microservice’s app or deploy your blog while sleeping become the new day to day life.\nGitOps decide to create a Universal model for develop and maintain an It infrastructure. The main idea is Infrastructure as Code and put all is software and configs into a Git repo.\nThis Idea has an huge example into Kubernetes where all is a Yaml file and must be committed somewhere.\nThis is a new think? ¶ In this blog there are some articles about dot-files and other gitops stuffs bifore there sere called GitOps.\nYou can make script, automations and configs into a file and make it deplora with the DevOps’s technique.\nYou must also have testing and deploy within a git repo. So you must use stuff like GitHub Action or TravisCI for testing and automations.\nDo I need to have Kubernetes? ¶ No, you don’t. You can use all sort of automations. You can write your own tools or you can use something like Kubernetes, Ansible, etc…\nThe main focus is to have a good Git server (GitHub, GitLab,GitTea,…) for hosting your repo and automation for apply the code and the config into your infrastructure.\nWhy do I gain from using it? ¶ First of all you gain time. If you have an history of all your change in the infrastructure you can roll back in an easy way (revert a commit) and you can add test for the config and other stuff like router configurations.\nSecond you have a way to approve the changes before something crash in a bad way.\nThird this is a really easy way to replicate a server or a configuration or edit it in a cluster of machine without logging inside all the machine or launch command after command. You only need to change the config/code in the repos and push to the master/main/deploy branch.\nForth you can have one or more Manager/Supervisor watching and approving all the changes (with the pull requests and fixes) and approving or deny them before something become a problem or a huge problem.\nMy team is one or two dev/devops/sysadmin/ttech guy… ¶ If you don’t have man power you need to use this technique for trying to have more work within the same time with the same check or even more.\nI can use it for my little project? ¶ Yes, you can. This blog is a GitOps example.\nThis site is made with all the necessary stuff and the configs inside repos.\nAll you need for run it is inside one of two repo:\nA repo with the source code of the blog (img, HTML, CSS, posts, etc…) The Hugo repo (the software for building my blog) An Example ¶ In this repos (the blog one) you have\nThe Data ¶ Like the posts and the images used in this blog and all the info for the Search engine are store in plain files. Some of them are media file but a lot of them are text files (a lot of MarkDown files and some Json). Only the comments are outside of the repo.\nThe Code ¶ All the template and the Css/JavaScript of the site (and in my case the SCSS for building the Css). I also have a couple script for generating compressed img for the web.2\nThe Config ¶ An the config folder where is define some stuff for build the site like the menu or the meta needed for the compression or CoockieLaw. It also have some config for GitHub for the GitHub Action and the config for GitHub Pages.\nThe Testing ¶ I added some GitHub Action for building the site and test for 404 or similar error after the build. In this way I don’t need to check all the link manually.\nConsole/command file ¶ I need this for dev and run it because I don’t remember all the commands. In my case an easy to use makefile with some command for building, cleaning and testing the site before deploy it on the world wild web.3\nConclusion ¶ Working in a little team GitOps is an essential tool for our teamwork. Good luck for your implementation of GitOps\nHere some articles ↗  ↩︎\nHugo With Lazy Loading and Webp  ↩︎\nThe team Makefile  ↩︎\n","date":"8 October 2021","description":"Why am I moving from DevOps to GitOps","tags":["dotfiles","devops","gitops"],"title":"From DevOps to GitOps","uri":"/post/2021/from-devops-to-gitops/"},{"categories":["rant"],"content":"This post is a follow up to one of my old post: Microsoft buy Atom, Electron and Open Source .\nWe start at the beginning ¶ This story start with a tweet. I was scrolling on Twitter in June 2018 and I saw a retweet of this tweet. Prediction: If Github ends up selling itself one day, Microsoft will be the buyer.\n— Jason Fried (@jasonfried) February 5, 2014 So I search more and find the official blog’s post ↗ of the acquisition.\nAfter reading it and some more research I write a post .\nThe big questions ¶ Now is three years after the original post and I have an answer for some of the questions i ask in my post.\nGithub has problems. Microsoft buying it will solve the problems or kill GitHub? ¶ For what I know Microsoft solve most of the financial problem of Github, putting more money and reworking some aspects of the platform.\nIn the begining there was an Exodus torward GitLab with #movingtogitlab trending on twitter GitHub imports to GitLab are still going up! #movingtogitlab see https://t.co/yGoy4AM3fY for an update. pic.twitter.com/4wl9bvEEif\n— 🦊 GitLab (@gitlab) June 5, 2018 But with the new GitHub Action ↗ Microsoft move a lot of user from Travis, CircleCi and GitLab CI. It is easier to use and you can find on GitHub a lot of pre-done action in the Marketplace.\nAnd the year after with the free privated repo ↗ Microsoft attack the marketpool of BitBucket and GitLab. A lot of the users of BitBucket and GitLab use them only for the free private repo so, if you have all the functions of GitLab and Bitbucket and the GitHub Action why someone need to stay on GitLab or BitBucket?\nBut the real nail on the coffin for the other platform was the GitHub Sponsor ↗ . With this you can have your Patreon/Coffee/SponsorPlatform directly on your GitHub account or, if you want, connect with the existing sponsor site.\nThe want to controll the OpenSource word or the only want to work with it? ¶ Maybe they want more controll over Open Source. We had in the last three years more and more Microsoft projects on GitHub and they show old source code.\nBecause Microsoft is not a Software Company anymore but more and more a Software as a Service company with some Hosting and Clouding related product they can share more and more code.\nThey also make more integration with the Microsoft Ecosystem.\nThey want more contoll over Electron and his development? ¶ I don’t know. NOW they have more controll over the project. They want it? Maybe. What I know is Microsoft is making more app with Electron (for now VSCode, Skype and Microsoft Team).\nThey want to controll Atom development? ¶ Microsoft kill Atom. This is how.\nAdd more integration for GitHub into VSCode ¶ With some plugin and new functions in the core app, Microsoft add more support for GitHub into VSCode. After this they add some of the exclusive feature of Atom to VSCode and the best integration ever: native sync of the VSCode’s config and plugin with your GitHub/microsoft account.\nMicrosoft take away resource from Atom ¶ Atom lost appeal after VSCode and Microsoft knows. I don’t know if they remove resource because the lost appeal or because the don’t want Atom but the contributors ↗ ’ tab on the GitHub page show a big decline in the Atom development.\nThey make an online editor Codespace ¶ Codespaces ↗ an online editor for git repository. Inside a codespace you can use any of the Visual Studio Code Marketplace’s Plugins, a custom dotfiles and you can connect it to a VS Code. Strange they don’t talk about Atom support in the Codespaces’ page.\nAll the programming language has a plugin/collection ¶ Microsoft, one at the time, implement a plugin/collection for language, with all the tool you need for the language. So VSCode support all language.\nThey want to make more Azure into Github service and all the marketplace? ¶ Now you have multiple integration from Azure to GitHub and from GitHub to Azure. And they add plugin into VSCode for debug or setting connection between your machine, GitHub and Azure.\nConclusion ¶ In my opinion is this1 bad for the Open Source community?\nBut how we can change the situation?\nWe need a GitServer App Federated where you have only a piece of the all system.2\nBut if we don’t have something federated is better have all in one palce (GitHub) with backup than have all in distint server within GitLab/GiTea/Gogo Instance.\nNB: this is my personal opinion.\nMicrosoft owning GitHub Yes. No one must controll the biggest hosting for code. ↩︎\nFor example Mastodon ↗ work in this way and they explain it in a easy way here ↗  ↩︎\n","date":"7 August 2021","description":"Three years later I talk about Microsoft buying Github","tags":["rant"],"title":"Microsoft and GitHub After Some Time","uri":"/post/2021/microsoft-and-github-after-some-time/"},{"categories":["dev","fingerfood"],"content":"New work and new knowledge. For having a better site/blog performance you can use loadding=“static” in the resources you need last and, if there are img, you can use avif and webp for faster render page time.\nSo I need to implement into my personal Hugo’s blog.\nHugo problem ¶ In Hugo you can edit the themplate for having all the “fix” img with lazy-loading or img alternative but if there are image inside a _.Content_of a post or other type you can’t edit them in a easy way. So I search online and found about the _/layouts/_default/markup/render-image.html 1.\nA simple render-image ¶ Render-image is an override of the default markdown to HTML with your custom code. So I search for some example and this is the simple one:\n\u003cimg loading=\"lazy\" src=\"{{ .Destination | safeURL }}\" alt=\"{{ .Text }}\" {{ with .Title}} title=\"{{ . }}\" {{ end }} /\u003e So from\n![Random img](cat.jpg) we have\n\u003cimg loading=\"lazy\" src=\"cat.jpg\" alt=\"Random img\"\u003e With only one line of code all the img inside a .Content has an alt filled and a loading=“lazy”.\nAfter this I want to add to all img the width and the height of the image and, if present, add the WebP ↗ and/or AVIF ↗ for optimization (I suggest some article for more info 2 3 4 5 )\nProblems with Hugo’s Statics File and Hugo’s Page Bundles ¶ I find some article about WebP and Hugo but there are some problems. All the word who implement a solution for this problem has a blog without the Page Bundles ↗ .\nSo I decide to choose one and “update” the solution for the Page Bundles. And my bas was this post: WebP and AVIF images on a Hugo website ↗ .\nThe code ¶ So this is my final render-image.html.\n{{- $src := ( .Destination | safeURL ) -}} {{- if strings.HasPrefix $src \"http\" -}} \u003cimg loading=\"lazy\" src=\"{{ .Destination | safeURL }}\" alt=\"{{ .Text }}\" {{ with .Title}} title=\"{{ . }}\" {{ end }} /\u003e {{- else -}} \u003cpicture\u003e {{ $isJPG := eq (path.Ext .Destination) \".jpg\" }} {{ $isPNG := eq (path.Ext .Destination) \".png\" }} {{ if ($isJPG) -}} {{ $avifPath:= replace .Destination \".jpg\" \".avif\" }} {{ $avifPathStatic:= (add (add \"/content/\" .Page.Dir) $avifPath) }} {{ if (fileExists $avifPathStatic) -}} \u003csource srcset=\"{{ $avifPath | safeURL }}\" type=\"image/avif\"\u003e {{- end }} {{ $webpPath:= replace .Destination \".jpg\" \".webp\" }} {{ $webpPathStatic:= (add (add \"/content/\" .Page.Dir) $webpPath )}} {{ if (fileExists $webpPathStatic) -}} \u003csource srcset=\"{{ $webpPath | safeURL }}\" type=\"image/webp\"\u003e {{- end }} {{- end }} {{ if ($isPNG) -}} {{ $avifPath:= replace .Destination \".png\" \".avif\" }} {{ $avifPathStatic:= (add (add \"/content/\" .Page.Dir) $avifPath )}} {{ if (fileExists $avifPathStatic) -}} \u003csource srcset=\"{{ $avifPath | safeURL }}\" type=\"image/avif\"\u003e {{- end }} {{ $webpPath:= replace .Destination \".png\" \".webp\" }} {{ $webpPathStatic:= (add (add \"/content/\" .Page.Dir) $webpPath )}} {{ if (fileExists $webpPathStatic) -}} \u003csource srcset=\"{{ $webpPath | safeURL }}\" type=\"image/webp\"\u003e {{- end }} {{- end }} {{ $img := imageConfig (add (add \"/content/\" .Page.Dir) .Destination) }} \u003cimg src=\"{{ .Destination | safeURL }}\" alt=\"{{ .Text }}\" loading=\"lazy\" decoding=\"async\" width=\"{{ $img.Width }}\" height=\"{{ $img.Height }}\" /\u003e \u003c/picture\u003e {{- end -}} The start if is for manage linked image and work as a base case of this code using the “simple” code for the base. For the “this is one of my blog’s image” case we use a picture tag. All the source tags after are use only if ugo find the img with the correct img format.\nBut the real different form the pawelgrzybek’s code. I get the image config form the image in the content and not from the static’s path. With the config of the image we can get the width and the height of the img.\nThat’s all? ¶ The only problem now is to make the WebP and the AVIF file from your image and pawelgrzybek suggest this example for compressing the img:\ncwebp cat.jpg -o cat.webp avifenc --min 10 --max 30 cat.jpg cat.avif If you are a macOs user you can use Homebrew ↗ .\nbrew install webp brew install joedrago/repo/avifenc If you add webp and avifenc to your build script like a makefile and integrate into your CI or your workflow.\nIf you need help or have some suggestion you can comment or tweet me ↗ From Hugo’s Docs ↗  ↩︎\nComparing AVIF vs WebP file sizes at the same DSSIM ↗  ↩︎\nOn the hunt for the best image quality per byte ↗  ↩︎\nAVIF support ↗  ↩︎\nWebP Compression Study ↗  ↩︎\n","date":"27 July 2021","description":"Adding Lazy load, WebP and AVIF to your Hugo","tags":["blogging","devops","hugo"],"title":"Hugo With Lazy Loading and Webp","uri":"/post/2021/hugo-with-lazy-loading-and-webp/"},{"categories":["dev","fingerfood"],"content":"keywords:\n‘Here are 10 SEO tags (relevant keywords) separated by commas:\nstatic site’\ncontact form\nbackend solution\nmicroservice\nREST API\nCaptcha\nPython Flask\nMailGun\nserveless\nuniversal\nSometime you need to make a contact form or something similar but you have a static site. So what do you do? If you have a static site you don’t have a way to save data or send email with the data how do you save/elaborate the form? You need an other software.\nMake a backend for your static site ¶ You have a lot of way to have a backend. Some more simple and cost effective solution for “free plan” site (like a Github Pages) and some more advance solution for more advance system with a static site.\nMy personal solution for this problem is a Microservice1 Rest Api2 with Captcha3 support. With this system I don’t have something to maintain. Also this is a very easy and clean piece of code and if make in the right way you will not edit it ever again.\nYou can also implement this code in a larger system but I make this code for a Microservice. Also this is my Python implementation because I use Python but you can make this solution with your favorite language4.\nThe implementation ¶ For this you need two part. One is the frontend and one is the backend.\nFrontend Html and JS ¶ \u003cscript src=\"https://www.google.com/recaptcha/api.js\"\u003e\u003c/script\u003e \u003cform method=\"post\" action=\"/somewhere_else\"\u003e ... your form data ... \u003cbutton class=\"g-recaptcha\" data-sitekey=\"reCAPTCHA_site_key\" data-callback='onSubmit' data-action='submit'\u003eSubmit\u003c/button\u003e \u003c/form\u003e \u003cscript\u003e function onSubmit(token) { document.getElementById(\"demo-form\").submit(); } \u003c/script\u003e With this code for form the client will call the Google server for the reCaptcha validation and send the form data to \"/somewhere_else\" as our endpoint.\nThis code is Universal so any backend you will use its allways be usefull. For more info about reCaptcha and how to use them you can read the official Google Guide ↗ 5.\nBackend Python Flask and Requests ¶ In my solution I use MailGun for send me the content of the form. This code send all the the content of the post without check it. It can be use for multiple form at the same time.\nAll the config are environment variables so you can recicle the script without a lot of work and this script is ready for serveless implementations.\nfrom flask import Flask, redirect from flask import request import requests as r import os DOMAIN = os.environ.get(\"DOMAIN\") API_KEY = os.environ.get(\"API_KEY\") SENDER_ALIAS = os.environ.get(\"SENDER_ALIAS\") SENDER_MAIL = f\"mailgun@{DOMAIN}\" TO_MAIL = os.environ.get(\"TO_MAIL\") SUBJECT = os.environ.get(\"SUBJECT\") RECAPTCHA = os.environ.get(\"RECAPTCHA\") SUCCESS_URL = os.environ.get(\"SUCCESS_URL\") app = Flask(__name__) def send_mailgun_message(message): auth = (\"api\", f\"{API_KEY}\") data = { \"from\": f\"{SENDER_ALIAS} \u003c{SENDER_MAIL}\u003e\", \"to\": TO_MAIL, \"subject\": SUBJECT, \"text\": message, } response = r.post( f\"https://api.mailgun.net/v3/{DOMAIN}/messages\", auth=auth, data=data ) return response.status_code @app.route(\"/\", methods=[\"GET\", \"POST\"]) def hello_world(): app.logger.error(request.method) if request.method == \"GET\": return \"Hello, World!\" if request.method == \"POST\": message = \"\" data = request.form[item] message += f\"{item}\\n{data}\\n\\n\" send_mailgun_message(message) return redirect(SUCCESS_URL, code=302) In this implementation you recive the post from the form and read the form data and send it to someone with MailGun. If you don’t need to send but to save it you can easy change the send_mailgun_message with what you need.\nAlternative ¶ With the html code show before you can have different endpoint. You can change the desination changing the function.\nFor example you can send as email with SMTP or save into a database or some file in the server. The only limit is the Api Rest Post url for getting the data from the form.\nWikipedia definition of Microservice ↗  ↩︎\nWikipedia definition of Rest Api ↗  ↩︎\nWikipedia definition of Captcha ↗  ↩︎\nIf your favorite language is Cobol or Pascal I suggest my code for your mental stability ↩︎\nLink ↗  ↩︎\n","date":"19 July 2021","description":"If you have a static site you can also have forms","tags":["hugo","microservice","flask"],"title":"Static With a Form in Python","uri":"/post/2021/static-with-a-form/"},{"categories":["dev","fingerfood"],"content":"Sometime you need to make some pdf looking more professional. In python you use the ReportLab1 package for make Pdf.\nFist the main core ¶ For every document type I need I write a class with a get_pdf for print2 a Pdf.\nHere an example3\nclass BasicPrinter: def __init__(self, buffer, pagesize=\"A4\"): self.buffer = buffer if pagesize == \"A4\": self.pagesize = A4 elif pagesize == \"Letter\": self.pagesize = letter else: self.pagesize = A4 self.width, self.height = self.pagesize @staticmethod def _header_footer(canvas, doc): BasicPrinter.header(canvas, doc) BasicPrinter.footer(canvas, doc) canvas.saveState() canvas.restoreState() @staticmethod def header(canvas, doc): canvas.saveState() header = Image(\"letterhead_header.jpg\", 600, 60) header.drawOn( canvas, doc.leftMargin - 2 * cm, doc.height + doc.topMargin + 2 * cm ) canvas.restoreState() @staticmethod def footer(canvas, doc): canvas.saveState() footer = Image(\"letterhead_footer.jpg\", 600, 60) w, h = footer.wrap(doc.width, doc.bottomMargin) footer.drawOn(canvas, doc.leftMargin - 2 * cm, h - 2 * cm) canvas.restoreState() The real important things are the footer and header function (in our case staticmethod). In each one we add a img (the footer or header) with all the logos and company info in it. If you want you can put the info as text yourself. Remember to save and restore alwayse the canvas because sometime, if you don’t do it can launch error.\nThe specific printer (or how to use the main core) ¶ After you have done you need to make a “printer” for your document. In this case is a booring paper about Privacy.\nclass PrivacyPaperPrinter(BasicPrinter): @staticmethod def _header_footer(canvas, doc): # Save the state of our canvas so we can draw on it PrivacyPaperPrinter.header(canvas, doc) PrivacyPaperPrinter.footer(canvas, doc) def get_pdf(self): buffer = self.buffer styles = getSampleStyleSheet() doc = SimpleDocTemplate(buffer) elements = [] elements.append(Paragraph(\"My boring Privacy Paper\", style=styles[\"Title\"])) elements.append(Paragraph(\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi sed sem ornare, dictum sapien at, egestas sapien. Nullam faucibus eleifend finibus. Vivamus vel sapien urna.\", style=styles[\"Normal\"])) doc.build(elements, onFirstPage=self._header_footer, onLaterPages=self._header_footer) pdf = buffer.getvalue() buffer.close() return pdf This class extend the previus one and fill the buffer with al the relevant info and other element of the document (like titles, paragraphs, tables and images).\nFor the way I set up this class you have all the page with the letterhead template. This is happening because I setup the onFirstPage which will be call on the first page and the onLaterPages which will be call from page two with the call for the header and the footer function.\nReportLab ↗ is an opensource engine for Pdf documents. The python package is here ↗  ↩︎\nI use print for the action of making a Pdf from some data (like a json, a csv or a datasource of other type) If one ore more of this Pdf’s types have a common layout (like a letterhead) I make an parent object for the type of document and call it SomethingPrinter. ↩︎\nMy default paper is A4 but you can import any format from reportlab.lib.pagesizes or define a new one following this format A4 = (210mm,297mm) ↩︎\n","date":"3 May 2021","description":"Sometime you need to have a letterhead document generated by your application and here we explain how to make it with Reportlab","tags":["coding","python","reportlab","pdf"],"title":"Letterhead With ReportLab","uri":"/post/2021/letterhead-with-reportlab/"},{"categories":["dev"],"content":"Many and many times I update my dotfiles1 and rewrite part of them for keep my work config and personal config in a same repo with all the config split for usage.\nSo I discover that I can have multiple ssh config and gitconfig on the same machine.\nMultiple SSH config files ¶ The SSH’s config file was too long to manage so one day I need to break it for make it easy for managing. So I implement one of the feature of the ssh config2: the include command.\nHow is it work? ¶ You write your normal config ssh for work or personal user. Something like this for the personal config\nHost fundor333 User root HostName fundor333.com IdentityFile ~/.ssh/keys/fundor333 PreferredAuthentications publickey After this you do all the same for yor work setting and rename all like personal_config or job_config and write an empty setting as ~/.ssh/config.\nSo you have something like this\n~/.ssh/config ~/.ssh/config-dir/personal_config ~/.ssh/config-dir/job_config Where config is empty. So I linking my stuff_config in to the main config with the import like this:\nInclude ~/.ssh/config-dir/personal_config Include ~/.ssh/config-dir/job_config In this way I can have sorted in a better way all my ssh config.\nMultiple config for git ¶ In reality I don’t need two gitconfig. I need two identity with git, one with some project one with others projects. Like ssh i need to use 2 account, one for work one for personal user.\nIn my case my repo structure is looking like this:\n~/Coding ~/Coding/Personal ~/Coding/Job So I need to have three git identities:\nA generic one for the default A personal git identity for my personal project A “job” git identity for my job project How to do it ¶ You need to write the .gitconfig and one file for every identities after the default one (so in this example three file, the gitconfig, the job_config and the personal_config).\nSo if you follow my example you have this\n~/.gitconfig ~/.git-identities/job ~/.git-identities/personal where you need a default user for the .gitconfig linke this\n[user] email = git@fundor333.com name = Fundor333 and add the regex for the path of the directory of the projects with the path for the config like this:\n[includeIf \"gitdir:~/Github/**\"] path = ~/.git-identities/gitconfig-fundor333 [includeIf \"gitdir:~/Coding/**\"] path = ~/.git-identities/gitconfig-fundor333 [includeIf \"gitdir:~/Coding/Personale/**\"] path = ~/.git-identities/gitconfig-fundor333 [includeIf \"gitdir:~/Coding/job/**\"] path = ~/.git-identities/gitconfig-job If you put in the config define in the path the gitconfig you need you will override for the target project/s like for the gitconfig-job\n[user] email = job@fundor333.com name = Fundor333's Job account This is a example for the user config but you can override all the config for the project like alias or the rule core for the commit and style of them.\nDotfiles, bot and yaml files  ↩︎\nThis examples need OpenSSH 7.3 or newer for work ↩︎\n","date":"11 March 2021","description":"My advance config for git e ssh","tags":["dotfiles","devops","git"],"title":"Advance Git Config and Ssh Config","uri":"/post/2021/advance-git-config-and-ssh-config/"},{"categories":["dev"],"content":"Working on a project with a team is a difficult task. If the project is not simple, you need to build it, test it and publish it and you can have multiple project with similar command but different parameters or path for build/test/stuff-making. Other times you can have a team of developer and the build/test/stuff-making will be done by THE sysadmin1.\nFrom personal expirience if you don’t have a method for the build/deploy/test for the project at the first update will came Murphy and make you an unhappy soul or have some colligue with a battle axe asking for a little talk about the build/deploy/test.\nFor this reason I suggest a template for developing something into a git repo:\nBuild script Documentation Testing Lint Documentation ¶ Not a full documentation, a basic one for rapid use. You need to have a full documentation of every project you will work and all you worked on sorted and updated at last version. In the git project is better to have a little README.md with the description of the project and one or two faq of the project.\nIn this way you will have allways have a cookbook for the everyday task.\nSome git hosting like GitHub, GitLab and GitTea will show your README.md at the page of the project as HTML so it can be also a “What the f**k is this project” page.\nBuilding script ¶ Any project you have will be having a different set of config and command to launch every task. Sometime you will make one or more script for your task and you need to remember all of the function and launch command. So I write a makefile for all my project, personal and job related.\nBase of makefile ¶ For write a good makefile you only need to write some statement like this\nRULE: DEPENDENCY LINE ## COMMENTS [tab]ACTION LINE(S) You can have multiple “rule”, one for any task you need, and I suggest one with code and other generic:\n.PHONY: help help: ## Show this help @egrep -h '\\s##\\s' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = \":.*?## \"}; {printf \"\\033[36m%-20s\\033[0m %s\\n\", $$1, $$2}' This magical command2 will use all your comment inline with the rule for build a help command. .PHONY is a string you put for a “A phony target is one that is not really the name of a file; rather it is just a name for a recipe to be executed when you make an explicit request”, it is a string for not having conflicts.\nOther _rule_I use are:\ninstall: setup the env for the project docs: build the docs of the project if there are inside the project run: run the env for the project test: launch the test for the project This is a example of one of my project. You can see at the RUN rule you can follow the rule with other rule for run them before the rule in question.\n.PHONY: install install: ## Make venv and install requirements pipenv install --dev .PHONY: docs docs: ## Build the docs pipenv run mkdocs build --clean .PHONY: run run: install docs ## Run all the task for building So, every time you will use this makefile with run you will run install, docs and run in this sequence.\nForce Testing ¶ Testing is one of the must of programming. And it can be done only with scripting. The best way I found is using the makefile. Setting up a good testing suite with a full cover for the code is the base of a good project.\nAnd a good way for testing is using some type of Continuous Integration like GitHub Action ↗ , Circle CI ↗ or Travis CI ↗ .\nIf you will use a CI with a git-flow ↗ ’s flow you can make the tests’ result blocking for merging branch.\nLint and reformatting ¶ Lint or Linter3 is an obscure thing. And make the code look readble. So I use a lot of git hooks ↗ or pre-commit ↗ for linting or reformatting.\nGit hooks ¶ You can write a bash/python/perl/what_you_want with all the code you need to lint or reformatting but there are some problems:\nIs not inside the repo so is not versioned Is difficult to debug it You need to manual set it at the start of the dev, not easy to script for the setup of the project. Pre-Commit ¶ Pre commit is a framework for pre-commit hooks. It has a lot of hooks ready for lint and reformatting the code and, like the normal git hook, block the commit if the hook change something.\nAlso the command pre-commit run will run the pre-commit hooks without make a commit. Sometime is usefull\nConclusion ¶ With this setup you can have a lot of automatic task for your project so you and your team will work better, more like a clock and without a lot of coordination if you can follow a standar template like this.\nAnd you can leave and enter in any project in an easy and fast way.\nTeam and Sysadmin description from my expirience ↩︎\nTaken from victoria.dev ↗  ↩︎\nLint is a static code analysis for finding bugs or other bad codes ↩︎\n","date":"15 January 2021","description":"You need to make a makefile if you are working on a team project","tags":["devops","coding","hacking"],"title":"The Team Makefile","uri":"/post/2021/the-team-makefile/"},{"categories":["dev"],"content":"Sometime you need to make a script or a program with some task and show to the user you are doing something so you need to write something as output: a Progress Bar.\nYou have multiple way to do it and now I will show some way to do it with packages.\nProgress ¶ The first package I present is progress ↗ , an easy python package with a lot of configuration.\nThis package is base of one object, the Bar, and you set it, you use it for update the progressbass or end it.\nFor example ¶ You have this base code:\nfrom time import sleep for i in range(100): sleep(1) print(i) This code print the first 100 number one for row. If I want to use a progress’s progress bar I need to to something like this:\nfrom time import sleep from progress.bar import Bar bar = Bar('Processing', max=20) for i in range(100): sleep(1) print(i) bar.next() bar.finish() This is a base version of the code for a bar but you can add a lot of configs like suffix, max value, remaing and other things.1\nProgressbar2 ¶ This is a package wich use iterators for working. You can also create custo widgets (or bars) for creating your custom expirences.\nExample ¶ Using the example code\nfrom time import sleep import progressbar for i in progressbar.progressbar(range(100)): sleep(1) print(i) you can have a progress bar using an iterator. If you need to edit the navbar you can make a custom widgets like the next example\nfrom time import sleep import progressbar widgets=[ ' [', progressbar.Timer(), '] ', progressbar.Bar(), ' (', progressbar.ETA(), ') ', ] for i in progressbar.progressbar(range(100), widgets=widgets): sleep(1) print(i) This is a custom output for the progress bar following the docs find in the project documentation2\nTQDM ¶ THe fastest one for install and a very easy one.\nNot huge for the customizing part but a good one. It also skip unnecessary iteration displays.\nExample ¶ Allwayse with our lovely code:\nfrom time import sleep from tqdm import tqdm for i in tqdm(range(100)): sleep(1) print(i) Here3 for the docs.\nAlive progress ¶ This is the fancy package for progress bar.\nIf you need a fancy progress bar this is the best one.\nExample ¶ With our favorite example this is an example\nfrom time import sleep from alive_progress import alive_bar items = range(100) with alive_bar(len(items)) as bar: for i in items: sleep(1) print(i) bar() With the correct config4 you can have some of the best animation ever.\nWich progress bar is your favorite?\nProgress, easy progress reporting for Python ↗  ↩︎\nProgressbar2, A Python Progressbar library to provide visual (yet text based) progress to long running operations. ↗  ↩︎\nTqdm ↗  ↩︎\nAlive-Progress, A new kind of Progress Bar, with real-time throughput, eta and very cool animations! ↗  ↩︎\n","date":"30 November 2020","description":"Sometime you need to add a Progress Bar to your script and this is how","tags":["python","coding","devops"],"title":"Adding Progress Bar in Python","uri":"/post/2020/adding-progress-bar-in-python/"},{"categories":["fingerfood","dev"],"content":"Some time ago I had a problem with a selfhosted Gitlab instances. I had a new user, johnyj12345, which create a repo and an issiue and log off. This is an attack made to my instance because I don’t upgraded it for some time so I cleanit and remove all the trace of this user and update all.1\nAfter this I was ready to tacle the elephant in the room: how to check if my self hosted GitLab.\nHow to check if GitLab is updated ¶ Official documentation of GitLab2 say that the /help page where there is, if logged, a label with\nUp to date new version out update asap And with it decide what you need to do.\nSo I decide to hack the system and make an allert for me.\nHack the GitLab help page ¶ First ve need to understand how the label work. A rapid ispection of the page show that the label is a responde of a get at the url version.gitlab.com/check.svg with some parameters.\nIn particolar we need the GitLab version installed. So we need it too. And for them we need the token from the self hosted installation3.\nGet the version of GitLab ¶ For this project we only need python and requests ↗ def get_gitlab_version(): url = BASE_GITLAB_URL + \"/api/v4/version\" headers = {\"Private-Token\": GITLAB_PERSONAL_TOKEN} req = requests.get(url, headers=headers) return req.json() and this return a json like this as python dict\n{ \"version\": \"8.13.0-pre\", \"revision\": \"4e963fe\" } From this json we know the version of GitLab for the next step.\nGet the label of the Help GitLab page ¶ def last_version_gitlab(): response = get_gitlab_version() url = BASE_GITLAB_URL ver = response[\"version\"] gfg = urlsafe_b64encode(str.encode('{\"version\":\"' + str(ver) + '\"}')) logger.debug(gfg) r = requests.get(url=\"https://version.gitlab.com/check.svg\", params={'gitlab_info': gfg}, headers={'Referer': url}) return r.text In this way you return a string with the label as xml img. So if you want a feedback when is to update it you can do this.\ndef gitlab_check(): return \"up-to-date\" in last_version_gitlab() In this way you return False if you need to update, True elsewhere.\nConclusion ¶ Whith this you can make another function for sending a notification or a mail for the update. I make all this code into a cronjob with mail sender for getting at the start of my work hours a mail for unupdated gitlab installation. I also suggest Slack or Telegram for the notification for the unupgraded GitLab.\nLink ↗ of a guide for clean. Update following the guide of GitLab. ↩︎\nOfficial documentation Version Check ↗  ↩︎\nOfficial documentation Acess Token ↗  ↩︎\n","date":"16 November 2020","description":"How to check if your GitLab is update automaticaly","tags":["devops","hacking"],"title":"Keep update Gitlab","uri":"/post/2020/keep_update_gitlab/"},{"categories":["dev"],"content":"Where you write code, an app, a mockup or a procedure you remember what you do but after 10,20,100 time you will forget one or more point. So you need to write down all.\nAnd you have multiple tool for doing it.\nTecnology or tools used ¶ We only have 2 tipe of tool for this task: paper o paperless. You can’t use other type of tool or tecnology and you can use the same tecnic in all the tecnology or tools you use.\nThis is because you need to understand how the human work for make a better doc.\nPaper or Journal or notebook or a printed paper ¶ The old fascion way. You write all into paper and no one can use it other then you. Sometime you can put in the office somewhere all the colleague can read it.\nSometime this is a good idea have a printed paper near a machine or someting similar because all the taks are in the “physical” world. But if you are working from home this is a bad solution.\nYou can’t share it without pass a physical copy of it to the other member of the team/client/human. This is a huge limit if your documentation.\nYou can also make a sign with the instruction for the task making it a documentation.\nSame example are printout, memorandum, manual or sign\nPaperless or Site or App or Digital document ¶ The best way to share a documentation or restrict the view with password or similar methods. The paperless way is the best for multiple reason:\nRemote updating: you can allwayse a link for the last version of the documentation and all you need to have/read it is follow the link Little or no cost: you don’t have a huge cost of updating and sharing the new/updated docs Eco frendly: no paper = no tree used Some example are wiki, site or online pdf.\nHow to do a documentation ¶ I am a developer, not an expert on documentation and teaching but I make a lot of research1 and some study at the University about Software documentation.\nI find two “universal” way to do a documentation:\nthe “answer a question” way or “wiki” way like the tutorial at Wikihow2 the “I know the task” way or the “to do” list where you know HOW but it is a long and compless way or a very delicate way like launching a Shuttle3 You can learn with a “wiki” style of documentation and you can make task with a “ToDo” list so you can combine the two for maximum effect of your docs.\nMy way ¶ I love MarkDown and the GitHub/GitLab issiue so for my personal and work project I combine them.\nFor the documentation I use MkDocs ↗ for build the documentation. I write it as a Question-Answer document, so it isn’t about HOW THE SOFTWARE WORK but it is about HOW DO TASK WITH SOFTWARE. In this way I find more easly what I want or what I need.\nWhen I need to do something I write a issiue with a todo with the micro-task I need to do for the issie, in this way I break the macro-task into task and after in micro-task so I can remember all and keep a trace of the task if I need to do It again.\nIf I find the task I doing can be needed in the future I copy the ToDo list into a MarkDown and I make a wiki about the task for future reference. In this way I have, for the big task, a to do list and a wiki for the task in question.\nThis is my way, and for someone can be usefull but I understand not all the documentation can be make in this way so good luck for writing your documentation.\nUniversity of Wisconsin - About Documentation Styles ↗  ↩︎\nHow to act like a vampire ↗  ↩︎\nLaunching a Shuttle: NASA Countdown to Blastoff ↗  ↩︎\n","date":"9 November 2020","description":"Every project you make you understand new things so you need to write down some thing. Something like a doc","tags":["coding","devops"],"title":"Why you need a doc","uri":"/post/2020/why-you-need-a-doc/"},{"categories":["dev"],"content":"After my other post I find we (me and my coworker) need to check between 30 to 40 domain, subdomain and SSL certificate for work and some more for our private life so I put on the test my other post’s script but we need to check more.\nWe need to check when the domain expire (DNS Lookup), we need to check if the server are up and the SSL certificate. This is a problem because we need to launch the same commands every day for multiple server every day and some time we forgot a domain or a url and we don’t check it for days. And if something boom we need to fix it with zero down time so we need to do some sysadmin work.\nxkcd #705 — Devotion to Duty The weird sense of duty really good sysadmins have can border on the sociopathic, but it's nice to know that it stands between the forces of darkness and your cat blog's servers. So, for our task, we need :\nAdd a list of url save somewhere. Some have only the domain, some have subdomain and some don’t have the protocol at the start1 Check for all SSL certificate for the saved urls Check for the expiration date of the domains Plugin or script support for custom things to check So I write a tool for check all the point: Server Grimoire ↗ How to work? ¶ It is a terminal app, so work all into your console. All the configs and the data are into two dotfiles, one called .servergrimoire_config and .servergrimoire_data (config and data respectively) and can be backup like all dotfiles .\nSo for start I need to register some urls like google and amazon for example\nservergrimoire add --u google.com --u amamzon.it Now you only register the url, nothing is check for now.\nFor run all job or only one you need to use the run directive with the –c flag for adding command.\nservergrimoire run After this you don’t have any return beause this command is for cronjob or similar. If you launch a run and you want to see what appen you need to add –stats for gettin an output.\nIf you need to see what was the last run you can call stats and info if you want to see what is save into the data file. This way make easy for cronjob, automatic task and will grow with other function. All the command are in the help directive if you need more info.\nThis is a little module but can be extrime usefull in small list of urls but you need other tool if you use it for hundreds urls. I also accept help for the plugin.\nSometime they don’t have the https or the http prefix ↩︎\n","date":"1 October 2020","description":"One dev manage 40 sites' domains, SSL and check all of them with a package","tags":["devops","bot","dotfiles"],"title":"Manage Site and Certificate","uri":"/post/2020/manage-site-and-certificate/"},{"categories":["fingerfood","dev"],"content":"Sometime you need to output error and other stuff in the same terminal. It can be a lot of text and you need to make more readible for the user/sysadmin/victim so, the easy way, is to make different the output.\nThe easy way to do it is to color the output to some color.\nHow it’s work ¶ In the ANSI character set you find the escape code for multiple things: cursor location, color, text style and other option for the terminal and the terminal emulators. So you need to check that your console support the ASCI escape code.\nSo for using them you need to make inside the string your are outputting, like this\nprint(\"\\033[91m\"+ \"I am a red text\" + \"\\033[0m\") You need the string \\003[0m for ending the color red (in this case) or the effect you are putting on the string.\nThis was you need to make every time your string and remember every escape code1.\nIn my code I use this class\nclass CLog: OKBLUE = '\\033[94m' OKGREEN = '\\033[92m' WARNING = '\\033[93m' FAIL = '\\033[91m' ENDC = '\\033[0m' def error(self,string): print(f\"{self.FAIL}{string}{self.ENDC}\") def info(self,string): print(f\"{self.OKGREEN}{string}{self.ENDC}\") def debug(self,string): print(f\"{self.OKBLUE}{string}{self.ENDC}\") def warning(self,string): print(f\"{self.WARNING}{string}{self.ENDC}\") In this way I have a colored printer for my little project. If you have a project of medium size or more I suggest to use the module coloredlogs ↗ which add color support for the python default logger.\nIf you choose one of this way you can make more deadible your logger or output for the user.\nYou can find almost every one of the official escape code on the wikipedia page ↗  ↩︎\n","date":"10 September 2020","description":"Sometime you need to make your output more readible adding color to the terminal","tags":["coding","devops"],"title":"Color Your Python Output","uri":"/post/2020/color-your-python-output/"},{"categories":["dev"],"content":"With covid I work sometime at home, sometime at office, allwayse with different computer.\nThis is one of the reason of my dotfile and, for some project I am working on, I need to have some cronjob in every computer but some cronjob is machine specific so I don’t need to sync all, only some.\nSo I contact the developer of DotBot1 and talk about it but it wasn’ t implemented so I make a plugin for this.\nThe plugin ¶ Definition of needs:\nSync cronjob Delete/update cronjob Work only on the user’s cronjob Only the bot’ cronjobs will be edited, not the others Work with Crontab, I’m not interested in others cronjobs’ apps So I use the command of crontab and make it works\nHow to use it ¶ Like every plugin for dotbot ↗ you need to clone the plugin’s repo ↗ and add it to the script.2\nAfter installation you can use the directive crontab for adding job to your crontab. In this way you can write multiple config for multiple type of intallations you have.\nThe direction will look like this\n- crontab -cron: 0 * * * * command: echo \"Hello world\" For now this is a little thing working only on Crontab but I am thinking about adding Windows support but I don’t have any idea about how I make it, so if you have idea about Windows implementation comment in this post or open an issiue or a pull request on the repo\nThe bot who manage my .dotfiles and other configs ↩︎\nThe repo of the plugin has all the instruction about the installation ↩︎\n","date":"30 August 2020","description":"Using DotBot for backup and sync crontab job","tags":["dotfiles","coding"],"title":"Backup Your Crontab","uri":"/post/2020/backup-your-crontab/"},{"categories":["dev","fingerfood"],"content":"As a backend developer I made a lot of web application, site and other stuffs which have one or more domains. Because I don’t have money I use Let’s Encrypt ↗ for make the SSL certificate for the HTTPS and, because it is free, it is only 3 month worty certificate so you need to renovate it.\nEvery sistem I have use CertBot, the bot for Let’s Encrypt, who renew the certificate when needed with a cronjob. Sometime you will recive a mail from Let’s Encrypt about some ending certificate and I don’t want to check manualy every time because some of our certificate are for multiple domain in one certificate.\nScript out the problem ¶ For this script we need\nPython 3.6 or more PyOpenssl I don’t want to use module outside the python core but, in this case, I need a module for the newest type of certificate so… I write it with a config file with all my site.\n#!/usr/bin/env python3 import datetime import logging import os import socket import ssl import OpenSSL logger = logging.getLogger(\"SSLVerify\") Start with the import for working with date, log, make a request for a ssl certificate and open a file. Also set the logger for the script.\ndef ssl_expiry_datetime(hostname: str) -\u003e datetime.datetime: cert = ssl.get_server_certificate((hostname, 443)) x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert) return datetime.datetime.strptime(x509.get_notAfter().decode('ascii'), '%Y%m%d%H%M%SZ') This function get a url, get the certificate of the domain and return a datetime python object listing the last minute the certificate validity. After this the site is not https\ndef ssl_valid_time_remaining(hostname: str) -\u003e datetime.timedelta: expires = ssl_expiry_datetime(hostname) logger.debug(\"SSL cert for {} expires at {}\".format(hostname, expires.isoformat())) return expires - datetime.datetime.utcnow() Return a python object with the remaining days of the certificate. It can be negative if is exspired.\ndef test_host(hostname: str, buffer_days: int = 30) -\u003e str: try: will_expire_in = ssl_valid_time_remaining(hostname) except ValueError as e: return \"❌ \" + hostname + \" cert error \" + str(e) except socket.timeout as e: return \"❌ \" + hostname + \" could not connect\" else: if will_expire_in \u003c datetime.timedelta(days=0): return \"❌ \" + hostname + \" cert will expired\" elif will_expire_in \u003c datetime.timedelta(days=buffer_days): return \"⏳ \" + hostname + \" cert will expire in \" + will_expire_in else: return \"✔️ \" + hostname + \" cert is fine\" This function build the string for the user to see about the domain. Use the emoji for fast reading for error1\ndef popupmsg(msg): logger.info(msg) Print into the console the output. I search a good way for making a popup or a toast for gui purpuise but I can’t make it multiOS so I use the standard output\nif __name__ == \"__main__\": f = open(os.path.expanduser(\"~/.sslverify\"), \"r\") end_message = \"\" for host in f.readlines(): host = host.strip() message = test_host(host) end_message += \"\\n\" + message print(end_message) popupmsg(end_message) The starter of the all script. The input of the script is a dotfiles , a .txt with one site for row, In this way I backup it with my dotbot ↗ and take with me into every machine I work in.\nChanging the output system you can easly make a cronjob out of this script or a lambda function for your need.\nI am thinking about making this script into a module or bash app in the near future.\nAll the code ¶ We end with all the code into a single block\n#!/usr/bin/env python3 import datetime import logging import os import socket import ssl import OpenSSL logger = logging.getLogger(\"SSLVerify\") def ssl_expiry_datetime(hostname: str) -\u003e datetime.datetime: cert = ssl.get_server_certificate((hostname, 443)) x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert) return datetime.datetime.strptime(x509.get_notAfter().decode('ascii'), '%Y%m%d%H%M%SZ') def ssl_valid_time_remaining(hostname: str) -\u003e datetime.timedelta: expires = ssl_expiry_datetime(hostname) logger.debug(\"SSL cert for {} expires at {}\".format(hostname, expires.isoformat())) return expires - datetime.datetime.utcnow() def test_host(hostname: str, buffer_days: int = 30) -\u003e str: try: will_expire_in = ssl_valid_time_remaining(hostname) except ValueError as e: return \"❌ \" + hostname + \" cert error \" + str(e) except socket.timeout as e: return \"❌ \" + hostname + \" could not connect\" else: if will_expire_in \u003c datetime.timedelta(days=0): return \"❌ \" + hostname + \" cert will expired\" elif will_expire_in \u003c datetime.timedelta(days=buffer_days): return \"⏳ \" + hostname + \" cert will expire in \" + will_expire_in else: return \"✔️ \" + hostname + \" cert is fine\" def popupmsg(msg): logger.info(msg) if __name__ == \"__main__\": f = open(os.path.expanduser(\"~/.sslverify\"), \"r\") end_message = \"\" for host in f.readlines(): host = host.strip() message = test_host(host) end_message += \"\\n\" + message print(end_message) popupmsg(end_message) The “error” in this case are the only one colored emoji of the bunch. ↩︎\n","date":"20 August 2020","description":"You need to check a lot of SSL certificate, some domain and others things","tags":["coding","devops"],"title":"SSL Check With a Script","uri":"/post/2020/ssl-check-with-a-script/"},{"categories":["dev","fingerfood"],"content":"Sometime you will need to have a template for the commit message.\nAllways put something (ticket code, bug code, etc…), order of stuff, some command for the CI system, etc…\nHow to do ¶ In Git you can set a a file as the template for the git commit. You can do it for a single project or for your user. In this case I will show the command for all your project.\nThe config ¶ First you need to write a file. Usualy I make a file in the home ~/.gitmessage where I put the message. For example a file template is:\n# Title of the commit, 50 chars # Body. What and Why, with Task Id/Bug Id, 72 chars Remember, if a row start with # the row is a comment.\nAfter you make your own themplate you must tell git where is it so you need to launch this command:\ngit config --global commit.template ~/.gitmessage After this git will use your new template for the commit.\nGood work\n","date":"15 August 2020","description":"Sometime you need to configure your git or have a template for the commit for your work","tags":["git","dotfiles"],"title":"Create a custon Git message with GitConfig","uri":"/post/2020/gitmessage-advance-config/"},{"categories":["dev","rant"],"content":"I find the way to become a good programmer:\nWrite a Blog about what are you doing\nI see more and more good programmers have good blog and good blog about programming have good author.\nAfter studing somee good blog and some bad blog I came with this list\nYou need to write a blog about what you know.\nYou must keep it updated.\nYou need to research for it.\nYou need to read other blogs.\nThis look like a stupid thing but follow me.\nWhy I need to write a blog ¶ You didn’t.\nFor my consept you need to write your knowledge down. You can write on a notebook or you can make a book with your knowledge but I find the easy one is the blog/newletter format.\nThis “fingerfood”1 style of share knowledge make easy to write down the article on a new argoment or write an update something older.\nThis because we learn stuff in lesson/part/argument and this make easy to map the new kwnowledge with the fingerfood. Sometime the fingerfood is one-to-one the note of the developer about that particolar argument so the blog become something like a personal documentation.\nAlso you can write about your personal knowledge, not only your work one. This can be a huge help when you are searcing for a work because you will have a “blog of presentatio”.\nIf you make a blog you also put tags and categories on the posts so you can search all your work more easily.\nWhy I must keep updated? ¶ If you work for updating the blog, you must learn always more things. So updating your knowledge you can test your understanding of the new argoment writing about it.\nIf you realy understand a new argument you can easily explaines to your granny so you can write about it.\nAlso if you keep it update you have also a diary of your progress of understanding of the knowledge you put into it.\nIt, also, will be a motivation for research more and more stuff.\nResearch ¶ More you research more you will want to know. This make a virtuosus circle of curiosity for understanding more and more stuff.\nThis take you to abuse rss and podcast, because they are the easy way to have new knowledge directly on you phone/tablet/watch/smart mirror/cat.\nIn this way you can have fingerfoods from other source and you can excenge with them.\nSo? ¶ So, in the end, you will create a blog with your knowledge and enter in a web community of developer and understand more and more so you can become more proficient in what you do.\nIn this way you will grow as programmer making something, not only reading here and there, but making something out of this.\nGood luch\nNB: I allways find usefull in a blog a section with some bibliography and urls of interesting site/blog or similar.\nBibliography ¶ Some article about this topic\nShould you be blogging as a software developer? ↗ Every developer should have a blog. Here’s why, and how to stick with it. ↗ 5 reasons why EVERY PROGRAMMER should have a BLOG! ↗ little and complete knowledge, an atomic unit of knowledge for rapid consumption. Easy to write, easy to read. ↩︎\n","date":"1 August 2020","description":"For be a good programmer you need to be a blogger and write regulary","tags":["rant"],"title":"Good Developer Must Be Blogger","uri":"/post/2020/good-developer-must-be-blogger/"},{"categories":["dev"],"content":"More time pass more time I need a server for my cronjob and other process. Sometime the cron was a supid thing, working only for the short period and after can be trashed but the real problem start with Feedly, the subscription for feed I use.\nOne day, adding a new feed to my Feedly account, I discovered that I can’t add more in the free subscription. So I start thinking some alternative.\nWhat I need ¶ web app i need to use on the run, not only in my machine but in other as well. auto update I need to find the newer or the newest post from my feed feed from wep page I need to have the feed from an url not only from the feed url mark read and not read because I need to read only the new stuff and not only the old one some endpoint for personal use I need some endpoint api rest for another project of mine So I need:\na web server for serving pages -\u003e Nginx a task manager for have a heap for work which the server do in the free time -\u003e Redis a database for the data where I put my data -\u003e PostgreSql a server framework for writing my server-app -\u003e Django Whith this stack I start my backend.\nFist problem: feeds ¶ First I need to have an alternative to Feedly so I start building my personal feed manager. And I discovered there are multiple type of feed: atoms, rss 1.0, rss 2.0, etc… So I “read” some of my feed manualy and start writing some generic reader for the rss and atom (the most popular format of the feed formats) and write some code for reading Xml in this two type.\nAfter this I write a Django model for the post inside the feeds so I can save it without thinking about the feed format but reading it, share it or deleting it.\nIn this way I discover some dead blog and other formats of feed (old one from some old site but still very active).\nAfter this I builds the task for the cronjob for getting all the feed of the multiple sources. This task add a command into redis and when the wrapper (celery in my case) can do the job, it does it and log into the database a row with the log in case of failure.\nI did the same also for the “mark as read” task so if I mark one this is a task done by the browser but if I do for the “last month” or “all” posts they make a Celery task into Redis because it can be a lot of work for the server because I can do more thinks with this but not now.\nIn the future I am thinking about point system for the post and other thinks that need a after processing for making a “prefernce system” or other similar thinks for my personal use1 and I want to save the top post into my Poket account or save it in a way I can store for personal reference with or without the site working and store it indefenitly.\nSecond problem: gui ¶ After working all the feed part I build a little gui, inspired by the teming of my blog and I love it. Light background, dark text with the same font and some similarity but also some difference, because I think that mine blog theme is not right for a backend or other type of web app other than blogs.\nThe problem come from the menu. I don like the menu with submenu so I write a “menu dashboard” for all the “categories” of view I made for my backend but I am not done for it. I need something more “mine” for the navigation inside them. And I need to add some Javascript for adding some gui impovment (color or highlight where needed) and this was a big problem for me.\nI am not fluent in js so I need to Google a lot of things about jquery and EMACS5 and “vanilla’ JavaScript.\nAfter all and with some trick learn in StackOverflow or some random blog I have a functional and someway good looking theme for my backend.\nThird act: Api ¶ Now is time for my favorite part: only backend!\nI have some project to migrate into this backend and half of them has some sort of need of endpoint api so I move the first api project into my backend. With some work and some help from the Django Rest Framework ↗ I build some view for outputting the json needed for the other project to work.\nAfter this I build the guis for manage the data of the api. I know that all of this can be done with the Django Admin but I don’t like it so I need to write the input, edit and view pages for them.\nFor now I consider this part compleate but, in time, I will porting all my other api into this backend.\nThe Fourth is with you ¶ Now I work on the landing of mine backend. I feel it empty so I think about what I can do to fill it.\nAnd for this reason I write client for some weather api and other similar api of my home city for my personal easy access. So, with an little time I write all the backend for the ‘widgets’ I want and make all into a ClassView Django putting all the info into the context of the view.\nWith a lot of testing with the layout and changing all the widgets more and more time I ending to make a dashboard with very simple widget for all of theme.\nFor now it works but if I add another widget I need to redo all the Dashboard but for now I don’t have need for another widget.\nGoing for Five ¶ After the gui I completely forgot how I write the Api so I need to have an autogenerated Api’s documentation. So I use the autogenerating documentation of the DRF2 and build a Swagger view for my persona use. I subclassed the generator for adding more function on the standard DRF implementation of the api like the tag sistem and the server tags for an eventualy testing server (maybe one day with more money…).\nAnd now the conclusion ¶ With some time I build more function into this system and add more api. For the time coming I am thinking to porting some cronjob into this backend, adding a documentation system for having some tutorial I can’t put in the blog or there are no reason to make them public, like some personal stuff and I want to put a system to write my work task and write the time I am working on them for build in a easy way my timetable for work.\nBecause all the project I am working on I don’t have a lot of time so all this project have the least priority of all but, one day after the other I will be updating all of this project with all the function I need but for now I have this.\nThis is an idea I copy from Feedly Premium. ↩︎\nThe DRF is the Django Rest Framework ↗  ↩︎\n","date":"26 June 2020","description":"Why someone need a server and how I build mine","tags":["django","coding","api"],"title":"Building My Backend","uri":"/post/2020/building-my-backend/"},{"categories":["dev"],"content":"You don’t need a dinamic site for your company or your blog. You are paing for query when you don’t need them. In the 90% of the situations you don’t need a dinamic web app or other complex things. You need a static site build with a static site generator.\nSome history ¶ To understand why in 2020 you need to have a static site and not a dinamic nees some hystory of the HypeText. This is linked with the web but I present it in a different way, a develper point of view. This make you understand more what you are writing/building/blogging and make you choose the best way to comunicate what your site/blog want to say.\nAll of this is from personal research and study.\nMemex, Hypertext and Hypermedia ¶ In the 1945 was publish in The Atlantic Monthly the article “As We May Think” where the Memex, the first concept of hypertext was born.\nIn 1963 the term “hypertext” and “hypermedia” was coined as part of a model for creating linked content.\nFrom here to 1980 any region of the planet make a type of hypertext but we ignore all of them because we aren’t interested in them now. You need to go to the 1980 CERN for have a software call ENQUIRE, a hypertext software. But it was unaccessible for everybody so the software was discart.\nIn 1991 was publicly avaible HTML Tags, the start of the HTML as we know. From now on we have a language for write hypertext and we move our attentions on the story of site and how to serve them.\nHtml, Bash, Perl, PHP and others monsters ¶ In the firsts years you have only a text-browser like Lynx where you don’t have img, css or js but it’s work.\nFrom here we add css and base js into the site for custom and make unique the site. But some one want to make easy to update the site and make it update or use data from file/databases/other fonts.\nUsing Bash (or SHell) and the regex the first static site generator are build. Some man1 use html and a text-browser for display info and are being integrate in the console.\nSome time pass and some people decide to have a command that build one or more html page from file/log/database with something more functionat than Bash (or SHell) so they start the Perl web epoche. In this era a lot of the web was served by perl scripts or server and many of them are the base of the modern web server and mail server.\nOn the perl ecosystem the developers write PHP, a language for making page dinamicaly from a request from the user and data from the db. Because it was born from perl they make it easly working on or with perl stuff. All this is someway easy for the machine and many host make it the default option for their offers. This because you put (in the days) all the code you need in one folder and you are done.\nYears pass and PHP become more look like Mr Creosote from Monty Python.\nFrom here any language build their web-server/web-framework/build-web-page-and-serve-it and make it more and more easy to make complex site and web apps. In this way they make more powerfull sistem but with more and more functionality and more and more bug and vulnerabilities.\nAnd this become more evident with Wordpress where you need from 10 to 40 query for build a web page.\nAnd now the static site generators ¶ Now we have to talk about the static site generator.\nFirst we talk about the one is not in use anymore: the gui one. Is a complex software where you have multiple buttons for build the gui and put the text, img and all the other things in position. This way was popular at the end of the 90’ and the beginning of the 2000’ with Microsoft Publisher and iLife iWeb. All of them death today because was too long to make a site and you need html knowledge for the more advance stuff and integrate js for some animation or others things.\nAnd now the big boy, the static site generator base on themplate-content-config paradigm. All this family of static site generator have a template build with the config passed and the content all put in path know by the generator. This type can be see as more for tecnical people but with the explosions of host site which build your static site or free hosting for put your html+css+js site and site full of template for your generator.\nSo why I need to use a Static Site Generator? ¶ After all this hystory and More you know why I need it? I have my Wordpress, Drupal, etc…\nShort answer ¶ You only need the hypertext for having a functional site/blog/something, all the other part are font of bug, make slow all the things and make vulnerable your little project.\nLoooong answer ¶ There are multiple good reason for this:\nScalable without work: a static site can be duplicate any time you need for all your need Free hosting: you are so light for the hosting you will be allways in the free price Sicure: You cant have a bug in HTML. If there is a bug is a rendering bug on the browser side but you can sleep well because hacker can’t do anything with your site Fast: they ask the page you serve it without any form of elaboration. You cant have a site more fast than static Easy to backup: you can backup in infinite ways your blog because you only need to save the theme, config and the content. All the other thins (the server software, the genererator and plugins) you don’t need in your backup. All are descript in the theme, config and content. No upgrade: you don’t need to update the site to the newer version of one library or the plugin for X. With a static site generator you have a HTML site allways valid You need hyperlink not plugin: at the end of the day you want the hyperlink of a site/blog not the fancy plugin for an unicorn running on the page. Any plugin add complexity at the system and the site, it make the site slower and sometime, when not working right, more difficult to debuggin. Conclusion ¶ So this is my motivation: make the site static and put all the vulnerability of your site in a pc withour any link to the site and focus on make content for the site/blog and not to update 123 plugins for Wordpress with issiue of compatibility with your theme.\nIf you want to choose you static site genenrator you can find a bunch here ↗ Man as manual ↩︎\n","date":"3 June 2020","description":"Why you need to move to static site generator and where they come from","tags":["rant","coding"],"title":"Al You Need Is Static","uri":"/post/2020/al-you-need-is-static/"},{"categories":["dev","fingerfood"],"content":"Sometime you need to import “old data” or other type of stuff from an Excel file into your Django and save it in the correct models. This an impossible task without the correct plugin and you need the correct one.\nI use the pyexcel and pyexcel-xls module for this work.\nPyExcel is a module where you can import multiple type of file (in our case xls with pyexcel-xls) with one common interface for all the type of files. So, with some editing, you can use this following code not only for xls but for other file type.\nFirst we need to install dipendency for our project\npip install django pip install pyexcel pip install pyexcel-xls After this we need to make a form for upload the Excel file with the data:\nclass ExcelForm(Form): excel = FileField() An easy and clean form. If you need more imput data you can add, no problems for the code.\nNow we have this Excel\nFor this tutorial we assume the xls file will be allways like this. You can sort the columns or adds new ones but not change lable or remove one.\nNow we need to write the view. For this view we use a FormView because it is cleaner and easy to read, like a crochet pattern on a magazine: one thing all explained.\nYou can edit with class view in any way with mixin or overwrite of function like we do now:\nclass ExcelFormView(FormView): form_class = ExcellForm template_name = \"myapp/xls.html\" def post(self, request, *args, **kwargs): try: request.FILES['excel'] except MultiValueDictKeyError: return redirect('excel_uploader_error') content = request.FILES['excel'].read() sheet = pyexcel.get_sheet(file_type='xls', file_content=content) sheet.name_columns_by_row(0) sd = sheet.dict for i in range(len(sd[\"LastName\"])): User.objects.create(last_name = sd[\"LastName\"][i], first_name = sd[\"FirstName\"][i], email = sd['Email'][i]) return redirect('excel_uploader_ok') All you need to do is understand the post part.\ntry: request.FILES['excel'] except MultiValueDictKeyError: return redirect('excel_uploader_error') This is a check for having a file uploaded. If you don’t have a file uploaded the view redirect to an error page.\ncontent = request.FILES['excel'].read() sheet = pyexcel.get_sheet(file_type='xls', file_content=content) sheet.name_columns_by_row(0) sd = sheet.dict This fragment is the the core of the xls’s reader. This is where we make a object sheet with tha data of the file. We use sheet.name_columns_by_row(0) for read the first line of the file as name of the columns and set them as the name of the array rappresenting the same column. In the end sd has a dictionary with the data of the uploaded xls. The keys are the content of the first row (as seen before).\nfor i in range(len(sd[\"LastName\"])): User.objects.create(last_name = sd[\"LastName\"][i], first_name = sd[\"FirstName\"][i], email = sd['Email'][i]) return redirect('excel_uploader_ok') In this fragment we loop on the array and, for each row, create an user for that row and, after this, return to a success page.\n\u003cform method=\"post\" enctype=\"multipart/form-data\"\u003e {{ form.as_p }} {% csrf_token %} \u003cinput type=\"submit\" value=\"Submit\"\u003e \u003c/form\u003e And this is the form for the upload, the last part of the project.\nNB: use the enctype=“multipart/form-data” for upload files. If you can’t upload files\nWith all this code you can read all the xls you ever want but remember:\nThis code work only if you allways have the same xls’s structure.\nYou can change the pyexcel module for change the type of file read\n","date":"20 May 2020","description":"Import excel to django with easy and usefull form","tags":["django","coding"],"title":"Make a Excel Django combo","uri":"/post/2020/excel-django-combo/"},{"categories":["dev"],"content":"If you ever use Unix based system you are familiar with dotfiles for configuration. Any program has some of this file or folders laying arrount in your user root.\nAnd many time it was a booring job to setup all your stuff before starting with all the work because I want the config to be the same every where I work. So, in the end of the 2017 i find an article about dotfiles: Managing your Dotfiles ↗ . With this article and some copy-and-paste from other dotfiles repo’s on Github I made mine ↗ . This was in November 2017. Github suggest it was the 20 of Novembre the first version of the repo but I remember I was trying multiple idea of it and only later make a repo with clean code so It was sometime in November.\nNow some time has pass and I have a BIG FAT PROBLEM. I need to have my dotfiles synced and working on a Linux Machine (Arch), an Apple Machine and a Windows Machine… So not only I have multiple versions of configs but for multiple platform. And I need also some of this config on all my machine like the ssh’s config.\nSo for some time I use a notebook (a book where i write notes not a pc) where I log the change and this make some problems. A lots of problems.\nSo I search for a system for launch a command and update all and I find it: dotbot ↗ .\nThe bot ¶ This is a project python where you can write an install script from a template and write one or more _.conf.yaml with the instructions. And there are multiple plugin for some package manager (pip, rust, apt, brew…) which can be usefull.\nThe best way to use (and the only one) is to make the plugin repo into a submodule so it can be updated and will be always an unicum.\nIn my case I have a multiple config installer\n#!/usr/bin/env bash set -e DEFAULT_CONFIG_PREFIX=\"default\" CONFIG_SUFFIX=\".conf.yaml\" DOTBOT_DIR=\".dotbot\" DOTBOT_BIN=\"bin/dotbot\" BASEDIR=\"$(cd \"$(dirname \"\\${BASH_SOURCE[0]}\")\" \u0026\u0026 pwd)\" cd \"${BASEDIR}\" git submodule update --init --recursive \"${DOTBOT_DIR}\" for conf in ${DEFAULT_CONFIG_PREFIX} ${@}; do \"${BASEDIR}/${DOTBOT_DIR}/${DOTBOT_BIN}\" -d \"${BASEDIR}\" --plugin-dir .dotbot-brew -c \"${conf}${CONFIG_SUFFIX}\" done The only thing you need to pay attention is the –plugin-dir which can be use multiple times in the command, one for plugin you have. Also you can install a plugin as a submodule for the same reasons as the bot.\nMy Idea ¶ I have a install script which can execute one config all the time (the default one) and any number of config as add for the default.\nSo I make multiple setting.conf.yaml one for every configuration I have and i don’t like it. I have:\ndefault.conf.yaml: ssh setting, git setting and some command for one or two folder windows.conf.yaml: cmd aliases for my pleasure mac.conf.yaml: zsh and some mac specific config linux.conf.yaml: zsh and some linux specific config Every time you run the command ./install the default.conf.yaml run and, if you request multiple config, it run default.cong.yaml plus every config you request. And all the configs files are into a folder, one for each and no way to make something similar to function or there is?\nI need something more modular, where i can set the config for program/app/stuff in one file and “import” in a list-config, so I can call a list-config or a single/multiple program’s configs.\nIn this way I don’t have duplication of code or config long km and make multiple list-config more easy to read because they become easy to read.\nNew Idea because I don’ t like the first ¶ I re-read the wiki and I make the meta files. The make file are the solution of my problem.\nThere are two plus one type of meta file:\nmeta/configs/: single script of config. You can set into this a single program or a “program” of config. In any case this is the “atomic config” of the bot: you can call it as an all not part of this meta/profiles/: the profile of the machine. I use this for make distinction between mac, linux or windows but you can set for something like work or server meta/base.yaml: the base, allways called one. Here you set some default and the cleaner command Whith this I need to change the install file and make some difference as show in the Wiki1\n#!/usr/bin/env bash set -e BASE_CONFIG=\"base\" CONFIG_SUFFIX=\".yaml\" META_DIR=\"meta\" CONFIG_DIR=\"configs\" PROFILES_DIR=\"profiles\" DOTBOT_DIR=\".dotbot\" DOTBOT_BIN=\"bin/dotbot\" BASE_DIR=\"$(cd \"$(dirname \"\\${BASH_SOURCE[0]}\")\" \u0026\u0026 pwd)\" cd \"${BASE_DIR}\" git -C \"${META_DIR}/${DOTBOT_DIR}\" submodule sync --quiet --recursive git submodule update --init --recursive \"${META_DIR}/\\${DOTBOT_DIR}\" while IFS= read -r config; do CONFIGS+=\" ${config}\" done \u003c \"${META_DIR}/${PROFILES_DIR}/$1\" shift echo \\${CONFIGS} for config in ${CONFIGS} ${@}; do echo -e \"\\nConfigure $config\" configFile=\"$(mktemp)\" ; echo -e \"$(\u003c\"${BASE_DIR}/${META_DIR}/${BASE_CONFIG}${CONFIG_SUFFIX}\")\\n$(\u003c\"${BASE_DIR}/${META_DIR}/${CONFIG_DIR}/${config}${CONFIG_SUFFIX}\")\" \u003e \"$configFile\" \"${BASE_DIR}/${META_DIR}/${DOTBOT_DIR}/${DOTBOT_BIN}\" -d \"${BASE_DIR}\" -c \"$configFile\" ; rm -f \"\\$configFile\" done Make particolar attention of the begginning of the script because is were you can find the configuration for the script.\nThis new script can run with or without profile. And you can also add plugins in the command as the first install script.\nThe config files ¶ Now I need to write the config files and it is an easy task. All I need to do is to use this commands and their options:\nlink: make a symbolically link of the file or directory from one of the file or one of the directory of the dotfiles’ repo create: make an empty directory shell: execute command in shell in the base directory (that is specified when running the installer) clean: remove all the dead symbolic links in the path defaults: default option for all the command that follow plugins commands: the command of the installed plugins Now I need to write a meta/base.yaml file for the default command:\n- defaults: link: create: true relink: true force: true - link: ~/script: - shell: - [git submodule update --init --recursive, Installing submodules] - [chmod +x ~/script/*] - clean: [\"~\"] I start with the default option for the link command:\ncreate for creating the parent directories as needed relink removing the old symlink if present force force the new link This is default for my configs.\nAfter this there is a link to make my default script directory linked in the home directory of the user.\nThen we have the shell command with the command for import/download all the submodules of the project and the command for make executable the script folder.\nAnd we end with the clean command with I clean the home from dead symbolic links and delete them all.\nAfter this I need to make my fist profile, the mac one. So I make a new file make/profiles/mac\ngit programming ssh zsh Every one of this name is a yaml file in the makefile/configs with the command to make/copy/something for the program/stuff is name of. For example git is:\n- link: ~/.gitconfig: ~/.gitignore_global: In this yaml the bot links in the path ~/.gitconfig to the file gitconfig and make the same with ~/.gitignore_global.2\nIn this way I can build multiple file for all the case I need. Some example is ssh or zsh or the emacs config in my repo ↗ which use the configuration describe in this post. There are some files not used like a requirements.txt or choco.ps1 that I don’t know if it’s a good idea.\nIn any case if you write a good dotfiles repo with dotbot you need to keep the idempotency3 of the bot execution so you are mathematically certan that the execution don’t make different installation with the same command.\nIf you want to copy some part of my config you can do it but remember:\nDotfiles are supposed to contain your personal settings — what works for someone else isn’t necessarily optimal for you. If certain configurations worked for everybody, those settings would have been built into programs as defaults. Blindly cloning someone else’s dotfiles, especially without having an understanding of how everything works, is not the optimal approach.\nAnish Athalye - Managing Your Dotfiles ↗ As describe in the wiki I rename the file as install-profile ↩︎\nBe carefull, if you put a path after the : the bot use the path. If you don’t the bot will search a file in the dotfile folder for the same path without the starting dot (if present) ↩︎\nIdempotence: is the property of certain operations in mathematics and computer science whereby they can be applied multiple times without changing the result beyond the initial application (from Wikipedia ↗ ) ↩︎\n","date":"1 May 2020","description":"Using the same dotfiles on multiple computer in the easy way","tags":["dotfiles","coding"],"title":"Dotfiles, bot and yaml files","uri":"/post/2020/dotfiles-bot-yaml/"},{"categories":["rant","fingerfood"],"content":"Sometime the life has a distorted sens of humor and make a hole in your sock wen you are going to work.\nIt make feel you strange because you fell it and you only want to pull off both of them but Irony come in your live looking like a mail:\nHello\nwe need to connect to [last thing buy for the boss] system for [stuff i don’t understand/like/want] reason so your team need to make a sock to talk with this system.\nLove\n[human(?) in my personal blacklist]\nSo I have a broken sock and I neet to make a socket.\nSo how to make a socket? ¶ In python all you need is in the core of the language. If you want to start you only need to import socket and start coding.\nAfter this we add some parameter like the host, the port and the size of the socket.\n1 2 3 4 5 import socket HOST = \"0.0.0.0\" PORT = 9000 SIZE =8192 Now we need a socket object. Usualy i make it into custom object or function like this\n6 7 8 9 def server_program(): server_socket = socket.socket() server_socket.bind((HOST, PORT)) server_socket.listen(20) Where we\nStart a socket with socket.socket() Set the socket to the Host and Port with .bind((HOST, PORT)) Set the max connection with .listen(20)1 After this you need to accept new incomming request. I also set a timeout because I don’t want a connection unused on my socket.\n10 11 12 13 while True: conn, address = server_socket.accept() conn.settimeout(60) data_raw = conn.recv(SIZE) We put into data_raw the data from the connection (here we use size)2 and we have 2 more interesting object:\nconn a socket with this connection address the ip for this connection Now we have the data and we need to do something with this\n14 15 16 17 # Sometimes you need this # data = data_raw.decode() do__somethings(adress,data_raw) conn.close() And after you do what you need to do close the connection.\nThis is a complete example of a working socket. If you need to response you can use conn.send() to send the data to the client.\nIf you need help or not understand something write me in the comment below or to my social.\nThis is the full code for Python33\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import socket HOST = \"0.0.0.0\" PORT = 9000 SIZE =8192 def server_program(): server_socket = socket.socket() server_socket.bind((HOST, PORT)) server_socket.listen(20) while True: conn, address = server_socket.accept() conn.settimeout(60) data_raw = conn.recv(SIZE) # Sometimes you need this # data = data_raw.decode() do__somethings(adress,data_raw) conn.close() if __name__ == \"__main__\": server_program() In this case we use localhost for the host, 9000 for the port and 20 for the max connection but you can change it for your need. ↩︎\nClient and server must have the same size or bad this will be appening in your socket ↩︎\nTested from 3.5 to 3.8 ↩︎\n","date":"15 April 2020","description":"A little thing about socket in python","tags":["socket","python"],"title":"Sock and socket","uri":"/post/2020/sock-and-socket/"},{"categories":["rant"],"content":" The story ¶ I had different work espiriences with big data and data analysis and so I describe it with tea. This is a personal rant and I will use some personal experience with tea for describe some experiences about data management.\nIndustrial Unamed Tea - Excel file ¶ We don’t need to make analisys\nBoss\nTHE big data for the NEWEST company. You can only use .xls, .xlsx e .csv file for it. Sometime you can use some advance system as Google Sheet or Excel 360. For make an analisys you need one-two month for one result. Any time you make an analisys you need to redo all the things. This is the oldest thing to do for make an analisys.\nThis is a industrial tea, the one you can find in all the pubs. Many time is a ultra low cost leamon tea and you only drink it because you are so sick that you only can drink this or water. If you are not sick you will not drink it because it taste only like leamon not tea.\nNamed Tea - Axcess db ¶ You know what you want but you don’t know how to get it\nthe marketing guy\nYou have an idea of what you want, you have a tool look like the right one but is too ‘80 maybe ‘90. Sometime this is the good tool but many, many time this is the obsolete one.\nAs a named tea. You are using because you allways used it or because your family/company allways used it and you never search for an alternative.\nThis one is where you have some space for progress for the big data\nAssam Black Tea - Generic DB with Web app ¶ We start in a good way but this is a generic solution\nA Good IT guy\nThis is a generic tea, a good tea but a generic tea. And the web app with the db is also a generic web app. This is a good solution for start and for some medium plan or some long plan but, when you become a “big guy” you maybe need something more ad hoc\nJasmin Perl White Tea - Custom tailor-made app ¶ We fit perfectly, right?\nThe beta tester\nWE have the money and WE have the idea so WE build a software or WE pay someone how can build it and will be perfect. Like the Jasmin Perl. A Perferc tea for a perfect break.\nIt will work like a clockworking machine, ticking when it must tick and make all you need but you need to understand how to use it.\nLike the tea. You need to know how much time it needs and how much hot or cold must be the water for the tea you want.\nCha no yu - Deep Thought ¶ And here is where you will find also hot coco and biscuit\nThe guide showing your software\nIt is a work of art made from one or more master. It look like a divine thing. It cost something like the GDP of a little african state.\nAnd we have only the question: “We realy need it?”\nSometime you can find the Boss/CEO/The Big Guy showing it to the guess because it was the Masterpiece\nSo? ¶ You need to size your software/tea for your break-time/job and not go oversize because it is only a loss of money for nothing. If you can make a on-shot, a taste of the product make it but understand that the price is not how good is the product for your case\n","date":"20 January 2020","description":"A rant about workspace and data managment with tea","tags":["data","rant"],"title":"Make a Tea Not Big Data","uri":"/post/2020/make-tea-not-big-data/"},{"categories":["dev"],"content":"This is a story about a myth about how to find Mew1.\nIn the old day without interent “the cousin of a friends” or a \" friend of my cousin find and captured a Mew.\nThe Myth ¶ If you want to do it yourself you need to:\nHave a Pokemon with Surf Have a Pokemon with Strength Have the SS Anne not leave because the player doesn’t have HM01 Cut If you use Surf in the SS Anne map you can go to the track.\nAfter you are near the truck you need to use Strength and Mew will spaw. Like in this gif.\nThis is a Myth. The only way you can do it in this way you need do inject some code into the savefile/game and run it. After doing so you can use the pokemon with Surf and Stength as explained before.\nThis is a video where the gamer inject code in a Pokemon game and make this MythGlich happen.\nThe fact ¶ You can get Mew in the game:\nGameShark2 or other methods of injecting code into it (GameShark was the easy one) Official Pokemon Event for Red/Blue3 Make a glitch wich spawn Mew We don’t want to use a GameShark or similar so #1 is not a possibility.\nA Nintendo event with a direct trade is not appening for Red/Blue so #2 is not a possibility any more.\nYou can make a glitch wich spaw Mew in many way. If you want to do it use the guide 4 5\nBut why it’s work?\nThe HOW TO ¶ When a loading appen in the game (open a menu, enter into a battle, enter into a house/cave/door or a random encounter) the game reade a memory slot. This has an adress and it is also in an other memory slot so if you can change the adress in the memory you can use other part of the memory of the game. So when you use one of the guide you are editing one or more memory adress so, the normal loading change because the adress is loading is not what are you suppose to load.\nThis is also the way of the video linked in the post works. He pass a glitch/edited pokemon which change a lot of memory slot so happens a lots of not standard stuff (like moving the truck).\nIf i find some specifical data about this i will post about it\nThe first event pokemon, a pokemon you can find only going to a GameFreak Pokemon Event, the famouse 151° Pokemon ↩︎\nCheat enging hardware for many console wiki ↗  ↩︎\nNot in program in any future time ↩︎\nThe “official link” into WikiHow How to find a Mew in Pokemon Red/Blue ↗  ↩︎\nThe link I wrote in my old schoolbook… How to find a Mew in Pokemon Red/Blue, old link ↗  ↩︎\n","date":"28 December 2019","description":"Why you can find a Mew under a truck on Pokemon Blue, Red and Green","tags":["rant","coding"],"title":"Mew and programming","uri":"/post/2019/mew-and-programming/"},{"categories":["dev","rant"],"content":"I use DevRant, a social for rant by developer. One day I find this ↗ rant.\nSome empty-headed helpdesk girl skipped into our office yesterday afternoon, despite the big scary warning signs glued to the door.\n“Hey, when I log in on my phone, the menu is looking weird”\n“Uh… look at my beard”\n“What”\n“Just look at this beard!”\n“Uh…. OK”\n“Does this look like a perfectly groomed beard”\n“Uh… it’s pretty nice I guess”\n“You don’t have to lie”\nShe looks puzzled: “OK… maybe it could use a little trimming. Uh… a lot of trimming”. “I still like it though” she adds, trying hard to be polite.\n“I understand you just started working here. But the beard… the beard should make it clear. See the office opposite to this one?”\n“Yeah”\n“Perfectly groomed ginger beards. It’s all stylish shawls and smiles and spinach smoothies. Those people are known as frontend developers, they care about pixels and menus. Now look at my beard. It is dark and wild, it has some gray stress hairs, and if you take a deep breath it smells like dust and cognac mixed with the tears caused by failed deploys. Nothing personal, but I don’t give a fuck what a menu looks like on your phone.”\nShe looked around, and noticed the other 2 tired looking guys with unshaven hobo chins. To her credit, she pointed at the woman in the corner: “What about her, she doesn’t seem to have a beard”\nYulia, 1.9m long muscled database admin from Ukraine, lets out a heavy sigh. “I do not know you well enough yet to show you where I grow my unkempt graying hairs… . Now get lost divchyna.”\nHelpdesk girl leaves the scene.\nJoanna, machine learning dev, walks in: “I saw a confused blonde lost in the hallway, did you give her the beard speech?”\n“Yeah” – couldn’t hold back a giggle – “haha now she’ll come to you”\nJoanna: “No I already took care of it”\n“How?”\n“She started about some stupid menu, so I just told her to smell my cup”. Joanna, functional alcoholic, is holding her 4pm Irish coffee. “I think this living up to our stereotype tactic is working, because the girl laughed and nodded like she understood, and ran off to the design department”\nMe: “I do miss shaving though”\nI love it and I find it sometime too realistic in my experience. But sometime after reading this rant I brought a Developer Mug with the phrase “There is no place as 127.0.0.1” and I write down some office’s mug types.\nCommoner mug ¶ Standard mug. Only one color with or without the phrase “Best Dad/Mum/Something Ever!”. Full of pens, always Bic or some type of ultra-low-price pen. Sometime there is a magnifier if the owner is in the legal or tax department.\nNever ever used as a mug.\nTHE Design Mug ¶ This mug is object of design. It’s a cube, has a famous paintings or a geometric template. This is the mug of the “artistic” or “graphic” department. Sometime has a joke about fonts (Comics Sans write in Arial font is a common one). Usualy is not use for coffee but for the Jasmine Dragon Pearl Tea1 from upper Fujian province not your every day tea\nFrontEnd Mug ¶ They allways have the same fu__ing mug\nAllways clean and with black coffee but allways the same fu__ing mug because “it’s original”2. Because the owner is a front-end developer the owner keep the mug in pristine state.\nBackEnd Mug ¶ A mug. Inside there is the darkness a concentrated black coffee or a black stuff (old cofee) merged with the inside of the mug. Outside there is one of this:\n:q! for exit The most difficult task ever: exit vim Logo of framework brought at somethingconvention When the backend dev is also a fanboy Joke moking FrontEnd Because backend is the real thing Helpdesk first level/noob’s Mug ¶ A new mug with Linux inside or powered by Linux. Sometime the mug is a Debian or Ubuntu mug. Nothing special like the owner…\nHelpdesk second level’s Mug ¶ An old mug with Linux inside or powered by Linux. Sometime the mug is a Debian or Ubuntu mug. The mug has seen better days. Usualy full of pen and dust.\nHelpdesk third level’s Mug ¶ It was a mug with a penguin/debian logo/ubuntu logo printed on it but now look like more a mug with cave painting on it. Full of broken pen and a pencil which is the only thingworking in the “mug”. Sometime the mug is a little broken.\nSysadmin’s Mug ¶ A mug with coffe in it. Sometime Irish coffee, sometime only wishky. On the outside there is a frase like “fuck off”, “sysadmin give, sysadmin take away” or “open a ticket then i look at it” or, my preferite, “if you have a problem it is your problem not mine”. Only sometime you will find a sysadmin with the vim command sheet’s mug.\nThis are some of the type of mug I find in my worklife. If i find other i will create a second part of this post.\nAn exquisite tea from the Fujian province, where it is grown in gardens. Its name is due to its pearl-like shape. With a pronounced jasmine aroma, it has a soft taste and digestive properties that make it very recommendable for drinking on its own after meals. ↩︎\nFrom a true story ↩︎\n","date":"15 July 2019","description":"A response about mugs to a rant about beards","tags":["rant"],"title":"Beards, mugs and men","uri":"/post/2019/beards-mugs-men/"},{"categories":["dev","rant"],"content":"Questo non è un post normale. E non tratto di programmazione ma di un problema molto grosso che affligge me e altri tecnici: le buzzword. Questo articolo, se letto nel mio blog con i JavaScript attivi farà in modo di mostrare alcune buzzword sotto forma di termini tipo buzzword .\nIniziamo dalle basi: una buzzword è solitamente un termine che la persona ha sentito, gli è stata presentata come “l’ultima frontiera di/del \u003cinserire qui l’ambito di interesse della persona o della direzione\u003e e risolverà tutti i problemi rendendovi più ricchi di Paperone”.\nPraticamente mai la persona che pronuncia buzzword riesce a spiegare come questo/a andrà a migliorare il servizio/lavoro/produttività azienda senza ripetere almeno due o tre volte buzzword assieme a “è l’ultima frontiera”1 e “lo usa anche ” senza sapere nemmeno perché o se la ditta in questione usa buzzword .\nQuesto poi, quando va Male2 produce prima una richiesta di fattibilità ai tecnici a cui viene chiesto di lasciare tutti i “commenti di valutazione personale su buzzword a casa e lasciare la decisione a chi di dovere”. Quindi segue una richiesta al reparto contabile/It/Sistemista/quello che segue quella cosa3 che riesce a produrre le risorse per partire con buzzword .\nQuindi i tecnici (quelli che poi lo devono implementare) passano alle preghiere e i sacrifici umani per evitare che il progetto trovi un padrino o una madrina. Se questi non funzionano e ci si trova un padrino/madrina per il progetto, il progetto buzzword verrá portato avanti.\nE qui entra in gioco il Tecnico4. Vittima del caso e del/della buzzword si ritrova a implementare il progetto “Supercazzola in buzzword implementato su una bananventolafofaser”5.\nOra mai troppo tardi per abbandonare tutto la creatura buzzword va implementata quindi si iniziano a comporre le parti in base a cosa hanno deciso i superiori (ovvero implementare quello che hanno capito non quello che stai cercando di spiegare loro). Fondamentalmente o ci si affida a un santo, uno bravo, per aiuto o si ha un posto all’inferno tra i bestemmiatori in quanto “la direzione ha deciso così e non si tratta”.\nArrivati a questo punto, se non si ha cambiato lavoro, ci si ritrova con il codice, solitamente in piú linguaggi, che parla in modi diversi, con 12-24 wrapper e altri sistemi che tengono su tutto. Fondamentalmente é piú vicino a un appalcatura abusiva che ha un orologio svizzero.\nSolitamente, qui avviene la discussione sul fatto che è una ciofeca, che non fa quello che si voleva (ma va’) e poi la frase che tutti temono “ma deve funzionare, ci abbiamo investito6 talmente tanto che non può non funzionare” che porta alla creazione di rant e folli ricerche su StackOverflow per trovare quello scriptino in perl di 200 righe che fa quello che voleva la direzione fin da subito7.\nMi auguro che non vi capiti mai una situazione del genere visto che porta solo morte e disperazione e che questo post vi aiuti a evitare di rimanere bloccato all’interno di uno di questi incubi.\nQualunque riferimento a fatti o avvenimenti o persone reali non è voluto ed è puramente casuale\nOrmai lo spazio come ultima frontiera è diventata cosa vecchia, bisogna aggiornarsi ↩︎\nNotare la maiuscola particolarmente importante per definire che siamo tra il male e il MALE ↩︎\nLa persona che riesce a fare apparire i soldi per ogni capriccio di qualcuno ma “dobbiamo vedere se per questo ci sono i soldi (questo = carta igienica, no una Ferrari per andare in giro) ↩︎\nNotare la maiuscola particolarmente importante per distinguerlo da il tecnico (di minor abilita) e IL TECNICO (che é talmente abile che senti anche il CAPLOCK quando si presenta come IL TECNICO) ↩︎\nNome comune di progetto che non ha ne capo ne coda ma solo un unico scopo. Far soffrire. ↩︎\nSolitamente sono stati investiti da a e sono stati investiti un paio di tecnici (tolti quelli fuggiti) di nuovi ruoli per seguire il nuovo giocattolo buzzword  ↩︎\nEd essendo uno script perl scaricato da StackOverflow configurato la prima volta poi nessun altro sarà in grado di usarlo/modificarlo/avere una vaga idea di cosa fa ↩︎\n","date":"17 June 2019","description":"Un rant sulle buzzwords","tags":["coding","rant"],"title":"Buzzwords buzzwords","uri":"/post/2019/buzzwords-buzzwords/"},{"categories":["dev"],"content":"I need to have a massive put in my rest endpoint and Django Rest Framework doesn’t do it. So I make my personal method for mycase.\nSetup fo the project ¶ You need to follow the tutorial from the official documentation of Django Rest Framework ↗ .\nAfter this you have a MyModel, MyModelSerializer and a view class MyModelListPost.\nWhy I can’t use the default? ¶ After you did the tutorial you have a base for a standard Django Rest Framework. This mean that you have only a get massive not an update massive. So we make one from scratch.\nThe CODE ¶ This is the code for massive put. You need to map your classes and your fields for make this code working\n# Code from \u003chttps://fundor333.com\u003e from rest_framework.response import Response from rest_framework.views i_port APIView from rest.models import MyModel_ from rest_framework import generics from rest.serializer import MyModelSerializer class MyModelListPost(generics.GenericAPIView, APIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer def put(self, request, *args, **kwargs): output = [] for data in request.data: try: instance = MyModel.objects.get(unique_id=data[\"unique_id\"]) created = False except Exception: instance = MyModel.objects.create( field1=data[\"field1\"], field2=data[\"field2\"], ) created = True if created: serializer = self.get_serializer(data=data) else: serializer = self.get_serializer(instance, data=data) if serializer.is_valid(): serializer.save() output.append(serializer.data) else: output.append(serializer._errors) return Response(output, status=status.HTTP_200_OK) In this case we use the unique_id to find any instance and update one by one with the get method. I know it’s not very Python Way but if you have some better solution please write below. Thanks\n","date":"23 April 2019","description":"How to make a massive put with Django Rest Framework","tags":["django","rest","django rest framework","api"],"title":"Django Rest Framework: Multiple post","uri":"/post/2019/django-rest-framework-multiple-post/"},{"categories":["dev"],"content":"Attualmente al lavoro il team di sviluppo é “giusto per le esigenze aziendali”. Questo significa due persone. Questo comporta anche che non esiste un backendista e un frontendista full time ma tutti fanno tutto.\nCon poi anche problemi legati alla pipeline di rilascio in produzione del codice che viene fatto manualmente e con molta (poca) attenzione. Fino al giorno dell’ARMAGEDDON.\nBuona Apocalisse a tutti e grazie per il pesce ¶ Kube, k8, Kubernetes o come lo chiamiamo noi il clousterone é stata la cosa che ha sconvolto la quiete del nostro reparto sviluppo.\nPer chi non é avvezzo al rilascio attraverso Kubernetes la cosa importante da sapere é che serve una o piú immagine Docker contenete il codice da eseguire, un set di permessi (sul cluster su cui si pubblica il progetto) e tanti comandi via terminale per i settaggi e simili. Questo ha portato alla creazione di N sistemi di notifica, deployment e automatizzazione che devono convivere assieme. Questo sta portando a molto scripting soltanto per risolvere queste problematiche.\nScelta delle tecnologie ovvero di che morte devo morire ¶ Qui cade la parte divertente e parte quella pesante. Per far funzionare i nostri sistemi ci siamo affidati per prima cosa a dei linguaggi con cui preparavamo degli script che, una volta lanciati, buildavano o facevano cose per la messa in produzione. Questi erano in Python e Bash e fondamentalmente ogni progetto aveva comandi diversi per la messa in opera con parametri diversi e path diversi. Una volta che si inizia ad avere tanti progetti diventa quindi necessario rivederli e unificarli in modo da stare tranquilli. Questo vale anche per il sistema di logging e notifica degli errori.\nLe nostre marionette ¶ Questo ha portato alla creazione di sistemi automatici/bot per i task. Partendo da due scuole di pensiero differenti abbiamo sviluppato entrambe le scuole in modo da essere piú completi.\nHook basati su git questi lanciano build in modo automatico basandosi sul co0dice che scriviamo. Interamente indipendente da il nostro intervento URL collegati a bot ci permettono di lanciare operazioni in qualsiasi momento e sono chiamabili a disponibilitá. Questo ha portato alla creazione di un modulo per la gestione del té in coffescript ↗ per Hubot, framework per bot di Github.\nA presto altri dettagli e info su bot per automatismi e, se posso, anche del codice annesso.\n","date":"5 February 2019","description":"Aggiornamento su cosa mi sta succedendo e perché ho iniziato a fare il DevOps","tags":["devops","bot","coding"],"title":"DevOps, ChatBot e NPM","uri":"/post/2019/devops-chatbot-npm/"},{"categories":[],"content":"DataBeers Venezia #6 - 30.11.18 @ Negozio Piave 67, Venezia\nWe are back again, data lovers from the Lagoon!\nGreat speakers for you next Friday November 30 @ Negozio Piave 67, Mestre, Venezia, starting at 18:30 sharp!\nTonight we have the pleasure to be with:\n**Lorenzo Brutti @lbrutti **\nData lover indipendente - Mogliano Veneto\nDatawalking: passeggiare nel datascape\n**Silvia Pavan **\nLead Analyst at FIS - Vicenza\nLa natura dà i numeri?\n**Francesco Costa @francescocosta **\nVicedirettore @ilpost - Milano\nGli Stati Uniti, i dati e le farfalle\n-–\nPlease REGISTER as soon as possible so we can provide enough beers (and bagigi) for you all!\nBeers are again VERY KINDLY PROVIDED BY ESTRELLA!\nThanks to LARUS for the technical support and logistics.\nSee you there!\nCheers\nAlice, Fabio, Francesco, Lorenzo, Marco, Nicola, Rocco\n","date":"6 November 2018","description":"","tags":[],"title":"DataBeers Venezia #6","uri":"/event/2018-11-06-databeers-venezia-6/"},{"categories":[],"content":"La storia delle trasformazioni dei Giardini in luogo espositivo; la costruzione dei padiglioni nazionali; la “vita” delle mostre e degli allestimenti museali. Ne parleremo con:\nFrancesca Castellani (Università Iuav di Venezia) Eleonora Charans (Università Iuav di Venezia) Chiara Di Stefano (Università per Stranieri di Perugia) Cristiano Guarneri (Università degli Studi di Padova) Stefano Zaggia (Università degli Studi di Padova) Guido Zucconi (Università Iuav di Venezia) ","date":"11 October 2018","description":"","tags":[],"title":"Follow UP! Dati dal Padiglione al Forte: Il cantiere Biennale","uri":"/event/2018-10-11-follow-up-dati-dal-padiglione-al-forte-il-cantiere-biennale/"},{"categories":[],"content":"Descrizione Matteo Basso, Federica Fava, Laura Fregolent, Renato Gibin presentano:\nVenezia verrà raccontata a partire da alcune ricerche condotte all’interno del Laboratorio di Analisi urbana e del territorio e del ClusterLab: H-City Housing in the city. Abitare e rigenerare, dell’Università IUAV di Venezia. La sovrapposizione dei risultati di diverse indagini condotte sui temi casa, commercio, uso ai piani terra e territori di margine, consentirà di restituire realtà e dinamiche di una città in veloce e continua trasformazione.\nDati\nMappa dell’abbandono ↗ Quali case per quali abitanti? ↗ ","date":"4 October 2018","description":"","tags":[],"title":"Follow UP! Dati dal Padiglione al Forte: “Abitare” a Venezia","uri":"/event/2018-10-04-follow-up-dati-dal-padiglione-al-forte-abitare-a-venezia/"},{"categories":[],"content":"Marco Goldin, il data scientist da sorriso maliardo, ci mostrerà degli algoritmi di cooccorrenza per il targeting delle comunicazioni comunali ai cittadini. DOMANDA: come si possono gestire algoritmicamente i dati delle interazioni dei cittadini? Sembra una cosa supertecnica ma serve per proporre i servizi ai cittadini ottimizzando la comunicazione con l’Amministrazione nei vari canali, che sia il sito web, i social, URP. Esempio banale: grazie all’analisi di cooccorrenza, se il cittadino 1 usa il servizio A e il cittadino 2 usa il servizio A e quello B, le macchine automaticamente propongono il servizio B anche al cittadino 1. Si farà un’analisi di qualche struttura di sito web e una serie di considerazioni.\n","date":"27 September 2018","description":"","tags":[],"title":"Follow UP! Dati dal Padiglione al Forte: Cittadini e algoritmi, comunicazione e servizi pubblici","uri":"/event/2018-09-27-follow-up-dati-dal-padiglione-al-forte-cittadini-e-algoritmi-comunicazione-e-servizi-pubblici/"},{"categories":[],"content":"Per il terzo incontro per il Padiglione Venezia parleremo di design della comunicazione per usare i dati per informare sull’emergenze ambientali e sociali nella città: strumenti interpretativi per affrontare la complessità.\nDal Corso di laurea in disegno industriale e multimedia del Dipartimento di progettazione e pianificazione in ambienti complessi, verranno proposte strategie e metodi per informare sull’ambiente naturale e civile nel Comune di Venezia. Gli unici strumenti saranno i numeri e dati rilevati sul territorio e “lavorati” per diventare strumenti informativi.\nSergio Brugiolo (docente di design della comunicazione) Claudia Faraone (architetto urbanista) Stefano Giacomazzi (presidente Viva Piraghetto associazione culturale) Anna Saccani (designer della comunicazione) Luca Corsato (moderatore) ","date":"26 June 2018","description":"","tags":[],"title":"Venezia Conta, dai dati all'ambiente: Biennale Architettura Follow UP! Dal Padiglione Venezia a Forte Marghera","uri":"/event/2018-06-26-venezia-conta-dai-dati-allambiente-biennale-architettura-follow-up-dal-padiglione-venezia-a-forte-marghera/"},{"categories":["dev"],"content":"Microsoft now own Github. From this we need to make some talk about the question which all the open source community is doing: “Whas are going to change into the OpenSource comunity or into the public code?”\nMany developer thinks about this and say something similar to “I do not want to risc my project so goodby” and the move to GitLab all theire code.\n↗ I think a lot about this acquisition of Github and I have a lot of dubts. How much code am I willing to give to a company that i not controll or own? And this make me think more and more. I have some project I feel value more so I feel the need to have in mi controll. And now I own a self hosting for my code or realy my personal important work.\nAnd sometime after, I find on twitter an four year old retweet that talk about the acquisition and, for years ago, only Microsot will buy it. And this leave me with more “I don’t understand” than before\n↗ And this make me understand that owning Github you don’t own Github code (site) but all the service make arrown Github.\nElectron ↗ JS Library for building desktop app Atom ↗ Text Editor, alternative to Visual Studio Code by Microsoft, with lots of plugin HuBot ↗ Framework for bot for Slack and other services My questions are:\nGithub has problems. Microsoft buying it will solve the problems or kill GitHub? The want to controll the OpenSource word or the only want to work with it? They want more contoll over Electron and his development? They want to controll Atom development? They want to make more Azure into Github service and all the marketplace? Only time will tell and i am curious about what will do with GitHub and I only be sad because one of the Big 51 of Tecnology own this OpenSource Colossum.\nApple, Microsoft, Amazon, Facebook, Google ↩︎\n","date":"11 June 2018","description":"Now what appen because Microsoft own Github and all theire project?","tags":["rant"],"title":"Microsoft buy Atom, Electron and Open Source","uri":"/post/2018/microsoft-buy-atom-electron-and-open-source/"},{"categories":[],"content":" Secondo incontro del Padiglione Venezia a Forte Marghera ¶ Nelle aule seminariali - appena entrati in fondo sulla destra - incontreremo il gruppo di ricerca Visualising Venice, è un’iniziativa di Digital Humanities di studenti, studiosi e architetti con progetti di ricerca per generare modelli digitali e mappe della città di Venezia, dei suoi territori e della sua laguna. Parleremo dei casi di studio presentati al Padiglione Venezia e delle attività di raccolta, analisi e riproduzione della Città dai documenti storici.\nNe parleramo con:\nCaroline Bruzelius (Duke University) Donatella Calabi (IUAV) Andrea Giordano (Università degli studi di Padova) Moderatore Luca Corsato, staff curatoriale Padiglione Venezia (OSD) ","date":"7 June 2018","description":"","tags":[],"title":"Visualising Venice: Biennale Architettura Follow UP! Dal Padiglione Venezia a Forte Marghera","uri":"/event/2018-06-07visualising-venice-biennale-architettura-follow-up-dal-padiglione-venezia-a-forte-marghera/"},{"categories":[],"content":"OSD opensensorsdata illustrerà il modello di gestione dati del Padiglione Venezia assieme a DataBeers Venezia, gli analisti dati con la schiuma, e Hacks/Hackers Venezia, gli smanettoni e i parolai con i dati tra giornalisti e hacker.\n","date":"31 May 2018","description":"","tags":[],"title":"Follow UP! Dati dal Padiglione al Forte","uri":"/event/2018-05-31follow-up-dati-dal-padiglione-al-forte/"},{"categories":["dev","rant"],"content":"Anche quest’anno sono stato al Pycon italia, raduno di pythonisti ormai arrivato alla nona riiterazione della cosa. Questo però non vuole dire che per me non è stata una nuova esperienza.\nPc, penna e traveler jurnal, questa é la postazione da PyconQuest’anno, infatti, ho fatto svariate cose diverse dal solito:\nho tenuto un talk ho partecipato a una competizione interna ho provato il famoso lampredotto “evitando” la PyFiorentina Il Talk ¶ Pelican e i generatori di siti statici ¶ e come non farci male ¶ Il talk è stato Pelican e i generatori di siti statici ed è stato, secondo me, un successo. Mentre scrivo questo post non ho ancora ricevuto un feedback “ufficiale” dagli organizzatori ma, viste sia le domande durante che dopo il talk, è piaciuto ed è stato interessante.\nNel prossimo futuro ho intenzione di pubblicare un articolo di approfondimento, a seguito del talk e delle domande che ci sono state e di alcune piattaforme scoperte dopo il talk\nLa competizione dei floppy ¶ A ogni partecipante alla convention viene dato un floppy disk con l’adesivo con i dati del partecipante e dietro un piccolo QRCode. E’ propio quest’ultimo che ha attirato enormemente la mia attenzione sulla cosa e si è rivelata un bell’ easter egg.\nInfatti il QRCode ha portato a una serie di piccoli enigmi informatici fino al raggiungimento di un gruppo Telegram, ultima tappa della caccia al tesoro.\nPersonalmente ho trovato divertentissima questa gara e sto già pensando di strutturarla all’interno di questo dominio in qualche parte, devo solo decidere ancora dove…\nIn ogni caso mi ha permesso di socializzare con alcune persone e di divertirmi in un modo diverso dal solito, con il sottile piacere degli enigmi.\nIl lampredotto ¶ Quest’anno, sia per un discorso economico che per un discorso di tempi, ho deciso di non partecipare alla Pyfiorentina ma andare a caccia di Lampredotto.\nTrovato quindi il locale e mangiato il lampredotto ho avuto una idea per un progetto con i GTFS di Google grazie all’autobus che per poco non mi metteva sotto (troppo distratto io dal lampredotto).\nSu questo spero di darvi presto aggiornamento.\nIn generale è stata una bella esperienza con talk molto belli ma ora bisogna pensare al futuro e a che talk portare l’anno prossimo per pagare di meno visto che comunque non ho più la tariffa studenti.\n","date":"3 May 2018","description":"Racconto della mia esperienza al Pycon 9","tags":["pycon","rant","convention"],"title":"Floppy, Pycon e generatori di siti statici","uri":"/post/2018/floppy-pycon-e-generatori-di-siti-statici/"},{"categories":[],"content":"Oggi nel web tutti hanno un sito o un blog che aggiornano e mantengono con articoli e informazioni di vario genere ed esistono svariate piattaforme per siti web dinamici.\nQui invece si parla del contrario, di come mantenere un sito statico, più performante e che risulta anche più economico e rilassante da mantenere, integrandolo con tecnologie come i Jupyter Notebook e Git per ottenere una completa interazione con le tecnologie più moderne e usate. Verranno anche presentati un paio di casi d’uso di Pelican in situazioni reali.\nCome prerequisiti si assume che l’ascoltatore sappia cosa sia un CMS e (a grandi linee) come funziona e cosa sia un Jupyter Notebook (non è necessario che sappia usarne uno)\n","date":"20 April 2018","description":"","tags":[],"title":"Pelican E Perchè Generare Siti Statici","uri":"/talk/2018/pelican-e-perche-generare-siti-statici/"},{"categories":[],"content":"PyCon Italia è la conferenza nazionale che raccoglie professionisti, ricercatori e appassionati del linguaggio di programmazione più bello che ci sia. Nella splendida cornice di Firenze, PyCon è un weekend per imparare, confrontarsi e scoprire.\n","date":"20 April 2018","description":"","tags":[],"title":"PyCon 9","uri":"/event/2018-04-19-pycon9/"},{"categories":[],"content":"Esattamente un anno fa, il 3 Marzo 2017, usciva la Nintendo Switch, la prima console sia fissa che portatile che la Nintendo abbia mai fatto. In quella stessa data mi è stata regalata una Nintendo Switch con Zelda Breath of the Wild, il gioco di lancio della console, per il mio compleanno, sempre il 3 Marzo.1\nOggi, a un anno dopo, mi metto a fare i conti su com’è la console e su che parte del mercato si è posizionata la console ibrida.\nCaratteristiche tecniche ¶ Partiamo dalla parte completamente oggettiva: le specifiche tecniche.\nTipo Dettagli Dimensioni 102 mm x 239 mm x 13,9 mm Peso 400 g con controller attaccati Schermo Touch screen capacitivo / 6,2 pollici LCD / risoluzione 1280 x 720 GPU/CPU Processore NVIDIA Tegra Memoria 32 GB di cui almeno 6,2 GB occupati dal sistema operativo Connessione Wireless LAN (compatibile IEEE 802.11 a/b/g/n/ac) / Bluetooth 4.1 (solo per la modalità TV) Uscita Video 1920x1080 con 60 fps via HDMI su TV. 1280x720 con 60 fps sullo schermo integrato Sensori Accelerometro / giroscopio / sensore di luminosità Semplicemente da questi dati si capisce che la console risulta essere meno potente delle rivali della Sony e Windows. Questo però è causato dalla possibilità di giocare “al volo” con la modalità portatile e quindi, dal mio punto di vista, è uno scambio equo per permettere alla batteria di avere una durata più che accettabile.\nCasi d’uso ¶ Sostanzialmente la console è sia una console portatile che una console fissa. Per fare ciò è stata creato un “dock” che viene collegata alla televisione o allo schermo (essendo collegabile via HDMI basta anche un monitor). Questa base risulta però pericolosa per l’integrità dello schermo touch, che viene segnato se ripetutamente inserita e rimossa senza fare attenzione. Personalmente ho risolto il problema con una pellicola protettiva che avrei acquistato comunque trattandosi anche di una console portatile e che l’uso più ambio che io ne faccio è proprio la funzionalità portatile.\nAltro problema è il punto di aggancio per l’alimentazione. Essendo posizionato sotto non è possibile utilizzare la gamba per tenere lo Switch in verticale mentre è in carica. Per farlo è necessaria una “base” che alzi lo Switch. Anche questa la ho presa separatamente e da rivenditori di terze parti anche se la Nintendo sembra essere intenzionata a spostare la presa dello Switch nella prossima linea.2\nHo fatto delle prove in tv e il risultato è esattamente quanto sperato. Ottima qualità video, ottimo audio, l’unico problema da parte mia è che la connessione alla rete è possibile solo via wifi ma per il resto funziona divinamente.\nVideogiochi dello Switch ¶ Già dal lancio lo Switch dimostra che è una console per due macro-categorie di videogiochi:\nIndie quali Shovel Knight,World of Goo, Little Inferno, The Binging of Isaac: Afterbirth+ GDR quali I am setsuna, Shovel Knight, The Legend of Zelda Breath of the Wild Questo attaggiamento dello Switch è continuato e continua tuttora con giochi come Xenoblade Chronocols 2, _Terraria_e quello che sto attendendo di più in assoluto Hollow Knight.\nQuesta è la vera potenza della console Nintendo dal mio punto di vista: tanti sviluppatori indipendenti che sono attratti dalla console e che rilasciano software per essa e, a seguire, grosse ditte come Bethesda e la Square Enix che rilasciano giochi.\nIl risultato è che va a coprire una fascia di mercato che le altre console non riescono a coprire e che è slegata dalla postazione di gioco (punto focale del successo della console).\nA questo poi viene aggiunto il fattore esclusive Nintendo, che risultano sempre essere molto attraenti soprattutto per chi segue il franchise da tempo.\nIn conclusione ¶ Ottima idea di console, ottima implementazione ibrida, alcuni difetti nel design ma molto limitati. A questo si aggiunge un bel parco giochi e esclusive con un bel parco indie che incentivano il mercato con nuove idee e nuove grafiche.\nPersonalmente consiglio l’acquisto della console sopratutto se interessano gli indie e i gdr ma se non piacciono queste due categorie potrebbe essere una console meno adatta se piacciono di più gli sparatutto.\nSperando di avervi interessato vi invito a commentare e discutere sulla console, grazie.\nPer chi fosse interessato ho la versione “blu-rossa” della console ↩︎\nSostanzialmente i problemi di design dello Switch sono conosciuti e sembra che la Nintendo ha già pronti i fix per la prossima versione ↩︎\n","date":"3 March 2018","description":"Esattamente un anno fa veniva rilasciata la Nintendo Switch. Oggi, un anno dopo, vediamo che tipo di mercato ha coperto.","tags":["rant"],"title":"Tanti Auguri Nintendo Switch","uri":"/post/2018/tanti-auguri-nintendo/"},{"categories":[],"content":"Hey Hey, My My! Databeers will never die! We are launching the new chapter of Databeers Venezia! Great speakers for you next Friday February 23 @ Negozio Piave 67, Venezia, starting at 18:30 sharp!\nIt will be a great night on the stage with:\nMassimo Lamanna from Cern, Geneva in: CERN: Big Experiments and Big Data\nFrancesco Bergamo from IUAV, Venice in: Representing Data: Ecologies and Politics of Interfaces\nRina Camporese from ISTAT, Venice in: Data Climbing\nPlease REGISTER ↗ as soon as possible so we can provide enough beers (and bagigi) for you all!\nBeers are again VERY KINDLY PROVIDED BY ESTRELLA!\nThanks to LARUS for the technical support and logistics.\nSee you there!\nCheers\nAlice, Fabio, Francesco, Marco, Nicola, Rocco\n","date":"23 February 2018","description":"","tags":[],"title":"DataBeers VCE 4","uri":"/event/2018-02-23-databeers-vce-4/"},{"categories":["rant"],"content":"Da poco ho scoperto che nel 2006 l’agenzia Russa FSB ha accusato gli inglesi di spionaggio attraverso una roccia “wirless”1 e questo mi ha ricordato di alcuni progetti P2P che seguivo.\nPartiamo con ordine: cos’è il P2P?\nP2P sta per “Point to Point” ovvero “punto a punto”. Significa che la comunicazione è tra il “mittente” e il destinatario senza utilizzare intermediari. Questo, nel mondo moderno di internet e nel mondo delle nuove tecnologie, è rarissimo da trovare. Solo le tecnologie .torrent e dei magnet link assieme ad alcune rare eccezioni di servizi di chat sono gli unici servizi per l’utente puramente P2P (il p2p tra macchine non lo prendo in considerazione perchè esce dal punto dell’articolo anche se è importante notare che c’è ed è molto presente)\nQuesto ha portato alla creazione di alcuni progetti hardware/software che cercano di creare questa comunicazione “offline” (in modo da evitare terzi) partendo dal concetto di Dead Drops.\nNonostante quello che mostrano nei film, lo scambio ‘di persona’ è molto pericoloso e raramente usato. Viene invece usato il Dead Drops o consegna morta: dopo essersi accordati su un punto di consegna, il mittente lascia il “pacchetto” nel punto di consegna dove, il ricevente, lo viene a ritirare\nDa questa idea nasce il primo progetto che esamino da lungo tempo: il progetto “Dead Drops”\nDead Drop ¶ Nato come progetto d’arte di Aram Bartholl, un artista con base a Berlino, è un progetto che è stato molto apprezzato nelle comunità underground urbane e di hacking.2\nInfatti è considerabile come hack urbano in quanto è, semplicemente, il posizionamento di supporti di memoria fissa nel territorio. Ad esempio il murare una chiavetta usb su una parete o legare, con una sicura, ad un albero un supporto usb.\nTutto questo viene gestito all’interno di un sito internet3 che ha anche un database in cui vengono segnalati i dead drop esistenti, il contenuto di partenza e lo stato del supporto stesso per rendere tutto più semplice e funzionale.\nQuesto sistema risulta essere molto interessante da un punto di vista tecnico ma difficile da mantenere in quanto molto soggetta allo stato della parete stessa e alle condizioni atmosferiche dell’area. In oltre può essere anche intesa come danneggiamento di suolo pubblico/privato.\nPersonalmente lo trovo un sistema molto funzionale nel caso venga applicato in un campus o una situazione controllata come all’interno di un negozio o di un caffè, in quanto riesce a essere più facilmente mantenuta.\nManifesto Dead Drop ↗ Invece esistono dispositivi più facilmente mantenibili che ottengono lo stesso risultato di condivisione offline.\nPirateBox ¶ Ispirata dal sistema delle radio pirata, la PiratBox è un sistema hardware di offline sharing che utilizza tecnologie OpenSource (FLOSS per gli amici) per la condivisione dei file e contenuti.\nTecnicamente è un router modificato in modo da creare un hotspot “offile” da cui prendere e lasciare file e commenti. Si basa su una “patch” di OpenWrt che trasforma il router compatibile in un hotspot/server.\nAttraverso una interfaccia web e collegandosi via WiFi è possibile caricare e scaricare i file contenuti all’interno della PirateBox.\nOvviamente, essendo tutto FLOSS è possibile modificare sia la patch che il sito in modo da creare un dispositivo più adatto al proprio scopo.\nIn particolare sono state effettuate delle “mod” della PirateBox basate proprio su questo principio che utilizzano come base la PirateBox per ottenere però la condivisione unilaterale di contenuti di uno specifico tipo:\nPirateBox Streaming Radio with Icecast Utilizzando IceCast è possibile utilizzare la PiratBox come “server” per la radio4 OpenStreetMap on PirateBox Con alcune modifiche è possibile condividere mappe di OpenStreetMap sulla PirateBox5 Calibre eBook Server on PirateBox Utilizzando COPS ↗ è possibile avere un server contente una biblioteca di Calibre sulla propria PirateBox6 In oltre alcune di queste modifiche sono diventate talmente grosse da diventare progetti indipendenti come LibraryBox.\nLibraryBox ¶ Mod e poi fork di PirateBox, è la versione “per libri” della PirateBox.\nRisulta utilizzare la stessa base hardware (sempre un router con una unità di memoria) ed è sempre una “patch” di OpenrWrt a cui viene cambiata l’interfaccia grafica e alcune funzionalità.\nInfatti è un sistema di condivisione unidirezionale, pensato per ottenere in una location un mediaserver di condivisione di documenti offline, che permetta la distribuzione di una scelta di documenti/file. Questo ha portato il dispositivo a essere molto aprezzato nel mondo dell’educazione, dove rende possibile la condivisione di documenti pesanti semplicemente attaccandosi al WiFi del dispositivo, senza appesantire le reti della struttura.\nIn oltre viene molto aprezzato in alcune aree in cui viene censurato l’accesso alla rete, che porta a aver bisogno di costose VPN per il recupero di determinate risorse, che la LibraryBox permette di condividere molto più facilmente.\nQuesto ha portato molti a sfruttare molto più pesantemente la LibraryBox rispetto alla PirateBox portandone anche a un maggiore sviluppo della stessa, che risulta molto più facile da costumizzare nella parte grafica (cosa molto più complessa nella PirateBox).\nFondamentalmente queste sono le tecnologie P2P offline che suggerisco e di cui mi sono interessato nel mio tempo libero. Nel caso ne trovi di nuove mi preoccuperò di fare un aggiornamento in quanto l’argomento a me piace in modo particolare e lo trovo anche particolarmente interessante anche dal punto di vista umano, perchè è sempre interessante vedere i nuovi sistemi con cui il genere umano condivide la conoscenza.\nThe Guardian: Moscow names British ‘spies’ in NGO row ↗  ↩︎\nSito ufficiale del progetto Dead Drops Link con problemi deaddrops.com ↩︎\nMappa dei dead drop Link con problemi deaddrops.com/dead-drops/db-map ↩︎\nThread sulla mod con Icecast ↗ e tutorial ↗  ↩︎\nThread sulla mod con OpenStreetMap ↗ e tutorial ↗  ↩︎\nTutorial ↗  ↩︎\n","date":"16 February 2018","description":"Esistono altri sistemi per la condivisione p2p e quelli offline sono particolarmente interessanti. Eccone alcuni dei più interessanti","tags":["hacking"],"title":"P2P offline come le Spie","uri":"/post/2018/p2p-offline-da-spie/"},{"categories":["rant"],"content":"E per caso mi ritrovo a dover parlare al Pycon… E ovviamente voglio complicarmi la vita perchè se non faccio le cose in modo facile non mi diverto a sufficienza.\nFacciamo un po’ di ordine:\nHo un blog gestito attraverso un generatore di siti statici Passo spesso tra Pelican e Hugo come generatore del blog, in quanto non mi trovo con entrambi Ho una passione per il formato file .TeX e per LaTeX Voglio partecipare al Pycon9 spendendo poco ma ho “perso” la posizione di studente laureandomi Questo ha portato a combinare tutto in una unica situazione: sono uno degli speaker del Pycon 9 e porterò Pelican come talk… E tutto questo in LaTeX.\nQuesto significa che ho fatto sia delle modifiche sul blog che dei nuovi repository su Github ↗ . In particolare ho ristutturato l’intero blog con Hugo (che va a sostituire Pelican) e preparato due nuove sezioni del sito: eventi e talk.\nAppena disponibili queste due sezioni appariranno nel menù in alto per portarvi a un riassunto degli eventi a cui ho partecipato e a cui voglio partecipare (ovviamente con tutti i dettagli e link del caso) e la parte talk dedicata alle mie presentazioni che, con slide e tutto il materiale annesso, verranno postate anche come articolo di questo blog. Questi articoli, di fatto, costituiscono la mia traccia di appunt con qui io tengo il talk e, ovviamente, per il Pycon9 prendo pesantemente dai miei articoli di comparazione di Hugo e Pelican passati, sia da una ricerca che sto facendo personalmente su Pelican e il sistema di plugin, vero punto di forza per questo software.\nA questo aggiungo anche che ho bruciato la SSD del mio portatile abituale per cui tutto quello che faccio è nel vecchio Mac BookPro che, borbottando, ci mette 3-4 volte tanto a fare tutto e personalmente, non ci sono più abituato.\nA presto altri aggiornamenti sulla cosa e nuovi articoli sul blog.\n","date":"12 February 2018","description":"E vado a parlare al Pycon9 per colpa di questo blog, della mia piccola passione per i generatori di siti statici e di un certo informatico","tags":["convention","pycon","python"],"title":"E Talk Al Pycon9","uri":"/post/2018/e-talk-al-pycon9/"},{"categories":["dev"],"content":"What is a REST API? REST stand for Representational state transfer (REST) or RESTful web services and it’s the most used tipe of API you find online.\nIf I need some data I need to go to the url of the API and go to the subpath of the data I want.\nFor example if I need some posts from https://jsonplaceholder.typicode.com/ ↗ I need to go to https://jsonplaceholder.typicode.com/posts ↗ and download all the posts or pass the id in the url like in https://jsonplaceholder.typicode.com/posts/1 ↗ or whatever the path is. Some time I will need only fews posta but the api give me all or one so it’s can be some heavy lifting for the connection. And I need to know all the url and the params needed for the datas.\nThis is why Facebook in 2012 develop GraphQL ↗ #What is GraphQL\nGraphQL is a data query language which request a knowledge about the schema of the api.\nOne of the best “skill” of GraphQL is the multi-db support. You can map multiple database in one api because the graphql server can use multiple source for build the api, and, doing so, add different’s types of db or other type of source at the same time.\nIn this way you can use with one unique and uniform interface hidding behind it all the architectural dectail with only one point of comunication (the graphql url) with all the user need from the api.\nStructure of a GraphQL API ¶ If you want a GraphQL’s API you need to know how the API works.\nAll the data into the databases are object named Type with multiple Field. Every Field is get by a Resolvers which return a Value.\nYou will need a Schema, a collection of Types, for describing all the api and make the api working.\nYou also need to know the difference between Query and Mutation because there are the only action youi can make on a GraphQL API.\nA Query is a type of the schema for getting out the datas you will need for your work.\nA Mutation is a type of the schema for adding or editing the datas in the databases.\n#Why use a GraphQL over Rest ?\nWhich is the difference between Rest API and a GraphQL API? Because you can get only what you want and nothing more.\nThanks to Relay1 and thanks to the Query you can build a request with a selected number of element2 with only the needed Value3 .\nThis will be usefull because some type of Query will be resized than the SQL query and you will be writing in a GraphQL language which check for type error and syntactic error and output error if the Query or the Mutation don’t respect the Schema. In this way the Api Admin will allways be in controll of all the operation on the database and the user must be allways knew all the change into the Schema\nIn this way you will have an api with only what you need for your lightnet app which use only the necessary connection, no more.\nNow I’m working on an another article about the python implementation of GraphQL so wait another article.\nJavascript framework integrathed with GraphQL ↩︎\nLike all the friend of the hero ↩︎\nOnly the first name ↩︎\n","date":"16 January 2018","description":"This is an article about the future of the api: GraphQL. This is the natural evolution from the REST API and it's the best thing for request only part of the data in the API","tags":["rest","api","graphql"],"title":"GraphQL and working with it","uri":"/post/2018/graphql-and-working-with-it/"},{"categories":["rant","dev"],"content":"Da quasi 10 anni io utilizzo Linux o sistemi Unix su tutti i pc che utilizzo. Questo mi ha portato a creare svariate configurazioni personalizzate legate a i vari servizi/programmi/script che utilizzo tutti i giorni, perdendo un tempo notevole in caso di ripristino a risettare tutto com’era.\nQuindi ho imparato a “backappare” i file di configurazione e stavo iniziando a scrivere un orrendo accrocchio per la generazione delle configurazioni in modo automatico partendo da un database sqlite, che, per quanto intelligente come idea, non è una cosa di facile gestione ne adatto alla situazione che si è creata.\nQuindi, girando su GitHub ho incontrato il progetto DotFiles ↗ . Questo è una abitudine/gioco/sistema che va “di moda” su GitHub. Viene fatto un repository dei propri file di config (che, nei sistemi Linux/Unix iniziano sempre con il punto) con uno script di install.sh che, quando lanciato, installa correttamente le config e permette di partire dopo un ripristino o una reinstallazione in modo molto veloce.\nPer quanto mi riguarda io lo ho stutturato in modo da seguire nel modo migliore le mie esigenze e ho utilizzato un software per la gestione dei dotfile\nDotBot Utility scritto in Python, gestisce l’installazione dei file di configurazione nella home utilizzando la configurazione presente nel file install.conf.yaml\nDotBot Pip Plugin per il DotBot che mi permette di gestire l’installazione dei moduli python in automatico. Questo mi permette di settare in automatico già alcune mie dipendenze che installo praticamente sempre.\ninstall.conf.yaml Il file di configurazione, necessario per il funzionamento di DotBot. Raccoglie tutto ciò che il bot deve fare per ripristinare le config\nI dotfiles Tutti i file e le cartelle predisposte per essere importate per ripristinare le configurazioni. Si suggerisce la divisione in cartelle anche per poter tenere meglio organizzato il repository/backup\nAggiornamento Bisogna tenere sempre i file e per farlo va fatto a mano. Personalmente credo che sia il modo migliore per aggiornarli è farlo a mano. Si ha così controllo e si riesce a mantenere puliti i file di configurazione.\nPer terminare E’ importante rimanere anche aggiornati su come cambiano i config dei programmi e servizi che si usano. Per questo suggerisco di seguire gli aggiornamenti dei programmi/servizi di cui si stanno tenendo i dotfile e di seguire anche i tweet di @EditorConfig che da utili consigli e condivide altri repository di dotfile per confronto/copia.\nComunque la cosa importante è rimanere sempre informati dei cambiamenti che avvengono nei propri dotfile e perchè accadono. Questo permetterà anche di capire meglio le stesse impostazioni e controllare che siano sempre come vorremmo.\nSpero che questi consigli vi tornino utili.\nFundor333\n","date":"4 December 2017","description":"DotFile e la mia configurazione di tutto","tags":["dotfiles","coding"],"title":"DotFile e le mie config","uri":"/post/2017/dotfile-e-le-mie-config/"},{"categories":[],"content":"Le DevFest sono delle vere e proprie “feste degli sviluppatori” organizzate dai GDG di tutto il mondo, nel periodo tra settembre e novembre. Sono degli eventi composti da talk, codelab e momenti di networking dedicati a sviluppatori e designer professionisti, ad imprenditori, studenti o semplici appassionati e curiosi. Si tratta di un’occasione per condividere insieme competenze e passioni all’interno dell’universo delle tecnologie Google.\n","date":"2 December 2017","description":"","tags":[],"title":"GDG Venezia Tech Talks @ Ca' Foscari","uri":"/event/2017-12-02-devfest1-veneto/"},{"categories":[],"content":"Hey Data and Beers lovers! We’re back! We are launching the third Databeers Venezia! We are waiting for you next Thursday November 23 @ Negozio Piave 67, Venezia, starting at 19:30 sharp!\nIt will be a great night on the stage with:\nLeonidas Paterakis (@FablabVenezia) from FabLab, Venice\nLorenzo Speranzoni (@inserpio) from LARUS, Venezia\nFabiana Zollo (@zollofab) from Università Cà Foscari, Venezia\nPlease REGISTER as soon as possible so we can provide enough beers (and bagigi) for you all!\nBeers are again VERY KINDLY PROVIDED BY ESTRELLA!\nThanks to LARUS for the technical support and logistics.See you there!\nCheersAlice, Fabio, Marco, Nicola, Rocco\n","date":"23 November 2017","description":"","tags":[],"title":"DataBeers VCE 3","uri":"/event/2017-11-23-databeers-vce-3/"},{"categories":["rant"],"content":"Personalmente io adoro i raduni informatici e di data scienze, sono strani nel senso bello. Uno di quelli a cui riesco a partecipare di più in assoluto è il DataBeers di Venezia ↗ .\nHo partecipato dalla prima iterazione a questo evento e, dal mio punto di vista, questa terza iterazione è stata la migliore. Ci sono stati tre interventi di altrettante persone diverse:\nData Driven Design Leonidas Paterakis del FabLab di Venezia presenta il sistema del Data Driven Design. Attraverso degli algoritmi randomizzati o dati reali è possibile tradurli in oggetti fisici quali tavoli, sedie o lampade. Hanno utilizzato le “metaball” per la costruzione di un tavolo di design\nIcij Realeases Paradise Papers Data from Appleby Lorenzo Speranzoni di Larus mostra l’utilizzo dei database a grafo (utilizzato con Neo4J) per seguire i dati dei Paradise Papers. Molto interessante a livello di “lezione” in quanto mostra la reale utilità delle connessione dei dati, che risulta essenziale in alcuni casi, rispetto ad avere solo il dato in se.\nDisinformazione ai tempi dei social Fabiana Zollo, di Ca’ Foscari, ci parla delle bufale online e della loro diffusione grazie alla nostra enorme produzione di dati. Il problema fondamentale di questo periodo è nato dal fatto dal fatto che i media sono stati “materializzati” e resi indipendenti portandoli a essere plasmati dalla volontà del lettore stesso. Questo porta le persone a cercare informazioni che sono già allineate con le nostre ideologie\nPersonalmente mi sono piaciuti molto tutti gli interventi e ho finalmente trovato una ditta (Appleby) che utilizza Neo4J nei loro progetti.\nIl loro prossimo evento sarà l’anno prossimo e non vedo l’ora che arrivi anche se sono astemio.\n","date":"23 November 2017","description":"La mia terza esperienza al DataBeers di Venezia, mio quarto Databeers","tags":["rant","convention"],"title":"Un Astemio al Tezo Databeers","uri":"/post/2017/astemio-al-terzo-databeers/"},{"categories":["rant"],"content":"Uno dei problemi che avevamo al lavoro era quello di controllare un insieme di processi remoti. Quando hai un applicativo gestionale che deve visualizzare in breve tempo i dati all’utente senza rallentare mai la visualizzazione, devi avere alcune componenti/operazioni che lavorano in asincrono rispetto alla parte di I/O dell’utente.\nQuesto obbliga ad avere file di log nella macchina che sta eseguendo il task asincrono e dover leggere da quello l’esecuzione del processo nel caso io voglia vedere come sta andando il alvoro. Questo non sarebbe un problema se ci fosse solo una macchina che svolgie i processi asincroni ma ce ne sono due sempre in funzione che permettono di alleggarire il carico di lavoro e accellerarlo quanto basta per non creare code di task.\nQuesto ci porta alla necessità di avere una “dashboard/console/roba” che ci permetta di vedere in tempo reale l’andamento dei processi e, nel caso abbiano errori, identificare quale processo si è interrotto.\nNB Questo non è un tutorial completo in quanto non porto un esempio di codice in un linguaggio specifico in quanto può essere implementato con tutti i linguaggi di programmazione e di scripting\nPrima fase: strutturare il db ¶ Come prima fase devo andare su Firebase ↗ e creare un progetto in modo da ottenere così un database in tempo reale su cui è possibile leggere e scrivere.\nUna volta ottenuto il db, io creo un file json di prova dove inserisco tutti i tipi di task asincroni che posso lanciare e controllo che non ci siano sovrapposizioni di chiavi, in modo da avere il database ad oggetti diviso in parti corrispondenti ai task o gruppi di task.\nNon lo faccio direttamente sul db ma su un file apparte perchè se un elemento di firebase non contiene niente viene eliminato dal db stesso, rendendo così inutilizzabile la struttura del db se ho bisogno di un riferimento al risultato per lo sviluppo.\nSeconda fase: preparare il doppio logger ¶ Sovrascrivo la funzione che utilizzo per fare logging in modo che ogni qualvolta scrive nel file di logging, scrive anche nel campo Firebase associato, ottenendo così un hub di tutti i log dei processi asincroni.\nQuindi faccio in modo che, quando il processo termina con sucesso, cancella i dati di quel processo da firebase ottenendo così un elenco di solo processi attivi dentro firebase.\nPer come è strutturato il resto del codice, il progetto, se il processo asincrono non va a buon fine, non termina il processo e non cancella la voce dentro firebase. Questo mi permette di recuperare i dati di esecuzione di quella task e di lanciarla su un ambiente controllato dove viene poi fatto il debug del problema.\nTerza fase: costruire la visualizzazione ¶ Con HTML e JS è stato possibile creare una pagina statica che mi visualizza i dati dei task asincroni e del loro avanzamento, dividendoli per categorie e ordinadoli in tempo di avvio. Questo punto si puo’ anche saltare in quanto è possibile usare la dashboard di firebase stessa per avere lo stesso risultato con meno personalizzazione.\nSpero che questo articolo ti sia stato utile e, se vuoi qualche info in più ovuoi condividere la tua esperienza, commenta pure\n","date":"4 September 2017","description":"Utilizzare le funzionalità di Firebase in modo non 'standard'","tags":["coding","rant"],"title":"Utilizzi alternativi di Firebase","uri":"/post/2017/utilizzi-alternativi-di-farebase/"},{"categories":["dev"],"content":" ⚠️ This post is obsolete. ⚠️\nI suggest to go to the newest post from the Python’s Reptile Env series I am a big fan of podcasts. I enjoy listening to them while I’m commuting or at the gym. One of my favorites is by Kenneth Reitz ↗ , the author of several Python modules, including Requests, which every Pythonista knows and uses. His latest project that caught my interest is PipEnv, the “sacred marriage of pipfile, pip, and virtualenv.”\nLet’s start with the basics: to create a Python project, you usually go through 3 mandatory phases:\nYou create a virtualenv to work in, so that installed packages don’t conflict with those in the system, providing a clean environment. You select the modules needed for the project and install them in the virtualenv using pip. You generate a requirements.txt file from the virtualenv that indicates what is installed. This requires you to constantly keep the virtualenv updated and clean, keep the requirements.txt file synchronized, and pin the minimum versions (or the exact version) of the modules in the requirements.txt.\nPipEnv does all of this for you with a few simple commands.\nFor example? ¶ Let’s say I need to create a Python script that fetches RSS feeds and saves them locally.\nI create a folder for the project to keep everything I need organized: mkdir python_project I choose which Python version to use, whether the current one or the legacy version: pipenv --three # current Python 3.x version # alternatively pipenv --two # legacy 2.7.x I start writing code and installing the necessary packages for the project: pipenv install requests pipenv install flask These commands, along with the initial setup, allow me to create a Pipfile that describes the modules I’ve installed. The best thing about this Pipfile is that it allows for multiple “environments” within the same file. This means I can have “testing”, “travis”, “dev”, and “prod” all described in a single file and managed automatically.\nNow, suppose I realize I no longer need flask because I’ve rewritten everything to make the code more readable without it… What do I do?\npipenv uninstall flask This command removes flask from the Pipfile, keeping it “clean” and always up to date.\nOnce the Pipfile is defined, you need to create the Pipfile.lock—an automatically generated version based on the “current installation” to perfectly reproduce the environment.\npipenv lock This pins the installed modules with their version, hash, and other data for both the specified packages and their dependencies, providing all the information needed to reproduce that exact environment.\nIs that all? ¶ No, the system initially creates a virtualenv for the project and populates it according to the terminal commands. This virtual environment is accessible via the command:\npipenv shell This opens a shell within the project’s virtualenv and allows you to execute commands inside that specific environment.\nFurthermore, PipEnv allows you to convert existing requirements.txt files into a Pipfile if they are not already present, and to update all packages using:\npipenv update Conclusion ¶ Personally, I hope this system—or at least the Pipfile—becomes the standard for Python application development and replaces requirements.txt files, which I find particularly impractical and too sparse, even if they do exactly what they were designed for.\n","date":"1 July 2017","description":"Witnessing the marriage of Pipfile, Pip, and Pipenv.","tags":["python","dev","pipenv"],"title":"Pipenv and all in one tool","uri":"/post/2017/pipenv-e-come-tutto-e-in-uno/"},{"categories":[],"content":"Hey Data Lovers! Following the huge success of the first edtion… we’re back! Databeers Venice #2 is live! We’re waiting for you next Friday, May 19th @ Negozio Piave 67, via Piave 67, Venezia, starting at 18:00 sharp!\nFive stunning speakers will drive the scene for you:\nMarco De Nadai Dottorando di Ricerca, Università di Trento Cosa accomuna Bogotà e Los Angeles? Il crimine raccontato e predetto dalle caratteristiche urbane.\nLuca Salmasi Università di Perugia Stima degli effetti di trattamento da cartelle cliniche elettroniche: metodi e potenziali impatti.\nEmanuele Chiericato Imprenditore Digitale Come strutturare una strategia di lead generation per la propria azienda.\nBruno Anastasia e Maurizio Gambuzza Veneto Lavoro Navigare i numeri sull’occupazione\nAs usual, please REGISTER as soon as possible so we can provide enough beers (and bagigi) for you all!\nBeers are again VERY KINDLY PROVIDED BY ESTRELLA!\nThanks to LARUS for the technical and logistic support.\nSee you there!\nCheers\nAlice, Fabio, Marco, Nicola, Rocco\n","date":"19 May 2017","description":"","tags":[],"title":"DataBeers VCE 2","uri":"/event/2017-05-19-databeers-vce-2/"},{"categories":["rant"],"content":"Sono nell’evento del GDG di Venezia a vedermi il Google IO 2017 in compagnia di altri informatici e interessati. Questo è il resoconto dell’evento.\nPre evento ¶ Stiamo soffiando bolle in attesa dell’inizio dell’evento. Il GDG fa una piccola presentazione di cos’è il GDG e cos’è il Google IO 2017. Tutti siamo in fremente attesa dell’evento, anche se la location risulta essere una distrazione. Il posto è la tesa 94 dell’Arsenale di Venezia, ove Google ha una delle sedi del Grand Tour d’Italia. Nell’attesa Google ci fa soffiare bolle nel nostro telefono che vengono “lanciate” dalla nostra posizione e arrivano nei loro enormi contatori che, città dopo città, mostrano i risultati raccolti. E quindi tutto smette e passiamo a un enorme silenzio… E con una delle più fighe animazioni di sempre parte il Google IO 2017.\nPresentazione ¶ Il Ceo fa il grosso elencando tutti i numeri dei servizi “maggiori” di Google e i loro successi. Ad esempio Android ha raggiunto i 2 Milioni… Come se avessero ancora bisogno di mostrare i muscoli…\nMobile to AI first ¶ Tutti i servizi vengono ripensati per l’utilizzo di IA. Ad esempio per le mail sono riusciti a renderle discorsive le risposte dell’AI in modo da permettere di avere risposte fabbricate al volo per l’occasione. E’ stato cambiato il sistema di imput, ad esempio Voice, se usato su dispositivi diversi, riconosce comunque la persona che parla e usa le sue impostazioni. Invece, per il riconoscimento di immagini hanno mostrato quello per parti e sono risusciti a migliorare il riconoscimento superando quello dell’uomo. In oltre sono riusciti a migliorare le foto e rimuovere pattern ripetuti, ad esempio una grata.\nGoogle Lens ¶ Nuovo servizio di Google che utilizza la telecamera. Prima vede il prodotto poi ti dice cos’è. Riconosce i locali, i codici a barre delle reti e i fiori (gli allergici fanno i salti mortali dalla giocia). Tutto sviluppato su AI first Data second, come ormai tutti i servizi Google.\nCloud TPU ¶ Nuovo dispositivo per la costruzione di clasters per il machine lerning. Pensata per l’educazione e l’inferenza per il machine lerning. La struttura, essendo stata pensata per il clouster, viene anche portato sul Google Engigne. Si sta lanciando nel Cloud AI computing commerciale… Vuole togliere clienti ad Amazon?\nGoogle Assistant ¶ Scott Huffman parla dela semplificazione ottenuta dall’assistente che impara quelo che vuoi e te lo presenta, sempre pronto a chiaccherare e sempre pronto a fare discussione. Sono riusciti a creare un sistema sempre più discirsi che riconoscono la persona con cui parla. Ora è possibile anche collegare il cellulare/tablet via Google Lens che permette di interaggire con l’assitente. In oltre ora il Google Assistent è sisponibile anche sull’Iphone e esite un SDK per il Google assistent. In questo modo le app di terze parti possono sviluppare il loro supporto per l’assistant.\nIl Google Assitant può gestire creazione degli account, pagamenti e discussioni. Per fortuna i pagamenti passano per l’impronta digitale anche se Google ha i tuoi dati delle carte di credito e affini.\nGoogle Home ¶ Altro dispositivo che puo’ essere abbinato al Google Assistant. Permette di segnalare variazioni del calendario causate dal traffico, segnala notifiche attraverso le luci disposte sopra e permette di fare chiamate attraverso Google gratuitamente verso il Canada e USA. E riconosce la voce in modo da personalizzare l’esperienza utilizzando la configurazione personalizzata abbinata alla voce. Ora Google Home ha anche una infinità di altri servizi di compagnie video/televisive. Permette di mandare le informazioni nel dispositivo preindicato una volta richiesto un servizio. Tutti i dispositivi Cromecast.\nYoutube TV ¶ Altra alternativa a Netflix… Guerra aperta? Non so’… Ne hanno parlato troppo troppo poco per commenti realmente utili.\nGoogle Photo ¶ 500 Milioni di utenti per utente al mese. Cavolo, tanti…\nPhoto sharing ¶ Ora Google Photo ti suggerisce a chi condividere le foto… Questo permette di condividere le foto migliori con le persone corrette. E poi, le persone con cui le condivide, possono aggiungere le proprie foto dell’evento. In questo modo si riesce a creare un insieme di album personalizzati da gruppi di persone.\nShared Libraries ¶ Scelti degli account posso automaticamente condividere con loro le foto che rispondono alla query. In oltre permette di produrre degli automatismi per catalogare le foto condivise con questo meccanismo.\nGoogle Photo Books ¶ Permette di produrre album fisici di foto scegliendo le migliore e preparandole per la stampa. Per ora SOLO in America :-(…\nGoogle lens into Google Photo ¶ Questo permette di avere le informazioni delle foto e e estrarre da essi i dati. Mi ricorda una vecchia app di Google… Disponibile verso fine anno su Google Photos.\nYoutube ¶ Susan Wokcicki presenta le novità per Youtube. Parte tutto dal bilione di utenti al mese che vedono i video. Più di un bilione di ore di video guardate al giorno. Ora la maggior parte delle visualizzazioni è da mobile ma la visione dell’aumento delle visualizzazioni viene dai televisori attraverso l’assistant.\nYoutube on Tv ¶ Aumentato il servizio nella TV con l’aggiunta dei video 360° controllabile col telecomando. Questo è valido anche per alcune console e altre piattaforme che possono essere connesse alla TV.\nSuper chat ¶ Possono essere fatte dei messaggi colorati/personalizzati pagando una piccola cifra che viene, in parte, donata allo streamer. Disponibile anche una APi per la SuperApi per ottenere azioni nel mondo reale…\nAndroid ¶ Dave Burke presenta la parte di Android. 2 bilioni di dispositivi attivi al mese con Andoroid. Questo comprende auto, chromebook, orologi e televisioni. Installate 82 Bilioni di app finora. Ora è stato aggiunto un sistema Picture in picture dove mi permette di ridurre in un angolo una view. Aggiunte le notivication dots che indicano un aumento/attività della app e permette di vedere la notifica tenendoci il dito sopra. Ora è disponibile avere l’autofill di Chrome nelle mie app. Personalizzabile dagli sviluppatori.\nAggiunto un smart text selector che permette di riconoscere il testo che stai selezionando in modo da avere tutto il dato compesso (indirizzo, nomi lunghi, numeri di telefono e email) collegato.\nTenserflow Lite ¶ Permette di creare reti neuronali per app e permette di utilizzare la nuova api del nuovo framework per potenziare questo lavoro.\nVitals ¶ Linea della Google per migliorare la sicurezza, OS migliorie e miglioramento dello sviluppo.\nAutomatico controllo delle app installati. Ridotto il tempo di avvio delle app e del sistema operativo. Possibile aggiungere nuovi vincoli per le app in background. Aggiunti servizi di controllo su Android Studio.\nGoogle Play Protect ¶ Permette di scansionare tutte le app del dispositivo e trovare quelle a rischio.\nPlay Console Dashboard ¶ Per ogni Issiue ci fa una analisi dei problemi e come correggerli.\nKotlin ¶ Linguaggio nuovo per lo sviluppo andorid\nAndorid GO ¶ Riscrittura di andorid, app e playstore. Ottimizzato tutto il core e le app in modo di poter girare con memories piccole. VIene in automatico attivato il save data in alcune app conosciute per il “peso”. Aggiunte api per Bilding for Billions per avere un menù per app nel menù personalizzato di app ottimizzate.\nYoutube Go ¶ Youtube per connessioni con pochi dati. In oltre permette di salvare i dati del video e condividerli con un servizio integrato di peer to peer.\nVR ¶ Daydream ¶ Aumento dei servizi che supportano DayDream.\nSandalone ¶ Prodotto da ditte terze completi senza bisogno di altri dispositivi. Pensato completamente per VR permette una ottivizzazione del dispositivo e i sensori al suo interno.\nAR ¶ Seconda generazione di Cellulare Tango ¶ Più piccoli e conpatti.\nSupporto con Google Maps ¶ Cerca immagini intorno a te (Google Visual Positional System) che permette di trovare le indicazioni di movimento in un area. Permette, in oltre, di analizzare il mondo che ti circonda e ottenere posizioni reali di oggetti.\nAggiunto AR to Expeditions ¶ Permette di aggiungere un oggetto 3d nella classe e di navigare all’interno dello stesso.\nGoogle for Jobs ¶ Progetto per connettere persone e ditte per permettere di trovare lavoro più velocemente attraverso il machine learning. Ora il cerca permette di trovare lavori on il tag “retail jobs”. Negli Usa nelle prossime settimane.\nTensorflow Opensource ¶ Enormemente contenti dal successo del repository di Tensorflow.\n","date":"18 May 2017","description":"Sono nell'evento del GDG di Venezia a vedermi il Google IO 2017 in compagnia di altri informatici e interessati.","tags":["convention"],"title":"Google IO 2017","uri":"/post/2017/google-io-2017/"},{"categories":["dev"],"content":"This blog is publish with a docker image with GitLab. But I don’t like the image I was using because wasn’t update and it’s big and havy. So I fork the project for create an update version for my personal blog.\nSo I started with updating the old docker image I was using this image\nFROM debian:wheezy MAINTAINER yigal@publysher.nl # Install pygments (for syntax highlighting) RUN apt-get -qq update \\ \u0026\u0026 DEBIAN_FRONTEND=noninteractive apt-get -qq install -y --no-install-recommends python-pygments git ca-certificates \\ \u0026\u0026 rm -rf /var/lib/apt/lists/* # Download and install hugo ENV HUGO_VERSION 0.20.6 ENV HUGO_BINARY hugo_${HUGO_VERSION}-64bit.deb ADD https://github.com/spf13/hugo/releases/download/v${HUGO_VERSION}/${HUGO_BINARY} /tmp/hugo.deb RUN dpkg -i /tmp/hugo.deb \\ \u0026\u0026 rm /tmp/hugo.deb # Create working directory RUN mkdir /usr/share/blog WORKDIR /usr/share/blog # Expose default hugo port EXPOSE 1313 # Automatically build site ONBUILD ADD site/ /usr/share/blog ONBUILD RUN hugo -d /usr/share/nginx/html/ # By default, serve site ENV HUGO_BASE_URL http://localhost:1313 CMD hugo server -b ${HUGO_BASE_URL} --bind=0.0.0.0 So I build an image of this container and it was 171 MB in my machine.\nBut I can do better than this because i can use alpine in the place of debian:wheezy.\nI do this because the image for debian is bigger than the image for alpine. But if I will use alpine I need to change somethings because I can’t install .deb into the image. So i use the binary of Hugo for Linux find on Github. And install it on the image\nFROM alpine LABEL maintainer \"fundor333@gmail.com\" # Download and install hugo ENV HUGO_VERSION 0.20.6 ENV HUGO_DIRECTORY hugo_${HUGO_VERSION}_Linux-64bit ENV HUGO_BINARY ${HUGO_DIRECTORY}.tar.gz # Install HUGO RUN set -x RUN apk add --update wget ca-certificates RUN wget https://github.com/spf13/hugo/releases/download/v${HUGO_VERSION}/${HUGO_BINARY} RUN tar xzf ${HUGO_BINARY} RUN rm -r ${HUGO_BINARY} RUN mv hugo /usr/bin/hugo RUN rm -r LICENSE.md RUN rm -r README.md RUN apk del wget ca-certificates RUN rm /var/cache/apk/* # Create working directory RUN mkdir /usr/share/blog WORKDIR /usr/share/blog # Expose default hugo port EXPOSE 1313 # Automatically build site ONBUILD ADD site/ /usr/share/blog ONBUILD RUN hugo -d /usr/share/nginx/html/ # By default, serve site ENV HUGO_BASE_URL http://localhost:1313 CMD hugo server -b ${HUGO_BASE_URL} --bind=0.0.0.0 This time the size was 33,5 MB. Good but i can do BETTER.\nWhenever you wrote a new line with RUN you make the “compiled” into another layer so, if you have 22 command (like me) you have 22 layer for the image\nFROM alpine LABEL maintainer \"fundor333@gmail.com\" # Download and install hugo ENV HUGO_VERSION 0.20.6 ENV HUGO_DIRECTORY hugo_${HUGO_VERSION}_Linux-64bit ENV HUGO_BINARY ${HUGO_DIRECTORY}.tar.gz # Install HUGO RUN set -x \u0026\u0026 \\ apk add --update wget ca-certificates \u0026\u0026 \\ wget https://github.com/spf13/hugo/releases/download/v${HUGO_VERSION}/${HUGO_BINARY} \u0026\u0026 \\ tar xzf ${HUGO_BINARY} \u0026\u0026 \\ rm -r ${HUGO_BINARY} \u0026\u0026 \\ mv hugo /usr/bin/hugo \u0026\u0026 \\ rm -r LICENSE.md \u0026\u0026 \\ rm -r README.md \u0026\u0026 \\ apk del wget ca-certificates \u0026\u0026 \\ rm /var/cache/apk/* # Create working directory RUN mkdir /usr/share/blog WORKDIR /usr/share/blog # Expose default hugo port EXPOSE 1313 # Automatically build site ONBUILD ADD site/ /usr/share/blog ONBUILD RUN hugo -d /usr/share/nginx/html/ # By default, serve site ENV HUGO_BASE_URL http://localhost:1313 CMD hugo server -b ${HUGO_BASE_URL} --bind=0.0.0.0 Size 3,99 MB in this case.\nThe maggior part of the total size is caused by the size of the Hugo binary itself so I cann’t make an image lighter than the binary.\nNow the image size and number layers can change update after update so I put this image with the allwayes data about the images.\n","date":"16 May 2017","description":"This blog is publish with a docker image with GitLab. But I don't like the image I was using because wasn't update and it's big and havy. So I fork the project for create an update version for my personal blog.","tags":["docker","hugo"],"title":"Hugo into Docker","uri":"/post/2017/hugo-into-docker/"},{"categories":["dev"],"content":"Ho iniziato a utilizzare Emacs in modo sempre più completo, dai piccoli file a quelli sempre più grossi fino usarlo come editor unico. La parte più difficile è stata la parte iniziale dove sono dovuto entrare nella mentalità di Emacs ovvero quando ho dovuto imparare a lavorare su buffer e windows.\nDa questo punto di vista il tutorial dentro emacs è un ottimo punto di partenza e ambiente ove testare e provare i comandi su un documento “bloccato e non danneggiabile”.\nQuesto primo periodo di utilizzo mi ha permesso di vedere che è un programma completo e molto efficente. In modo particolare ho addirittura iniziato a sviluppare una prima bozza di personalizzazione del mio Emacs attraverso una prima configurazione di .emacs.d/ disponibile su Github ↗ .\nPrima fase installazione di base ¶ Partiamo con ordine: si inizia con l’installazione e comprensione dei config. Dopo l’installazione ottenuta attravero il classico\nsudo apt-get install emacs Fatto questo io mi aspettavo che, dopo il primo avvio generasse i file di configurazione. Per come è stato programmato Emacs l’avvio genera solamente il file .emacs se non presente mentre tutto il resto della “struttura” viene generata man mano che si modificano le impostazioni dei singoli elementi.\nQuindi ho fatto una piccola ricerca di come cambiare il tema di Emacs che, a mio parere, puo’ essere la personalizzazione corretta per iniziare a utilizzare Emacs.\nAll’avvio Emacs cerca un file .emacs ove dovrebbe trovare i config e, nel caso non lo trovi, va a .emacs.d/init.el ove cerca i config e, nel caso non trova nessuno dei due, genera un file .emacs vuoto o con le configurazioni delle “sessione” corrente. E qui c’è il primo punto di interesse:\nConviene usare .emacs o .emacs.d/init.el? ¶ Per le configurazioni in Emacs ci sono due possibili impostazioni:\nImpostazione storica che utilizza .emacs per mettere tutte le configurazioni Impostazione a progetto che utilizza .emacs.d/init.el La versione storica ha il vantaggio di essere facilmente “condivisa” essendo un unico file ma la versione a progetto ti permette di realizzare un sistema più ordinato di configurazioni e permette di usare sistemi di versioning (nel mio caso git) per ordinare e gestire un backup o comunque un sistema di condivisione delle config.\nLa mia configurazione in particolare ¶ Ho impostato Emacs utilizzando una impostazione a progetto, in modo da poterlo condividere facilmente su GitHub o altri servizi di hosting per repository git. Di base utilizzo init.el ove ho settato le basi e il tema, in modo che sia caricato senza problemi\n(add-to-list 'custom-theme-load-path \"~/.emacs.d/themes\") (load \"~/.emacs.d/init-packages\") (custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(custom-enabled-themes (quote (dracula))) '(custom-safe-themes (quote (\"b97a01622103266c1a26a032567e02d920b2c697ff69d40b7d9956821ab666cc\" default)))) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. ) Con questa configurazione si divide le variabili di ambiente settate da Emacs (che devo ancora capira a cosa servano), il tema scelto (Dracula ↗ in questo caso) e i settaggi per i pacchetti che vengono definiti nel file init-packages.el.\n(require 'package) (add-to-list 'package-archives '(\"elpy\" . \"http://jorgenschaefer.github.io/packages/\")) (add-to-list 'package-archives '(\"marmalade\" . \"http://marmalade-repo.org/packages/\")) (add-to-list 'package-archives '(\"melpa-stable\" . \"http://melpa-stable.milkbox.net/packages/\") t) (add-to-list 'package-archives '(\"melpa\" . \"https://melpa.org/package/\")t) (add-to-list 'load-path \"~/.emacs.d/site-lisp/\") ; list the packages you want (setq package-list '(magit easy-hugo python dracula-theme)) ; activate all the packages (package-initialize) ; fetch the list of packages available (unless package-archive-contents (package-refresh-contents)) ; install the missing packages (dolist (package package-list) (unless (package-installed-p package) (package-install package))) (when (\u003c emacs-major-version 24) ;; For important compatibility libraries like cl-lib (add-to-list 'package-archives '(\"gnu\" . \"https://elpa.gnu.org/packages/\"))) (package-initialize) Questo script in Lisp permette di elencare nella prima parte tutta una serie di repository extra da aggiungere all’elenco dei plugin disponibili e li aggiunge all’elenco di Emacs.\n(add-to-list 'package-archives '(\"melpa\" . \"https://melpa.org/package/\")t) Ad esempio questo codice aggiunge il repository Melpa ↗ all’archivio in modo da rendere disponibili i suoi pacchetti a Emacs.\n(setq package-list '(magit easy-hugo python dracula-theme)) Questo comando invece permette di elencare i pacchetti di nostro interesse. Ogni pacchetto elencato verrà installato o aggirnato e successivamente attivato all’avvio del server Emacs\n; install the missing packages (dolist (package package-list) (unless (package-installed-p package) (package-install package))) Questo è infatti il codice per l’installazione dei pacchetti mancanti.\nCon questa configurazione e l’aggiunta di un .gitignore abbastanza pulito mi è possibile mantenere una versione di ripristino dell’ambiente di lavoro Emacs compatibile con ogni sistema operativo che supporta Emacs.\nQuesta è la mia prima esperienza con Emacs e ne sono entusiasta anche se devo ancora consultare appunti per certi shortcut ma credo che andando avanti non ne avrò di bisogno.\n","date":"21 April 2017","description":"Diario del mio primo periodo di utilizzo di Emacs","tags":["rant"],"title":"Il primo periodo con Emacs","uri":"/post/2017/il-primo-periodo-con-emacs/"},{"categories":[],"content":"Lo spirito dei DataBeers è quello di dare la possibilità a appassionati, smanettoni e professionisti dei dati di raccontare quello che hanno scoperto su un data base a loro disposizione, come hanno impiegato una certa API, come hanno impiegato in modo “smart” i dati per risolvere un problema, cosa hanno scoperto analizzando twitter …. e molto altro!\nDATABEERS TUSCANY\nPer la terza edizione di Databeers Tuscany, in collaborazione con PyData Italy e organizzeremo un evento all’interno della PyCon8, la conferenza italiana che ogni anno accoglie centinaia di Python Lover a Firenze.\nPer questa edizione la birra sarà offerta da Estrella :-)\nEstrella\nAnche questa volta potrai assistere alla presentazione di 5 Data Case della durata di 12 minuti ciascuno (7 minuti di presentazione + 5 minuti di domande). E se non ami la matematica o la statistica non preoccuparti… nelle presentazioni è vietato agli speaker l’utilizzo di formule ;-) .\nIl programma del III° Data Beers Tuscany è il seguente:\nore 19.00: check-in iscritti\nore 19.30: Benvenuto dagli orgaizzatori e presentazione dei talk\nSmartcity vs Big Data vs IoT, Paolo Nesi Artistic Side of Spatial Data, Michele Ferretti Analisi Evolutiva del Calciomercato. Stefano Mastini Fast Retail Big Data Analysis, Valerio Maggio e Ernesto Arbitrio. TBA ore 20.45: Networking and Chatting\nSe oltre partecipare come spettatore vuoi presentare un Data Case scrivi a databeers.tuscany [ \\at] gmail.com.\nCi vediamo al prossimo DataBeers!\nNel frattempo seguici su twitter, unisci al nostro gruppo facebook e partecipa alle nostre conversazioni\n","date":"6 April 2017","description":"","tags":[],"title":"DataBeers Tuscany 3","uri":"/event/2017-04-06-databeers-tuscany-3/"},{"categories":["rant"],"content":"E sono passato a Hugo da Pelican perchè Pelican non mi soddisfa. Dopo un po’ di utilizzo di Pelican ho deciso di prendere e fare due cose a modo mio perchè non mi piacciono o non supportate: una risistema al tema che è vermente una mostrosità di codice e la gestione delle categorie\nProblemi personali ¶ Perchè ho deciso di cambiare? Perchè ci sono due cose che sento strette:\nLa strutturazione del layout, che sento stretta e strutturata in modo “sbagliato” L’impossibilità di avere multiple category per un singolo post senza implementare io stesso un plugin A questi si aggiunge che non sono mai riuscito a far funzionare correttamente la configurazione che obbliga a renderizzare solo i post “passati” e non “futuri” am credo che questo sia un problema mio.\nLa scelta ¶ Ho scelto Hugo rispetto a Jekyll in quanto non ho interesse a lavorare in Ruby ma, invece, sono incuriosito a lavorare in GoLang (linguaggio in cui è interamente scritto Hugo) e me ne hanno parlato molto bene.\nLeggendo anche in giro non mi è sembrava particolarmente difficile la conversione Pelican -\u003e Hugo per cui ho dato una occhiata a come eseguirla.\nPer avere un blog di Hugo devi avere:\nUna “installazione” aggiornata di Hugo Uno spazio web dove poterti connettere Un tema per Hugo Realizzazione ¶ Scelto il generatore statico di siti è stata la volta di implementareil resto del sito.\nInstallazione ¶ L’installazione di Hugo è la cosa più semplice. Scarichi dal sito ↗ e segui le istruzioni per installarlo nel sistema operativo che si possiede.\nUna volta installato è stato possibile utilizzare comandi di Hugo da terminale costruendo così lo scheletro del tema e della struttura del blog.\nContenuto ¶ Bisogna convertire tutto il contenuto in un formato conpatibile con Hugo. Per mia fortuna il formato è sempre un Markdown per i contenuti mentre uso il formato Toml per i metadata. Hugo supporta anche altri formati per i metadata ma quello in cui mi trovo meglio è il Toml e di conseguenza ho modificato (a mano) tutti i post e le pagine per farli funzionare col nuovo sistema.\nTema ¶ Per il porting del sito è stato necessario fare il porting del tema in Hugo da Pelican o usare uno dei temi disponibili online. Ho quindi deciso di prendere i css e i js del tema pelican e riscriverlo per Hugo. E’ stato retalivamente facile una volta capito il sistema di temi di GoLang che risulta diverso da Jinja ↗ , che è il sistema utilizzato da Pelican.\nPublicazione ¶ Fatto questo ho portato tutto su GitLab dove ho configurato il settaggio per la compilazione automatica in modo da porter pushare i file e lui pensa a ricompilare tutti il sito.\nimage: publysher/hugo pages: script: - hugo artifacts: paths: - public only: - source Con questa configurazione ogni qual volta viene pushato un commit del branch source lui esegue l’elaborazione del sito nella cartella public che viene a sua volta visualizzata da GitLab come root del sito internet e distribuita online a chiunque richieda la pagina.\nHTTPS ¶ Ho utilizzato Let’s Encrypt ↗ per generare un certificato per il dominio associato al sito e lo ho caricato su static/.well-known come indicato dal servizio ottenendo così una connessione https configurata per il mio dominio\n","date":"4 April 2017","description":"Come e perchè sono passato a Hugo da Pelican","tags":["hugo","blogging"],"title":"E sono passato a Hugo","uri":"/post/2017/e-sono-passato-a-hugo/"},{"categories":[],"content":"Hey Data Lovers! The wait is over! The first Databeers Venezia is coming! Save the date! Friday, February 17th, 2017 at Negozio Piave 67 (just few minutes walking from Venezia-Mestre railway station). For the first event we have great speakers for you!\nAlessandro Scarpellini Aesse branding \u0026 visual communication | Rimini\nValentino Pediroda CEO and Founder of ModeFinance, the first fintech Credit Rating Agency in Europe | Trieste\nDuccio Schiavon CEO at Quantitas, Data Visualization | Venezia\nWe can’t wait to see all of you there, but please REGISTER and CONFIRM your attendance, so we’ll be sure to provide enough beers for you! Many thanks for the support to “Negozio Piave 67” and LARUS.\nBeers are VERY KINDLY sponsored by Estrella!\nStay tuned, we’re going to share more updates here and on our official Twitter account!\nAlice, Elisa, Fabio, Marco, Rocco\n","date":"17 February 2017","description":"","tags":[],"title":"DataBeers VCE 1","uri":"/event/2017-02-17-databeers-vce-1/"},{"categories":["rant"],"content":"E ho iniziato a scrivere con Emacs questo blog. Questo mi porta a essere orgoglioso di dire che questo blog è mouse free!\nOk posso capire che per la maggior parte di voi non capirà perchè questo cambiamento è rilevante per me ma, dal mio punto di vista, è un ENORME upgrade tecnico. La possibilità di avere un intero editor di testo personalizzabile, multipiattaforma e completamente open source mi ha sempre particolarmente colpito ma non ho mai trovato uno che lo sentissi mio. Attualmente uso molto Atom ma lo sento molto stretto soprattutto perchè, visto che deve supportare molti linguaggi (e di conseguenza molti plugin), risulta rallentato.\nCome sono arrivato a questa scelta ¶ Io ho bisogno di un software di editor di testo che avesse determinate funzioni:\nMultipiattaforma in generale preferisco software che sia multipiattaforma e che quindi mi permetta di passare senza problemi da un sistema ad un altro.\nCompletamente configurabile permettendomi di trasformare l’ide/editor in esattamente quello di cui ho bisogno.\nOpen Source personalmente preferisco software open source a quello a pagamento ma non disdegno software a pagamento.\nDeve poter supportare tutti i linguaggi che voglio questo è il problema più grosso. Se il programma scelto ha un buon sistema di plugin, questo permette anche di avere un buon supporto per un ampio numero di linguaggi attraverso i plugin stessi.\nI candidati alla posizione ¶ Ho esaminato alcuni editor di testo e ho analizzato i loro punti di forza e di debolezza. Questa analisi rimane soggettiva e basata sulle mie personali esigenze e non obbligatoriamente quello che per me è un difetto per altri potrebbe essere un pregio.\nAtom, Code e Sublime Gruppo di editor di testo espandibili ma per me poco pratici: Sublime ha il discorso della licenza da pagare e, da quello che ho visto nella versione di prova, per le mie esigenze non è motivata la spesa. Atom e Code di perse funzionerebbero anche bene ma è il sistema di plugin e i limiti dati da Node.js (esempio il fatto che devi aver installato Node.js e che per alcuni file abbastanza grandi soffrono, senza contare crash non comprensibili) risultano troppo “esigenti” rispetto a quello che necessito a livello di funzionalità. Infatti se sovraccaricati di funzionalità/plugin entrambi gli editor ne risentono molto e molto velocemente.\nVim Editor testuale tra i più vecchi al mondo. Installato in ogni sistema server esegue egregiamente il suo lavoro ma, dopo una brutta esperienza con lui per un commit, non sarei molto per usarlo.\nEmacs Altro editor testuale molto vecchio, completamente open source risulta molto leggero ed è completamente configurabile conoscendo Lisp e usando i plugin appositi\nOltre a questi ce ne sono molti altri che sono troppo situazionali che non ho nemmeno considerato o perché sono close source che amo.\nDa qui mi sono informato sui plugin disponibili per Emacs e, dopo aver visto che c’è​ il plugin per pelican e molti per Python, ora sto imparando a usare Emacs\n","date":"14 February 2017","description":"Cos'è Emacs e perchè ho iniziato a usarlo e rimosso il mouse dal mio set per il pc","tags":["coding","rant"],"title":"Emacs e mai più mouse","uri":"/post/2017/emacs-e-mai-piu-mouse/"},{"categories":["dev"],"content":"Si sta avvicinando il Pycon 8 e io ci parteciperò. Questo vuol dire che ho raccolto i soldi e sto preparando la strumentazione necessaria per quest’ anno. Visto quello che è successo l’anno scorso ho deciso di preinstallate Jupyter e essere pronto a fare degli appunti direttamente in notebook. Per questo ho cercato un sistema per convertirli in markdown, così da usarli anche nel blog, o farli leggere direttamente da Pelican e ho fatto una stupenda scoperta: esiste già questo plugin.\nPer rendererizzare i file .ipynb è necessario aver installato il plugin pelican-ipynb e settato i metadati del .ipynb coi i metadata corretti:\nTitle titolo del post Slug indirizzo del post Date data di publicazione del post Category categoria del post Tags tag del post Author autore del post Summary riassunto del post e settare i tipi di markup supportato con\nMARKUP = ('md', 'ipynb') facendoli vedere così i file .ipynb come file da eseguire e visualizzare come post.\nL’unico difetto di questo plugin è che che non supporta, per ora, il metadata Status.\nE quindi funziona? ¶ E si arriva alla domanda fondamentale: “Funziona?” La risposta è si, funziona.\nprint('Hello world!') Hello world! Come vedete nel blocco di codice sopra è funzionante e permette di fare tutto quello che normalmente faresti con Jupyter.\ncolumnA = ['Temporary','Intermittant','Partial','Redundant','Total', 'Multiplexed','Inherent','Duplicated','Dual-Homed','Synchronous', 'Bidirectional','Serial','Asynchronous','Multiple','Replicated', 'Non-Replicated','Unregistered','Non-Specific','Generic','Migrated', 'Localised','Resignalled','Dereferenced','Nullified','Aborted','Serious', 'Minor','Major','Extraneous','Illegal','Insufficient','Viral', 'Unsupported','Outmoded','Legacy','Permanent','Invalid','Deprecated', 'Virtual','Unreportable','Undetermined','Undiagnosable','Unfiltered', 'Static','Dynamic','Delayed','Immediate','Nonfatal','Fatal','Non-Valid', 'Unvalidated','Non-Static','Unreplicatable','Non-Serious'] columnB = ['Array','Systems','Hardware','Software','Firmware','Backplane', 'Logic-Subsystem','Integrity','Subsystem','Memory','Comms','Integrity', 'Checksum','Protocol','Parity','Bus','Timing','Synchronisation','Topology', 'Transmission','Reception','Stack','Framing','Code','Programming', 'Peripheral','Environmental','Loading','Operation','Parameter','Syntax', 'Initialisation','Execution','Resource','Encryption','Decryption','File', 'Precondition','Authentication','Paging','Swapfile','Service','Gateway', 'Request','Proxy','Media','Registry','Configuration','Metadata', 'Streaming','Retrieval','Installation','Library','Handler'] columnC = ['Interruption','Destabilisation','Destruction','Desynchronisation', 'Failure','Dereferencing','Overflow','Underflow','NMI','Interrupt', 'Corruption','Anomaly','Seizure','Override','Reclock','Rejection', 'Invalidation','Halt','Exhaustion','Infection','Incompatibility', 'Timeout','Expiry','Unavailability','Bug','Condition','Crash','Dump', 'Crashdump','Stackdump','Problem','Lockout'] columnD = ['Error','Problem','Warning','Signal','Flag'] from random import randint bofhExcuse = columnA[randint(0,len(columnA)-1)]+' ' bofhExcuse += columnB[randint(0,len(columnB)-1)]+' ' bofhExcuse += columnC[randint(0,len(columnC)-1)]+' ' if(randint(0,100) \u003e 80): bofhExcuse += columnD[randint(0,len(columnD)-1)] print 'Today\\'s issue is: '+bofhExcuse Today's issue is: Duplicated Proxy Overflow ","date":"14 February 2017","description":"Come ho combinato Jupyter con questo blog in Pelican","tags":["coding"],"title":"Jupyter Notebook Pelican Combo","uri":"/post/2017/jupyter-notebook-pelican-combo/"},{"categories":["dev"],"content":"Ho voluto provare a imparare a usare i decoratori e mi sono ritrovato a fare un intero bot telegram basato su codice funzionale e decoratori.\nL’inizio di tutto ¶ Ho trovato una libreria Python per lo sviluppo di bot per Telegram (cosa che mi ha sempre affascinato) e ho deciso di provare a scrivere un bot semplice. Quindi inizio a utilizzare questa libreria python-telegram-bot ↗ e inizio a scrivere i primi metodi per gestire i comandi per il bot e noto una cosa: ogni volta che scrivo una funzione devo legarla a “ascoltatore” che la esegue quando riceve il comando.\nAd esempio se io ho definito prima qi questo frammento di codice una funzione start che mi gestisce il comando omonimo, poi io devo registrarla all’updater attraverso il dispatcher come qui sotto.\nupdater.dispatcher.add_handler(CommandHandler('start', start)) Visto che devo riscrivere questa riga per ogni volta che voglio scrivere un comando per il bot ho pensato che sarebbe bene avere un “alias” per questa riga di codice che prenda in input la stringa a cui voglio risponda e la funzione.\nAlla ricerca di una alternativa ¶ Da bravo programmatore ho subito pensato che:\nIo una cosa così la ho già vista Qualcosa dentro di me dice di guardare il mio codice di prova di Flask Apro quindi il mio file prova-stupida-flask.py\nfrom flask import Flask app = Flask(__name__) @app.route(\"/\") def hello(): return \"Hello World!\" if __name__ == \"__main__\": app.run() E capisco che @app.route(\"\") è un decoratore che collega la funzione hello a un listener che risponde all’indirizzo localhost/. Esattamente quello che mi serve.\nDa una sbirciata al sorgente di Flask produco una classe che gestisce il token e contiene il metodo\ndef command_handler(self, name): def decorator(f): self.updater.dispatcher.add_handler(CommandHandler(name, f)) return f return decorator che mi permette di scrivere una funzione di gestione di un comando con un piccolo decoratore sopra che fa tutto il lavoro\n@mybot.command_handler('start') def start(bot,update): /_codice che genera il resto_/ E qui felice, continuo a scrivere codice fino ad accorgermi che continuavo a riscrivere la stessa funzione a meno di alcuni “parametri”.\nHo quindi scritto un nuovo generatore di funzioni in modo tale\ndef location_generator(bot, name, text, lonlat): @bot.command_handler(name) def decoreted(bot, update): logging.info(\"Give the \" + name + \" info\") BOTAN.track(update.message, name) bot.sendMessage(chat_id=update.message.chat_id, text=text,parse_mode=ParseMode.MARKDOWN) lon, lat = lonlat bot.sendLocation(chat_id=update.message.chat_id, latitude=lat, longitude=lon) return decoreted In questo modo, una volta passati i parametri corretti, questo genererà una funzione per rispondere con un testo seguito da una location al comando assegnato.\nConclusioni ¶ Personalmente sono molto soddisfatto su come mi è venuto il plugin ma non sono soddisfatto di come è fatto il modulo… Forse ci metterò mano o ne faccio uno io stesso… Vedremo\nFundor333\n","date":"11 February 2017","description":"Come un mio tentativo di imparare a usare i decoratori in python è sfociata in un bot in Python","tags":["bot","python","coding","post"],"title":"Bot, Telegram e programmazione funzionale","uri":"/post/2017/bot-telegram-e-programmazione-funzionale/"},{"categories":["rant"],"content":"Io sono un pythonista che cerca di rimanere informato di quello che succede nel mondo di Python e quello che fanno alcune aziende particolarmente grosse o di mio interesse.\nQuindi quando ho visto che Google lancia Grumpy in un articolo nel loro blog ↗ non potevo che essere incuriosito e interessato ad avere ancora più notizie sul questo progetto. E, grazie ad un podcast che ascolto ho avuto ancora più notizie.\nIo sono iscritto al podcast Talk Python ↗ dove in un episodio ↗ è stato intervistato Dylan Trotter, Ingegniere Youtube e un entusiasta di GoLang.\nQuesta intervista mi ha permesso approfondire questo progetto che mi incuriosiva molto.\nGrumpy ↗ è un compilatore source-to-source ovvero un software che, dato del codice in un linguaggio, lo converte in un altro linguaggio di programmazione, con un compilatore che lo compila e esegue.\nPersonalmente lo trovo molto interessante perchè mappa alcune strutture Python (dico alcune in quanto il 70%-80% delle strutture di Python sono state “mappate” da Grumpy ma non ancora tutte) vengono transposte in GoLang, ottenendo così le ottimizzazioni di GoLang per quanto riguarda i processi concorrenti e alcune strutture, oltre a un tempo migliore in quanto non sarebbe più codice interpretato ma eseguito.\nLa cosa che, però, a me interessa di più è capire perchè Google ha spinto in questa direzione e qui mi viene in aiuto il podcast di TalkPython: Google, il motore di ricerca e YouTube, il front end per lo meno, sono interamente gestiti da codice Python 2.7.x.\nInfatti Google vuole sostituire tutto il codice Python 2.7.x (definito legacy code) con una versione più “nuova e performante” per mantenere il sistema performante e sempre al massimo della potenza. Per questa ragione potrebbe, in futuro, convertire alcune componenti da Python 2.7.x (notare bene che, per ora, Grumpy non supporta la conversione di Python 3.x) in GoLang in modo automatico per semplificare e velocizzare il lavoro. Questo mostra, anche, una grossa intenzione di abbandonare Python 2.7.x (NB: non è possibile fare assunzioni su Python 3.x da Grumpy) in favore di altri linguaggi più moderni/efficaci/adatti al sistema immenso di cluster che Google deve gestire.\nPer questo motivo io inizierò a sperimentare con Grumpy per capirne i limiti e i vantaggi rispetto a un CPyhton o Jython e a fare più attenzioni alle librerie per GoLang rilasciate da Google.\n","date":"26 January 2017","description":"Cos'è Grumpy e come la penso su questo progetto di Google e le sue conseguenze","tags":["python","coding"],"title":"Grumpy, come convertire il serpente nel gopher","uri":"/post/2017/grumpy-come-convertire-il-serpente-nel-gopher/"},{"categories":["dev"],"content":"Ho riscritto interamente il blog. Ora gira tutto in Python… Anche se nel server è tutto in HTML5.\nQuesto perchè sento la necessità di legarmi a una tecnologia più elastica e a me congeniale rispetto a PHP. Prima infatti tutto il blog era basato su wordpress ma, cercando di sviluppare un tema per il blog non ero convinto.\nCosì sono passato da un blog dinamico a uno statico.\nCome mi hanno detto una volta, le storie miglioni non hanno un inizio, si parte già al centro dell’azione e questo è quello che è successo: io stavo scrivendo un layout html per questo blog ma non ero soddisfatto di dover utilizzare PHP come linguaggio di composizione delle pagine. E’ qui che ho iniziato a farmi idee su come potermi sganciare da wordpress e PHP verso qualcosa di più nel mio stile più mio. Qui è quando ho visto un blog che seguo da tempo nel mio aggregatore di RSS, il blog di Eevee ↗ . E’ un blog di questo programmatore che seguo da un po’ appassionato di Python e gaming, con una leggera passione per i PokeMon.\nQui avevo notato che, nel footer, c’era l’avviso che il blog è stato realizzato in Python ma con un “web framework” che non conoscevo, Pelican ↗ . Dopo una prima analisi della documentazione mi rendo conto che è un generatore di siti statici, ovvero dato qualcosa ritorna un sito HTML completamente costruito dai dati che gli dai in pasto (nel mio caso dati in formato Markdown ↗ ) compreso di post e pagine.\nQuesto mi ha portato a realizzare un tema basato sulla sintassi utilizzata dal Jinja2 ↗ .\nDefinizione del tema ¶ Il tema in se non è stato difficile da realizzare, molto css era già pronto da miei precedenti tentativi di realizzare un tema personale ma è stato lungo realizzare tutti i cicli per la visualizzazione corretta di pagine, articoli e link più per una questione di mio gusto artistico che che per un reale problema tecnico/limite di Pelican.\nCon l’aiuto di Bootstrap ↗ mi è anche stato facile realizzare il sito in modo responsive, sistemando così anche questo problema.\nBackup da wordpress ¶ Con l’aiuto di un comando integrato di Pelican è stato possibile importare il vecchio sito wordpress. Questo mi ha permesso di poter mantenere i post del blog vecchio assieme alle pagine. Tutto questo è stato quindi salvato in formato Markdown e suddiviso nelle rispettive directory in base alla categoria e ri-etichettate in base al nuovo sistema utilizzato da Pelican.\nPiccola nota a parte sulla cosa: io mi trovo MOLTO meglio con il sistema di gestione di pagine e articoli di Pelican che quello di Wordpress. Qui io posso aggiungere ai miei post un nuovo meta-dato e creare una corretta visualizzazione del metadato stesso senza andare a toccare Pelican stesso (come avresti dovuto fare con Wordpress).\nInstallazione plugin ¶ Inizialmente io ho pensato di utilizzare la “nuova” funzionalità dei sub-moduli di Git ma questo mi ha portato più problemi che altro.\nDopo svariati tentativi e poca comprensione di perchè continua a essere elaborato male da git e dal mio ide ho pensato che i plugin sono più facili da gestire semplicemente copiandoli in una cartella e aggiornando a mano.\nSistemazione articoli e pagine ¶ Ho fatto un po’ di pulizia perchè il meccanismo di importazione automatica lascia dello “sporco” qui e li sotto forma di codice html/css non più desiderato in alcuni punti (precedentemente era usato da plugin e dal tema di wordpress per fare cosucce ma col passaggio è risultato inutile).\nStessa cosa è successa con le pagine ed è stato più veloce. Sono, per ora, in attesa di revisione e correzione, in modo che siano aggiornate e più coerenti con la grafica del nuovo tema.\nTravis e la autopublicazione ¶ Dopo aver elaborato le pagine e gli altricoli ho quindi preparato il repository github seguendo il paradigma di Git Flow ↗ e preparando TravisCI per la autopublicazione degli articoli. Questo mi consente di accedere a un qualunque pc collegato a internet, andare sul sito di github, aggiungere il post o editare parte del sito e travis si occupa dell’elaborazione e di mandarmi il log in caso di fallimento, tutto intermente sul server, senza aver niente installato sul pc che sto usando per scrivere.\nIl settaggio di Travis in se mi ha tolto circa un ora di sonno perchè non sono stato in grado di capire alcuni piccoli comandi. Ora però il meccanismo funziona e, grazie alle funzionalità beta di Travis ho avuto una idea…\nProgetti per il futuro ¶ Intanto spero di rilanciare il blog, renderlo più attivo e seguito e poi spero di riuscire a scrivere un piccolo plugin per Pelican ma questa è una storia per un altra volta…\n","date":"14 January 2017","description":"Come scrivere un blog interamente in pelican, gestito in github e travis con autopubblicazioni","tags":["rant","git"],"title":"Scrivi, push e publica","uri":"/post/2017/scrivi-push-public/"},{"categories":[],"content":"","date":"17 December 2016","description":"","tags":[],"title":"GDG Venezia Tech Talks @ Ca' Foscari","uri":"/event/2016-12-17_gdg_-venezia_tech_talks_ca_foscari/"},{"categories":["rant"],"content":"(°,,,°)\nThis is my face when I open Twitter…\nA fragment of code with parentesies at the end of the row…\nUse whatever brace style you prefer.\nBut not this.\nDon’t do this.\nSeek help instead of this.\npic.twitter.com/1EYb7BLHkb— hiscursedness@mastodon.art (@HisCursedness) October 19, 2016\n\\|/(x,,,x)\\|/\nThis is one of the think you must not do. The bon ton of coding show you how you need to write the code. You need to write in a way which you will can read it easy in eons in the future with different coders. If you write code like this when you came back to it, because you will, you will soffer for your older decision, cursing yourself for years to come because you will need to rewrite some part or all of the orrible code you wrote.\nSo thing allwayse to write good code because the coder-karma is a monster and has your home adress and come when you don’t have time to rewrite the horror-code.\n","date":"9 November 2016","description":"How to use parentesies in coding","tags":["coding","rant"],"title":"Parentesys Horror","uri":"/post/2016/orrori-delle-parentesi/"},{"categories":["rant"],"content":"Quando hai un progetto Git, normalmente lo usi per fare controllo delle versioni.\nUna volta che il progetto è nella fase di rilascio tu hai quindi un repository molto “pieno” di dati temporali e di chi a modificato cosa e quando. E’ solitamente in questo momento che io faccio il “Gource” del progetto.\nCos’è questo “Gource” che io faccio dei miei progetti? E’ una rappresentazione grafica dello sviluppo del progetto utilizzando i log del version controll software utilizzato per il progetto.\nIl video qui sotto è esattamente questo: un progetto sviluppato per il corso di Ingegneria del software con Git come vcs.\nGource ↗ quindi è solo un applicativo software per visualizzare la crescita dei file di un progetto come fosse una pianta che cresce e muore in base ai file modificati, tolti e aggiunti del progetto.\nPersonalmente lo trovo molto utile per capire i momenti in cui ci sono stati problemi nello sviluppo ad esempio creazione di grandi quantitativi di file presto eliminati o un gruppo di sviluppo che va a toccare troppo i file di altri gruppi puo’ servire a una revisione di fine progetto.\nMolto interessante risulta essere anche il progetto derivato da Gource ovvero Lostalgia ↗ . Lostalgia è un visualizzatore di log per server web. Ti permette di visualizzare le richieste ricevute e servite in modo pratico e veloce.\nIn particolare è possibile vedere molto velocemente traffico “sospetto” come quello nel video qui sopra. Infatti questo video è un attacco SQLInjection con un successivo DDOS attack. Questo vuole dire che prima raccoglie tutto quello che può da un unico indirizzo client e successivamente intasa tutte le richieste\n","date":"7 November 2016","description":"Gource, cos'è e come usarlo al meglio","tags":["git"],"title":"Gource, visualizzare Git repository","uri":"/post/2016/gource-visualizzare-git-repository/"},{"categories":["rant"],"content":"Esco in questi giorni da un Hackathon organizzato dalla regione Veneto (qui ↗ info), portando a casa con la mia squadra un felice e molto sudato terzo posto. Si ok abbiamo programmato in modo continuo per 24 ore ma seguendo poche regole capite successivamente dopo aver recuperto le ore di sonno.\nPartiamo dalle basi: l’hackathon solitamente sono 24 ore continue di programmazione, in cui bisogna produrre un programma “pronto” per la presentazione. Di conseguenza bisogna partire con:\nUn buon portatile, configurato con i pacchetti di base per la programmazione. In base all’hackathon ci possono essere delle specifiche per le piattaforme per cui sviluppare per cui controllare sempre il regolamento Alimentatori, prese multiple e alimentatori vari. Essenziali per far durare la tecnologia le 24 ore necessarie per l’hackathon. Un buon riposo. Per partecipare e pensare di essere produttivi a questi eventi è necessario avere una buona notte di riposo alle spalle per poter durare il più possibile durante le 24 ore successive Avere un buon team, equilibrato. La cosa importante è che il team sia a conoscenza dei propri limiti e delle poche carenze e miri a utilizzare ipunti di forza presenti. Conoscere i propri limiti fisici. Sapere quando ormai non stai più programmando ma solo danneggiando la squadra ed è meglio farsi un pisolino o quattro passi al chiaro di luna. Questo è il necessario pre gara. Io mi sono presentato a questo hackathon senza team ma devo ringraziare qualche buona stella che mi ha fatto trovare questo splendido team che mi ha permesso di arrivare al terzo posto.\nPassiamo quindi a cosa si fa in gara:\nTrovare una idea entro la prima ora. Essenziale per non perdere tempo e poter cercare quello che serve e vedere se esistono progetti simili da cui carpire pregi e difetti. Definire le tecnologie da usare subito. In questo modo si riduce il tempo perso in discussioni inutili (tipo preferisco questo framework a quello) e ci si dedica subito allo sviluppo. Assumere teina/caffeina al giusto ritmo per rimanere svegli. Questo ti permetterà di reggere più a lungo anche se poi lo sentirai tutto sulla tua pelle finito l’evento Cercare che il team non perda il ritmo. L’importante è che il progetto non si fermi. Sempre avanzare e portare avanti quanto prefissato. Dividersi i compiti. Appena si finisce qualcosa si chiede cosa manca da fare al resto del team. Puo’ sembrare una cosa stupida ma così si ha sempre il polso della situazione su cosa manca da fare e cosa è già stato fatto Tenere le ultime 4-5 ore per debug e bugfix. Le ultime ore sono le più dure da rimanere svegli per cui è bene sistemare solo le ultime cose invece di implementare interamente nuove funzionalità. Meglio quindi aver tutto già strutturato e sistemare i dettagli Così è come ho vissuto il mio primo (e non ultimo) hackathon e lo reputo una delle più belle esperienze mai fatte. Lo consiglio a qualunque programmatore che vuole provare a mettersi in gioco e lanciarsi in una corsa contro il tempo per realizzare un piccolo progetto e divertirsi.\nIn ogni caso, il giorno dopo l’hackathon è perso causa recupero delle ore di sonno della gara…\n","date":"25 October 2016","description":"Sommario della mia avventura all'Hackathon eodappathon","tags":["hackathon","programmazione","tutorial"],"title":"Come sopravivvere a un Hackathon programmando","uri":"/post/2016/come-sopravivvere-a-un-hackathon-programmando/"},{"categories":[],"content":"I’ve decided to start sharing some episodes that happened to me as an IT technician.\nIt all began with a request from a very dear friend of mine to take a look at some computers at a stationery store near my house.\nThis stationery shop had an internet point that had become a haven for all things evil—hell itself—and every virus AVG could possibly detect… Not to mention the spider web/Gordian knot/death trap that was their cable system. That’s where I started, by getting my hands on that setup (I’m not calling it a horror only because, after reading Lovecraft, I know it could have been worse—even if it came close…) and offering on-call tech support.\nFrom this experience came the stories in the series What Did You Just Do, Sorry? (now called Horror stories), an irregularly scheduled column depending on what happens to me.\nPersonally, I hope it doesn’t happen often—but I know from experience that Murphy ↗ is always lurking, in pleasant company with the FuckUp Fairy ↗ .\n","date":"12 October 2016","description":"How start my horror story for a little shop","tags":["rant"],"title":"How it started","uri":"/post/2016/come-tutto-e-iniziato/"},{"categories":["rant"],"content":"Spesso e volentieri uno dei problemi dello sviluppo di software è avere backup del codice e condividerlo in modo da poterci lavorare in più persone in contemporanea senza sovrapporre le modifiche. Queste due richieste vengono soddisfatte con un software di version controlling che permetta il lavoro di multipli utenti.\nDopo una analisi ho capito che Git ↗ è quello che fa al caso mio.\nCome sono arrivato a Git?\nHo copiato il più grande progetto Open Source che conosco: il Kernel Linux.\nVedendo che il Kernel usa Git per il version controlling ho deciso di capire perchè lo usano. Linus da alcuni motivi validi:\nE’ indipendente dalla piattaforma usata Tiene traccia delle modifiche effettuate ai file non a tutto il file Non esiste un repository più importante degli altri quindi tutte le copie del repository possono essere sostituite senza che ci siano perdite al progetto Non necessità della rete per funzionare. La rete la usa solo per condividere le modifiche con eventuali server o le altre copie del repository Garantisce che “tutto il codice che butti dentro non viene toccato” E’ facile fare una diramazione del progetto, tenerne traccia e, finite le modifiche desiderate, farla ritornare nel “ramo” principale in frazioni di secondo fino a pochi secondi per progetti particolarmente grandi. Questa tipologia si chiama software di version controlling distribuito. Questo si contrappone ad altri software che richiedono un server a cui bisogna accedere per fare qualunque operazione.\nPerchè è la soluzione per me?\nPerchè risponde alle richieste di gratuità, coerenza del codice e permette di lavorare offline. In oltre mi permette di scaricare i repository SVN, che è il servizio storico ed è molto usato.\nCome funziona tutto ciò?\nIn modo semplice se si capisce come ragiona. Altrimenti è aramaico antico…\nData una cartella contente il repository Git, se io faccio un cambiamento questo file viene analizzato da Git con la versione in memoria. Le differenze tra le versioni sono quelle che Git memorizza. Le modifiche ai file assumono quindi degli ‘stati’: registrate, non controllate, sotto osservazione.\nNormalmente le modifiche sono effettuate nella “Working Directory” e passano nella “Staging Area” dopo che vengono selezionate con il comando git add nomefilemodificato.estensione.\nUna volta qui vengono raggruppate con git commit e gli viene messo del testo per spiegare lo scopo delle modifiche. Se si va a vedere cosa contiene un “commit” si trovano, per ogni modifica fatta, i dati di cosa è stato tolto o messo per ogni riga e file toccati dalla modifica. Quindi il tutto può essere inviato attraverso la rete a destinazioni predefinite col comando git push o è possibile recuperare le modifiche effettuate da altri con un git pull.\nA tutto questo, si aggiunge il sistema dei branch o ramificazioni che permettono di tenere una versione “stabile” del progetto mentre si lavora a nuove componenti stando tranquilli che, nel caso di problemi, è possibile tornare indietro alla situazione “tranquilla”.\n","date":"10 October 2016","description":"Spesso e volentieri uno dei problemi dello sviluppo di software è avere backup del codice e condividerlo in modo da poterci lavorare in più persone in contemporanea senza sovrapporre le modifiche. Queste due richieste vengono soddisfatte con un software di version controlling che permetta il lavoro di multipli utenti.","tags":["git","coding"],"title":"Git, l'albero delle versioni che ci salva il progetto","uri":"/post/2016/git-lalbero-delle-versioni/"},{"categories":["rant"],"content":"Oggi parliamo di balene e di Virtual Machine, ovvero parliamo di Docker. La prima volta che ho incontrato Docker è stato leggendo un articolo sulle macchine virtuali e su come rendere uguale l’ambiente di develop, testing e di produzione. Quando lo ho letto non capivo bene come funzionasse ma poi ho trovato degli esempi più semplici che spiegano bene la differenza tra i due.\nLa macchina virtuale ¶ La macchina virtuale solitamente la possiamo vedere come i vecchi hard disk a cassettoni: installo il sistema operativo, installo tutte le componenti e poi è pronto per essere inserito nella macchina affinchè funzioni. In oltre basta copiarlo n volte per averne n ambienti completamente uguali.\nPregi ¶ Stabile e interamente contenuto in un unico “ambiente” portabile (solitamente è un file in cui è salvato l’hd della macchina virtuale).\nDifetti ¶ Molto pesante in termini di spazio e memoria. Se ho due installazioni identiche che fanno girare due applicazioni diverse sulla stessa macchina io ho due copie delle librerie, del sistema operativo e delle configurazioni.\nQuesta immagine mostra bene come il “guest os” risuta essere duplicato (in questo caso triplicato) e non possa essere “riutilizzato” dalle altre applicazioni.\nDocker ¶ Sul serio è un servizio differente? Si e no.\nConcettualmente è comunque un sistema di macchina virtuale. Praticamente è una “torta multistrato” di quello che Docker chiama conteiner.\nOgni livello contiene parte dei prerequisiti divisi per livello in base a come è stato scritto il Dockerfile (file di configurazione per la creazione di conteiner docker) e se due “applicativi docker” o immagini docker utilizzano gli stessi container non genera una copia nell’hard disk ma utilizza lo stesso container per entrambi.\nVantaggi ¶ Puoi distribuire il file di configurazione (semplice file di testo, solitamente anche molto breve) al posto che condividere un intero disco virtuale e è più compatto rispetto alla virtual machine per quanto riguarda lo spazio occupato, in quanto c’è solo le librerie richieste e nessun altra componente del sistema operativo o delle librerie. In oltre, in caso di multiple istanze di docker risulta spesso più performante, sopratutto quanto più sono simili le immagini.\nSvantaggi ¶ Bisogna imparare a fare i file docker e, nel caso di una solo istanza di docker in funzione sulla macchina potrebbe essere più pesante di una macchina virtuale.\nPersonalmente ultimamente lo uso molto per sviluppare siti web. Questo mi permette di avere una unica installazione di php e di mysql senza dover spostare ogni volta i progetti all’interno della root del web server ma semplicemente lanciando i file docker di quel progetto, che ricevono automaticamente un ip e, di conseguenza, posso visualizzarli in parallelo.\nSe quindi volete provare anche voi Docker vi lascio qui il link ↗ .\n","date":"3 October 2016","description":"Docker, cos'è e come funziona","tags":["docker","coding","devops"],"title":"Docker, la balena con i container per software","uri":"/post/2016/docker-la-balena-con-i-container/"},{"categories":[],"content":"Scala Italy is the third edition of the annual Italian conference on the Scala Programming Language.\nIt is brought to you by and for the scala community. All conference talks are peer evaluated by members of the community itself.\n","date":"14 May 2016","description":"","tags":[],"title":"Scala Italy 3","uri":"/event/2016-05-14-scala-italy/"},{"categories":[],"content":"PyCon Italia è la conferenza nazionale che raccoglie professionisti, ricercatori e appassionati del linguaggio di programmazione più bello che ci sia. Nella splendida cornice di Firenze, PyCon è un weekend per imparare, confrontarsi e scoprire.\n","date":"15 April 2016","description":"","tags":[],"title":"PyCon 7","uri":"/event/2016-04-17-pycon7/"},{"categories":["rant"],"content":"Studente di informatica, nerd e maschio. Non del tutto convinto di quello che faccio scrivo per essere ascoltato e parlo per scrivere.\nPraticamente sposato col mio gatto ho una passione per tutta l’informatica e le cose “non spiegabili”.\nPossiedo, in oltre, una inspiegabile passione per i giochi Indie e la criptografia\n","date":"20 August 2012","description":"Primo post","tags":[],"title":"Fundor333","uri":"/post/2012/fundor333/"},{"categories":[],"content":"This page collects content I’m producing in some way or the other, and is consumable with RSS. Learn more about the idea ↗ .\nYou can follow me here:\nAll stuff from my blog Atom RSS Json All my post from my blog Atom RSS Json All my photo from my blog Atom RSS Json My personal Newsletter Atom ↗ RSS ↗ ","date":"20 August 2000","description":"","tags":[],"title":"Feeds","uri":"/feeds/"},{"categories":[],"content":"Specifics about the hardware and software equipment I use for work and for my personal life.\nThe page is part of the uses.tech ↗ project.\nPhoto Setup ¶ Canon ¶ Canon EOS R5 ↗ Canon RF 50MM F1.8 STM ↗ Canon RF 24-105MM F/4L IS USM ↗ Canon RF 70-200MM F2.8 L IS USM ↗ FujiFilm ¶ FujiFilm X-T30 II ↗ FUJINON XF18-55MMF2.8-4 R LM OIS ↗ Gadget Fotografico ¶ SanDisk 128GB Extreme PRO ↗ PC Setup ¶ Hardware ¶ MelGeek MOJO68 Advance ↗ Epomaker Split 65 ↗ Blue Yeti Microfone ↗ Keycaps ↗ Software ¶ VS Code ↗ VS Code Plugins ¶ Python ↗ DevGPT ↗ Remote SSH ↗ One Dark Pro ↗ EditorConfig for VS Code ↗ .ENV Switcher ↗ PeacockCode ↗ Fonts ¶ MonoLisa ↗ JetBrains Mono ↗ Fira Code ↗ Operator Mono ↗ Gadget ¶ Rubber Duck for Debugging - Dark Soul Oscar Knight of Astora ↗ ","date":"20 August 2000","description":"","tags":[],"title":"Uses","uri":"/uses/"},{"categories":[],"content":"Dear all, we’re back with the PyData meetups, focused as always on sharing best practice, methodologies, analysis, machine learning systems, .., with the open-source projects of the NumFOCUS ↗ program — but not only!\nWe’ll meet #InPresence on Thursday, June 18 at 7:00 PM. We’ll be hosted by Anda Venice Hostel ↗ in the Medusa Room and, for those who cannot join us, it will also be on YouTube in #streaming.\n👥 We’ll have two interesting sessions one in Italian 🇮🇹 and one in English 🇬🇧: 🗣 Fabio Lamanna , one of PyData Venice founders, will present an analysis of the real impact of “Bologna #City30”, the 30 km/h limit, using #FloatingCarData (#FCD) with #QGIS and #Python to compare pre/post driving speeds and measure how much the city respects the new limit. 🗣 Claudio Giancaterino ↗ will show a #MultiAgent system that turns car damage photos into an insurance claim assessment in minutes, where an Orchestrator coordinates a Vision Agent (#GPT-5.2), OEM/Aftermarket Cost Estimation Agents (#Perplexity), and a Shop Finder Agent, each running a transparent #ReAct reasoning loop to return damage severity, comparative repair costs, and recommended shops.\nAnd afterwards, for those who want, we’ll stay there for ( 🍸 | 🍺 ) \u0026 ( 🍕 | 🍔 ) and #networking until late ‼️\n📽 And if you’d like to share ideas, projects, topics, or propose yourself as the next speaker, here’s the usual Google form ↗ or Sessionize ↗ !\n","date":"10 July 1926","description":"","tags":[],"title":"PyDataVE #27 - #UrbanMobility \u0026 #AgenticAI","uri":"/event/2026-06-18-pydatave-27-urbanmobility-agenticai/"},{"categories":[],"content":"Carissimi, continuiamo il nostro viaggio itinerante per il #Veneto !\nCi troviamo in #presenza giovedì 19 novembre alle ore 19:00. La location sarà comunicata appena definita. E per chi non potesse raggiungerci, si terrà anche in #streaming su YouTube.\n🗣 La scaletta non è ancora stata definita.\nE dopo, per chi vuole, resteremo lì per ( 🍸 | 🍺 ) e ( 🍕 | 🍔 ) e #networking ad oltranza ‼️\n📽 E se avete piacere di condividere idee, progetti, argomenti, o proporvi come prossimi speaker, lascio un form Google ↗ e la pagina Sessionize ↗ !\n","date":"10 March 1926","description":"","tags":["meetup-1064","meetup-8192"],"title":"PyVenice #6","uri":"/event/2026-11-19-pyvenice-6/"},{"categories":[],"content":"Continuiamo il nostro viaggio itinerante 🚀 per il #Veneto a Mestre, in collaborazione con il #GDGVenezia, un evento alla scoperta dei #framework in #Python !\nCi troviamo in #presenza giovedì 19 febbraio alle ore 19:00. Saremo ospitati da Anda Venice Hostel ↗ a Mestre, e per chi non potesse raggiungerci, si terrà anche su YouTube in #streaming.\n🗣 Giorgio Basile ↗ ci racconterà la sua avventura con #Flask confrontando poi approccio #ServerSide e #ClientSide rendering con il framework #Angular. A seguire, 🗣 Nicola Gramola ↗ ci parlerà di #DjangoNinja, considerato il #Fast Django #REST framework.\nE dopo, per chi vuole, resteremo lì per ( 🍸 | 🍺 ) e ( 🍕 | 🍔 ) e #networking ad oltranza ‼️\n📽 E se avete piacere di condividere idee, progetti, argomenti, o proporvi come prossimi speaker, lascio un form Google ↗ e la pagina Sessionize ↗ !\n","date":"10 March 1926","description":"","tags":["meetup-1064","meetup-8192"],"title":"PyVenice #3 - #Flask \u0026 #DjangoNinja","uri":"/event/2026-02-19-pyvenice-3-flask-djangoninja/"},{"categories":[],"content":"Carissimi, continuiamo il nostro viaggio itinerante per il #Veneto !\nCi troviamo in #presenza giovedì 16 aprile alle ore 19:00. Saremo ospitati da Anda Venice Hostel ↗ a Mestre. E per chi non potesse raggiungerci, si terrà anche in #streaming su YouTube.\n🗣 La scaletta non è ancora stata definita.\nE dopo, per chi vuole, resteremo lì per ( 🍸 | 🍺 ) e ( 🍕 | 🍔 ) e #networking ad oltranza ‼️\n📽 E se avete piacere di condividere idee, progetti, argomenti, o proporvi come prossimi speaker, lascio un form Google ↗ e la pagina Sessionize ↗ !\n","date":"10 March 1926","description":"","tags":["meetup-1064","meetup-8192"],"title":"PyVenice #4 - #n8n #workshop","uri":"/event/2026-04-16-pyvenice-4-n8n-workshop/"},{"categories":[],"content":"Carissimi, continuiamo il nostro viaggio itinerante per il #Veneto !\nCi troviamo in #presenza giovedì 17 settembre alle ore 19:00. La location sarà comunicata appena definita. E per chi non potesse raggiungerci, si terrà anche in #streaming su YouTube.\n🗣 La scaletta non è ancora stata definita.\nE dopo, per chi vuole, resteremo lì per ( 🍸 | 🍺 ) e ( 🍕 | 🍔 ) e #networking ad oltranza ‼️\n📽 E se avete piacere di condividere idee, progetti, argomenti, o proporvi come prossimi speaker, lascio un form Google ↗ e la pagina Sessionize ↗ !\n","date":"10 March 1926","description":"","tags":["meetup-1064","meetup-8192"],"title":"PyVenice #5","uri":"/event/2026-09-17-pyvenice-5/"},{"categories":[],"content":"Carissimi, ricominciamo l’anno parlando di #Networking e #Serverless !\nCi troviamo in #presenza GIOVEDì 29 gennaio alle ore 19:00. L’incontro si terrà presso il Coworking Mestre ↗ , in via Torino 135, di fronte al NH Laguna Palace Hotel. E per chi non potesse raggiungerci, si terrà anche in #streaming su YouTube.\nLa scaletta prevede due speech seguiti da discussione ciascuno. 🗣 Sebastiano Caccaro ↗ , ci parlerà di come hanno modernizzato la loro #VPC senza #downtime ! A seguire 🗣 Marco Falcier ↗ , ci racconterà che strumenti usare per accedere a database relazionali e a grafo, evitando di saturare le connessioni !\n👥 Poi ci sposteremo per ( 🍸 | 🍺 ) \u0026 ( 🍕 | 🍔 ) e #networking !\nE come sempre, proponete[vi per] argomenti e/o location con il Form Google ↗ o direttamente nel canale Telegram !\n","date":"10 March 1926","description":"","tags":["meetup-661712","meetup-15167","meetup-19297"],"title":"AWS User Group Venezia #12 - Networking e Serverless","uri":"/event/2026-01-29-aws-user-group-venezia-12-networking-e-serverless/"},{"categories":[],"content":"Carissimi, proseguiamo il nostro viaggio per parlare di #AWS !\nCi troviamo in #presenza giovedì 26 marzo alle ore 19:00. L’incontro si terrà presso il Coworking Mestre ↗ , in via Torino 135, di fronte al NH Laguna Palace Hotel. E per chi non potesse raggiungerci, si terrà anche in #streaming su YouTube.\nLa scaletta prevede due speech seguiti da discussione ciascuno. 🗣 Federico Parezzan ↗ , ci parlerà di come sia semplice fare app in #Flutter, con un approccio #CodeFirst, sfruttando #AWSAmplify e #CloudSandbox per uno sviluppo #Fullstack in tempi record ! A seguire 🗣 Salvatore Caputi ↗ , ci racconterà di come gestire processi lunghi con #AWSBatch nel mondo del #CloudComputing !\n👥 Poi ci sposteremo per ( 🍸 | 🍺 ) \u0026 ( 🍕 | 🍔 ) e #networking !\nE come sempre, proponete[vi per] argomenti e/o location con il Form Google ↗ o direttamente nel canale Telegram !\n","date":"10 March 1926","description":"","tags":[],"title":"AWS User Group Venezia #14 - FullStack e CloudComputing","uri":"/event/2026-03-26-aws-user-group-venezia-14-fullstack-e-cloudcomputing/"},{"categories":[],"content":"Carissimi, proseguiamo il nostro viaggio per parlare di #AWS !\nCi troviamo in #presenza giovedì 21 maggio alle ore 19:00. L’incontro si terrà presso il Coworking Mestre ↗ , in via Torino 135, di fronte al NH Laguna Palace Hotel. E per chi non potesse raggiungerci, si terrà anche in #streaming su YouTube.\nLa scaletta non è ancora stata definita.\nSe volete partecipare attivamete, proponete[vi per] argomenti e/o location con il Form Google ↗ o direttamente nel canale Telegram !\n","date":"10 March 1926","description":"","tags":[],"title":"AWS User Group Venezia #15","uri":"/event/2026-05-21-aws-user-group-venezia-15/"},{"categories":[],"content":"Carissimi, proseguiamo il nostro viaggio per parlare di #AWS !\nCi troviamo in #presenza giovedì 30 luglio alle ore 19:00. L’incontro si terrà presso il Coworking Mestre ↗ , in via Torino 135, di fronte al NH Laguna Palace Hotel. E per chi non potesse raggiungerci, si terrà anche in #streaming su YouTube.\nLa scaletta non è ancora stata definita.\nSe volete partecipare attivamete, proponete[vi per] argomenti e/o location con il Form Google ↗ o direttamente nel canale Telegram !\n","date":"10 March 1926","description":"","tags":[],"title":"AWS User Group Venezia #16","uri":"/event/2026-07-30-aws-user-group-venezia-16/"},{"categories":[],"content":"Carissimi, proseguiamo il nostro viaggio per parlare di #AWS !\nCi troviamo in #presenza giovedì 24 settembre alle ore 19:00. L’incontro si terrà presso il Coworking Mestre ↗ , in via Torino 135, di fronte al NH Laguna Palace Hotel. E per chi non potesse raggiungerci, si terrà anche in #streaming su YouTube.\nLa scaletta non è ancora stata definita.\nSe volete partecipare attivamete, proponete[vi per] argomenti e/o location con il Form Google ↗ o direttamente nel canale Telegram !\n","date":"10 March 1926","description":"","tags":[],"title":"AWS User Group Venezia #17","uri":"/event/2026-09-24-aws-user-group-venezia-17/"},{"categories":[],"content":"Carissimi, proseguiamo il nostro viaggio per parlare di #AWS !\nCi troviamo in #presenza giovedì 26 novembre alle ore 19:00. L’incontro si terrà presso il Coworking Mestre ↗ , in via Torino 135, di fronte al NH Laguna Palace Hotel. E per chi non potesse raggiungerci, si terrà anche in #streaming su YouTube.\nLa scaletta non è ancora stata definita.\nSe volete partecipare attivamete, proponete[vi per] argomenti e/o location con il Form Google ↗ o direttamente nel canale Telegram !\n","date":"10 March 1926","description":"","tags":[],"title":"AWS User Group Venezia #18","uri":"/event/2026-11-26-aws-user-group-venezia-18/"},{"categories":[],"content":"Carissimi, proseguiamo il nostro viaggio con una #Competition !\nCi troviamo in #presenza GIOVEDì 27 novembre alle ore 19:00. Saremo ospitati da Anda Venice Hostel ↗ nella sala Medusa e, per chi non potesse raggiungerci, si terrà anche su YouTube ↗ in #streaming.\nLa scaletta prevede: 🏆 la spiegazione del torneo, basato su AWS Jam ↗ , una competizione per team che si vogliono mettere alla prova con scenari reali 🎮 la presentazione del canale discord 💻 l’uso del proprio computer, per giocare !! 🚦 lo start della competizione 🆘 qualche aiutino pratico per gareggiare al meglio 🏁 la competizione rimarrà attiva per due ore\n🧢👕 E poi seguirà premiazione e ( 🍸 | 🍺 ) \u0026 ( 🍕 | 🍔 ) #networking ‼️\n🏅Allenati su AWS Cloud Quest ↗ guardando il video ↗ di spiegazione della scorsa competizione, per prepararti a questo evento ‼️ 📋 Per organizzarci al meglio, comunicaci con questo form ↗ il tuo livello su AWS e se hai già un team per la competizione ‼️\nE come sempre, proponete[vi per] argomenti e/o location con il Form Google ↗ o direttamente nel canale Telegram !\n","date":"10 March 1926","description":"","tags":[],"title":"AWS User Group Venezia #11 Competition","uri":"/event/2025-11-27-aws-user-group-venezia-11-competition/"},{"categories":[],"content":"https://secure.meetupstatic.com/photos/event/8/5/8/8/600_460234184.jpeg ↗ Anche quest’anno il GDG Venezia è lieto di organizzare il Google I/O Extended, per scoprire insieme tutte le novità che Google ha in serbo per sviluppatori e non.\nL’evento si terrà presso: “Tesa 94, Arsenale Nord, Venezia”\nProgramma:\n• 17.45: Check-in\n• 18.00: Aperitivo di Networking con buffet\n• 19.00: Inizio del keynote in live streaming\n• 21.00: Conclusione dell’evento.\nCi sarà inoltre la possibilità di ricevere qualche gadget. Vi aspettiamo!\nCome Raggiungerci:\nE’ consigliabile raggiungere Venezia\nin treno ( Link (http://www.trenitalia.com/)) ↗ , in autobus ( Link (http://actv.avmspa.it/it ↗ )) in tram Linea T1 ( Link (http://actv.avmspa.it/it/content/il-tram-0 ↗ ) ) e prendere i vaporetti 4.1 o 5.2 (fermata Celestia o Bacini)\nOppure da piazzale Roma seguire per Piazza San Marco e poi per Arsenale (passeggiata di 35min circa).\nNell’immagine qui sotto potete capire al meglio qual’è la Tesa 94.\nhttps://secure.meetupstatic.com/photos/event/1/a/f/d/600_460626909.jpeg ↗ ","date":"10 March 1926","description":"","tags":[],"title":"Google I/O Extended Venezia 2017","uri":"/event/2017-05-17-google-i-o-extended-venezia-2017/"},{"categories":[],"content":"Cari pythonisti e non solo… ci siamo! Il primo Pydata Venice sta per iniziare! Grazie agli amici dell’EndSummerCamp, nel pomeriggio di sabato 21 settembre avremo la possibilità di presentare il nostro gruppo e solleticare l’attenzione con qualche bel talk pieno zeppo di dati!\nEcco il programma!\nPresentazione del meetup Talk “Python, Sudoku \u0026 RAM” sull’ottimizzazione in Python Workshop “Intro a Pandas” Discussione informale con i partecipanti per definire i prossimi appuntamenti\nGrazie ai ragazzi dell’EndSummerCamp per l’ospitalità!!!\n","date":"10 March 1926","description":"","tags":[],"title":"PyData Venice #0","uri":"/event/2019-09-21-pydata-venice-0/"},{"categories":[],"content":"PyData Global is the very first fully-online PyData conference. Join our global community for five days packed with talks, tutorials, posters, open-source sprints and a digital hallway track.\nFor more information, check out global.pydata.org\nThe CFP is now live! (https://global.pydata.org/pages/cfp.html ↗ ) Tickets will be on sale soon at the website.\n","date":"10 March 1926","description":"","tags":[],"title":"PyData Global 2020 Online Conference ","uri":"/event/2020-11-11-pydata-global-2020-online-conference/"},{"categories":[],"content":"EVENTO ONLINE SU ZOOM Riproponiamo l’evento in modalità videoconferenza.\nIl tema del meetup è la visualizzazione dei dati. Ci scambieremo conoscenze e best practice su tool e librerie per mostrare e comprendere i dati che elaboriamo. Come spunto di partenza partiremo da un caso d’uso sulla visualizzazione su mappa di punti geospaziali usando Python.\nCi sarà spazio per il dialogo e il confronto anche sui temi di attualità legati ai dati. Se qualcuno vuole proporre qualche caso d’uso di visualizzazione dati è pregato di scrivere agli organizzatori così da venire messo in scaletta.\nIl meeting ID sarà diffuso il giorno dell’evento\n","date":"10 March 1926","description":"","tags":[],"title":"PyDataVE #2 - DataViz (geo e non)","uri":"/event/2020-03-31-pydatave-2-dataviz-geo-e-non/"},{"categories":[],"content":"In questo incontro approfondiremo una libreria emersa durante il PyDataVE #2 per la generazione di grafici e data visualization. A seguire un’introduzione a NumPy e Pandas , gli strumenti principali del mondo Python per l’analisi dei dataset. Per finire, l’annuncio di un nuovo progetto comunitario!\nL’incontro si terrà su Zoom e l’ID della stanza verrà comunicato a ridosso dell’evento via email a chi darà conferma di partecipazione.\n","date":"10 March 1926","description":"","tags":[],"title":"PyDataVE #3 (ONLINE) - Python Data Tools","uri":"/event/2020-05-07-pydatave-3-online-python-data-tools/"},{"categories":[],"content":"Carissimi, continuiamo con i meetup PyData, incentrati come sempre sulla condivisione di best practice, metodologie, analisi, sistemi di machine learning, .., con i progetti open source del programma di NumFOCUS ↗ ma non solo !\nCi troviamo in #presenza giovedì 28 agosto alle ore 19:00. Saremo ospitati da Anda Venice Hostel ↗ a Mestre, e per chi non potesse raggiungerci, si terrà anche su YouTube ↗ in #streaming.\n👥 Avremo due sessioni interessanti, una teorica e una pratica: 🗣 ↗ Alessandra Bilardi ↗ ci porterà da zero alle basi della #DataAnalysis, per comprenderne le fondamenta e le #BestPractice, nonché le librerie utili per l’#EDA. A seguire 💻 andremo a sfruttare quanto raccontato, per analizzare i dati di una competizione di #Kaggle e provare alcune librerie !\n⚙️ Il meetup sarà organizzato come un workshop: ci saranno alcuni sondaggi durante la prima sessione e, nella seconda, si potrà lavorare con il proprio portatile su #Colab, in modo da provare con mano le librerie proposte‼️\n📽 E se avete piacere di condividere idee, progetti, argomenti, o proporvi come prossimi speaker, lascio il solito form Google ↗ !\n","date":"10 March 1926","description":"","tags":[],"title":"PyDataVE #22 - #DataAnalysis #Workshop","uri":"/event/2025-08-28-pydatave-22-dataanalysis-workshop/"},{"categories":[],"content":"Massimo Lamanna, coordinatore tecnico dell’esperimento ALICE al CERN di Ginevra, ci presenterà ROOT, il tool di analisi dati più usato in fisica delle particelle (quello utilizzato per la scoperta del Bosone di Higgs!). Non mancate!\nL’evento si terrà online e il link Zoom verrà recapitato solo a chi si iscrive.\n","date":"10 March 1926","description":"","tags":[],"title":"PyDataVE #6 - CERN Edition","uri":"/event/2020-11-27-pydatave-6-cern-edition/"},{"categories":[],"content":"Carissimi, riprendiamo con gli speech su #Alexa e #Bedrock con due ospiti speciali !\nCi troviamo in #presenza GIOVEDì 25 settembre alle ore 19:00. L’incontro si terrà presso il Coworking Mestre ↗ , in via Torino 135, di fronte al NH Laguna Palace Hotel. E per chi non potesse raggiungerci, si terrà anche in #streaming su YouTube ↗ .\nLa scaletta prevede due speech seguiti da discussione ciascuno. 🗣 Riccardo Marostica ↗ , da buon #developer, ci racconterà come ha integrato un sistema #IoT centralizzato con #Alexa. A seguire 🗣 Stefano Boscolo ↗ , ci mostrerà #Amazon #AgentCore, uno dei nuovi servizi di #AWS in #preview che consente di distribuire e gestire #Agent #AI.\n👕 Premieremo i vincitori della #competition di martedì 16 settembre 🏆 ❓Ti sei iscritto alla competizione ↗ ❓ 👥 E poi ci sposteremo per ( 🍸 | 🍺 ) \u0026 ( 🍕 | 🍔 ) e #networking !\nE come sempre, proponete[vi per] argomenti e/o location con il Form Google ↗ o direttamente nel canale Telegram !\n","date":"10 March 1926","description":"","tags":["meetup-661712","meetup-15167","meetup-19297"],"title":"AWS User Group Venezia #10 - #Alexa e #Bedrock","uri":"/event/2025-09-25-aws-user-group-venezia-10-alexa-e-bedrock/"},{"categories":[],"content":"Carissimi, proseguiamo il nostro viaggio con una #Competition !\nCi troviamo in #presenza MARTEDì 16 settembre alle ore 19:00. L’incontro si terrà presso il Coworking Mestre ↗ , in via Torino 135, di fronte al NH Laguna Palace Hotel. E per chi non potesse raggiungerci, si terrà anche in #streaming su YouTube ↗ .\nLa scaletta prevede: 🏆 la spiegazione del torneo, basato su AWS Cloud Quest ↗ , l’unico gioco di ruolo 3D che ti aiuta a sviluppare competenze pratiche per il cloud AWS 🏅 allenarsi per il #badge Cloud Practitioner e, se hai questa certificazione AWS, 🔄 vale come rinnovo ‼️ 🎮 la presentazione del canale discord 💻 l’uso del proprio computer, per iscriversi al torneo 🚦 lo start della competizione 🆘 qualche aiutino pratico per gareggiare al meglio 🏁 la competizione rimarrà attiva una settimana\n👕 E poi ci troviamo giovedì 25 settembre per la premiazione ‼️\nE come sempre, proponete[vi per] argomenti e/o location con il Form Google ↗ o direttamente nel canale Telegram !\n","date":"10 March 1926","description":"","tags":[],"title":"AWS User Group Venezia #9 Competition","uri":"/event/2025-09-16-aws-user-group-venezia-9-competition/"},{"categories":[],"content":"Dear all, we’re back with the PyData meetups ↗ , focused as always on sharing best practice, methodologies, analysis, machine learning systems, .., with the open-source projects of the NumFOCUS ↗ program — but not only!\nWe’ll meet #InPresence on Thursday, December 18 at 7:00 PM. We’ll be hosted by Anda Venice Hostel ↗ in the Medusa Room and, for those who cannot join us, it will also be on YouTube ↗ in #streaming.\n👥 We’ll have two interesting sessions in English 🇬🇧: 🗣 Árpád Goretity ↗ and Oliver Kocsis ↗ will talk to us about #NLP solutions and their optimizations in a local environment: #OnPremise is the New Promise – Small, Smart, #LocalAI in the age of LLMs 🗣 Sara Ferro ↗ will present a blend of theory on classical networks and more recent ones together with more recent ones: #ImageSegmentation through #DeepLearning Models\nAnd afterwards, for those who want, we’ll stay there for ( 🍸 | 🍺 ) \u0026 ( 🍕 | 🍔 ) and #networking until late ‼️\n📽 And if you’d like to share ideas, projects, topics, or propose yourself as the next speaker, here’s the usual Google form ↗ or Sessionize ↗ !\n","date":"10 March 1926","description":"","tags":[],"title":"PyDataVE #24 - #MachineLearning edition","uri":"/event/2025-12-18-pydatave-24-machinelearning-edition/"},{"categories":[],"content":"#PyVenice #1 - #Ai #Astrophysics #AgentAi #Coding #OpenSource\nContinuiamo il nostro viaggio per il #Veneto da Vicenza alle #stelle, ospitati dall’Elevator Innovation Hub.\nUna serata dedicata all’Intelligenza Artificiale declinata sull’#Astrofisica e il #MachineLearning, e al #Coding assistito dagli #AgentiAi in salsa #OpenSource.\nCi troviamo in #presenza giovedì 2 ottobre presso l’Elevator Innovation Hub ↗ di Vicenza in 📍Viale Fusinato 8, per chi non potesse raggiungerci, si terrà anche in #streaming su YouTube ↗ .\n🕕 ore 19:00, 🗣 Marco DallAmico: ci parlerà di “AI oltre le stelle: quando l’intelligenza artificiale incontra l’astrofisica”. 🕡 ore 19:30, 🗣 Alessandra Bilardi: ci introduce al “Coding assistants Open Source with custom Agents AI” 🕘 a seguire un po’ di #networking per conoscerci meglio!\n💾 NON mancate !\n📽 E se avete piacere di condividere idee, progetti, argomenti, o proporvi come prossimi speaker, lascio un form Google ↗ !\n#PyVenice #1 Python Italia ↗ #Python #ML #Astrophysics #Coding #AgenticAi\n","date":"10 March 1926","description":"","tags":["meetup-584902","meetup-917262","meetup-34455"],"title":"PyVenice #1 - #Astrophysics #MachineLearning #Coding #AgenticAi","uri":"/event/2025-10-02-pyvenice-1-astrophysics-machinelearning-coding-agenticai/"},{"categories":[],"content":"THIS IS A PAID EVENT - PURCHASE YOUR TICKET IN THE LINK BELOW\nhttps://gdg.community.dev/events/details/google-gdg-venezia-presents-devfest-italia-2020/ ↗ Anche quest’anno torna la DevFest, in una nuova veste nazionale, coordinata globalmente e totalmente online.\nDevFest 2020 riunirà migliaia di sviluppatori dalla passione condivisa per le tecnologie Google e non per un weekend epico in cui le comunità di tutto il mondo si uniranno per connettersi, imparare e, soprattutto, divertirsi.\nUnisciti anche te il 17 e il 18 ottobre per la più grande conferenza tecnologica virtuale distribuita mai creata!\n🎫 Registrazione gratuita → gdg.community.dev/e/mjmb5j/\nUn evento totalmente online e interattivo con talk, discussioni a tema tech, giochi e divertimento.\nDue giorni in cui affrontare 7 aree tematiche:\n☁ Cloud Computing\n🤖 Machine Learning\n💻 Front-end\n📱 Mobile\n📊 Marketing\n🌍 Diversity \u0026 Inclusion\n😎 Soft Skill\n❓ INFO E FAQ\nQuando: sabato 17 e domenica 18 ottobre Orario: mattina e pomeriggio (TBD) Dove: online (piattaforma TBD) Costo: gratis Alcune track tematiche saranno tenute in parallelo Registrazioni ➡ gdg.community.dev Sito web ➡ devfest.it Leggi il codice di condotta Hashtag ufficiali: #devfestitalia #devfestita20 #devfest2020 #gdgfun Scopri le altre DevFest europee ➡ devfesteurope.com\n👩‍💻 PROGRAMMA (in costruzione) https://www.devfest.it/speakers/ ↗ Agenda\nHosted By\nAndrea Maglie, GDG Organizer\nMarco Gomiero, GDG Organizer\nI’m working as Uniwhere Tech Lead, where I manage the end-to-end development of a platform with half a million users.\nI’m a Kotlin lover with a Computer Engineering degree, I have experience with native Android and native iOS development, as well as cross-platform development with React Native, Flutter and Kotlin Multiplatform.\nIn my spare time I write and maintain open source code, I share my dev experience by speaking at confs and organizing events with the Google Developer Group Venezia and I play basketball.\nSimone Formica, GDG Organizer\nOmar Al Bukhari, GDG Organizer\nTHIS IS A PAID EVENT - PURCHASE YOUR TICKET IN THE LINK BELOW\nhttps://gdg.community.dev/events/details/google-gdg-venezia-presents-devfest-italia-2020/ ↗ ","date":"10 March 1926","description":"","tags":[],"title":"DevFest Italia 2020","uri":"/event/2020-10-17-devfest-italia-2020/"},{"categories":[],"content":"🌟 DevFest Venezia 2023 🌟\nSiamo entusiasti di annunciare il ritorno della DevFest a Venezia, l’evento straordinario dove appassionati ed esperti si incontrano per condividere la loro passione per lo sviluppo a tutto tondo. Quest’anno, stiamo alzando l’asticella con tre tracce contemporanee, due in inglese e una in italiano, aprendo le porte a un pubblico più vasto e diversificato!\n🔥 Cosa aspettarci:\n🎤 Speaker d’eccezione da tutto il mondo condividono le loro conoscenze sui prodotti Google e non solo.\n🌐 Tre tracce coinvolgenti con sessioni in inglese e italiano.\n🤝 Opportunità uniche di networking con sviluppatori e appassionati del settore.\n🆓 L’ingresso all’evento è assolutamente gratuito!\nQuesto evento è pensato per riunire la comunità tech, mettendo in primo piano l’apprendimento, la connessione e l’ispirazione. Scopri le ultime tendenze in ambito tecnologico, affina le tue competenze e connettiti con professionisti del settore provenienti da tutto il mondo.\nNon perdere questa occasione unica di crescita professionale e preparati a essere ispirato! 🚀\nMaggiori informazioni qua:\nhttps://devfest23.gdgvenezia.it/ ↗ Agenda\nHosted By\nMarco Gomiero, Android Engineer\nMarco is an Android engineer, currently working at TIER. He is a Google Developer Expert for Kotlin, he loves Kotlin and he has experience with native Android and native iOS development, as well as cross-platform development with Flutter and Kotlin Multiplatform.\nIn his spare time, he writes and maintains open-source code, he shares his dev experience by writing on his blog, speaking at confs and organizing events with the Google Developer Group Venezia and he plays basketball.\nSimone Formica, Organizer\nAndroid \u0026 AOSP Dev Linux lovers, IoT and Photo lover\nCo-organizer of GdG Venezia - Mentor at Coderdojo ZeroBranco (TV)\nAndrea Maglie, Organizer\nOmar Al Bukhari, Android Developer\nI am specialized in developing Android applications. I love to learn a lot of new things even not related to my field. I spend my time also on doing karate, traveling to places that I have never visited, and I do love photo-shooting the world. I am part of the Google Developer Group community as one of many lead co-organizers in GDG Venice and GDG Italy. I have just one goal in my entire life, being inspired every time no matter what is in front of me!\nGiuseppe Sorce, Senior Mobile Developer\nFabio Catinella, Android Engineer\nComplete your event RSVP here: https://gdg.community.dev/events/details/google-gdg-venezia-presents-devfest-venezia-2023/ ↗ .\n","date":"10 March 1926","description":"","tags":[],"title":"DevFest Venezia - 2023","uri":"/event/2023-12-02-devfest-venezia-2023/"},{"categories":[],"content":"Il GDG Venezia vi invita al Google I/O Extended 2024 il 14 maggio! L’evento offre la possibilità di seguire in diretta streaming il Keynote del Google I/O, ma soprattutto di connettersi con altri appassionati di tecnologia e sviluppatori. Il Google I/O Extended 2024 è gratuito, ma la registrazione è obbligatoria. Il numero di posti è limitato, quindi registrati subito per non perdere l’occasione di partecipare!\nL’evento sarà ospitato da Zero12. La zona è facilmente raggiungibile con i mezzi pubblici.\nAgenda\n6:30 PM: Registrazione\n7:00 PM: Inizio livestream del Keynote\n8:30 PM: Cena e networking\nHosted By\nMarco Gomiero, Android Engineer\nMarco is an Android engineer, currently working at Airalo. He is a Google Developer Expert for Kotlin, he loves Kotlin and he has experience with native Android and native iOS development, as well as cross-platform development with Flutter and Kotlin Multiplatform.\nIn his spare time, he writes and maintains open-source code, he shares his dev experience by writing on his blog, speaking at confs and organizing events with the Google Developer Group Venezia and he plays basketball.\nAndrea Maglie, Organizer\nSimone Formica, Organizer\nAndroid \u0026 AOSP Dev Linux lovers, IoT and Photo lover\nCo-organizer of GdG Venezia - Mentor at Coderdojo ZeroBranco (TV)\nOmar Al Bukhari, Android Developer\nI am specialized in developing Android applications. I love to learn a lot of new things even not related to my field. I spend my time also on doing karate, traveling to places that I have never visited, and I do love photo-shooting the world. I am part of the Google Developer Group community as one of many lead co-organizers in GDG Venice and GDG Italy. I have just one goal in my entire life, being inspired every time no matter what is in front of me!\nGiuseppe Sorce, Senior Mobile Developer\nFabio Catinella, Android Engineer\nPartner\nZero12 (https://www.zero12.it/ ↗ )\nComplete your event RSVP here: https://gdg.community.dev/events/details/google-gdg-venezia-presents-google-io-extended-2024-watch-party/ ↗ .\n","date":"10 March 1926","description":"","tags":[],"title":"Google I/O Extended 2024 Watch Party","uri":"/event/2024-05-14-google-i-o-extended-2024-watch-party/"},{"categories":[],"content":"🌟 DevFest Venezia 2024 🌟\nSiamo entusiasti di annunciare il ritorno della DevFest a Venezia, l’evento straordinario dove appassionati ed esperti si incontrano per condividere la loro passione per lo sviluppo a tutto tondo.\nQuest’anno, stiamo alzando l’asticella con tre tracce contemporanee, due in inglese e una in italiano, aprendo le porte a un pubblico più vasto e diversificato!\n🔥 Cosa aspettarci:\n🎤 Speaker d’eccezione da tutto il mondo condividono le loro conoscenze sui prodotti Google e non solo.\n🌐 Tre tracce coinvolgenti con sessioni in inglese e italiano.\n🤝 Opportunità uniche di networking con sviluppatori e appassionati del settore.\n🆓 L’ingresso all’evento è assolutamente gratuito!\nQuesto evento è pensato per riunire la comunità tech, mettendo in primo piano l’apprendimento, la connessione e l’ispirazione. Scopri le ultime tendenze in ambito tecnologico, affina le tue competenze e connettiti con professionisti del settore provenienti da tutto il mondo.\nNon perdere questa occasione unica di crescita professionale e preparati a essere ispirato! 🚀\nMaggiori informazioni qua:\nhttps://devfest24.gdgvenezia.it/ ↗ Agenda\nHosted By\nMarco Gomiero, Android Engineer\nMarco is an Android engineer, currently working at Airalo. He is a Google Developer Expert for Kotlin, he loves Kotlin and he has experience with native Android and native iOS development, as well as cross-platform development with Flutter and Kotlin Multiplatform.\nIn his spare time, he writes and maintains open-source code, he shares his dev experience by writing on his blog, speaking at confs and organizing events with the Google Developer Group Venezia and he plays basketball.\nAndrea Maglie, Organizer\nSimone Formica, Organizer\nAndroid \u0026 AOSP Dev Linux lovers, IoT and Photo lover\nCo-organizer of GdG Venezia - Mentor at Coderdojo ZeroBranco (TV)\nOmar Al Bukhari, Organizer\nExperienced Mobile Developer with a track record of optimizing development lifecycles and enhancing client satisfaction.Key highlights include:\n-Proven expertise in Android, Outsystems development, and ongoing learning in Kotlin Multiplatform. -Successfully reduced time-to-market by 30% through optimised development practices. -Lead co-organizer at GDG Venice and GDG Italy, fostering collaboration within the tech community. -Avid learner with a passion for exploring new technologies and contributing to the growth of the Google Developer Group community.\nFabio Catinella, Android Engineer\nPietro Ferrara, Co-organizer\nComplete your event RSVP here: https://gdg.community.dev/events/details/google-gdg-venezia-presents-devfest-venezia-2024/ ↗ .\n","date":"10 March 1926","description":"","tags":[],"title":"DevFest Venezia 2024","uri":"/event/2024-11-16-devfest-venezia-2024/"},{"categories":[],"content":"🌟 DevFest Venezia 2025 🌟\nWe’re thrilled to announce the return of DevFest to Venice, the extraordinary event where enthusiasts and experts meet to share their passion for all-around development.\nThis year, we’re raising the bar with three concurrent tracks, two in English and one in Italian, opening the doors to a wider and more diverse audience!\n🔥 What to expect:\n🎤 Exceptional speakers from all over the world sharing their knowledge on Google products and beyond.\n🌐 Three engaging tracks with sessions in both English and Italian.\n🤝 Unique networking opportunities with developers and industry enthusiasts.\n🆓 Admission to the event is completely free!\nThis event is designed to bring the tech community together, focusing on learning, connection, and inspiration. Discover the latest tech trends, sharpen your skills, and connect with industry professionals from around the world.\nDon’t miss this unique opportunity for professional growth and get ready to be inspired! 🚀\nMore information here: https://devfest25.gdgvenezia.it/ ↗ ¶ 🌟 DevFest Venezia 2025 🌟\nSiamo entusiasti di annunciare il ritorno della DevFest a Venezia, l’evento straordinario dove appassionati ed esperti si incontrano per condividere la loro passione per lo sviluppo a tutto tondo.\nQuest’anno, stiamo alzando l’asticella con tre tracce contemporanee, due in inglese e una in italiano, aprendo le porte a un pubblico più vasto e diversificato!\n🔥 Cosa aspettarci:\n🎤 Speaker d’eccezione da tutto il mondo condividono le loro conoscenze sui prodotti Google e non solo.\n🌐 Tre tracce coinvolgenti con sessioni in inglese e italiano.\n🤝 Opportunità uniche di networking con sviluppatori e appassionati del settore.\n🆓 L’ingresso all’evento è assolutamente gratuito!\nQuesto evento è pensato per riunire la comunità tech, mettendo in primo piano l’apprendimento, la connessione e l’ispirazione. Scopri le ultime tendenze in ambito tecnologico, affina le tue competenze e connettiti con professionisti del settore provenienti da tutto il mondo.\nNon perdere questa occasione unica di crescita professionale e preparati a essere ispirato! 🚀\nMaggiori informazioni qua:\nhttps://devfest25.gdgvenezia.it/ ↗ Agenda\nHosted By\nMarco Gomiero, Android Engineer\nMarco is an Android engineer, currently working at Airalo. He is a Google Developer Expert for Kotlin, he loves Kotlin and he has experience with native Android and native iOS development, as well as cross-platform development with Flutter and Kotlin Multiplatform.\nIn his spare time, he writes and maintains open-source code, he shares his dev experience by writing on his blog, speaking at confs and organizing events with the Google Developer Group Venezia and he plays basketball.\nAndrea Maglie, Organizer\nFabio Catinella, Android Engineer\nSimone Formica, Organizer\nAndroid \u0026 AOSP Dev Linux lovers, IoT and Photo lover\nCo-organizer of GdG Venezia - Mentor at Coderdojo ZeroBranco (TV)\nJessica Marini, Social Media Manager\nOmar Al Bukhari, Organizer\nExperienced Mobile Developer with a track record of optimizing development lifecycles and enhancing client satisfaction.Key highlights include:\n-Proven expertise in Android, Outsystems development, and ongoing learning in Kotlin Multiplatform. -Successfully reduced time-to-market by 30% through optimised development practices. -Lead co-organizer at GDG Venice and GDG Italy, fostering collaboration within the tech community. -Avid learner with a passion for exploring new technologies and contributing to the growth of the Google Developer Group community.\nGiuseppe Sorce, Senior Mobile Developer\nComplete your event RSVP here: https://gdg.community.dev/events/details/google-gdg-venezia-presents-devfest-venezia-2025/ ↗ .\n","date":"10 March 1926","description":"","tags":[],"title":"DevFest Venezia 2025","uri":"/event/2025-10-11-devfest-venezia-2025/"},{"categories":[],"content":"Carissimi, continuiamo il nostro viaggio itinerante per il #Veneto !\nCi troviamo in #presenza giovedì 19 febbraio alle ore 19:00. La location sarà comunicata appena definita. E per chi non potesse raggiungerci, si terrà anche in #streaming su YouTube.\n🗣 La scaletta non è ancora stata definita.\nE dopo, per chi vuole, resteremo lì per ( 🍸 | 🍺 ) e ( 🍕 | 🍔 ) e #networking ad oltranza ‼️\n📽 E se avete piacere di condividere idee, progetti, argomenti, o proporvi come prossimi speaker, lascio un form Google ↗ e la pagina Sessionize ↗ !\n","date":"10 February 1926","description":"","tags":["meetup-1064","meetup-8192"],"title":"PyVenice #3","uri":"/event/2026-02-19-pyvenice-3/"},{"categories":[],"content":"Carissimi, continuiamo il nostro viaggio itinerante per il #Veneto !\nCi troviamo in #presenza giovedì 16 aprile alle ore 19:00. La location sarà comunicata appena definita. E per chi non potesse raggiungerci, si terrà anche in #streaming su YouTube.\n🗣 La scaletta non è ancora stata definita.\nE dopo, per chi vuole, resteremo lì per ( 🍸 | 🍺 ) e ( 🍕 | 🍔 ) e #networking ad oltranza ‼️\n📽 E se avete piacere di condividere idee, progetti, argomenti, o proporvi come prossimi speaker, lascio un form Google ↗ e la pagina Sessionize ↗ !\n","date":"10 February 1926","description":"","tags":["meetup-1064","meetup-8192"],"title":"PyVenice #4","uri":"/event/2026-04-16-pyvenice-4/"},{"categories":[],"content":"Carissimi, proseguiamo il nostro viaggio per parlare di #AWS !\nCi troviamo in #presenza giovedì 26 marzo alle ore 19:00. L’incontro si terrà presso il Coworking Mestre ↗ , in via Torino 135, di fronte al NH Laguna Palace Hotel. E per chi non potesse raggiungerci, si terrà anche in #streaming su YouTube.\nLa scaletta non è ancora stata definita.\nSe volete partecipare attivamete, proponete[vi per] argomenti e/o location con il Form Google ↗ o direttamente nel canale Telegram !\n","date":"4 February 1926","description":"","tags":[],"title":"AWS User Group Venezia #14","uri":"/event/2026-03-26-aws-user-group-venezia-14/"},{"categories":[],"content":"Dear all, we’re back with the PyData meetups ↗ , focused as always on sharing best practice, methodologies, analysis, machine learning systems, .., with the open-source projects ↗ of the NumFOCUS program ↗ — but not only!\nWe’ll meet #InPresence on Thursday, December 18 at 7:00 PM. We’ll be hosted by Anda Venice Hostel ↗ in the Medusa Room and, for those who cannot join us, it will also be on YouTube ↗ in #streaming.\n👥 We’ll have two interesting sessions, in Italian 🇮🇹 or in English 🇬🇧 or one and one: 🗣 Here there will be the description of the speakers\nAnd afterwards, for those who want, we’ll stay there for ( 🍸 | 🍺 ) \u0026 ( 🍕 | 🍔 ) and #networking until late ‼️\n📽 And if you’d like to share ideas, projects, topics, or propose yourself as the next speaker, here’s the usual Google form ↗ or Sessionize ↗ !\n","date":"11 December 1925","description":"","tags":[],"title":"PyDataVE #24","uri":"/event/2025-12-18-pydatave-24/"},{"categories":[],"content":"","date":"1 January 0001","description":"","tags":[],"title":"","uri":"/link/"},{"categories":[],"content":"","date":"1 January 0001","description":"","tags":[],"title":"","uri":"/micro/2025/07/dnd-response/"},{"categories":[],"content":"","date":"1 January 0001","description":"","tags":[],"title":"","uri":"/social_card/"},{"categories":[],"content":" Web badges, buttons or stickers are small images on web pages, typically part of the footer. They can be used for promotion, stating compliance with web standards or to comply with an application’s terms of service. They are sometimes referred to as 88x31 or 80x15, common image resolutions for web buttons.\nThese were first popularized as “Best viewed in…” buttons by Netscape and Microsoft during the browser wars of the late 1990s. They have seen a resurgence in the early 2020s through websites like Neocities. There are now large collections of buttons linking to personal websites that serve as modern takes on old web culture.\nFrom Wikipedia ↗ This is my collection\n","date":"1 January 0001","description":"","tags":[],"title":"88x31","uri":"/88x31/"},{"categories":[],"content":" Fundor 333’s personal space on the web ¶ Pythonista, Backend Developer, Photographer, Dev Ops, Ex-Scout, Bookworm and Tea Lover. Sometime you can find me in a GDG, a DataBeers, a Pycon, a Comicon or other similar event. Huge Open Source fan and user I am allways searching something new to do or to study. Huge fan of automation, autodeploy, data sharing and bots. A lot of my personal stuff are here in my blog and some in my Github.\n","date":"1 January 0001","description":"","tags":[],"title":"About","uri":"/about/"},{"categories":[],"content":"This page intentionally left blank\n","date":"1 January 0001","description":"","tags":[],"title":"Blank","uri":"/blank/"},{"categories":[],"content":" Artists David Revoy - Artist, Instructor, using only Free/Libre and Open-Source software since 2009. Paths Peculiar (feed) Ritual Dust (feed) Winnie Lim (feed) Blog Brain Baking (feed) from jason (feed) Home on Burgeon Lab (feed) jadin.me (feed) Developer Andrea Grandi (feed) Cavelab blog (feed) Duarte O.Carmo (feed) James' Coffee Blog (feed) jimmyhmiller.github.io (feed) Longest Voyage (feed) macwright.com (feed) Max Böck (feed) Ru (feed) Strudel Blog (feed) The Great Django Webring Me Blog on Fundor333 (feed) Digital Tea Room (feed) DTR NewsLetter (feed) Fundor333 - All (feed) Photos on Fundor333 (feed) Photography a fleeting ripple (feed) Baranetzky Photography (feed) ITCHBAN.com / Blog - itchban (feed) omi (feed) Scottish Stoater (feed) Street Photography Blog: Eolo Perfido's Photography Journal | Stories Through Leica (feed) Stuntbox (feed) Shops Smollab Stationary and fountain pens Inkdependence (feed) Mountain of Ink (feed) Olive Octopus (feed) Rachel's Reflections (feed) SCRIPTION STUDIO (feed) The Gentleman Stationer (feed) The Pen Addict (feed) The Poor Penman (feed) The Take Note Newsletter (feed) The Well-Appointed Desk (feed) ","date":"1 January 0001","description":"","tags":[],"title":"Blogroll","uri":"/blogroll/"},{"categories":[],"content":" What is this page? ¶ This page is my citation preferences. 1\nWhen diting a post on my website, please refer to me as Fundor333 or F333. My pronouns are he/him/his.\nHere is an example to how to cite a post on this website\nIn Django Generate Barcode With Reportlab ↗ Fundor333 wrote about …\nOr you can refer a post as the all blog\nFundor333’s Blog ↗ has a page where describe all his tech hardware…\nFor academic-style referencing, please use Fundor333 - Matteo Scarpa as the author name and Fundor333.com as the site name.\nIf you have some question about how to cite my blog or how I cite your work you can write me at blog@fundor333.com Idea taken from this post ↗  ↩︎\n","date":"1 January 0001","description":"","tags":[],"title":"Cite","uri":"/cite/"},{"categories":[],"content":" What is this page? ¶ This is a Colophon page or a “How this blog work?” page.\nIn publishing, a colophon (/ˈkɒləfən, -fɒn/) is a brief statement containing information about the publication of a book such as an “imprint” (the place of publication, the publisher, and the date of publication).\nWikipedia ↗ This page exist because I am a coder with the passion of try new stuff with code or system, so here I collect what I use.\nSome story about this site ¶ This blog start in the August 2012 as a Wordpress site (no I did not leave any trace about it),some time after in the 2016 as a Pelican site (I have some article in Italian about Pelican ) and some time after Hugo.\nI try multiple configuration, I wrote some Pelican plugins and some Hugo stuff but a lot of them are trash…\nToday ¶ The code for this website is hosted on GitHub ↗ and created using Visual Studio Code ↗ . Automated deployments are done with Github Action and hosted by GitHub Pages. Hugo ↗ is used as the static site generator and the theme is mine Cyberlavandatea ↗ . Some of the icons are from Fontawesome ↗ .\nSome part (some of the static pages) of this site are generated from api, some mine, some from external service and some from json files generated by some of mine Github automation ↗ .\nThe comments are done with webmentions ↗ and hosted with the Github automation ↗ in the repo ↗ with all other file needed to build the site.\nThe now page ↗ is make with this article ↗ in mind and I edit every time I remember to update it.\n","date":"1 January 0001","description":"","tags":[],"title":"Colophon","uri":"/colophon/"},{"categories":[],"content":"This is how to contact me for work related stuff or similar.\nI only do asynchronous communication so you can reach/follow me via the following means:\nEmail me@fundor333.com If you want to connect in other way with me, like with Social Network or you want to follow me on social media, you can look in the hello page\n","date":"1 January 0001","description":"","tags":[],"title":"Contact","uri":"/contact/"},{"categories":[],"content":"From Canion dot Blog ↗ here is my preferred pronoun’s page.\nMine are\nhe/his/him\nMore info ¶ ","date":"1 January 0001","description":"","tags":[],"title":"Guy","uri":"/guy/"},{"categories":[],"content":"Hello!\nThis is my Hello! ↗ page where I list how to keep in touch with me and for what reason.\nFeed and Newsletter for the blog stuff fundor333.com/feeds/ ↗ Github for my code and my coding projects github.com/fundor333 ↗ Facebook (dead-ish) for photo facebook.com/fundor333 ↗ Mastodon my “main” social account… But I post to little to be interesting mastodon.social/@fundor333 ↗ Instagram photo cosplay (I am the photographer) instagram.com/fundor333/ ↗ Instagram urban photogrphy instagram.com/matteo.scarpa3/ ↗ Telegram Channel stuff about cosplay and my photo @f333_photoset ↗ ","date":"1 January 0001","description":"","tags":[],"title":"Hello","uri":"/hello/"},{"categories":[],"content":" A federate Git Server, something like a fusion of Mastodon Federation and Gitea Some photo set with cosplayers in some spectacular location ","date":"1 January 0001","description":"","tags":[],"title":"Ideas","uri":"/ideas/"},{"categories":[],"content":" Dev Apis you won't hate (feed) Podcasts for Developers (feed) Gaming Old Gen ","date":"1 January 0001","description":"","tags":[],"title":"Podroll","uri":"/podroll/"},{"categories":[],"content":"A list of all pages on this website, in alphabetical order. A lot of them are describe in here ↗ 88x31 — A collection of 88x31 Web Button About — A page about me Blank — This page intentionally left blank Blogroll — A list of my favorites sites Cite — How to cite this blog or the post Colophon — Info about this site publication/build Con and Event — My personal list of event and con I went and will go Contact — How to contact me Feeds — Feed from my personal blog and similar Guy — My preferred pronouns Hello — How to follow me Ideas — Should be about the future the crazy things people always wanted to make, concepts they’re mulling over, or … Now — A page that tells you what I am focused on now Podroll — A list of my favorites podcast Search — Search Page Style Guide — A listing of all the styles and elements used on this site Uses — My tech stuffs, from every day to work tech ","date":"1 January 0001","description":"","tags":[],"title":"SlashPages","uri":"/slashpages/"},{"categories":[],"content":"Inspired by json.blog’s style guide ↗ and, in turn, The Frugal Gamer ↗ , a (not so1) comprehensive listing of all possible styles and elements on this site.\nThe site runs the CyberLavandaTea theme: dark only, two accent hues (a violet and a green), headings in Audiowide, body text in Rajdhani.\nHeading 1 ¶ Heading 2 ¶ Heading 3 ¶ Heading 4 ¶ Headings get an id and, on hover, a ¶ anchor link to that section.\nAnd now, for the text content, which is the most important part of the blog.\nContent ¶ Paragraphs ¶ In a hole in the ground there lived a hobbit. Not a nasty, dirty, wet hole, filled with the ends of worms and an oozy smell, nor yet a dry, bare, sandy hole with nothing in it to sit down on or to eat: it was a hobbit-hole, and that means comfort. It had a perfectly round door like a porthole, painted green, with a shiny yellow brass knob in the exact middle. The door opened on to a tube-shaped hall like a tunnel: a very comfortable tunnel without smoke, with panelled walls, and floors tiled and carpeted, provided with polished chairs, and lots and lots of pegs for hats and coats — the hobbit was fond of visitors. The tunnel wound on and on, going fairly but not quite straight into the side of the hill — The Hill, as all the people for many miles round called it — and many little round doors opened out of it, first on one side and then on another. No going upstairs for the hobbit: bedrooms, bathrooms, cellars, pantries (lots of these), wardrobes (he had whole rooms devoted to clothes), kitchens, dining-rooms, all were on the same floor, and indeed on the same passage.\nLists ¶ Unordered List 1 Unordered List 2 Nested list 1 Nested list 2 Ordered List 1 Ordered List 2 In-line styles ¶ Bilbo Baggins: Good morning!\nGandalf: ( leaning on his staff ) What do you mean? Do you wish me a good morning, or mean that it is a good morning whether I want it or not; or that you feel good this morning; or that it is a morning to be good on?\nThis is a link ↗ .\nYou can also write some inline code when you need it.\nLinks ¶ Links are green. A visited link ↗ turns lavender, and on hover every link goes violet. External links open in a new tab, get a ↗ marker, and pick up a utm_source parameter.\nImages ¶ A block image is centered inside a \u003cfigure\u003e; the title, if present, becomes the caption.\nThis title line renders as the caption Block Styles ¶ Quote ¶ “I wish it need not have happened in my time,” said Frodo. “So do I,” said Gandalf, “and so do all who live to see such times. But that is not for them to decide. All we have to decide is what to do with the time that is given us.”\nBlockquotes have a violet left border on a slightly lifted surface. There are no separate “note / warning / caution” callout boxes — a quote is a quote.\nTables ¶ I don’t really use tables much, but here’s one anyway. Rows alternate with a faint tint and the whole thing sits inside a scroll container when it’s too wide.\nColumn 1 Column 2 Column Blue Left Text Centered 22.50 Code ¶ Code is also rare on the blog, though it’s a big part of my “day life”. Here’s a bit of Python. Syntax highlighting stays inside the two accent hues: keywords are violet, strings green, function names a lighter green, numbers a lighter violet, comments grey.\nfrom pathlib import Path def read_calibration(file_path: str) -\u003e list[str]: return Path(file_path).read_text().splitlines() def find_numbers(line: str) -\u003e list[str]: return [char for char in line if char.isdigit()] def combine_first_and_last(numbers: list[str]) -\u003e str: if not numbers: return \"0\" return numbers[0] + numbers[-1] def sum_lines(lines: list[str]) -\u003e int: return sum(int(line) for line in lines) Color Guide ¶ The theme is dark only. Six semantic roles, plus two surfaces derived by opacity — nothing else in the site chrome.\nRole Token Hex Primary (violet) --color-primary #9B8CF8 Content --color-content #DCDCE4 Links (green) --color-link #74D18C Visited (lavender) --color-visited #9E8FBE Background --color-background #1E1E24 Inactive --color-inactive #8C8C99 Surface (derived) --color-surface #2D2D33 Border (derived) --color-border #39393F Syntax highlighting palette:\nToken Hex keyword / operator #9B8CF8 string #74D18C function / class #A6E0B4 number / constant #C3B8F5 comment #8C8C99 error / removed line #E1808F Type:\nUse Family Headings, links, bold, footer Audiowide Body text Rajdhani “Written by a human” signature Ocean Trace Code system mono Actually, this is also not comprehensive. If you find I forgot something ping me and I will fix it ↩︎\n","date":"1 January 0001","description":"","tags":[],"title":"Style Guide","uri":"/style-guide/"}]