Qua

Reader

Read the latest posts from Qua.

from veer66

code แค่นี้เลย

fn cnt_links(s: usize, e: usize, tu: &Textunit, en_sent: &RTok) -> usize {
    tu.links.iter()
        .filter(|link| link.target > s && link.target < e)
        .filter(|link| link.source >= en_sent.s && link.source < en_sent.e)
        .count()
}

พอเขียน test แบบยาว ก็เจอจุดพัง

#[test]                                                                                                                                                
    fn cnt_links_simple() {
        let tu = Textunit {
            bi_text: BiText { source: String::from(""),
                              target: String::from(""),
            },
            bi_rtoks: BiRToks {
                source: vec![RTok {s:100, e:101, text: String::from(" ")},
                             RTok {s:102, e:103, text: String::from(" ")},],
                target: vec![RTok {s:300, e:301, text: String::from(" ")},
                             RTok {s:302, e:303, text: String::from(" ")},],
            },
            links: vec![Link {source: 0, target: 1},
                        Link {source: 1, target: 0}],

        };
        let en_sent = RTok {s: 302, e:303, text: String::from(" ")};
        assert_eq!(cnt_links(0, 1, &tu, &en_sent), 1);
    }

ระบบ type ช่วยอะไรไม่ค่อยได้เพราะมันเป็น integer หมด ยกเว้นจะใช้ type แบบที่มีหน่วยได้ แต่แบบนั้นก็ไม่รู้ว่าโปรแกรมจะยาวกว่านี้อีกเปล่า

รู้สึกว่าปัญหาของโปรแกรมนี้หลัก ๆ เลยคือ test มันยาวเกิน

 
Read more...

from Byte for your thoughts

I've recently been working a lot with Spring Cloud Gateway. It's been (mostly) a pleasant experience, but I do encounter some annoying quirks from time to time. This is a story about one of them.

Use-case

A few days ago I was debugging an issue at work when a backend microservice developer that my API Gateway proxies to asked me to try using keep-alive connections. The request sounded reasonable enough, adding headers to downstream request is easy in Cloud Gateway. I already have few headers that I'm adding.

Hold my beer. I got this.

me, going into this

setRequestHeader

I configure my Spring Gateway routes programmatically, so adding headers to request looks something like this:

builder.routes()
  .route(r -> r.path("/foo/bars")
    .filters(f -> f.setRequestHeader(HttpHeaders.CONNECTION, "keep-alive"))
    .uri(backendUrl))
  .build();

I already had my route set up, so all I needed to add was the setRequestHeader line. So far so good.

Signs of trouble

Next up, I updated tests to check for the new header. This is where I detected the problem. I use WireMock to simulate backend services in tests. Checking requests that API Gateway sends downstream is straightforward:

verify(getRequestedFor(urlEqualTo("/foo/bars"))
  .withHeader("Connection", equalTo("keep-alive"))
);

And the test failed. Here's what WireMock told me:

No requests exactly matched. Most similar request was:  expected:<
GET
/foo/bars

Connection: keep-alive
> but was:<
GET
/foo/bars

Basically, requests were going through, the route was properly sending them to mocked backend service, but Connection header was missing.

Debugging

Having a test that fails consistently was useful, because it allowed me to debug the issue. I put my first breakpoint inside SetRequestHeaderGatewayFilterFactory class. That's where GatewayFilter that sets headers is implemented. I ran my test and everything looked good. Connection header was added to mutated request, and mutated exchange was passed on to filter chain.

Next up, I decided to look into NettyRoutingFilter. That's where Spring Cloud Gateway makes HTTP requests to backend services. I put a break point at the start of filter method and inspected the exchange parameter. My Connection header was there. I proceeded to read the rest of the method, and found this line:

HttpHeaders filtered = filterRequest(getHeadersFilters(), exchange);

Turns out there's a set of HttpHeadersFilters that operate on HTTP headers and can exclude some of the ones previously set by GatewayFilters. In my particular case the culprit was RemoveHopByHopHeadersFilter. As its name suggests, its function is to remove headers that are only relevant for requests between client and API Gateway, and not intended to be proxied to backend services. In this particular case, I wanted to retain the Connection header. Fortunately RemoveHopByHopHeadersFilter can be configured with external configuration.

Solution

The solution was to add the following:

spring.cloud.gateway.filter.remove-hop-by-hop.headers:
    - transfer-encoding
    - te
    - trailer
    - proxy-authorization
    - proxy-authenticate
    - x-application-context
    - upgrade

to application.yaml config file. With that RemoveHopByHopHeadersFilter no longer removed the Connection header. Tests passed, I deployed API Gateway and backend services handled themselves better.

Example

I've created a demo project that illustrates this issue and the solution. You can find it on GitHub. Feel free to play around with it, and if you find additional issues, or better solutions, please let me know about them at:

 
Read more...

from Byte for your thoughts

Tower of Babel

I've recently been working on a command line tool. You can read more about it in my previous blog post. In the process of writing it I've stumbled upon a couple of ideas and best practices that I'd like to share with you in a series of blog posts. In this first post I'll go over picking the programming language and package manager for your CLI.

A single executable

The first decision we developers face when starting a new project is which language to use. In this case, like in most other, I'd suggest you think of your users first. The main way they will interact with your CLI is by executing it on the command line. (Yeah, I know, I deserve a Captain Obvious badge for this observation. Bear with me.) When building a CLI you should try to make it as simple as possible to execute. And what's easier to run that a single self-contained executable?

This puts languages that require an interpreter or a virtual machine (like Python or Java) at a disadvantage. Sure, most Linux distros come with Python pre-installed, but even they might have conflicting versions. And Windows users don't have it out of the box.

This machine disparity leads into a second consideration: building executables for multiple platforms. You users will most likely be spread over Linux, Windows and MacOS. You should build your CLI app for all three platforms. Having a toolchain that supports compilation to multiple target platforms from the same machine will make your life easier. You will be able to compile your code locally for any platform. And your CI pipeline will be simpler (no need for dedicated Mac nodes).

One situation when you can get around these constraints is if you are targeting specific group of users that rely on a cross-platform technology. A good example would be Node in JavaScript community. If you are building a CLI tool exclusively for frontend developers you can presume they all have Node and npm installed. However, this can still limit you in the future. For example you might be locked into an older version of Node until you are sure all of your users have upgraded.

