Shared posts

18 Jan 04:10

Nine steps for Facebook

by Joe Gregorio

Facebook must be restructured. The FTC should take these nine steps now

This was published back in March of 2018, but it’s still a good list of things that should be done.

18 Jan 04:10

Free transit motion to be debated by Vancouver city councillors

by Stephen Rees

The headline is taken from a CBC News story and the motion will be debated tomorrow. It also provides a link to the motion as a pdf file. The motion asks Council to support the All on Board  campaign. Apparently there is going to be a “research report containing evidence” – but that is not ready yet. You might think that it would be a Good Idea to have had that ready in time for the discussion. Because there is remarkably little evidence on offer so far either in the motion’s “Whereas” section or the campaign website. Other than some people think it might be a Good Idea and other places have already tried it.

What needs to be considered is how much revenue is going to be lost from this proposal and how it might be replaced. The motion suggests that the Provincial Government will be approached for more funding. Presumably, the Province will also have to consider if this is something that needs to be applied province wide. If not, then you can expect the attention to switch to property taxes as that is about the only source that the municipalities can access. I would certainly expect that someone will actually do the necessary policy analysis, which, of course, is entirely absent so far. This would include some assessment of the costs to increase transit supply at peak periods – and also at times when young people are not in school and can be expected to be enjoying their new found freedom to ride transit as often and as far as they can go. I would also expect questions to be asked like why does this demographic get pushed to the front of the line when others – the aged, the disabled, the desperately poor adult population –  fail to get anything like such generous treatment?

I accept that for low income families even reduced fares for children can be inadequate to be affordable for many trips. At one time people who had transit passes could take their spouse and children with them at weekends for no extra charge. I forget now when that concession was withdrawn, but I would be willing to bet that cost was a concern.

It is true that giving children free rides will increase ridership – though the campaign has not made any forecast of that. Nor have they considered what other ways might also increase ridership and their comparative effectiveness. What we do know, and what is not mentioned anywhere in these materials, is how increasing service frequency and improving reliability (through traffic management measures) can offer much higher rates of return at lower levels of cost, and can be better targeted. For just as there are families that can’t afford transit, there are plenty for whom the fare is not the deterrent that inconvenience, unreliability and inadequate service undoubtedly are. Transit takes you from where you are not to a point at some distance from where you want to be. And for a lot of the trip will expect you to stand, or be crowded with others, or left at a bus stop wondering how long your wait will be. People who have invested heavily in a vehicle, and its insurance (which does not vary by distance driven) have a vested interest in getting as much use out of that expense as possible. And despite traffic congestion and the hassle of finding parking still get a better travel experience than transit riders for most trips. The car is at your convenience and takes you all the way without a transfer!

I do think that the province ought to be increasing what it spends on transit, I just think we need to be a bit more considered about how that money is spent. I also think that transit should not be considered as a social service or a redistributive device. If people are poor then giving them more money is far better than giving them scrip for approved expenditures. Free transit passes are as prescriptive as food stamps and both can be a stigma. Giving free rides to children whose parents are wealthy may not actually reduce car use all that much, if at all and is palpably wasteful.

And anyway, why are we focussed on transit and not asking why these kids are not walking more or using their bicycles? Might it be something to do with concerns about their safety?

 

18 Jan 03:52

Moving to a Profile per Install Architecture

by Dave Townsend

With Firefox 67 you’ll be able to run different Firefox installs side by side by default.

Supporting profiles per installation is a feature that has been requested by pre-release users for a long time now and we’re pleased to announce that starting with Firefox 67 users will be able to run different installs of Firefox side by side without needing to manage profiles.

What are profiles?

Firefox saves information such as bookmarks, passwords and user preferences in a set of files called your profile. This profile is stored in a location separate from the Firefox program files.

More details on profiles are can be found here.

What changes are we making to profiles in Firefox 67?

Previously, all Firefox versions shared a single profile by default. With Firefox 67, Firefox will begin using a dedicated profile for each Firefox version (including Nightly, Beta, Developer Edition, and ESR). This will make Firefox more stable when switching between versions on the same computer and will also allow you to run different Firefox installations at the same time:

  • You have not lost any personal data or customizations. Any previous profile data is saved and associated with the first Firefox installation that was opened after this change.
  • Starting with Firefox 67, Firefox installations will now have separate profiles. This will apply to Nightly 67 initially and then to all versions of release 67 and above as the  change makes it way to Developer Edition, Beta, Firefox, and ESR.

What are my options?

If you do nothing, your profile data will be different on each version of Firefox.

If you would like the information you save to Firefox to be the same on all versions, you can use a Firefox Account to keep them in sync.

Sync is the easiest way to make your profiles consistent on all of your versions of Firefox. You also get additional benefits like sending tabs and secure password storage. Get started with Sync here.

You will not lose any personal data or customizations. Any previous profile data is safe and attached to the first Firefox installation that was opened after this change.

Users of only one Firefox install or users of multiple Firefox installs who already had set different profiles for different installations will not notice the change

We really hope that this change will make it simpler for Firefox users to start running Nightly. If you come across a bug or have any suggestions we really welcome your input through our support channels.

What if I already use separate profiles for my different Firefox installations?

Users who already have created manually separate profile for different installations will not notice the change (this has been the advised procedure on Nightly for a while).

18 Jan 03:51

Energy, Intermittent Abundance and Resilience

by Ton Zijlstra

A while ago Peter wrote about energy security and how having a less reliable grid may actually be useful to energy security.

This the difference between having tightly coupled systems and loosely coupled systems. Loosely coupled systems can show more robustness because having failing parts will not break the whole. It also allows for more resilience that way, you can locally fix things that fell apart.

It may clash however with our current expectations of having electricity 24/7. Because of that expectation we don’t spend much time about being clever in our timing and usage of energy. A long time ago I provided training to a group of some 20 Iraqi water provision managers, as part of the rebuilding efforts after the US invasion of Iraq. They had all kinds of issues obviously, and often issues arising in parallel. What I remember connected to Peter’s post is how they described Iraqi citizens had adapted to the intermittent availability of electricity and water. How they made things work, at some level, by incorporating the intermittent availability of things into their routines. When there was no electricity they used water for cooling, and vice versa for instance. A few years ago at a Border Sessions conference in The Hague, one speaker talked about resilience and intermittent energy sources too. He mentioned the example that historically Dutch millers had dispensation of visiting church on Sundays if it was windy enough to mill.

The past few days in Dutch newspapers a discussion is taking place that some local solar energy plans can’t be implemented because the grid maintainers can’t deal with the inputs. Now this isn’t necessarily true, but more the framing that comes with the current always on macro-grid. Tellingly any mention of micro grids, or local storage is absent from that framing.

In a different discussion with Peter Rukavina and with Peter Bihr, it was mentioned that resilience is, and needs to be, rising on the list of design principles. It’s also the reason why resilience is one of three elements of agency in my networked agency thinking.

Line 'Em Up
Power lines in Canada, photo Ian Muttoo, license CC BY SA

18 Jan 03:50

splashr 0.6.0 Now Uses the CRAN-nascent stevedore Package for Docker Orchestration

