Category Archives: ideas

Larsen Cundrič shares how to level up during studies

In Meaningful work interviews I talk to people about their area of work and expertise to better understand what they do and why it matters to them.

Larsen Cundrič is in his final year of undergraduate Computer Science studies. We also talked about his previous entrepreneurial experience. At the time of this conversation, he was just finishing his last week of exams during his Erasmus exchange in Denmark.

What’s your current focus?

I’m deep into learning how to be a data scientist. How to organize data, build pipelines, and how that connects to creating prediction models. I’m already working with an early-stage biotechnology startup so all of this is not just theoretical. I’ve also had previous apprenticeship experience in creating prediction models in an ad tech company.

How do you currently see the role of a data scientist?

From what I’ve seen so far, this role requires a very diverse set of skills. You need to understand a lot of statistics and how to do data processing. It also requires you to know how to visualize all of this data.

You mentioned that you’re looking to specialize in Machine Learning and Artificial Intelligence. Why did you decide on it and not for example Web or Mobile development?

Before I started with my studies I was competing with my team as a part of the FIRST LEGO League. The task was to program the robot so it would autonomously solve the challenges in the competition. That’s when I knew I wanted to be in the field of programming.

As I started my studies I couldn’t connect with Web or Mobile development. I enjoyed mathematics and logical thinking much more. In my second year of studies, I stumbled upon a Data Science Bootcamp on Udemy. That’s where I discovered that data science is a perfect field of work for me. It’s a mix of math and computer science and you still get to implement practical solutions in innovative ways. I enjoy the complexity of connecting so many different disciplines together.

Are there any outcomes of your technology that fascinates you at the moment?

My work in a biotechnology startup feels really magical to me at the moment. We’ve developed a process using data science approaches that let us analyze your blood sample and deduct your age from it. That seemed like science fiction to me when I started my studies and now I’m part of the team that is developing such technology.

It’s also amazing how fast it’s possible to learn all of this. It only took me 3½ years to be able to work in data science, develop Android applications, and many more things. I also didn’t learn just the technology but also about the engineering aspects of projects.

You were also active as an entrepreneur. What did you learn from those attempts?

I’ve had two previous entrepreneurial projects. We created a brand of beeswax cosmetics, and we were developing a concept of gamification in marketing.

What I’ve learned from these experiences is that there are many more options in life than just having a job. You can build a company. You can do project-based work. You can join a startup and try to change the world. Concepts and opportunities that were completely foreign to me before.

I’ve also learned a lot from launching new business projects. I think the main lessons were more about the mechanism of running a business. How to keep track of finances, setting goals, and how to divide and delegate responsibilities. It also requires much more attention and focus than I expected. I’ve also learned that I’m currently more interested in technology so I’ve shifted my attention away from business development.

Overall I’ve discovered that the general opinion of what’s hard to achieve doesn’t always apply to me. I’ve always heard that it’s hard to study math and computer science. So it’s a good thing that I tried it for myself and discovered that it isn’t that hard. So now I know that I need to experience things for myself to be able to know if it’s really hard or not.

Can you recommend any good resources to level up?

What I learned from talking with Larsen

A good approach to learn about oneself is to give things try and evaluate if it’s a good fit or not.

The best students are supplementing their studies with self-directed online learning.

With every failure there’s a lot of learning that comes out from it.

Islands vs. Streams as a learning model

How we learn in this digital age is broken, amazing, and weird at the same time. I see two major paradigms that are present in learning models: islands and streams.

Islands of learning are a traditional classroom approach. There’s a syllabus of reading, tasks to do, and lectures to listen to. It’s a very safe and guarded experience. Major online learning platforms such as Udemy or Coursera are bringing that model online. The other option is to learn through different streams of information. You read a chapter from a book, look at the YouTube video, do a short Skillshare course, and lurk on Instagram.

I’m trying to figure out how we can make these types of learnings more explicit to the learners. I’m also noticing that there is prestige attached to being a part of an island of learning. There’s just more status to say that you’re part of an expensive island instead of admitting that you’ve learned from many YouTube videos and blog posts.