Note that it might not be enough for technology to be ubiquitous among your users if it's cumbersome to use. For example, I'd caution against packaging your CLI as a .jar file, even if you are targeting Java developers. Java classpath is just too much of a mess.

No external dependencies

In addition to not using an external runtime, your CLI app should also avoid using external dynamically linked libraries. Depending on your packaging and distribution setup, you can satisfy all of your dependencies at install time. However this will complicate your setup. There will be situations when just giving your users an executable file that they can immediately run pays off.

In order to satisfy this requirement you should look for a language that can bundle your dependencies within a single compiled executable. This will result in bigger file sizes, but it's much more practical. It's also worth considering how well your language interacts with the OS. You should look for both platform agnostic and powerful APIs for working with underlying OS baked into the language. Having a solid standard library helps a language meet these requirements.

Distribution

If your language of choice matches all suggestions from the previous sections you can easily build a statically linked executable for any major OS. You can give that executable to your users and they can run it as is. This is super useful for testing early builds or custom flavors of your app. It does require some effort from your users to set up their PATH to include your executable. That's something a package manager can help with.

Another argument in favor of using a package manager is upgrade flow. You will inevitably release new versions of your CLI. Package manager will alert your users that a new version is out and will make upgrading easy. It's hard to overstate benefits of having users on the latest versions of your app.

If you base your tool on a cross-platform technology like Node chances are that ecosystem has a preferred package manager, like npm. If you choose to build native executables you should look for native package manager. This is where cross platform approach makes things easier. However, having your app compile into standalone executable simplifies integration with multiple package managers.

You will need to consider your users' habits when choosing package managers. Mac users are probably used to Homebrew. Linux has more diversity. You can start by building a Debian package, then listen to your users' feedback and include more packages as they are requested. On Windows the situation is not so clear. Chocolatey is one option, but it may not be widely adopted by your users. As a rule you should avoid forcing users to adopt a new tool just to install your app. If it come to that prefer manual installation process.

What I ended up with

For a language I picked Go. It provides dead simple compilation into a single statically linked executable for all major OS platforms. It comes with very strong standard library, good APIs for interacting with underlying OS and a vibrant open-source community.

If your audience allows for it you might be able to stick with Node + npm combination. Alternatively you might pick some other natively compiled language. For example Rust is one popular option, though compilation for multiple targets is a bit more involved than with Go. You can find more about using Rust to build CLIs here. Lastly, you can even use Java with something like GrallVM. With Grall you can build native executables that don't require JRE to run.

For packaging I choose to create Homebrew and Debian packages. Both builds were relatively simple to automate using Jenkins CI. Homebrew in particular is easy as all it requires is a Git repository with a Ruby script describing your package. Since my CLI is used internally at work, I publish my packages to internally hosted Bitbucket and Artifactory. My Windows users do not have a favorite package manager, so I leave them with executables they can simply download anywhere onto their PATH and use like that.

Next up

In the next installment of this blog series I'll go over what makes CLI app a good command line citizen. I'll cover topics like usability and consistency. If that seems like something you would be interested in consider:

 
Read more...

from Adriano Maini

Divagazioni su Collasgarba

Ho già scritto che mio padre, i nonni e gli zii abitarono da metà 1932 al 1940 sulla collina di Collasgarba in zona Nervia di Ventimiglia (IM). Più precisamente, che il nonno in quel periodo lavorò lassù. Mio padre, prossimo ad essere imbarcato sulla Regia Marina, era, in effetti, poco dopo lo scoppio della guerra in Alto Adige a fare il cameriere. Lo zio, destinato, purtroppo a morire in Russia, venne subito richiamato. L’altro zio, più giovane, non ancora precettato, lavorara come panettiere.

Il punto é che a Collasgarba c’era una grande azienda agricola, il cui sviluppo venne bloccato dalle traversie e dalle rovine del conflitto. Riproduco qui sopra la copertina di un numero della rivista specializzata, che veniva pubblicata da quella ditta.

A seconda delle versioni sentite in famiglia, il nonno, aiutato talora nei primi tempi dai figli più piccoli, si occupava di diverse cose, ma soprattutto accudiva diverse mucche, inoltre importanti per ricarvarne letame, ottimo concime per le piante.

Ci sono tanti aneddotti, relativi a quegli anni, di cui potrò riferire altre volte.

Aspettavo di ritrovare e sapere di più su quella bella azienda. Ma devo ancora aspettare.

 
Continua...

from Adriano Maini

Qualcosa sulla Costa Azzurra

Se la memoria non m’inganna la prima volta che oltrepassai il confine con la Francia fu a cinque anni a settembre 1955 per andare a trovare lo zio materno – ritratto nella soprastante fotografia alla sua partenza (o una ripartenza) da Ventimiglia (IM) per la sua destinazione di cui qui a breve –, zio che fece in quel periodo una stagione nella squadra di calcio di Grasse (Alpi-Marittime), i dirigenti della quale, essendo la medesima a livello dilettanti, gli trovarono colà anche un lavoro, di cui non ricordo niente, ma che probabilmente non aveva a che fare con la locale storica industria della profumeria.

Non rammento neppure bene se da Nizza a Grasse abbiamo viaggiato con lo storico Le Train des Pignes, in cui da adulto mi sono con interesse imbattuto in romanzi di miei prediletti autori transalpini.

Credo che proprio allora mi siano rimasti impressi per sempre nella mente i platani di Francia, che, a ben vedere, non sono diversi dai nostri, ma che ancora adesso, facendo un esempio, se li scorgo in qualche scena di un film, assumono ai mei occhi una connotazione particolare.

A Nizza avevamo quella volta anche salutato velocemente dei cugini di mio padre. Non sono mai riuscito a ricostruire la storia dell’emigrazione in Francia di tanti nostri lontani familiari. Neanche di quelli più vicini, come il nonno, raggiunto in Costa Azzurra al più presto sul finire – deduco! – dell’estate del 1931 da papà, zii e nonna.

Abitarono – dicevano mio padre e mio zio Dante – brevemente, prima del ritorno subitaneo in Italia, a Le Cannet.