by hrbrmstr

The splashr package [srht|GL|GH] — an alternative to Selenium for javascript-enabled/browser-emulated web scraping — is now at version 0.6.0 (still in dev-mode but on its way to CRAN in the next 14 days).

The major change from version 0.5.x (which never made it to CRAN) is a swap out of the reticulated docker package with the pure-R stevedore🔗 package which will make it loads more compatible across the landscape of R installs as it removes a somewhat heavy dependency on a working Python environment (something quite challenging to consistently achieve in that fragmented language ecosystem).

Another addition is a set of new user agents for Android, Kindle, Apple TV & Chromecast as an increasing number of sites are changing what type of HTML (et. al.) they send to those and other alternative glowing rectangles. A more efficient/sane user agent system will also be introduced prior to the CRAN. Now’s the time to vote on existing issues or file new ones if there is a burning desire for new or modified functionality.

Since the Travis tests now work (they were failing miserably because of they Python dependency) I’ve integrated the changes from the 0.6.0 to the master branch but you can follow the machinations of the 0.6.0 branch up until CRAN release.

18 Jan 03:50

Stop Wasting Your Community Data, It’s Your Most Powerful Tool

by Richard Millington

If you want me to ruin your day, ask me if you’re measuring the right things.

I’ll probably ask you what you will do differently if any of your metrics go up or down.

Then I’ll probably try to say something profound like: “If you don’t know what you will do differently because of the data, it really doesn’t matter what data you collect”

Data analysis should be the most powerful tool in your community professional toolkit.

It should tell you exactly what to stop doing, keep doing, and how to fix problems in your community.

But almost no-one is doing this today.

We spend a lot of time during our Strategic Community Management course changing how participants think about measurement.

 

Four Levels of Using Data

In our benchmarks, we rate data skills on a range of 1 to 4.

You can see a simple breakdown of these below:

Almost everyone begins at a level 0 (not even measuring the right things). By the end of the course, we aim to get most people to level 3 or 4.

Here’s a breakdown of what each level looks like:

 

Level 0 – 1 – Measuring what happened

If you’re dropping monthly metrics into a big spreadsheet to send to your boss, you’re probably at level 0.

You’ve probably selected the metrics which are easiest to get instead of those which best reflect your work.

You’re also probably not presenting the data well or making any inferences about what the data is telling you.

Level 1 is usually the level of being able to pull data (automatically) from multiple sources into a single spreadsheet with simple to read dashboards. Here’s an example we put together for a client below:


(this goes on for another 20 columns or so)

This spreadsheet automatically pulls data from Google Analytics and runs SQL queries on the platform (along with some simple calculations) to complete a useful data set.

From this you can put together some simple dashboards to show what is and isn’t working like those below:

p.s. Just from these 4 (of 10) graphs, can you spot a few major problems already?

However, none of this data means anything if you have no idea what to do with it.

This means we need to understand why a metric we care about went up or down.

 

LEVEL 1 – 2 – Analyzing why it happened

Amazingly only a tiny fraction of people ever bothers to do this.

If growth is rising/falling or if activity is going up or down you need to know why.

Most people prefer to guess rather than analyze the problem in detail.

To analyze why a metric went up or down, you need a decision tree and additional data.

For example, imagine the number of posts in your community drops. There can be three possible reasons for this.

  1. Fewer members are posting.
  2. Members are making fewer posts.
  3. Both of the above.

So you need to check the average number of posts per active member and number of members who made a post in the past month.

Let’s imagine members are posting less. This is still interesting, but it’s not useful.

To make it useful you need to know which type of members are posting less.

Hence (as you see in the table above) we like to know the average number of posts from the top 1%, top 10%, top 50% and bottom 50% of active members etc…

You can equally segment this by the average number of posts by newcomers, irregulars, veterans etc…

Is there a drop across all categories (which suggests a technology/level of interest problem) or is it focused on a single group (i.e. has the mean number of monthly posts from the top 1% dropped over time?)

Now you can look specifically at top members.

Was there a sudden drop in their level of participation or has there been a steady decline (usually speeding up until it becomes noticeable)?

This tells you if the problem is an external event (technology or product change) or if it’s a steadily declining loss of interest.

If it’s an external event you can pinpoint the date and see what else changed around that time to fix it.

If it’s a steadily declining loss of interest you need to figure out if they are losing interest in the topic altogether or just with your community?

If they participate in other communities, you can ask what they like better about that community and either incorporate features or develop new ones to bring them back.

By the end of this stage, you should be able to make really specific statements like:

The level of activity in our community has dropped in recent months because our top members are participating less. This is due to them preferring to answer questions on Quora, StackOverflow, and other online communities which are easier to use and gives them more visibility than they get from our community.

Notice how specific and concrete that is? It also rules out a lot of possible solutions which won’t work.

Most people if they see engagement dropping panic and try a bunch of silly tricks to get people to participate more (AMAs, photos, live chats, gamification etc…!).

These are wild guesses which have no chance of fixing the problem.

Now you know exactly what’s broken, but you still don’t know how to fix it.

 

LEVEL 2 – 3 – How To Improve It

This is the critical step.

It doesn’t matter how great you are at analyzing the problem if you don’t know how to fix it.

This means we need to put together a few ideas of how to fix the problem and test them until we get an answer.

From the above, we would probably test ways to improve the ease of community and the visibility members get from writing blog posts, asking questions, and answering questions.

First, we would look at who has solved this specific problem really well.

Asking peers helps (p.s. please stop asking for help until you’ve properly diagnosed the problem) so does your own research into existing brand communities which have managed to keep highly engaged experts.

Because every situation is different, you need to draw up a list of possible solutions to test. For example, this might include:

  1. Let top members speak at our annual conference.
  2. Help get positive PR coverage for best member contributions in the trade press.
  3. Feature member contributions on Twitter, in our newsletter, and link to their solutions within product documentations.
  4. Let top members co-create on user guides which get sent to all members who use the product.
  5. Develop a plugin/tool to enable members to share their external contributions easily with the community.
  6. etc…

(aside, as a rule, don’t aim for equivalency with a competitor. Always do something a competitor can’t match).

If you’re pushed for time, you can try all of these at once. But you’re unlikely to have the resources to do it (and even if you did you wouldn’t know which was working). So try to test each individually.

Over time, you can rule out options until you find the ones that work.

Remember that any change might take 3 to 6 months to show up on the dashboard.

 

LEVEL 3 – 4 – Designing An Ongoing System For Improvement

But what if there isn’t an immediate problem?

This process doesn’t just explain a way to fix problems, it also shows a way to constantly improve your community.

You can inverse this process to identify what’s working well, analyze why it’s working, and then doubling down on the areas which work best.

At the very top level, you want to be dedicating more and more resources to the areas which produce the best results.

This first means identifying whether a tactic achieved its impact and deciding whether there is more potential in that impact (i.e. more people who can be reached, a bigger change in behavior etc..) if you invest more resources in the tactic.

This means you need to design a process where each month (or every 3 months) you measure which tactics are working well/not working well and then decide whether to repeat, kill, tweak, or invest more in the tactic.