There’s also a matter of getting good feedback loops in the process of learning. Let’s say you decide to learn about baking sourdough bread.

Islands way is to: 

  1. Read a book and try to follow instructions
  2. Go to a two-day workshop.
  3. Experiment with baking and talk to your family and a few close friends.
  4. Participate in a Facebook group for your workshop class

Streams way would be to:

  1. Find a 101 YouTube video from Tasty
  2. Read articles on the Perfect Loaf website
  3. Fail and discover “Beginner sourdough bakers” Facebook groups
  4. Post your pictures, get feedback from others, and with time get better
  5. Start posting on Instagram and get feedback from a global community of people

You only need to find the first few and you’ll organically find them by attracting people that are just a bit better than you. You’ll also start helping people that know a bit less than you.

6. Discover new sub-communities and repeat the process. Think of it as a journey and there’s no final destination.

The way I described streams is very community-driven. It requires a lot of vulnerability to consistently share failures instead of only your successes. Even with your best work you should approach it by asking how to improve it further.

I’m approaching learning from both perspectives and it’s frustrating in both cases. Islands make it hard to weave in resources from outside. Streams are often just these giants blobs of content that don’t make it easy to weave them into a coherent story and they’re hard to reference later.

Products that would help me on this learning journey

Figure out what’s the smallest and most streamable unit of content for each creative work. I’m thinking in terms of paragraphs and short video clips from longer videos. I’d like to have a way to easily assemble a learning trail of such content. Both for my reference and to be able to share it with others.

I’d like to relate these units of content to a larger community. Give a bit of context about the author and what’s the best audience for them.

Is there an inherent feedback loop that makes sharing such resources better with time? Can we develop assistive tools that will make it easier to suggest links to community-written FAQs or instructional videos?

Overall I still find that the process of collecting and curating learning is too high friction. There’s a lot of value in seeing the journey that one person took and we don’t make it easy for others to follow them. Our prevailing model is still mostly of top-down teaching and collaborative learning is still not a fundamental building block.

Google Sheets in Python with gspread

As I build more back-office web interfaces I notice that users feel most comfortable in an Excel-like interface. That’s why it’s now so common to find data being edited and exchanged Google Sheets.

This got me wondering – how do I access, manipulate and write to Sheets from Python. I like the answer that I found – a library called gspread.

Basic usage

A high-level overview of how you use it:

  1. Create a service account in Google Developer Console
  2. Share your Google Sheet to that special email address
  3. You can now access it from python with gspread and related libraries

Making it even better with Pandas

While it’s great to have low-level access in Python it’s much more convenient if I can manipulate the data inside Pandas DataFrame. That way I don’t have to think about data structures and how to correctly represent data in each cell or row.

To do this I found two libraries:

They’re both similar and you essentially just import a snippet:

For a larger project, I used gspread-pandas (just because I found it first) and it gives you quite a lot of control over how and when you update the data.

Sheets and Data Validation

Sheets allow you to define data validation checks on specific cells. You can validate against a predefined list of items or reference a range of cells. This allowed me to build an elaborate export of data from an API and provide users a way to quickly review the data and also possibly use Sheets to update the data.

To manipulate Sheets data validation from Python you can use gspread-formatting library.

Video and Slides of Talk on this topic

If you’d like to see slides from my talk on this Subject at the Python Ljubljana meetup group I’ve embedded them below.

Was this useful for you?

If this is useful to you, please leave a comment or send me an email. I’ll be happy to write a more detailed tutorials and support you.

Lessons from organizing OE Global 2020

Open Education Global Conference is a yearly conference for the Open Education community, that a small non-profit OE Global, co-organizes yearly with a local host institution. For 2020 we planned to hold the conference in mid-November in Taipei, Taiwan. But then Covid happened and we’ve decided to make it a virtual event. 

We’ve had ~125 online sessions, and additional 50 posters, presentations that were delivered asynchronously. It happened over 5 days (Mon-Fri) and across all timezones (from Taiwan, Europe, and across the Americas).