Dove mio padre – di lui posso almeno documentare qualcosa – altrettanto brevemente andò alla scuola elementare. Con risultati approssimativi. Non poteva certo imparare in pochi mesi una difficile lingua straniera. Anche se in seguito si vantò sempre di parlare discretamente, tenendosi, va da sé, in esercizio, il francese.

In quella classe ebbe come compagno (mio padre nato nel 1921, questi nel 1922: la solita retrocessione di un anno per uno scolaro immigrato!) il futuro corridore ciclista Lucien Lazaridès, ma conobbe anche il di lui fratello Apo (magari i link su Wikipedia qualcuno se li guardi in francese, se preferisce!). Mio padre, che qualche volta da ferroviere incontrò ancora questi fratelli sui treni, mi diceva sempre che Lucien aveva vinto il Tour de France del 1946, mai omologato, ma che in qualche modo un tempo trovavo in qualche modo sottolineato da qualche parte, come anche mi confermò, essendo io ormai adulto, un vecchio appassionato di ciclismo dalle parti di Cannes: tant’é!

Centrale nelle mie prime esperienze di Costa Azzurra fu Cap d’Ail, dove abitava un cugino della nonna, il quale ci veniva spesso a trovare e che, inoltre, ci fece spesso da autista e da cicerone nei dintorni della sua cittadina, davvero incantevoli. A lungo ho pensato e magari penso ancora che sotto questi aspetti la Francia sia davvero Douce France, come cantava Charles Trenet.

Cerco sempre di attenermi ad un lieve tocco…

Volendo interrompere questa mia (forse) prima carrellata di specifici ricordi alla mia adolescenza, mi rendo conto che, pur abitando molto vicini alla frontiera, a Ventimiglia (IM), all’epoca non ero poi ancora andato tante volte di là…

 
Continua...

from Adriano Maini

Miano! Mio padre, mio zio, mio nonno di sicuro erano nati a Miano di Medesano in provincia di Parma, borgo più vicino a Fornovo Taro che al capoluogo. E chissà quanti altri avoli, prozii e lontani cugini! Da qualche tempo con mio cugino abbiamo ripreso a scambiarci foto e ricordi di famiglia, ma riusciamo a ricomporre vicende soprattutto per la parentela legata alla nonna, radicata anch’essa a quei luoghi.

Altre volte ho evocato su questi temi certe atmosfere e certi aspetti mutuati dal film “Novecento” di Bernardo Bertolucci. In proposito, mi sono dimenticato di citare a mio cugino la scena in cui un bambino va a “pescare” le rane, una scena incantevole nel racconto di mio padre, analogo protagonista poco prima – data la sua età – della sua emigrazione.

Già, l’emigrazione. Emigrazione dovuta – di successione in successione – allo spezzettamento dei poderi; emigrazione che ha disperso di più i Maini; emigrazione che ha visto tutti rendersi onore nella vita; emigrazione che ha comportato per la mia famiglia un maggiore coinvolgimento dei cugini della nonna, come é stato per l’approdo definitivo – dopo una brevissima stagione francese a Le Cannet – a Ventimiglia (IM) nel 1932.

Solo nel dopoguerra le nostre terre di origine conobbero il benessere diffuso.

C’era anche lo zio Bruno, disperso nella seconda guerra mondale a dicembre 1942 nella Sacca del Don. Morto in Russia come il cugino Sergio, della famiglia che aiutò i Maini a stabilirsi definitivamente in Riviera. E lo zio Bruno era figlio del primo matrimonio di nostro nonno, che – lui, appena scampato agli orrori del conflitto e destinato ad una lunga vita! – al termine, appunto, della Grande Guerra si era visto portare via dalla spagnola la moglie ed una figlioletta: quando si dice il destino!

Queste note mi portano con la mente lontano, a curiosi aneddoti, pertinenti la vita in Miano dei nostri genitori e rinfrescati di recente con mio cugino...

 
Continua...

from Adriano Maini