The purpose of this system is to gradually allocate more and more of your resources to the areas where they will have the biggest impact.

It doesn’t matter if you have 1 or 10 hours a day, you can still allocate your limited resources (and all resources are limited) to use them as effectively as possible.

Now you have a system in place which constantly improves your community as you collect more and more data.

 

Amateurs use intuition, professionals use data

I’ve seen organizations waste millions of dollars on migrating platforms and hiring new staff to fix problems which they haven’t properly analyzed.

I’ve seen community professionals waste months, even years, struggling to fix problems in their communities because they haven’t properly identified what’s going wrong or feasible solutions to fix this.

I’ve also seen far too many community professionals waste far too much time and energy on tactics which aren’t working.

These are all amateur level mistakes and we’re community professionals.

Amateurs use intuition and gut instinct, professionals use data and reason.

This is why data professionals are far more effective than amateurs.

This is how we get great results from our consultancy engagements, we turn this free asset into a powerful tool to diagnose and improve the community.

Beginning on January 28, we’re going to teach you how to do this.

I hope some of you will join us.

Click here to sign up for Strategic Community Management ($675 USD)
Click here to sign up for Psychology of Community ($675 USD)
Click here to sign up for both courses ($1100 USD)

17 Jan 04:39

✚ How to Make Animated (GIF) Heatmaps in R

by Nathan Yau

Using color as the visual encoding, show changes over time in two dimensions. Read More

17 Jan 04:38

Goodbye, Mid-Range Shot

by Nathan Yau

There's a space on the basketball court called "mid-range." It's actually not off-limits. In fact, people used to shoot these so-called "mid-range" shots. Read More

17 Jan 04:38

A Postscript on Server Migrations (redirecting network traffic to a new IP)

by Reverend

During the break between Christmas and New Year’s I migrated a server from Linode to Digital Ocean. We have just a handful left, and most of those should be gone this year. This migration was pretty straightforward, no WordPress portal or WHMCS instance, just a straight-up cPanel server. The plan was to run our handy dandy server deploy script which gets about 95% of a new cPanel server setup in about 30 minutes, which is amazing given this use to be a day-long process. Once that server is setup we need to copy all data between the two servers using IP addresses given we want to keep the same hostname, i.e., universityx.reclaimhosting.com. This is easily done with the the Transfer tool in cPanel, and migrating over 500 cPanel accounts took about an hour and a half. 

Once all the accounts are migrated over cleanly, we need to point the DNS records in AWS’s Route 53 to the new IP address of the new server on Digital Ocean. If all went well that should be all set, the one mistake I made on this recent migration was not copying over the existing SSL certificate from the old server—it’s always something. So, after that’s done another trick Tim showed me that has come in useful was redirecting all traffic to the old IP to the new IP server-wide. This post spells it out very well, and it ensures that any lingering traffic that may be going to old server for all kinds of DNS reasons would be pushed to the new server right away. 

https://www.debuntu.org/how-to-redirecting-network-traffic-to-a-new-ip-using-iptables/

Anyway, just putting this here in the event I need this again so I don’t have to dig through Slack again to find the link, not to mention to remind myself of the mistakes I made the last time so I can avoid them next time 🙂

17 Jan 04:38

So I’ve Finished: Yoku’s Island Express

by chuttenc

Yoku’s Island Express is weird. It’s a pinball platformer of short duration. Its segmented and straightforward play style is well-suited to 15-minute sessions making it a lovely fit for the Nintendo Switch’s portable nature. Its story is nothing special with a twist that I might not forgive you for not deducing a third of the way through the game. Its soundtrack is adorably dorky in the same way as Rayman Legends‘ or LocoRoco‘s or Katamari Damacy‘s.

(( You’re welcome, by the way. All of those are excellent. ))

There’s no high score system making it fiercely single-playthrough (which is good if you like games that actually end). Some of the pinball designs are just poorly-laid-out (one boss battle in particular can be a real trial).  And traversing the world can be annoyingly convoluted and slow as you work your way through pinball traversals that were tricky the first time and now have lost all charm.

But it was fun. Altogether worth the about $25 it costs (and definitely worth the download and time to try out the demo if you’re still unsure if it’s for you).

I recommend it to anyone who isn’t afraid of weird things (say, if you’ve run out of things to roll up in Katamari and need something new) and games that are under 20 hours playtime. Fun for the whole family.

17 Jan 04:38

Counting the Countless: Data, Infrastructure, and Queer Pluralities

I’m going to be giving a talk, provisionally titled Counting the Countless: Data, Infrastructure, and Queer Pluralities, as part of Seattle University’s Trans* Visions Lecture Series. Anyone can come along! Details:

17 Jan 04:38

The German Reichstag with Tiergarten in the for...


The German Reichstag with Tiergarten in the foreground.

The weather in Berlin isn’t typical for January. Instead, it rather feels like permanent November. The temperature has been between freezing and 5ºC, and the skies have been grey. While it’s easy to get around town, it’s my least favorite weather for January. I’d much rather have the bright blue sunny skies that come when the temperature goes below -10ºC.

(For my American friends, that’s 40ºF and 15ºF.)

17 Jan 04:38

Purism Supports Software Freedom Conservancy

by Sriram Ramkrishna

We live in a dangerous world where privacy and security are more important than ever. In order for software to be trusted, the source code must be available to verify — a simple trust and verify model. Purism is proud to release all of our source code under Free Software licenses that not only empower users but are vital to protect their privacy and security. We favor licenses with strong copyleft like the GNU General Public License version 3, and will release software under the GPLv3 or an FSF-approved license we inherit. Our code can be studied, verified, and shared, whether you use our Librem line of products or not.

Software Freedom Conservancy is a vital and important part of the Free Software ecosystem that we at Purism and billions of people worldwide rely upon. Without organizations that protect and enforce the terms expressed in software licenses, our digital rights are at risk. Conservancy continues to play a central role in legal battles to safeguard these freedoms.

License enforcement is only part of the story, and Conservancy assists its member projects by handling all matters other than software development and documentation, so the developers can focus on what they do best: improving the software for the public good. Many of these member projects play a critical role in the advancement of privacy and security, such as the Reproducible Builds project and coreboot, one of the standout security features of Purism’s Librem laptops and upcoming smartphone.

Purism is delighted to contribute $1,000 USD to support Software Freedom Conservancy. Their funding drive ends today and we urge everyone who utilizes Free Software as part of their daily workflow or toolchain to donate to Conservancy and help them reach their fundraising goals.

Donate Today!

The post Purism Supports Software Freedom Conservancy appeared first on Purism.

17 Jan 04:37

Learning Electron - Part 2

by Stephen Downes
Continuing from Part 1

The story so far

In Part 1 I covered the basics of Electron up to and including building executable applications from the Node.js application.

In particular I looked at the fundamental role played by the package.json file in defining the application requirements, defining start and build scripts, and giving Electron a script to begin running, which we called bootstrap.js.

In turn, bootstrap.js set up communication between the different components, defined a browser window to house the application and loaded  starting web page, and defined how the application should shut down.