In this blog post, I’ll share some lessons that I learned, mostly from technology and related processes. As it was a big undertaking with more than 20 people involved on the organizing side, I only had to focus on my part of responsibilities.

Some technology works well

Presentation side

For our real-time presentations, we used Zoom in normal ‘meeting’ mode. With attendees joining from everywhere in the world, I’ve rarely seen any problems. People know how to use Zoom and they have a good enough camera and microphone. We also used a machine based auto-captioning service by rev.com to generate real-time subtitles. It’s about 90% accurate and it turned out to be quite a good addition to the presentations.

What was most surprising was how cheap this part of the stack was. Zoom is about 15 USD/month and rev.com is additional an 20 USD. I’ve looked into their competition (mostly Google Meet and Jitsi) and nobody could beat them on features or pricing. Google doesn’t seem to even offer a competing solution (I can’t just easily buy 5 seats for one month).

I also evaluated Jitsi and BigBlueButton, but they both required a lot of server infrastructure at the worse result for the end-user. The reason is that when you’re running a global conference where your participants are connecting from different continents you now have to think about peering servers, network latencies and how do you globally distribute your servers. This isn’t easy or cheap. So we’d have to go with a commercial vendor or develop this expertise in house.

Discussion platform and a shared space

For the online discussion platform, we’ve chosen Discourse. It turned out to be a good decision, but the flexibility and complexity of the platform made it somewhat challenging at the time. Through the planning process, we’ve managed to configure it to our liking and import all the data and users with a series of python scripting and a custom Discourse plugin that took care of the presentation of the program.

Developing plugins for Discourse is both a pleasure and a very frustrating experience. It’s a mixture of (older version of) Ember.js on the frontend and Ruby on Rails on the backend. The issue is that you’re writing a plugin into mostly undocumented API of Discourse. So in the end you have to just go and start reading the source of the Discourse and be a bit creative in how you approach your code. I think it’s worth it, but next time I’ll have to invest more time in just learning Rails so I can figure out better integrations.

I’ve considered going with Sched, as we’ve used it in the past, but I decided that it wasn’t flexible enough for our needs. I also looked into developing it on top of WordPress, but I didn’t find any solutions for communities that seemed like it would work for us.

Before the conference

Since we had a lot of registrations at 25-50 USD per ticket, I’ve decided to go with Stripe, WordPress, and Gravity-forms with Stripe add-on. For the most part, it worked very well and Stripe made the whole credit card integration easy. After working with Eventbrite in the past, I’m happy with the choice as it gave us much more flexibility with lower costs. (We also had WP+Gravity Forms stack pre-built from previous years).

For our Call for Presentations, we’ve used Easychair. It’s a kind of specialized software that is mostly used in space of organizing academic conferences. I’m not a big fan, but at our scale and number of reviewers, all other options seemed worse or much more expensive. We get about 200 presentation proposals that we distribute to 50 reviewers.

Archiving the conference

We’ve recorded most of the sessions in zoom and the recordings were available in Zoom in a matter of minutes after the session ended. We’ve then transferred these recordings to YouTube and pasted links back into our Discourse.

I’m not entirely happy with using YouTube as a video hosting solution. It’s a definite trade-off in terms of privacy and control. At the same time, using any other vendor is significantly more expensive. Hosting it ourselves would also be a costly and non-trivial thing to do. This is something that I’d like to revisit for next year to figure out if there are any better options.

Some technology is less friendly

Building the schedule

Building a schedule for 130 sessions across 5 days, multiple tracks and basically, all time zones end up being a very complex issue. I wish there was better software than Google Spreadsheets that we could use for this. I know there are schedule solvers out there, but I have to find one that would make sense for us (at a sensible price point).

Connecting all the technologies

Our back-office stack is Google Workspace, so a lot of Google Spreadsheets, mixed with Slack, Mailgun, and Python scripts. What I found is that it takes a lot of effort to make good workflows where input in one system (e.g. registration form) triggers a welcome email from another system. If I were building a Software as a Service (SaaS) system, I would make it part of the onboarding process. But with the conference, the system is more of a drip-email campaign. At some point, you release information to everyone, but if a person registered after that date, you then need to both back-fill old information as well as send them a new one.