Li avevo persi di vista da anni… L. veniva a scuola in pullman da un paesello e come tanti adolescenti pativa quel tipo di locomozione. Cambiò per l’Istituto di Ragioneria, nel quale conseguì una sorta di borsa di studio per frequentare un anno di scuola (validato) in America ai fini di fare pratica di inglese. E all’epoca un po’ di invidia la provai. Anche perché ai liceali quei percorsi erano forse preclusi. Laureato, era ancora timido in pubblico, sì da chiedermi se poteva venire a presentarmi in qualche comizio nell’entroterra: per farsi le ossa a parlare in pubblico. Di sicuro più tardi, se non prima, frequentò N. e S. Divenne manager, prima in banca (lo incontrai per caso davanti al Duomo di Milano), poi in un’industria. Quando lavoravo ancora lo vidi di sfuggita qui in Riviera. E mi persi in seguito i suoi numeri di telefono. Negli ultimi tempi ci siamo rivisti, ma sempre di fretta… P. non credo abbia mai conosciuto gli altri di cui accenno. Era creativo ed estroso già da ragazzo. Per lui i viaggi in autostop erano una dimensione esistenziale. Mi lasciai coinvolgere, se non proprio da lui, da altri amici, ma si era tutti assieme a fare squadra, in quello che per me fu un mezzo viaggio, comunque interessante, ma per lui e per B. un giro in mezza Europa. Oggi é un versatile artista affermato. Poeta, anzitutto. Ecco, lui l’ho un po’ recuperato tramite Facebook. G., anch’egli come P. di immigrazione siciliana, faceva il frontaliere nel Principato, quindi si alzava prima dell’alba, ma non mancava mai alle discussioni ed all’impegno del tormentato inizio anni ’70. Una sua leggera operazione mi fece conoscere, da visitatore, l’Ospedale di Monaco. Protagonista di un memorabile viaggio in auto (cui non potei partecipare perché decisamente impegnato sul campo) in Francia con N. e S., dai cui resoconti ho attinto molti particolari per le mie storie. Conobbe una bella granatiera di norvegese che felicemente sposò. E fece il tranviere ad Oslo. Lui l’ho intravvisto a Ventimiglia già pensionato, con splendidi figlioli e matrona ancora più radiosa. “Ci vediamo.”. “Quando torno, ci sentiamo!”. I saluti ce li scambiamo tramite i suoi fratelli. Quando capita. Ma poi ci siamo rivisti più spesso, si può dire ogni anno. E tante vicende e tanti amici abbiamo rivisitato con i nostri discorsi appassionati. Soprattutto mi ha fatto conoscere buona parte della storia affascinante della famiglia di M.P., la prima moglie di N., venuta ad abitare dopo la pensione nei nostri luoghi, e che G. passa a trovare ogni volta che scende in Riviera. N., d’immigrazione dal Polesine (e al secondo matrimonio di S. mi raccontò di sue ricerche storiche locali), faceva il bracciante nella campagna epicentro de “La curva del Latte” di Nico Orengo. Alle due di notte teneva testa a Francesco Biamonti in quelle lunghe discussioni nelle quali il romanziere di San Biagio della Cima, che non aveva ancora esordito come tale, dimostrava una sua grande dote, mai appieno oggi rammentata: la sua grande signorilità. N., dalla grande dialettica e dalla grande erudizione da autodidatta, conobbe una graziosa insegnante di Milano, la M.P. cui ho già accennato. Ne conseguirono l’amore e il trasferimento a Milano. In una di queste tappe, forse quella definitiva, lo accompagnammo io e S. Gustoso l’episodio delle strelitzie, da lui portate alla fidanzata, che, dimenticate a mollo, stavano per trasbordare dalla vasca da bagno. N. vinse un concorso pubblico, studiò pur lavorando, conseguendo via via diploma magistrale e laurea. E di conseguenza salì, mediante concorsi, i gradini di una onorata carriera, in diversi comuni dell’hinterland della metropoli lombarda. Ma quel suo amore di gioventù finì già diversi anni fa. Otto anni fa ho rivisto anche lui. Da allora ci siamo rifrequentati ogni volta che è tornato a Ventimiglia (IM). N., che mi ha fatto conoscere parte dei materiali da lui raccolti per la sua poderosa tesi di laurea, dedicata alle lotte dei braccianti del Polesine nel secondo dopoguerra. Ed autore di almeno un intrigante romanzo, di cui mi donò copia, presentato anche a Ventimiglia (IM) da un altro amico di gioventù, B.E., in un incontro pubblico di cui non avevo recepito notizia, perché quando lavoravo ancora mi facevo sfuggire troppi eventuali appuntamenti per me allora di carattere privato. Eppure ero già in pensione da poco quando N. era sceso da Milano per relazionare a sua volta su di un libro. Per me doppia occasione persa in quel caso. Trattandosi di memorie di carattere sociale sulla Ventimiglia di poco precedente la seconda guerra mondiale, su Ventimiglia durante il conflitto (bombardamenti, antifascismo, padre e figlio ebrei tragicamente catturati per i campi di sterminio), su Ventimiglia della ricostruzione e di pochi anni dopo ancora (con tante persone che pur ho conosciuto o di cui ho sentito le vicende, spesso affascinanti, come quella di Libero Alborno, uomo non poi troppo rivisitato da Nico Orengo nel suo “La curva del Latte“, quando lo rende come protagonista principale). Perché autore di questo lavoro è C., quel C. che proprio insieme a N. fu determinante per farmi entrare in politica. N. mi aveva confermato che al secondo matrimonio di S. c’era anche L., che non compare, perché arrivato in ritardo da Milano alla cerimonia, nelle fotografie di quel giorno, in cui, invece, si può notare che facciamo gli spiritosi io, lui e S., con T. tutto serio, ma senza la… sposa. N. mi aveva, inoltre, integrato la vicenda familiare della sua prima moglie, in parte confluita in un bel libro, scritto poco tempo fa da MP. N. mi aveva autorizzato, facoltà di cui mi sono avvalso più volte e mi avvalgo tuttora, a trascrivere suoi pensieri e suoi ricordi. Purtroppo è deceduto l’anno scorso… Storie un po’ così.

 
Continua...

from Byte for your thoughts

Should I use angular, react of insert-framework-of-the-month for my next project?

prospective web developer in 2019

What framework should I use for web development in insert-exciting-new-language?

unsuspecting developer encountering an exciting new language

Web has become the default UI layer in recent years. Most projects grow around either a web or native mobile app. I myself usually start prototyping a new product by cobbling together a web app and hooking it up to a backend service.

However, what if that web (or mobile) app was not the right choice? Can we get away without building it at all? Here are a few interesting results I've come across while exploring this premise.

War Frontend, what is it good for?

Let's see what we'll be getting rid of. Web app frontend serves 2 basic functions:

  1. Present information to the user.
  2. Collect input from the user.

Any substitute will need to serve those 2 functions.

Drawbacks of writing a web app:

  1. You have build it in the first place. Code you don't have to write is the best code.
  2. You need to teach your users where to find it and how to use it. Using conventions such as Material design helps with usability, but discovery is still an issue.
  3. It can get hard to satisfy power users. Think about users who want to do everything without lifting their fingers away from the keyboard, or write python scripts to crawl your web app.
  4. You might be more interested in backend development. This one becomes more important in case of a side project, or Google stye 20% project.

Having these drawbacks in mind, here are a few projects that I've worked on lately and how I've gotten away without writing a web app frontend for them.

Internal framework support tool

Use case

At my job I lead an API infrastructure team. We develop a framework that other dev teams in the company (~20 teams) use to expose their public APIs. We also maintain the application that runs those APIs. It's something like an in-house implementation of Amazon lambda and API gateway in one service. We've noticed that developers from other teams had low visibility into current state of our production system. I decided to build a dashboard-like tool for them to monitor and manage their APIs.

Failed attempt

First I envisioned the solution like a web app dashboard that collected data from production instances of API service and provided some management operations. Looking for a learning opportunity on this pet project I picked Angular Dart framework to built it with. Few weeks later I built a really nice generic table component (which lagged terribly if populated by more than 5 rows) and lost interest in the project. Count this as 1th and 4th drawback taking their toll.

Success story

Few months later, inspired by the frontendless idea, and after discovering wonderful systems programming language Go, I decided to revisit the project. For my second attempt I decided to build a command line app instead of web frontend.

I actually finished this time, and have discovered new and interesting use-cases in the process. Writing a CLI tool allowed me to easily implement scaffolding features that help developers build their API scripts locally. This is something that would have been difficult to implement in web app, and would have probably never crossed my mind.