I also encountered some issues with the examples provided in the Udemy course I was studying in order to learn Electron, and in articular, I noted how the working directory was defined differently in Node.js and in the executable application.

I didn't know this at the time, but this would be the last time in the course we would actually build an executable application. We would create the applications but never test them. So there may be more problems like this lurking - I just don't know about them.

Integrating Frameworks

One of the features that attracted me to Electron was the possibility of working with application frameworks I already knew, and in particular, jQuery and Bootstrap. This section covered the use of these frameworks in Electron.

Angular

The first of these was Angular. According to Google search, Angular is "a TypeScript-based open-source front-end web application framework led by the Angular Team at Google and by a community of individuals and corporations." It's a complete rewrite of AngularJS, the original Javascript version.

I haven't worked with Angular before, so this part of the course wasn't as useful as it might have been. Nonetheless I worked my way through the examples and followed what was going on.

Angular is integrated using three Node modules (all loaded using npm install):  electron-angular, electron-reload, and elegular. In Angular, you define an 'app' which will have various 'views'; these views are defined using TypeScript, JS and a mapping. Most of the lesson was devoted to creating these.

To run Angular in Electron, we throw out the bootstrap.js file and build a startup file created specifically for Angular (this was the only case where we did this). All we did with Angular was to create a basic start page. The package.json file looked the same as in previous cases, and the application was launched using the start script, just as before.

Nothing in this section gave me any reason to want to work with Angular in the future. I'm sure it has its merits, but these were not on display here.

Photon

I had never heard of Photon before so I was interested in this section. As it turns out, Photon was intuitive and slick - exactly the opposite of Angular. Photon was written specifically for Electron, so it's no surprise the two work so well together.

With Photon you do not install it using npm. Rather, you download it and install it into the directory you created for your electron project. Photon itself is mostly a collection of stylesheets and fonts, all assembled using a gruntfile, which automates the installation process.

This means that the only dependency listed in package.json was electron-reload, which we've seen before. This is a really interesting function. What it does is update the Node application any time a fle changes, so you can make changes in the HTML and Javascript and see them right away, without having to stop and restart your application.

The bootstrap.js file was basically the same as before, with the only difference being that ti was called main.js and the starting HTML page was called main.html. I don't know why this was the case.

Photon works by giving you predefined class names for HTML elements. So, for example, you could have div class="panegroup" containing three instances of div class="pane" and you'll get three nice neat columns. That is what we created in this section.

Photon is pretty basic, but what you get if you use it is an application that looks like an application. That's important in that it makes people comfortable with your application; it doesn't look like there's anything weird going on.

Bootstrap

I know Bootstrap pretty well. I used it along with jQuery to develop the gRSShopper look and feel. Like Photon, it defines a set of classes you can use to style HTML elements. It also has a lot of interactivity, doing things like opening tabs and launching modal windows.

One of the attractions of using Bootstrap is its support for ARIA - Accessible Rich Internet Applications - a W3C accessibility standard. I'm not sure whether this support extends through Electron, but it's at least a starting point.

Installing Bootstrap was very straightforward - set up package.json and main.js as before, and thn install bootstrap in the command window using npm install bootstrap. To use Bootstrap it's exactly the same as on a web page - you need to use a style tag that points to the bootstrap.css file (it's worth noting that the instructor had difficulty finding the .css file as it's buried in the directory structure).

What was not covered was any of the Javascript functionality in Bootstrap. A lot of the value of Bootstrap is the way it manages page elements; it uses jQuery and adds Javascript of its own. These need to be defined in the document head using a link tag, and jQuery has to be installed using npm. None of this was shown in the course, and the instructor overall seems to be really unfamiliar with Bootstrap generally.

I didn't test the Bootstrap Javascript functions, since I wanted to stick with the plan the course had set out. I would imagine they work fine, and it's something to revisit later.

Webview

The next application was one that actually made me giddy: displaying pages from other websites inside our application. At this point it hits home - this isn't a web page with framing. It's a web browser, and it allows you to do things a website can't do, like load pages from external websites.

The setup for this was super-simple, with no libraries to install and minimal Javascript. The work is done by the following lines:


Now what I'm not sure about, and what was not discussed, was whether (a) some web pages could pop our of this element, the way they can pop our of a frame on a web page, and (b) how much (if any) of the data from the web page can be accessed by the script.

In theory I should be able to do a page request and pull the content apart, but it is by no means clear that this is the way to do it.

Database

In addition to reading and saving local files, Electron can interoperate with a locally hosted database. I know from reading other articles that Electron can use database engines like Mongo and MySQL, but this course looked only at SQLite.

From the SQLite website we read: "SQLite is a C-language library that implements a small, fast, self-contained, high-reliability, full-featured, SQL database engine. SQLite is the most used database engine in the world. It is built into all mobile phones and most computers and comes bundled inside countless other applications that people use every day."

I don't know whether it's preinstalled in most computers, but I had to download it from the website and install it. It was a very straightforward installation; I downloaded the Precompiled Binaries for Windows and ran the installer. There are several files you can download, and the course provided no guidance about these whatsoever (again, none of this appears to have been tested on Windows).

There are two npm modules to install. The first is called Knex (knex = connects - get it). This is a general-purpose SQL query-building library for Javascript. The second is the specific SQLite3 module for Node. These were installed using npm install and automatically appeared as dependencies in package.json.

We breezed through setting up basic CRUD functionality (Create - Read - Update - Delete) in Electron, including even a second window that acted as our data input window. Then, in a nice section called 'splitting responsibilities' we took the single page of code and split it into separate scripts for updating, deleting, etc.

This section took me a lot longer than it should have because, first, the wrong scripts were associated with the different modules, and second, one of the script download files was corrupt. This meant I had to follow along with the text as it was typed on video and recreate these download files for myself. Error-handing in the course was in general pretty weak, which meant I had to do a lot of spelunking to correct typos.

And once again, the utter indifference of the Udemy online support astonished me. The corrupt files are still corrupt. I was told they would "look into it", they didn't, and then told that "The uploaded file is heavy therefore some people are facing problem in downloading or in extracting the file. Hence we asked to drop an email." It took them six days to actually send me the replacement file, and by then I had recreated it, uploaded it on my website, and posted a note in the discussion telling people where to find it.

I also noticed that when I ran SQLite for a large number of inputs at once it generated quite a few errors because SQLite was "busy". That probably would not have happened with a proper database. In any case, there was no discussion at all of error-handling and data integrity.

SQLite Studio Interface

Feed Reader

This section was at the core of my interests, but also created a major distraction, again because of a corrupt download file (which was never sent to me, even though I asked) and because of poor error handling.

The feed reader brings together several Electron functions:
- it retrieves content from the web
- it parses that content with an XML parser (SAX, to be specific)
- it displays the results on a web page
- it stores the results in a database

The 'request' function is built into Node so you don't need to install a module. We needed both Knex and SQLite3 for the database, and in addition, feed-parser to parse the RSS feed. Note the hyphen. There are several feed parsers for Node, including one with the same name (but without the hyphen). Inside the code, the instructor uses 'feedparser' to refer to 'feed-parser'. Not clear at all.

