[{"content":"Editing PDFs is always a headache. I don\u0026rsquo;t most of the time, but I was always scrambling to find a GUI tool when I need to. As I moved from Windows to Linux, my options became even more limited. For a long time, I was using free online PDF editors. It was enough, until I wanted to edit a PDF with sensitive private information. That forced me to explore command line tools. I had found a few since then. Here is a little cheatsheet to share.\nImage to pdf Installation pip3 install img2pdf # or sudo apt install img2pdf Example img2pdf --pagesize A4 -o enbridge_bill.pdf IMG_20220201_110317~2.jpg IMG_20220201_110347~2.jpg IMG_20220201_110454~2.jpg IMG_20220201_110522~2.jpg pagesize options: support A\u0026lt;num\u0026gt; sizing and Letter it\u0026rsquo;s case sensitive\npdftk Installation sudo apt install pdftk Change pdf bookmarks You can create a new pdf file with the new metadata, e.g. bookmark. This is particularly useful for me because Okular\u0026rsquo;s bookmark system stores the user added bookmark somewhere else entirely.\nGet existing pdf metadata pdftk \u0026lt;pdf_path\u0026gt; dump_data # could save stdout to file pdftk target-pdf.pdf dump_data \u0026gt;\u0026gt; ./metadata update the metadata file Code snippet for bookmarks\nNumberOfPages: 161 # what goes before BookmarkBegin BookmarkTitle: \u0026lt;title\u0026gt; BookmarkLevel: 2 BookmarkPageNumber: \u0026lt;page\u0026gt; # what goes after PageMediaBegin Create new pdf with new metadata pdftk \u0026lt;original_pdf\u0026gt; update_info \u0026lt;new_metadata\u0026gt; output \u0026lt;new_pdf\u0026gt; Merge PDFs pdftk A=\u0026lt;file path\u0026gt; B=\u0026lt;file path\u0026gt; ... cat \u0026lt;list of files aliases\u0026gt; output \u0026lt;output file path\u0026gt; pdftk A=file1.pdf B=file2.pdf cat A B output out.pdf Honorable Mention pdftools (python) . It support merge, add, insert, zip, \u0026hellip;\n","permalink":"http://individual.utoronto.ca/natasha_ps_ho/posts/editing-pdf/","summary":"Editing PDFs is always a headache. I don\u0026rsquo;t most of the time, but I was always scrambling to find a GUI tool when I need to. As I moved from Windows to Linux, my options became even more limited. For a long time, I was using free online PDF editors. It was enough, until I wanted to edit a PDF with sensitive private information. That forced me to explore command line tools.","title":"Editing PDFs"},{"content":"I have been around the tech world for a bit. Now that I am a lot more confident and comfortable as a software developer, what do I want to do next? It was unclear to me what was the difference between an engineering manager and a staff/principal engineer. Not to mention, I barely understood what was the difference between tech lead and engineering manager. What was with all these titles when everyone worked together in very similar capacity? At every stage of my career, I am often confused by what the next title truly meant. I had a similar question when I was progressing through junior to intermediate. As I am looking down my future career split road, I wanted to understand what being a manager and staff developer truly means. This had been troubling me for awhile until recently.\nBack in May, I attended the Women in Tech Texas 2022 conference. This was my first conference. I was unsure about what I want to get out of it. I took this question with me to the conference. I had a lightbulb moment when I was in Sarah Kim \u0026rsquo;s talk - Leading High-Performing Distributed Teams. Unfortunately, the recording is not publicly available. I will try my best to summarize it below.\nTalk summary: As a manager, you need to be clear about what\u0026rsquo;s your ideal dream team (leadership philosophy). Distributed teams might have additional challenges, but the management considerations are very similar to co-located teams. You need to pick new hires who would help you build your dream team. You need to translate the company\u0026rsquo;s goals and strategies to your team and match those with your team members\u0026rsquo; goals and aspiration (alignment). Alignment is achieved by thoughtful communications, e.g. 1-on-1s to engage with your team individually; lunch and learns for people to share new ideas; all hands meetings for C-suite to share the company-wide strategies; water cooler \u0026ldquo;meetings\u0026rdquo; for building connections within the team. A big part of your job is to decide the means and content of your communication.\nI sat in for this talk because I was curious how teams are adapting to remote work. Sarah did a great job on delivering what management really means. However, I became increasingly disengaged throughout the talk. I categorized both engineering manager and staff developer in the same realm of software development. While engineering managers need to have technical skills, it is about managing people at the core. Both roles are about software on the surface, but they have very different focuses underneath. I think of them as different dishes. When I am eating an omelette, the eggs are the star. The omelette could have meat or vegetables in it, but they are there to compliment the eggs. Meat and vegetables could be the star in other dishes with eggs as an accompaniment. People management is the main and software development is the side for engineering manager and the opposite for a staff developer. As she further elaborate the nuances of people management, I understood that is not what I would like to pursue.\n","permalink":"http://individual.utoronto.ca/natasha_ps_ho/posts/manager-vs-ic/","summary":"I have been around the tech world for a bit. Now that I am a lot more confident and comfortable as a software developer, what do I want to do next? It was unclear to me what was the difference between an engineering manager and a staff/principal engineer. Not to mention, I barely understood what was the difference between tech lead and engineering manager. What was with all these titles when everyone worked together in very similar capacity?","title":"Manager vs IC"},{"content":"Software Engineer Canonical\nNov 2021 - Present\nDevelop Kubernetes operators (i.e. charms) to manage the lifecycle of MLOps applications on Juju Participate and contribute to upstream kubeflow community Tech Stack: Python, Juju, Charmcraft, Kubernetes, microk8s, AWS, GCP, Kubeflow\nFull Stack Developer III TouchBistro\nSep 2021 - Oct 2021\nImplement permission service for merchants to set multiple tiers of authorization Design and create system to support corporations with multiple locations and organizations Actively engage with teammates, dev manager and product manager to ensure product success and project delivery Collaborate with design, product management, analytics, and support to create the best user experience Mentor other developers Write clear documentations, and recommendations for technical problems Write tests, utilize CI/CD and monitoring tools to ensure application’s quality Tech stack: node.js, React, TypeScript, AWS SQS, SES, LaunchDarkly, and Docker\nFull Stack Developer II TouchBistro\nSep 2020 - Sep 2021\nDesign and create signup and activation flow for merchants to self onboard with minimal agent support Implement workflows for passing data back to Salesforce to maintain data integrity Full Stack Developer I TouchBistro\nOct 2019 - Sep 2020\nBuild authentication service, single sign with Okta using OpenID Connect standard for merchants, azure for general public logins QA Automation Engineer Bunz\nMar 2018 - Apr 2019\nDesign, develop and execute automation scripts using open source tools Promote CI/CD by building tools for regular overnight test runs and on AWS Device Farm Actively research and try on new testing tools and strategies Review requirements, specifications and technical design documents to provide timely and meaningful feedback Participate in product design reviews to provide input on functional requirements, product designs, schedules, or potential problems Provide feedback and recommendations to developers on software usability and functionality Review product documentation to ensure technical accuracy, compliance and completeness Orchestrate and participate in the testing activities including designing test plans, scenarios, scripts, and procedures Estimate, prioritize, plan and coordinate testing activities Develop and apply testing processes for new and existing products to meet client needs Liaise with internal teams (e.g. developers and product managers) to identify system requirements Tech Stack: Ruby, Cucumber\nSoftware QA Analyst West Corporation\nApr 2017 - Mar 2018\nDesign, execute and maintain test plans for a variety of web and mobile-centric projects Identify, analyse, and document defects, questionable functions, errors, and inconsistencies in software program functions, outputs, online screens and content Compare test execution to specifications and documentation Document, track, and communicate test cases, results, analysis, and unresolved problems to developers Maintain defect-tracking database for multiple projects Analyse, test and document, and verify system change requests (defects, enhancements, new features etc.) Collaborate with Project Management and Development staff through all stages of the Project lifecycle Maintain test procedures for functional and system testing, and accompanying documentation Participate in software test plan reviews, requirements review, test execution, and problem reporting and resolution Technical Support Analyst Top Hat\nDec 2016 - Feb 2017\nResponding to over 90 support tickets a day in a thoughtful, efficient and friendly manner Achieve a customer satisfaction rate of above 99% Have a thorough understanding of the product, including product features, modules, and even bugs inside and out Find the root cause of an issue. Communicating with the development, product and QA teams to prioritize and resolve customer issues Pro-actively communicate with professors on a regular basis to ensure that all their issues and concerns are being dealt with Contact and liaise with IT departments in universities and explain our requirements to ensure compatibility before the start of classes Uses MySQL, Salesforce, Amplitude, Full Story, and JIRA on a day-to-day basis ","permalink":"http://individual.utoronto.ca/natasha_ps_ho/software/","summary":"Software Engineer Canonical\nNov 2021 - Present\nDevelop Kubernetes operators (i.e. charms) to manage the lifecycle of MLOps applications on Juju Participate and contribute to upstream kubeflow community Tech Stack: Python, Juju, Charmcraft, Kubernetes, microk8s, AWS, GCP, Kubeflow\nFull Stack Developer III TouchBistro\nSep 2021 - Oct 2021\nImplement permission service for merchants to set multiple tiers of authorization Design and create system to support corporations with multiple locations and organizations Actively engage with teammates, dev manager and product manager to ensure product success and project delivery Collaborate with design, product management, analytics, and support to create the best user experience Mentor other developers Write clear documentations, and recommendations for technical problems Write tests, utilize CI/CD and monitoring tools to ensure application’s quality Tech stack: node.","title":"Software Work Experience"},{"content":"Alto - St.James Cathedral 2018 - 2020\nThe Cathedral Church of St. James houses one of Canada\u0026rsquo;s most precious musical hidden gems. Uniquely within the city of Toronto, the fully professional 18-voice Cathedral Choir sings as part of the Anglican worship at Eucharist (11:00am), and Evensong (4:30pm) each Sunday to an internationally high standard. Its repertoire spans eight centuries, and provides a balanced diet of choral delights to congregations young and old, non-Christians and Christians, and those whose ears hold an insatiable curiosity for music.\nI was a part of the choir under Robert Busiakiewicz. Recordings are available on SoundCloud and CD Gate of Heaven on Spotify .\nRepertoire September 2018 October 2018 November 2018 December 2018 January 2019 February 2019 March 2019 April 2019 May 2019 June 2019 July 2019 August 2019 September 2019 October 2019 November 2019 December 2019 January 2020 February 2020 March 2020 Soprano - Toronto Mendelssohn Choir and Singers 2017 - 2019\nA chrous member in both the Toronto Mendelssohn Choir (TMC) and Mendelssohn Singers, a 70-voice ensemble formed from the ranks of the TMC. The Toronto Mendelssohn Choir is one of Canada\u0026rsquo;s oldest, largest and best-known choral ensembles founded in 1894 by Augustus Vogt. The Grammy-nominated Choir, as one of Canada\u0026rsquo;s largest choral organizations, believes its role is to provide Canadian audiences the experience of the classical choral masterworks of the world. Other than our own concerts, The Mendelssohn Choir actively collaborated with the Toronto Symphony Orchestra to perform choral masterpieces.\nI was a part of TMC under Noel Edison and David Fallis. You can listen to the Berlioz: Symphonie fantastique Recording on Spotify .\n2018/2019 Repertoire Fantasy on Shakespeare\u0026rsquo;s The Tempest - Hector Berlioz (1803-69) War Requiem Op. 66 - Benjamin Britten (1913-76) Festival of Carols Concert Hodie, Christus natus est - Healey Willan (1880-1968) Maria durch ein Dornwald ging - arr. Claas Once in Royal David\u0026rsquo;s City Ave Maria - Felix Mendelssohn (1809-1847) An Earthly Tree - Stephanie Martin (b.1962) In the bleak midwinter - Darke Hodie, Christus natus est - Sweelinck Weihnachten - Felix Mendelssohn (1809-1847) O Come, All Ye Faithful There is No Rose - Wilkinson Silent Night Es ist ein Reis entsprungen - Berg Laudate Dominum - Honegger Spotlight on North America Concert Ambe - Andrew Balfour (b.1873) Trapped in Stone - Andrew Balfour (b.1873) Gloria Deo Per Immensa Saecula - Healey Willan (1880-1968) Rise up, My Love - Stephanie Martin (b. 1962) Sleep - Eric Whitacre (b.1970) Alleluia - Randall Thompson At the river - arr. Aaron Copland Feller From Fortune - arr. Harry Somers Blanche comme la neige - arr. Sir Ernest MacMillan J\u0026rsquo;entends le moulin - arr. Donald Patriquin Handel and Haydn Concert Kettle Drum Mass (Mass in Time of War) - Franz Joseph Haydn (1732-1809) Locus iste - J. Michael Haydn (1737-1806) Ave Verum Corpus - W. A. Mozart (1756-1759) Coronation Anthems - George Friderick Handel (1685-1759) Sacred Music For A Sacred Space Concert O sacrum convivium - Olivier Messiaen (1908-92) Salve Regina - Francis Poulenc (1899-1963) Mass for double choir - Frank Martin (1890-1974) Jesus and the Traders - Zoltan Kodaly (1882-1967) Cherubic Hymn - Sergei Rachmaninoff (1873-1943) Song of Cherubim - Krzysztof Penderecki (b.1933) Complete this work which I began - Alfred Schnittke (1934-98) An Apostrophe to the Heavenly Hosts - Healey Willan (1880-1968) Carmina Burana - Carl Orff (1895-1982) 2017/2018 Repertoire Ein deutshes Requiem (A German Requiem), Op.45 - Johannes Brahms (1833-1897) Afghanistan : Requiem For A Generation - Jeffrey Ryan (b.1962) Toronto Premiere Festival of Carols Concert Sussex Carol - Bob Chilcott (b.1955) Hark! The Herald Angels Sing - arr. David Willcocks (1919-2015) The Holly and the Ivy - Stuart Thompson (b.1970) In dulci jubilo - Samuel Scheidt (1587-1654) In the Bleak Mid-winter - Ola Gjeilo (b.1978) Joy to the World - arr. Paul Halley (b.1952) Away in a Manage - arr. Elmer Iseler (1927-98) The Three Kings - Healey Willian (1880-1968) The Good News Carol - Joannie Ing (Winner of the 2017 TMC Choral Composition Competition) A Babe is Born - Robert Evans (1933-2005) Tomorrow Shall be my Dancing Day - John Gardner (1917-2011) The First Nowell - arr. Paul Halley Messiah - George Frideric Handel (1685-1759) TMC Choral Condctors\u0026rsquo; Symposium Gloria from Miss Kenya - Paul Basler Introit \u0026amp; Kyrie from Requiem - Maurice Durufle Confutatis \u0026amp; Lacrimosa from The Requiem - Wolfgang Amadeus Mozart Kyrie from African Sanctus - David Fanshawe The Beatitudes - Arvo Part Ubi Caritas - Paul Halley Old Lady Rose - arr. Larry Nickel Home I\u0026rsquo;ll Be - arr. Stuart Calvert The Promise of Living - Aaron Copland Berliner Messe - Arvo Part (b.1935) Seven Last Words from the Cross - James MacMillan (b.1959) Sacred Music For A Sacred Place Concert Behold the Tabernacle of God - Healey Willan (1880-1968) Mass in G Minor - Vaughan Williams (1872-1958) O Salutaris Hostia - Eriks Esenvalds (b.1977) Psalm 43 - Felix Mendelssohn (1809-1847) Nunc Dimittis - Felix Mendelssohn (1809-1847) Ave Maria - Pawel Lukaszewski (b.1968) Ave Maria - Sergei Rachmaninoff (1873-1943) Ave Maria \u0026amp; Christus factus est - Anton Bruckner (1824-1896) Song for Athene - John Tavener (1944-2013) Sleep \u0026amp; Her Sacred Spirit Soars - Eric Whitacre (b.1970) Candide - Leonard Bernstein (1918-1990) Symphony No.9 - Ludwig van Beethoven (1770-1827) Alto - Tallis Choir of Toronto Nov 2017\nThe Tallis Choir is a chamber ensemble of 36 voices that has earned a reputation for innovative programming and polished performances. Works from Gregorian Chant to contemporary choral music are represented, but the Choir is best known as one of the few ensembles in Canada specialising in the music of the Renaissance, particularly 16th century Italy and England. I was helping out in the Forty! Forty! Forty! concert, singing Ecce Beatum Lucem by Alessandro Striggion and Spem in Alium by Thomas Tallis.\nAlto - Edinburgh University Chamber Choir Jan 2016 - Apr 2016\nEdinburgh University Chamber Choir is one of the three choirs attached to the University of Edinburgh specialising in the classical repertoire. It is the smallest of the three choirs, consisting of 24 singers, and performs music from the 12th to the 21st century in two main concerts during the academic year.\nI took part in the Love and Death Concert conducted by Robert Brooks. Recordings are available on SoundCloud Love and Death Concert Repertoire Vincenzo Bertulosi (1550-1608) Osculetur Me Osculo Ego Flos Campi Camille Saint-Saens (1835-1921) Les Fleurs Et Les Arbres Calme Des Nuits Claudio Monteverdi (1567-1643) Dolicissimo Uscignolo Sfogava Con Le Stelle Love Lost - Paul Sjolund Endymion - Robert Brooks In Manus Tuas - John Sheppard (1515-1558) Songs of Farewell - Hubert Parry (1848-1918) Concert-mistress - Hart House Chamber Strings 2014 - 2015\nHart House Chamber Strings is a student-run music ensemble that is made up of students and alumni from various programs and departments at the University of Toronto who all share a love for music. We currently have about forty members, more than most chamber groups, which enables us to occasionally divert from the realm of “standard” chamber music and take on an eclectic repertoire.\nAlto - University of Toronto Trinity College Chapel Choir 2012 - 2014\nThe Trinity College Chapel Choir is a 28 voice SATB choir performing repertoire from Renaissance masters to living composers. The choir rehearses three hours weekly and performs a new set of music each Wednesday evening for Choral Evensong in the Trinity College Chapel.\nSoprano Choral Scholar - Christ Church Brampton Choir 2012 - 2014\nChrist Church Choir joins the 10:45 Traditional Service. Choral scholar is awarded $1200 per year for private voice lessons.\nAlto - University of Toronto Women\u0026rsquo;s Chorus 2012 - 2013\nUniversity of Toronto Women\u0026rsquo;s Chorus is part of the University of Toronto Choirs run by the Faculty of Music.\n","permalink":"http://individual.utoronto.ca/natasha_ps_ho/music/","summary":"Alto - St.James Cathedral 2018 - 2020\nThe Cathedral Church of St. James houses one of Canada\u0026rsquo;s most precious musical hidden gems. Uniquely within the city of Toronto, the fully professional 18-voice Cathedral Choir sings as part of the Anglican worship at Eucharist (11:00am), and Evensong (4:30pm) each Sunday to an internationally high standard. Its repertoire spans eight centuries, and provides a balanced diet of choral delights to congregations young and old, non-Christians and Christians, and those whose ears hold an insatiable curiosity for music.","title":"Music"},{"content":"Originally from Hong Kong, Natasha went to University of Toronto to pursue a bachelor\u0026rsquo;s degree in Psychology and Linguistics. Out of boredom, she took some introduction to computer science courses and fell in love with it. She then went on exchange to University of Edinburgh and studied the intersection of linguistics and computer science.\nAfter graduation, she pursued a career in tech. She worked her way from technical support and QA into software development. She last worked as a full stack JavaScript web developer at TouchBistro, a restaurant point-of-sale system company. She currently works at Canonical charming engineering team to build out kubernetes operator for Kubeflow and MLOps.\n","permalink":"http://individual.utoronto.ca/natasha_ps_ho/about/","summary":"Originally from Hong Kong, Natasha went to University of Toronto to pursue a bachelor\u0026rsquo;s degree in Psychology and Linguistics. Out of boredom, she took some introduction to computer science courses and fell in love with it. She then went on exchange to University of Edinburgh and studied the intersection of linguistics and computer science.\nAfter graduation, she pursued a career in tech. She worked her way from technical support and QA into software development.","title":"About Me"}]