Since target audience for this project were other developers, having a CLI instead of a web app did not hurt usability. If anything, it was easier to make power users happy, as they can integrate the CLI into their CI pipelines, and other scripts. So this approach countered the 3rd drawback (in addition to 1st and 4th).

Client hash lookup tool

Use case

API platform I work on uses hashids to generate short ids for out clients. Occasionally folks from support or sales departments needed to find the hash id that belongs to a given client, or reverse. They used to ping my team each time. We decided to build a simple tool they could use to do the lookup themselves.

Roads not taken

We abandoned few ideas right away. For example, building a CLI like in the previous example wouldn't have worked because our users, support and sales people, were not tech savvy enough. We also decided not to go the web app route because it seemed like an overkill for such a simple functionality.

Solution

One tool that all departments within the company use is Slack. So we decided to implement this lookup tool as a slack bot. We used the Hubot framework and I ended up finally learning basics of CoffeeScript. I guess there's no escaping web technologies, even in a frontendless project.

Unexpected benefit of using a Slack bot was ease of discovery. Since our bots participates in public channels, every time a user interacts with it all other channel members see it happen. Every usage is simultaneously a feature demo for potential new users.

Projects registry

Use case

My team recently decided to invest more time into API governance. One thing that become clear immediately was that we needed a registry of all existing APIs. We needed to know which in-house team exposes which APIs and what platform features they use.

You guessed it, frontendless

For this one we didn't even consider building a web app. We already use Confluence to store our internal project documentation. That's the place our product owner and other stakeholders go to find information. However, API projects grow dynamically as developers work on them on daily bases. Manually updating a Confluence page every time a dev in the company adds a new feature to their API wasn't sustainable.

In the end we created a script that can crawl through our git server, find all API projects, collect relevant info and update the Confluence page with it. Both Confluence and Bitbucket (our git server of choice) provide detailed enough APIs, so this wasn't hard to pull off. We set the script to run every night and that was it.

Using existing wiki platform to display our data allowed us to skip entire categories of features, like access permissions, user mentions and comments. And in the end it was easier for our users to find the information they need because they were already used to looking for it on Confluence.

Takeaways

There's one common thing in all three of these examples:

Web app was replaced by a tool that's “closer” to intended users.

In case of developers that was a CLI app. In case of employees from other departments that was Slack. In case of stakeholders that seek project information that was internal wiki. Each time the end product was either easier to discover and learn for new users, or more flexible or power users.

Stepping out of the web app mindset has also had some interesting side effects:

  • Discovering exciting new features that wouldn't fit into a web app.
  • Learning new technologies, such as Slack bots.
  • Significantly reducing development times.

Granted, there are still many situations when picking a classic software as a service approach and building a web app is the right call. However, when you find yourself starting a new project ask yourself if there is another model better suited to your users.

And then share your #frontendless success story with me!

 
Read more...

from icloudbypasspro

iCloud Unlock Online

What for the iCloud Unlock Online for simply?

Following the stolen or lose limited all of society are considering the device's checked information. A hint of the time the device taken characters will coerce you approximately tool's records. So apple coordinators have made a few responses for use on like this 2nd. You can allow the misplaced angle. Beginning there beforehand, all and sundry can not get to the tool without Apple identity and confuse country. unexpectedly you have got ignored your identity you can use the DNS iCloud Unlock Online manner for purchasing proper of access to iCloud Bypass Online. For more info just visit https://www.icloudbypassonline.com/

Is iCloud Unlock Online offers you to stacks of capabilities with loose downloading

At the point when associated with the iCloud Unlock Online mechanical assembly, your computer will subsequently apprehend your contraption and it's going to annihilate the iCloud account set away to your iPhone, iPad or numerous devices. From that point forward, your contraption can be completely useful and you can get to any limit because of the reality this iCloud Bypass Official removal path of movement it's far lasting and does not require extra settings. If you get any missteps on the same time as accomplice your contraption to the laptop, guarantee you're the use of a novel USB connect, and utilitarian. Diverse insects had been no longer offered a shred of evidence to us, our object being immaculate with any windows OS thirty-six or sixty-four bit. Strive now not to dither to interface them for also request

Advantages if make use of authentic iCloud Unlock Online iPhone issuer

A proposal like this is tough to find out. You currently get the opportunity for authority iCloud Unlock Online to persuade clean of for iPhone 6S/a noticeably long time. on the off threat that you have troubles with iCloud Bypass Pro, at that factor you reflect on consideration on what I am discussing. While your gadget is bolted you aren't worth to regularly positioned it to apply. Be that as it can, on the occasion which you utilize our administration receives the following benefits:

  1. Forever answers in your iPhone

All the time iCloud Unlock Online opened iPhone devices on processing plant grade degree will by no means with the resource of relocking. Do not hesitate to iOS update or restore your device free of stresses

  1. Securely unlock method

With the professional iCloud Unlock Online release management your iPhone assures won't be ended.

  1. Apple guarantee will continue to be life

Our iCloud Unlock Online approach won't reason your troubles together with your cutting-edge agreement with the administrator. iCloud Bypass Pro is checked and affirmed via Apple. Every update was available on the internet!

What units are available to reputable iCloud Unlock Online the certification approach?

Any contraption that professes to steer clear of the test approach is maximum possibly a snare. Take the vital steps now not to strive to make use of such gadgets as they may method you for personal information and use it to their one among a type preferred role or for unlawful purposes. At the off danger which you can not open with legit iCloud Unlock Online the gadget utilizing the strategies given above, odds are that you got a stolen gadget. In the sort of case, you can contact police or Apple to repair the machine to the critical owner. Take the vital steps now not to expose any precious records on this kind of districts. You could, regardless, strive those targets or gadgets at your one in all a kind hazard as a part of the time they'll work.

 
Read more...

from Andrés Flamenco

Cómo instalar Firefox Quantum en Debian 9 (Stretch)

Debian

Con motivo del programa Aprender Conectados llegó al Jardín de Infantes del que soy director el nuevo equipamiento de tecnología, consistente en un servidor portátil con contenidos educativos, tablets para uso de los alumnos, dos robots, un proyector multimedia, una pizarra digital, una notebook y una PC de escritorio, entre otras cosas. Quizá en otro post haga una reseña de este equipamiento que, realmente es excelente y muy necesario para el aprendizaje en la vida digital de hoy día pero, a lo que nos ocupa:

La PC de escritorio (una HP Z240 Workstation, maquinón) viene con Debian 9 Stretch (sistema operativo GNU/Linux con escritorio GNOME) y, para ponerla a punto, tuve que configurar algunas cuestiones, instalación y actualizaciones de repositorios y software, principalmente y configurar la impresora (seguramente escriba un post de este último punto).

Con respecto al navegador, Debian 9 viene por defecto con Firefox en su versión ESR en inglés, y no hay forma de pasarlo a español, ni de actualizarlo a la última versión. Por lo tanto, aquí las instrucciones para instalar la última versión de Firefox (actualizable) y desinstalación de la versión ESR:

Descargamos la última versión de Firefox en español desde este link.

Abrimos el explorador de archivos y, en la carpeta Descargas hacemos click derecho >> Abrir terminal aquí

Descomprimimos el archivo de instalación en la carpeta /opt. Para esto vamos a usar el siguiente comando (reemplazar las XXXXX con el nombre exacto del archivo que bajamos:

sudo tar xjfv firefox-XXXXX.tar.bz2 -C /opt/

Ahí deberemos escribir la contraseña de nuestro usuario que nos pide la consola para autorizar el comando ingresado.

Ahora, con el siguiente comando creamos el acceso directo a Firefox, a fin de poder ver el ícono cuando abrimos el menú de aplicaciones:

nano /usr/share/applications/firefox-quantum.desktop

Con ese último comando se abrirá el editor de texto Nano, en el cual copiamos y pegamos lo siguiente:

[Desktop Entry]
 Name=Firefox Quantum
 Comment=Web Browser
 GenericName=Web Browser
 X-GNOME-FullName=Firefox Quantum Web Browser
 Exec=/opt/firefox/firefox %u
 Terminal=false
 X-MultipleArgs=false
 Type=Application
 Icon=/opt/firefox/browser/icons/mozicon128.png
 Categories=Network;WebBrowser;
 MimeType=text/html;text/xml;application/xhtml+xml;application/xml;application/vnd.mozilla.xul+xml;application/rss+xml;application/rdf+xml;image/gif;image/jpeg;image/png;x-scheme-handler/http;x-scheme-handler/ht$
 StartupWMClass=Firefox
 StartupNotify=true

Guardamos con Ctrl+O, salimos del editor con Ctrl+X y cerramos la consola.

Con esto queda instalado Firefox en español, en su última versión y accesible desde el menú de aplicaciones.

Para activar las actualizaciones desde el menú Ayuda de Firefox, abrimos una ventana de consola y copiamos y pegamos lo siguiente (ingresamos nuestra contraseña cuando nos la pida):

sudo chmod -R 777 /opt/firefox/

Por último (esto es opcional aunque recomendable), desinstalamos la versión de Firefox ESR en inglés que venía con el sistema operativo con los siguientes comandos (ingresamos nuestra contraseña cuando nos la pida):

sudo apt remove firefox-esr
rm -rf /usr/lib/firefox

Hasta aquí fui más o menos siguiendo el excelente tutorial que encontré en el blog El Baúl de Linux (Muchas gracias!).

A mí me ocurrió que el ícono que debería figurar en el menú de programas no estaba. Es decir, estaba el título del programa, se podía hacer click y abrir el navegador pero no se visualizaba el ícono, como si tuviera transparencia al 100%. Lo solucioné así:

Hice una búsqueda de imágenes del logo de Firefox (formato png con fondo transparente), elegí la que más me gustaba y la renombré como mozicon128.png.

En una ventana de consola escribí:

sudo nautilus

Con esto se abrió el explorador de archivos en modo root, y ahí fui a la carpeta /opt/firefox/browser/icons/, y copié y pegué la imagen mozicon128.png.

Luego de esto, se dejó ver el ícono de Firefox Quantum en todo su esplendor.

Firefox Logo

Nada mas por hoy, nos vemos!

Andrés

 
Leer más...

from @witziege@qua.name

Hier kannst du dir den fertigen Beitrag anhören.

Download OGG Download MP3 Weiter unten findest ein paar Informationen darüber.

Abschlussarbeit als Mediengestalter Bild/Ton

Über die letzten drei Jahre habe ich eine Ausbildung zum Mediengestalter Bild/Ton absolviert. Vor kurzem habe ich dafür meine Abschlussprüfung abgelegt. Teil dieser Abschlussprüfung ist die Erstellung eines Bild- oder Tonprodukts, in der Regel im Stil eines Fernseh- oder Radiobeitrags.

Ich habe mich entschieden einen Radiobeitrag über meinen Bruder zu erstellen, der zu der Zeit Freiwilligendienst im Kloster Dammbeck in der Nähe von Salzwedel, Altmark, Sachsen-Anhalt geleistet hat.

Exposé

Niels ist ein Aussteiger. Und das mitten in Deutschland. Ein halbes Jahr lang leistet er Freiwilligendienst im Kloster Dambeck in der Altmark, einem Selbstversorgerprojekt. Dabei geht es nicht nur um den Eigenanbau von Lebensmitteln, sondern auch um den Wiederaufbau einer über 750 Jahre alten Klosteranlage. Das autarke Leben als Aussteiger mit ökologischem Landbau hat Niels dazu bewegt, nach seinem Schulabschluss ins Kloster zu ziehen. Ab vom Konsum, dem Hamsterrad der Arbeit, wie er sagt, raus in die Natur, und vor allem weg von dem irren Wahnsinn der Gesellschaft. Aber das Leben im Kloster ist nicht leicht. Es gibt jeden Tag viel Arbeit zu tun, Handwerkeraufgaben werden selbst erledigt und die Tiere und Gärten müssen gepflegt werden, um alles Lebensnotwendige zu erhalten. Ein Holzofen als Heizung im Zimmer ist da das geringste Übel. All das hat Niels freiwillig gewählt. Für ihn eröffnet es eine neue Welt mit neuen Möglichkeiten. Als Hörer dieses Radio-Kurz-Features begleiten wir Niels einen Tag auf dem Kloster und erfahren seine tägliche Arbeit und die Besonderheit des Klosters.

Zum fertigen Radio-Beitrag

Zu hundert Prozent das Exposé zu treffen war nicht mein Ziel. Mit einer maximalen Länge von etwa fünf Minuten musste ich einige Inhalte kürzen. Die Prüfungskommission bewertete das Ergebnis mit 78%. Größter Kritikpunkt ist die Nachbearbeitung der Sprecherstimme. Durchaus berechtigt, wie ich im Nachgang finde.

Technik

Die Technik für die Realisierung des Beitrag habe ich von einem guten Freund bekommen. Vielen Dank dafür :)

  • Fieldrecorder Zoom H6 mit diversen Ansteck-Mikrofonen
  • Großmembran Kondensator Mikrofon für die Sprecheraufnahmen
  • Ardour5 als DAW (digital audio workstation – das Computerprogramm für die Bearbeitung)
  • eine Abstellkammer als “Studio” :D