So I copied the code from the video and ran it and got "error in parsing". That's it. I studied the code and couldn't find a typo or any error at all. Stumped.

Digression: Learning Node 

At this point I wasn't sure whether I had encountered an Electron problem or a Node problem or what. So I decided that I should spend some time on Node itself. If I could get a feed reader working in Node, then I could figure out why it wasn't working in Electron.

This proved to be less easy than I thought it would be. There are various feed reading packages in Node, but it wasn't clear to me how any of these worked or how they would be used in a web server or Node environment. I would have to go back to basics. This one in particular looked like the one to use. It even had examples - but not examples that made any sense to me.

What I did find was the W3C Schools tutorial on Node. W3C Schools is excellent; I've used them for things like Bootstrap with great success. Working through all these examples I found after that I could distinguish what part of the Udemy course was Electron and what part was Node. I also found this really useful video describing the Node event loop (great graphics, but it starts in a really weird manner, with the speaker showing us his underwear).

Node stack and events

So when a Javascript program runs, as each function is called, it is put on top of the stack. When the program completes, it is removed from the stack and the value it produced (if any) is passed to the next function on the stack.

In an event-driven program like Node, some functions are not called until an event happens. For example, your web page might sit there and wait until you click a mouse.Once you click the mouse, things happen. So these event-driven functions are listed in the 'webapis' box. When one of them is called, it is moved to the end of the task queue. When the stack is empty, then Javascript begins processing the first function in the task queue.

So I kind-of knew all this, but this video made it really clear. But it didn't actually get me closer to solving my problem. I had to look at a bunch of Stack Overflow pages (using a variety of different search terms like 'handling errors in Node feed reader'). So here's how it works (and this is a very general Javascript pattern with I should have figured out a lot more quickly):

- you call a function (like, say, readWeb())
- you might pass a value to this function (like, say, readWeb(url))
- you might define some event handlers to handle different types of events (like, say, readWeb(url,{event-handlers}))
- each event handler has two parts: the name of the event, and a function to run (like, say, readWeb(url,{on "finished": printFile(result)}))
- and, significantly, an error is one of those events you want to handle.

So that was how it was set up in the feed parser script in the Udemy course:


I've really simplified this example so it's clear what's going on. 'req' is the request, and once the event 'response' happens, it streams the result 'res' to 'feedparser'.

Feedparser does its thing, and then it might return an event 'error', in which case it displays the message, or it might return an event 'readable', and write a report to the console log. In our case, it returned the response 'error'.

But what was the error? It's the value in the function being called in function(error). But in the course, we don't do anything with this value. So all we get is a cryptic non-helpful message 'error in parsing'. So I made a very simple change to the error function:

   console.log('error in parsing: '+error)

Now it printed out the actual error. What was it? It wasn't a parsing error at all!  In the next part of the program I had typed:

     conosole.log("Received readable parser")

and the error was 'No such function conosole()'. I had spelled 'console' wrong. I removed the extra 'o' and the parser ran perfectly, and I finished the module in about five minutes.

Two simple things combined to give me a miserable experience in this module: first, the corrupted download file, and second, the poor error handling in the example. Sure, it could be argued that my knowledge of Javascript and Node improved as a result, but that wasn't due in any part to the course, but only because I'm really stubborn, and will drill down in these things until I find the problem, and make sure I know why the problem happened.

Anyhow, I also went a bit beyond the content of the course because it never did show how to find out what values are contained in the RSS feed item (if you print news.keys() you get a nice list)  and how to get the link in the RSS feed item (news['link']). It also doesn't describe where to find and/or use feed information.

Calculator

The 'capstone exercise' in the course was ultimately pretty basic, and didn't take advantage of most of what we had learned (and there were some mix-ups in the wrap-up and introductory videos that suggested that this was the 'capstone' from an earlier and even more basic version of the course).

What was different about this project was that we took a Node project from GitHub and adapted it to run in Electron. Specifically, we started with the kaidesu/calculator repository (I had to squint to read it off the video, then run a search on GitHub, because there are no written notes for any of the modules).

Most of the work was taken up in making inexplicable changes to the CSS to concert the calculator into a much more monochrome application. Why we did this was never explained, and it was actually done incorrectly, resulting in calculator keys that disappeared when you hovered over them.

We also rewrote the main calculator logic, taking the input as an expression that we evaluated in order to produce a result (we had to use regular expressions to convert 'x' to '*' but there was no discussion of what a regular expression is, how it works in Node/Electron, nor why we were doing this).

The key-pressing and display functionality was handled by jQuery. Like other modules, jQuery is installed in Node using an npm install jquery command. Then, just as we had to do with Bootstrap, we had to find the actual jquery.js file in the subdirectory and create a link element pointing to it in our web page.

It would have been impressive had we actually built the application and an executable and tried putting it on a Windows machine and running it as an application (which is the whole point of Electron) but we didn't do that.

So that was it. A bit anticlimactic, but I finished the course and got my certificate.


Lessons?

The course consists of about 290 minutes of video, or in other words, about five hours. So if you just sat down and watched all the videos, then you 'completed' your five hour course.