Onboarding suddenly matters a lot

Challenge with moving from in-person conference to online-only, is that your existing workflows assume in-person experience, but your attendees expect an online experience. Things that you can improvise in-person (e.g. write a new name tag with a pen), becomes a support issue in an online context. If they for some reason didn’t do something correctly online (or their spam filter blocked an email), you don’t have a good way to instantly fix it. It becomes a game of emails and troubleshooting to figure out what’s the core issue.

To make this better next time, I’ll try to sketch all parts of the onboarding process and what are potential issues. I guess we’ll also want to track churn and similar concepts from traditional SaaS businesses. 

 Hallway track still needs work

There are just fewer opportunities to connect with other attendees and ask good questions. We’ve tried a lot of things – different thread stats and Discourse, drop-in zoom sessions, interactive tools. They kind of work, but they still don’t replicate the serendipity of meeting new people and listening to different group conversations during coffee breaks.

I’m hopeful we’ll figure out how to do this in the next few years. It might require a completely new way of thinking and organizing our time.

It’s now harder to be at a conference

Being at the conference is usually associated with a deep dive into a field with intense connection and learning over a few days. When you’re attending from your home office, there’s this tension of trying to still do your work, be with family and also try to follow the conference. I think that trying to do all of these things at once just isn’t possible. I hope we can figure out how to help people take this time for their professional development, without feeling guilty about not attending to some other things.

Overall

Most of all, I’m just excited and surprised how well it all worked. We’ve managed to bring our conference to people and communities that could never afford (or be allowed to) travel to our in-person event. I’m excited at what this means for the future of our field.

Getting tailwind css to work with Roots Sage 9 theme

I’m really enjoying how easy makes Sage WordPress Theme development. It’s very different in the beginning, but it soon feels a lot more like working in Django instead of WordPress.

At the same time, I’ve also been trying to use tailwind for this project. To make it work in production, you need to configure a few more settings for purgecss that official instructions don’t cover. The trick is that you need to define a TailwindExtractor that doesn’t strip out md:underline, hover:underline and similar color prefixed CSS classes.

Notice that I also exclude a few of external packages, so that purgecss doesn’t strip their CSS rules.

// webpack.config.optimize.js

'use strict'; // eslint-disable-line

const { default: ImageminPlugin } = require('imagemin-webpack-plugin');
const imageminMozjpeg = require('imagemin-mozjpeg');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const glob = require('glob-all');
const PurgecssPlugin = require('purgecss-webpack-plugin');

const config = require('./config');

class TailwindExtractor {
  static extract(content) {
    return content.match(/[A-Za-z0-9-_:\/]+/g) || [];
  }
}

module.exports = {
  plugins: [
    new ImageminPlugin({
      optipng: { optimizationLevel: 7 },
      gifsicle: { optimizationLevel: 3 },
      pngquant: { quality: '65-90', speed: 4 },
      svgo: {
        plugins: [
          { removeUnknownsAndDefaults: false },
          { cleanupIDs: false },
          { removeViewBox: false },
        ],
      },
      plugins: [imageminMozjpeg({ quality: 75 })],
      disable: (config.enabled.watcher),
    }),
    new UglifyJsPlugin({
      uglifyOptions: {
        ecma: 5,
        compress: {
          warnings: true,
          drop_console: true,
        },
      },
    }),
    new PurgecssPlugin({
      paths: glob.sync([
        'app/**/*.php',
        'resources/views/**/*.php',
        'resources/assets/scripts/**/*.js',
        'node_modules/vex-js/dist/js/*.js',
        'node_modules/mapbox-gl/dist/*.js',
        'node_modules/slick-carousel/slick/slick.js',
      ]),
      extractors: [
        {
          extractor: TailwindExtractor,
          extensions: ["html", "js", "php"],
        },
      ],
      whitelist: [
      ],
    }),
  ],
};