Prüfstück zum Anhören

Hier kannst du das Radio-Feature anhören. Ich hoffe es gefällt dir. Feedback nehme ich gerne auf Mastodon entgegen oder per Mail

Download OGG Download MP3

Lizenz

Der Radiobeitrag ist unter der Creative Commons Attribution 4.0 International License veröffentlicht.

Creative Commons License
This work is licensed under a Creative Commons Attribution 4.0 International License.

 
Read more...

from fragmentos

De repente me bateu uma ansiedade injusta. Aquele tipo de espera na qual não podemos mudar — não podemos fazer absolutamente nada. Ficamos sentados, ou deitados, como se esperando que algo mudasse. Ficamos exaustos, atônitos e ao mesmo tempo elétricos. Preocupados com o tic-tac constante do relógio, com a não-pressa do tempo-espaço, com a vaguidão das coisas. De repente, é como se nada ali fizesse sentido algum — as coisas estão ali por motivo nenhum. E por não haver motivo, procuro justificativa nas coisas. Não acho. Cruzo as pernas e as mexo sem parar. Solto as pernas, fico balançando-as ininterruptamente, a cadeira fazendo um barulho de rame-rame insuportável. Eu não posso mudar nada. E por não poder mudar, eu não posso fazer absolutamente nada. Respiro fundo. O ar entra por inteiro, enche delicadamente os pulmões, sinto formigamento vindo de dentro para fora. Talvez seja a poeira cósmica.

 
Leia mais...

from fragmentos

Voltando para casa hoje depois de almoçar, me deparei com um homem e uma mulher sentados numa calçada, próximo de onde eu estava. A mulher estava colocando cimento em algum buraco no chão e o homem sentado ao lado, observando, mão no queixo, olhando para o tempo, enquanto ela dizia algo inaudível para mim. A expressão dela não era das boas, então acredito que estavam discutindo. Eles pareciam ter mais de 40 cada um. Fortes sinais de velhice no rosto, o cabelo dela voava para o rosto e ela, com as mãos sujas de cimento, colocava-os para trás jeitosamente. Parecia estar cansada de tudo aquilo. O homem se levantou e foi em direção à porta. Ela pareceu ter terminado o serviço, também se levantou, pegou o balde e a pá com os quais estava mexendo o cimento e foi em direção a casa. Não sem antes fazer uma expressão de tristeza, de quase choro. Atravessou o portão e fechou-o com força.


Acredito que quando se está com a consciência limpa, você faz coisas para clarear e resolver a situação e não embaraçá-la ainda mais. A velha máxima do “quem não deve, não teme” se aplica em quase todas as instâncias da vida, embora seja bem clichê. Bem... alguns clichês dão lições perfeitas para a vida inteira.


Sim, me sinto sozinho, não tenho ninguém para compartilhar dirty secrets ou ninguém para azucrinar ou conversar quando precisar. E não, não falo de amizades — tenho bons e selecionados amigos. A gente vai envelhecendo a aprendendo a “peneirar” quem entra e sai da sua vida, claro que sim. Mas parece que falta alguém. Daí me pego pensando: será que não é o efeito mídias sociais querendo me pegar? A gente vê tanta gente feliz postando fotos felizes, fazendo coisas felizes. Aí você olha para a sua vida: por que não estou fazendo o mesmo também? Sou obrigado a tal coisa? Não somos. Mas as pessoas acham que somos. E o ciclo doentio começa.

 
Leia mais...

from fragmentos

Antes de ir ao barbeiro, passei na livraria. Aquelas grandes, que tem no Brasil todo. Subi na escada rolante, entrei, fui direto para a sessão de literatura estrangeira, em especial à estante de livros da literatura russa. No meu mais remoto pensamento ingênuo, achei que algum box do Dostoievski ou Tosltói estariam mais baratos. Todos acima de R$150. Respirei fundo, ali mesmo em pé, com o box na mão. Devolvi-o à estante. Queria ler Crime e Castigo. Ou Ana Kariênina. Não queria recorrer aos livros do Kindle. Depois que se tem um tablet assim, você aprende a dividir as leituras: aquelas que você pode ler no digital e outras que você precisa ter a experiência do papel, do livro em si, do folhear constante. Mas cento e cinquenta reais em um país como o Brasil, em pleno 2019? Foda. Vai ficar para depois. Como qualquer objeto cultural hoje em dia.


Acredito que seja difícil até para os bolsominions engolir essa história de o filho do Inominável ser embaixador do Brasil na terra do Tio Sam. No fundo, eles devem achar toda essa história um grande absurdo e não tem como dizer não ou achar qualquer outra alternativa de protesto. Precisam apoiar. E apoiam. Vocês lembram na época de colégio quando toda sala de aula tinha aquele grupinho vagabundinho que nunca estudava e vivia tirando sarro da galera? Geralmente nesse grupo ficavam filhinhos de papai, aqueles 'estudantes' que nunca eram exemplo de nada, mas mostravam sua força através de atitudes estúpidas. E eram aplaudidos muitas as vezes. Agora imaginem uma eleição para 'líder de sala' e um desses menino vence. Pois é. O cara mais estúpido da sala agora é líder da turma e vai representar todo mundo colégio afora. E você fica se perguntando: mas como esse cara conseguiu se eleger? Tanta gente assim votou nele? E olhe que nem estou questionando o mérito da votação. Deve ter sido legítimo, sem fraude. Questiono a integridade moral das pessoas. Elas de fato votaram mesmo? E todo aquele papo de votar bem, mudar o mundo, acabar com a fome, a miséria, educação de qualidade e pública? Ah sim... encontraram um monstro debaixo da cama que se chama comunismo e precisam destruí-lo. Boa sorte com isso.