It took me a lot longer than that because I worked through every example, often reconstructing them from scratch, and solving problems as they came up (it was interesting because the instructor made a lot of coding errors in the videos (even running a Node update in the middle of one of them) so my examples wouldn't run at first; I often anticipated how he would have to fix his code).

The course really suffered from being basically a video-only course. There were no notes or links except to the not-always-functioning download files. These files, meanwhile, were much larger than they needed to be, because they contained the entire application including all the required Node modules (which is exactly how these are not supposed to be distributed). It would have been much better had we had a GitHub repository to work from, downloading the actual electron code, and then running the installation.

There was no support despite the existence of a putative 'TA' and there was no community. It would have been nice to see some discussion in the discussion boards, but while the page claims some 350 or so people took the course, I could find evidence of only one or two people.

But... I gave the course 2.5 out of five.

It did do what I wanted it to do, which was to teach me Electron. I feel like I understand it really well now, and while I would need to actually build some things to develop any sort of expertise, I feel comfortable enough to take on a few projects. It was also clear enough that it allowed me to work in an unfamiliar Node environment, so that's saying something.

And it showed me that, ultimately, Electron is a real thing, it was worth learning, and some of the things we see in Electron will be influencing the ed-tech landscape in the future.


17 Jan 04:37

Katerina and I were riding an elevator on our w...

Katerina and I were riding an elevator on our way home after spending the day at her co-working space.

“Hey, weren’t you the one wearing a Microsoft hoodie and using a Mac upstairs?“ asked a guy that was on the elevator with us.

“Yeah… I was.” I kind of knew what was coming and looking forward to it.

“Well, is that you know, allowed?”

“Sure! At least in some groups. More people than you might expect use Macs at Microsoft. A lot of people in my group have one.“

“But you have to have Windows on it, don’t you?”

“Nope.“ He was confused by that, so I continued. “I do have a Surface laptop which I use for all the things I need Windows for. But I’m in the Azure group, and most of what I do is work with Unix.”

“But,” he said, just not quite processing, “isn’t that kind of weird?”

Yeah, but in a good way. I didn’t have time; otherwise, I would have remembered to mention that some people in my group use straight up Linux, and others even use Chromebooks and have PlayStations hooked up to their televisions.

17 Jan 04:37

Writing, printing, and permanence

by Josh Bernoff

Words make pages, which make books. Behind that simple statement is the rich history of the mechanisms of printing. My personal history is a thread in the the broader history of the methods by which words reach the eyes of the reader — a narrative that came to life for me when I recently visited … Continued

The post Writing, printing, and permanence appeared first on without bullshit.

17 Jan 04:37

A very small hack, exporting the speaker’s note...

by Ton Zijlstra

A very small hack, exporting the speaker’s notes from a slide deck, yet saving me some time and hassle every time I blog a presentation. All it took was one online search and adapting the applescript I found to my specific needs. Turns out, although Keynote doesn’t have an option to export notes, it does allow apple script direct access to those notes.

17 Jan 04:37

Walking away from facebook

by Chris Corrigan

Back in December I announced my intention to take a sabbatical from Facebook and see what would happen. There were a number of factors in that decision, and I’ll share what I learned and what I’m doing now. 

I had a few reasons for wanting to take a break:

  1. Facebook was a huge time waster, and earlier last year I deleted the app from my phone (it and Messenger and Instagram track your life your life and serve you ads based on what you’ve been doing). As a result, I have spent a lot less time there, although I do spend a lot of time on twitter.
  2. Facebook in engaged in undermining democracy and articles I was reading in 2018 pointed to their intentional and unintentional aiding and abetting behaviour with respect to undermining elections and eroding democratic engagement.  Here is a good Atlantic article on that.
  3. Facebook creates a deep gravity well for conversation. It tailors your news feed using algorithms to only serve you a very small slice of your friends’ activity. Much of what you see confirms what you know and it is designed to activate your brain in a way that causes you to share information and pass it on, deepening confirmation bias, and spreading rumours and lies.
  4. People communicate on Facebook in shallow and brief ways, meaning large and important conversations for local communities become pile ons, where people that have never made the effort to introduce themselves to others in real life nevertheless feel free to be mean spirited and even borderline libellous while hiding behind their virtual identities.  This has major implications in a small community like mine, where big local issues result in people starting rumours, passing judgements and ostracizing and slandering others in a way they would never do if they had to write to the newspaper, or see these people at the General Store. Discussions of complex ideas have devolved into the equivalent of drive-by shootings, often deeply personal.

These were the reasons I took a break and these are the reasons I am not coming back in a meaningful way.

When I started blogging in 2001, the promise of the Web 2.0 was that it would usher in the era of the creator. Any one could now create work on line. Recording studios, radio stations, television and film productions, newspaper, and magazines and book publishing all used to be inaccessible for the common person or the beginner artist. Now anyone could use whatever form of medium they wanted to say what is important to them. Before social media, Web 2.0 was about content creation media. It took time and effort to do it, but you could build a life, connect with others, find community in far flung corners of the globe, and make a contribution. 

When social media came about into widespread use, around 2007 in my case with Facebook, the blogging world almost completely disappeared. People whose blogs I followed moved into facebook where I followed them for a while until their well crafted posts were lost in the endless stream of mindless diarizing, half-baked opinions and, later, the endless copypasta of shared memes and viral content. I had a hard time finding my people, but I was enjoying wishing friends a happy birthday and connecting with people from school, 30 years ago.

Over the past ten or so years what has happened is that my time has disappeared into the suck hole of scrolling through useless content instead of producing some of my own. Yesterday, talking with my friend Julien Thomas, I remembered that somewhere I said that democracy depends on us being active participants and not consumers.

Social media has made us consumers of other people’s content. In the 2001-2007 era of blogging, someone would write a post and if it was meaningful to you, you would quote it with an annotation about why it mattered and what your take was on it. Conversation was more considered and content was savoured and appreciated and hardly ever simply passed on.  We were all content creators, hyperlinked to other content creators. When commenting began, discussion started to remain in a limited number of places but it was all open in the public and available to anyone. Comment spam really killed open discussion on blogs and maintaining spam-free comments sections became time-consuming. (Luckily there are better tools now, which is why you need to wait for me to approve comments on my blog).

With the dawn of Facebook however, content creation became highly concentrated in only a relatively and proportionally small number of places. Most people on Facebook simply pass it on other people’s stuff, often without any credit or link back to the original creator, and discussion happens behind closed doors and isn’t archived or very easy to access.

These days we are consumers of other people’s content, and we generally pass on what we like and agree with, amplifying it’s impact without adding to it. A few people have complained that they miss me on facebook, that they miss my voice and the things I say. But what I notice is that they like those things mostly because they can pass them on, or because what I have to say validates their views. It makes me I wonder where THEIR voice is, why they haven’t been thinking about things and sharing original opinions. And I wonder half-heartedly why I never get stuff from in my news feed that challenges my biases and my ideas anymore. 

I have recently created a sock puppet twitter account to engage with conservatives in Canada, including those who are nationalist, populist and extreme right-wing. I am curious and concerned about the rise of populism and nationalism in Canada and the global connections between far right leaders who are promoting anti-immigrant, anti-globalist politics and messages.  Through my “fake” twitter account, I am meeting conservatives that are also opposed to these far right echo chambers, and I am having my own ideas challenged. I am getting into debates and conversations with people I vehemently disagree with. I am posing on twitter as a real person, but not as “Chris Corrigan.”

I’m not going to reveal the identity of that twitter account. It says something to me about the nature of the social media landscape that I feel deeply uncomfortable showing up as my own self in those conversations.  Debating with Nazis is not a safe thing to do, especially when one is debating with people hiding behind anonymous identities. And so I show up as a real person but with a fake name. Interesting.

Social media has become a place where relationships have become commercialized transactions and where democratic engagement has devolved into a fact free festival of insulting the other and patting your friends and allies on the back while being served highly specific advertising messages from corporations and political influencers. All the while, someone other than you is getting rich every time you connect to a friend. While it is nice to “stay in touch” I have to say that most of what passes across my screens on facebook is of very little value to me.

I would encourage people to go back to, or start blogging, and I’d encourage you to do it in the spirit of 2001 blogging, not in the spirit of “blog as PR tool” that we see today: share things, speculate, use it as a platform for what I call “Open Source Learning.”  Use it as a gift exchange, not as a digital business card. Embed links to other people and add to the gifts of knowledge you receive before passing them on. You can start with WordPress as a powerful, free and easy-to-get-started-with tool.

For me I’ll be using facebook in these ways going forward:

  • I’ll be continuing to promote workshops and events there, and for limited times, participating in facebook groups where that is chosen by the group as a way of keeping in touch.
  • I will occasionally scan my feed and if I see that you have a birthday, or have experienced a death in the family, and you are a person with whom I have a personal relationship, you may well get an email or a phone call from me.
  • I will share blog posts on facebook, but encourage discussion to happen here on the blog, where the world can see it and anyone can participate.

I’ll be going off Instagram and What’s App entirely (both owned by Facebook) and continuing to use twitter (@chriscorrigan) as a place for spontaneous conversation and meeting new voices.  You can find my photos on Flickr, which has recently become revitalized and awesome again. If you have a blog, let me know and I’ll add you to my RSS feed (I use Inoreader for that)

17 Jan 04:35

2019-01-15 Daybook

I will have a tremendous backlog for WFD when I get back from China. ::: Gender and the evaluation...
17 Jan 04:35

On Public Bug Trackers

For open source projects it makes sense to have a public bug tracker. It would be hard to do the work without it.

But for commercial software? It’s not a good idea at all.

(I bring this up because I saw someone suggest this idea recently, and it stuck in my head.)

Decisions about what to work on — and when, and by whom — are complicated. From the outside it might look like it’s as simple as picking the next feature request with the most votes, but it’s not that simple.

A company might prioritize a crashing bug over that bug.

Or that feature might need x, y, z and done first, all of which require major work — maybe it needs some surprising amount of design or under-the-hood work, or both, that the requestors understandably don’t know about. Or it needs a bunch of localizations. Or lots of extra testing because the implementation is complex or wide-ranging — or it’s in an area where it could cause regressions.

Or the person who best knows that area of the code is temporarily on another team to help with another company priority. Or that person is going on vacation.

Or there are features nobody has asked for specifically, but that the company thinks would be awesome, and those get priority.

Or there are a half-dozen features that are low-hanging fruit, and for various reasons it’s a good idea to do a bunch of easy things for a while.

Or the feature doesn’t even really fit with the app: companies make that call all the time. (I never added Usenet support to NetNewsWire, despite getting requests for it.)

Or the feature is actually impossible. Or impossible without spending two years and a few million dollars on research and development first.

Or there’s a new OS feature that should be supported. Or an incompatibility with a new OS to fix.

And so on — the list goes on.

But if you have a public bug tracker, you’d likely find that you’re having to explain your decisions all the time. You’d be constantly defending your plans to people who remind you that Feature X has all these votes, so why hasn’t it shipped yet?

I’d argue that most companies aren’t open and accessible enough. Many companies don’t listen to their users very well. Many don’t even write honest and respectful release notes.

But opening up the bug tracker to the public is just a way to get bogged down: it’s a way to make worse decisions, and make them more slowly.

17 Jan 04:35

7 Reasons to do Interval Training on Your Bike

by Average Joe Cyclist

7 Reasons to do Interval Training on Your BikeRiding a bike is a great way to get fit. Just getting on a bike and riding it somewhere will give you exercise, and exercise is always good. So, if you want to get fitter and healthier, and fight aging, riding a bike will help. However, like everything, you can work hard, or you can work smart. And it turns out that interval training on a bike is the smart way to get fitter faster, burn more calories, fight stress and aging, and control blood sugar levels. Read our post to learn more about the exciting benefits of interval training on your bike. It includes the top 7 reasons to do interval training on your bike!

The post 7 Reasons to do Interval Training on Your Bike appeared first on Average Joe Cyclist.

17 Jan 04:33

Twitter Favorites: [iamdanw] THIS ARTWORK INTEROGATES THE SMART CITY’S LIMINAL SPACES i scream as I throw the dockless hire bike into the canal

Dan @iamdanw
THIS ARTWORK INTEROGATES THE SMART CITY’S LIMINAL SPACES i scream as I throw the dockless hire bike into the canal
17 Jan 04:33

Twitter Favorites: [Stv] ‘Couvers, ranked: 1. Suncouver (winter) 2. Fogcouver 3. Suncouver (summer) 4. Raincouver 5. Greycouver … 100. Smok… https://t.co/MrP9hs0ani

Steve @Stv
‘Couvers, ranked: 1. Suncouver (winter) 2. Fogcouver 3. Suncouver (summer) 4. Raincouver 5. Greycouver … 100. Smok… twitter.com/i/web/status/1…
17 Jan 04:33

Twitter Favorites: [RealGDT] 5) In every sense, ROMA is a Fresco, a Mural, not a portrait. Not only the way it is lensed but the way it "scrolls… https://t.co/7UOU5SFjrA

Guillermo del Toro @RealGDT
5) In every sense, ROMA is a Fresco, a Mural, not a portrait. Not only the way it is lensed but the way it "scrolls… twitter.com/i/web/status/1…
17 Jan 04:32

Twitter Favorites: [erikbryn] And the winner is...Worker Dividend. Plus some very thoughtful and at times funny or snarky suggestions in the r… https://t.co/qzfAM9f49O

Erik Brynjolfsson @erikbryn
And the winner is...Worker Dividend. Plus some very thoughtful and at times funny or snarky suggestions in the r… twitter.com/i/web/status/1…
17 Jan 04:32

Twitter Favorites: [NewYorker] The rise and fall of Cantopop mirrors the growing and waning influence of Hong Kong: https://t.co/bWfT096V2s https://t.co/XOLAZNINtY

The New Yorker @NewYorker
The rise and fall of Cantopop mirrors the growing and waning influence of Hong Kong: nyer.cm/IvRUvZj pic.twitter.com/XOLAZNINtY
17 Jan 04:32

Twitter Favorites: [ThatRetro] @dailysimpsons https://t.co/VKm3gwjXrc

🏳️‍🌈Retro: Old Media Enthusiast🏳️‍🌈 @ThatRetro
@dailysimpsons pic.twitter.com/VKm3gwjXrc
17 Jan 04:27

The circle of life on the bus

by Liz

So I was waiting for the 51A bus in the rain in the dark with some other folks and was super happy when the bus pulled up and it was near empty and the driver let down the ramp without any weirdness or fuss. There was another guy in the front of the bus sitting on the other side. The bus driver got out some big old straps. I thanked her and said I would rather not, and didn’t need them. She said she would have to call her supervisor because it was policy that she had to restrain my wheelchair, or I would have to get off the bus. She was nice about it and I just kind of nodded like, OK…. and said I had been riding buses in wheelchairs for many years and go ahead and call.

The guy across started yelling at me during this exchange, from almost the first moment, that I was a bitch, an asshole, a cocksucker, a goddamned bitch and he hopes I die young.

At that point I stared back at him and said it was too late for that since I’m already 50. (OK, well, 49 and a half.) The driver told him to shut up a few times and told him he should not call me out of my name. By that time we had driven off because her supervisor told her to tell me that, should I be injured because of not being restrained on the bus, they could not assume any liability. Thanks. OK. I agree! We drove down Broadway towards downtown.

Then the guy said someone should kill me. Staring right into my eyes he said “I’ll kill you myself you bitch!” Driver finally told him to shut up or she would make him get off but that just made him madder. At some point he started just mouthing or whispering his threats while flipping me off.

I felt very glad I was not strapped to the bus while I was a couple of feet away from this horrible man.

Was I married? He bet I was not. I’m too nasty! Too much of a bitch! He’s been married 4 times! He was in Vietnam! Also, he’ll kill me! I need to die! BITCH!!! You’re a BITCH!