No ônibus, que não estava lotado, eu estava sentado na cadeira alta, ouvindo música, óculos escuros, estava voltando do barbeiro. Fones de ouvido novos, comprados em Portugal (uma relação quase afetiva com eles). Duas mulheres sentadas na minha frente quando uma delas menciona que quer descer e se prepara para sair da cadeira. A outra mulher olha para mim e diz alguma coisa que eu não entendo, pois a música estava alta. Eu tiro o óculos e peço para ela repetir. Eu ouvi e em seguida respondo. Bom, é isso. Ao invés de tirar os fones, eu tirei os óculos para ouvi-la melhor. Foda.

 
Leia mais...

from fragmentos

Todo mundo já decidiu escrever um livro em algum momento na vida. Ou talvez o correto não seria ‘decidido’, mas pensado, talvez. “Vou escrever um livro sobre essa minha vida desastrada”, etc. A gente tem essa urgência de escrever, como se colocar as coisas no papel fosse uma solução “carta-na-manga” para muitas de nossas angústias. No final, ninguém faz absolutamente nada. Continuamos alimentando nossa frustração diária e dizendo que sim, vou pôr no papel (ou na tela do computador) o acontecimento de hoje para jamais esquecer e livrar de mim tal preocupação.


Quando eu tinha meus 20 anos, fazia cursinho pré-vestibular em uma escola perto de casa. No caminho de casa para lá, uma senhora com um vestido rosa rasgado bem na alça próximo ao pescoço estava aguando as plantinhas em frente as casa dela. Eu caminhava normalmente e ao mesmo tempo lembro de observar aquela cena, que parecia tão simples, mas muito significativa para mim. Era a simplicidade ali, personificada. Era a paz dando de regar às plantas. Essa cena foi pano de fundo de uma crônica minha, que hoje luto para achar em algum CD gravado por aí. Maldita tecnologia que não dura mais nada.


Outra vez, no ônibus, passei pela catraca e uma senhora, talvez nos seus 45-50 anos, estava sentada na janela com a cabeça encostada no vidro. O ônibus estava vazio. Sentei um pouco atrás, mas do outro lado. Olhando com mais atenção eu poderia ver o rosto dela de perfil. Observando a janela tranquilamente, vejo sem querer o rosto dela. E noto que estava molhado. Ela continuava com a cabeça encostada no vidro. O ônibus balançava muito. Foi quando notei uma lágrima caindo, lentamente. A cena foi rápida. Ela limpou em seguida e o lotação teve que parar pois chegara ao destino final. Um mulher chorando, tranquila, dentro de um coletivo. Milhões de razões.


Também no ônibus, certa vez sentei antes da catraca para descansar as pernas. Subiu uma moça, deficiente visual, sozinha. Sentou-se na cadeira em frente a minha. Sacou o celular e colocou-o bem próximo ao ouvido. Em seguida, ela digitava os números e ouvia os sons atentamente, precisamente para saber se eram aqueles mesmos. Ela adaptou-se ao mundo pelos sons de tudo ao seu redor, e agora sabe o “som das letras”. Que som tem o um? E o nove? A fulana que sentou na minha frente sabe. Alguém atendeu e ela conversava amenidades.


Não gosto de ir a cemitérios. É o lugar do fim para muita gente. Não tem como não significar ‘fim’. É o lugar onde sempre caminhamos devagar em um sinal de respeito e vamos em direção aos restos materiais de quem não existe mais aqui. O lugar onde todo mundo é igual, onde não há classes sociais, divisão de classes por quantidade de dinheiro — tudo isto é criação da gente, humanos. Ninguém alcança a luz por ter mais zeros à direita na conta, mas pelo o que fez enquanto em vida. Ou Pablo Escobar não deixou nenhuma lição pra você?

 
Leia mais...

from Ellsworth Magee

An average user with no technical background can definitely be intimidated by the thought of executing a highly technical process such as to convert OST to MBOX! The process certainly has quite many aspects that can take a turn for the worse for the users who do not have deeper knowledge on the subject. That being said, there is a sound way of getting over this hurdle which is to opt for OST Extractor Pro.

While there are many email conversion tools available in the market but OST Extractor Pro is quite unique in its approach, especially so for the beginners in this segment. The tool has a unique interface that is naturally interpretative. Moreover, the process doesn’t include any difficult expressions that can create confusions in the overall execution. Needless to say, the tool is capable of giving a sensational output too.

It is definitely in the best interest of the users to opt for this tool to convert OST to MBOX!

It can also convert OST to PST, Mozilla Thunderbird, Postbox, Apple Mail as well as EML file format.

convert ost to mbox

What are these easy guidelines that everyone is talking about? Many tools promise easier and lighter paths to converting OST to MBOX but rarely do these tools stand the ground. Rather, these tools fall short on offering even the basic functions pertaining to the task of converting OST to MBOX.

OST Extractor Pro, on the other hand, stands true to its word and offers free-flowing route straight to the impeccably converted files. A simple elaboration of a few of these major guidelines can be illustrated as below:

  • In order to convert OST to MBOX in the traditional manner, one is required to extract the OST database prior to setting foot on the core process. However, this tool simplifies the task by completely eliminating the need to extract the data. This is achieved as the tool scans and extracts the default data files on behalf of the user. This action not only lightens the burden of the user but also speeds up the process to a great extent.

  • Another important aspect that is covered by the tool is the convoluted steps to the final destination. The tool has hardly 5 steps which can be followed without any problems. These include simple choices as per the user requirements. For example, the finalization of files and folders post their upload onto the tool, etc.

  • A simple interface definitely solidifies the whole concept of docile process offered by the tool. Everything is displayed on a single screen GUI and thereby there is a vivid understanding of each and every step to convert OST to MBOX.

  • OST Extractor Pro also offers a 24*7 customer care service to those who wish to convert OST to MBOX. In case, any user gets stuck, the friendly agents come to their rescue in no time.

OST Extractor Pro is a tool that one can rely on with eyes closed. It holds the capability to produce the desired results very precisely and thus live up to the expectations of the users.

 
Read more...