It was amazing how much venom he got into the word “Bitch”!!!!

Let’s take a moment to quote the beautiful words of the immortal JOREEN,

Bitches must form together in a movement to deal with their problems in a political manner. They must organize for their own liberation as all women must organize for theirs. We must be strong, we must be militant, we must be dangerous. We must realize that Bitch is Beautiful and that we have nothing to lose. Nothing whatsoever.

Thank you Joreen!!! You give me strength!

At one point I said, You know what, we all have the right to ride this public bus, me, everyone, and you too even though you’re a sad and crazy old guy yelling at me, you get to ride the bus. That’s it. I was shaking with rage and fear but that’s what I said!

So that went on for a little while and I mostly didn’t say anything more, and I kept my camera on and pointed at him in case things heated up and my other hand on my folded up cane that I was half sitting on, which is quite sharp on the folded ends, carbon fiber edges, and which honestly I was ready to drive into a motherfucker’s throat if he came at me, and then he got off the bus while humbly thanking the bus driver and apologizing to her and everyone else on the bus FOR WHAT A BITCH I WAS SORRY TO EVERYONE EXCEPT HER THAT BITCH and now he was gonna go to Grocery Outlet. Bitch.

Wild!

Then, like, all the women on the bus came up to me and patted me and were sweet and concerned to check in that I was ok and say they were so sorry I had to go through that. And stuff. They were very nice but I was so mad I found it hard to talk any more. I actually thought then, Oh, they were more scared than I was. Until he got off. Huh.

My BART ride and extra bus ride home were peaceful. I then twittered cathartically about my experience all the way home, at some point realizing I should put on headphones and listen to the loudest possible riot grrrl and punk music. Thank you 7 Year Bitch, L7, Tribe 8, Crashprez, The Soviettes, MDC, Black Flag, and J Church. Very healing to the soul.

So, I am still super mad, and I so wished I could yell at that guy (more than the little bit of pissy backtalk that slipped out from me in the moment ) And also I had the thought that actually he did cross a line legally and it was all recorded on the bus camera which is easily obtainable through FOIA request. Like, he did threaten me and stuff but… Actually I just wanted to go home and recognized that my truly obscene amounts of privilege did not need to be whipped out just here. I disagreed with how the bus driver handled it but also figured that she probably saw this guy every day and she had a notion of whether he was really going to be violent or not. And I still had a part of me that didn’t want to agitate to kick an old guy out in the drizzling rain any more than I didn’t want to get off the bus myself and wait another 25 minutes for the next one. Anyway so I did not escalate and didn’t ask the bus driver to kick him off. She really was super calm and chill about the whole thing and I admire de-escalating in general. But, she could have – should have maybe – protected me a little more, I think. I’m going to be thinking about how I could have tried to set a boundary myself with the guy that I would have felt better with than what I went with which was “me shutting up while he yelled insults at me”.

I’m not so fragile! I’m mnot going to like, be fucked up that some asshole yelled at me! Assholes have been yelling at me on buses since I was 10 years old! They called me a faggot and a bitch and spit in my face and I cherish the memory of some guy who told me on Facebook 35 years later that he cherishes the memory of tiny 11 year old me double flipping off everyone on the bus clutching my bookbag to my chest and screaming shrilly, “FUCK YOUUUUUUUU!!!!!!!” I cherish my fierceness! I am a little badass inside! I don’t like being yelled at! It freaks me the fuck out! I would never tolerate it in my everyday life, not for a moment from anyone at all! Obviously, I’m fucking bothered or I wouldn’t be writing this hours later. But you know what….. WHATEVER. You know what is the best fierceness – it is maintaining your vulnerability. I don’t have to not be bothered, it is right to be upset, inside, it lets me defend my vulnerable self, which I assert to the world.

Anyway, I got off the bus pretty near my house and went across the street to see if this guy who lives on the corner was there because, he got all his stuff stolen again, and I got him some warm things but the shoes the VA gave him were two sizes too small, he took them because, half way on they kept his feet warmer and drier. He has a wheelchair but cannot push himself in it very well as his hands are also messed up but he gets along pretty ok. Whatever I asked him his shoe size the other day and realized it is the same size as my brother in law, and i was at him and my sister’s house all today, so I had these shoes to give him. He was happy about the shoes but he was also drinking and a bit messed up. I realized suddenly that between the bus stop and his niche on the corner I had seen a blanket and some bags and a backpack. Bob do you have your backpack. Was that your backpack over there on the other block? Oh no does it have an american flag on it? I went to see. Yes…. so… I brought him all his stuff. I think it just fell off the back of his chair as he was going along and he was too messed up to notice. No one had even gone through it. He kissed my hand drunkenly and invited me to sit with him. I went home but felt like so much more human because I took all the meanness and transmuted it into kindness and being decent to other people which is literally JUST WHAT HAS TO BE DONE. What is to be done? Do the work in front of you and be decent about it people. Like I said on the twitters Kindness is punk as fuck, and this bitch will bring you a boot party where it’s a present of boots that fit your feet and keep them warm and dry. Motherfucker, you will take these social services and this transformative justice and this example of nontoxic masculinity, OR ELSE. P.S. Fuck you, asshole!

How weird is it that I went from hating on one old guy to helping out another one. It is really true, that helping someone out is something to be grateful for, because they trusted you enough to let you do it.

I’d like to thank this cat, this nice loud riot grrrl music, this feminist manifesto from the year I was born, this soothing mint tea, and this excellent marijuana for the massive improvement of my evening.

Also my nice spouse who spent all weekend and all day since 5am trying to like save Europe from Article 13 and Article 11 and thus save the entire fucking Internet. And then who brought me the soothing mint tea.

The rest of the day was super nice, I spent it working while my sister worked on her stuff, and we showed each other physical therapy exercises and had tacos. When I stopped working I got to show my nephew how to write a little Inform7 and then I left him playing Zork.

Good night all.

17 Jan 04:20

Learning Electron

Stephen Downes, Half an Hour, Jan 15, 2019
Icon

This is a two-part post (Part 1, Part 2) I wrote describing my experiences taking a Udemy course on Electron, which is an application that enables you to create desktop software for Windows, Mac and Linux using only Javascript, CSS and HTML. I made the course my project over the recent holiday break (we all do different things for fun). In these posts I not only describe what I learned and how I leaned it, but also my (not so pleasant) experience taking a course on Udemy.

Web: [Direct Link] [This Post]
17 Jan 04:20

How To Write A Philosophy Paper: Online Guides

Justin Weinberg, Daily Nous, Jan 15, 2019
Icon

These are all pretty good guides and offer a fairly uniform view of what a good philosophy paper should look like. These are very different from what (say) a research paper in the field of education would look like. The latter are often structured to resemble empirical science (like you might find in engineering or physics) but are based on 'instruments' like surveys and polls. I personally think the philosophical approach is more suitable for education, given that there is little agreement on the goals, methods, instruments and outcomes of educational theory. At the very least, writers in education should (a) state a thesis, and (b) offer convincing evidence that the thesis is true.

Web: [Direct Link] [This Post]