Skip to content

Latest commit

 

History

History
1585 lines (893 loc) · 72.8 KB

2020-07-12.md

File metadata and controls

1585 lines (893 loc) · 72.8 KB

< 2020-07-12 >

1,691,327 events, 945,648 push events, 1,326,975 commit messages, 72,207,625 characters

Sunday 2020-07-12 00:00:15 by melchi

finished off coloring (note to self, stop using gmail drafts as a text editor it is causing all kinda of weird characters to magically appear)

This should be the last commit for this one.


Sunday 2020-07-12 00:30:34 by mssx86

add: (patches/) rustc-1.44.1, patch to add x86_64 apathy triplet. why in the fuck do i need to set a custom triplet like this, why can't you figure it out yourself rustc? why the fuck do i need to build that fucking rustc shit 2 times like this? that's 11 hours off of my life that i'll never get back. i really really really hate mozilla and every single thing they stand on even if it is the greatest thing that'll solve all of the worlds problems. i fucking hate this, fucking hate it. and you're fucking telling me that this fucking thing is going to be used to build linux drivers in the future HAHAHAHAHAHAHAHAH, very fucking funny.


Sunday 2020-07-12 01:46:41 by Glloyd

Merge pull request #886 from Glloyd/merge-2k19

Big Mega Fuck You PR


Sunday 2020-07-12 02:20:03 by goodolrusty

The unfuck yourself commit

Fixes all the broken recipes where it was required to have a forge.

Adds in crafting for sledgehammers, and throwing knives

Add a forge to the legion camp.


Sunday 2020-07-12 04:32:19 by xTeal

2.14.4 - the holy shit a lot of stuff got removed and shit got overhauled because it wasnt being used update

"the holy shit a lot of stuff got removed and shit got overhauled because it wasnt being used update"

What got removed:

• Blacklisting • Rep • Feature Requesting (includes frcheck, fr, frrem, fradd so, just use Github) • Remind • Repcheck

Updates: • command descriptions • remove files so discord-bot-updater doesnt fuck with it • Rose bonuses removed, only bonus remaining is diamond, good luck getting that.

Also: • Dice is still unusable and mock isnt removed :^) • made readme more shit


Sunday 2020-07-12 07:44:35 by Huy Vo

Resolve neovim's checkhealth issue with python3 and macos

Here's the context: I just set-up my workflow on a fresh Catalina install, and I use a few neovim plugins that depend on python3. When doing brew install python3, brew installed [email protected] for me and sadly it's give a checkhealth error with neovim 0.4.3 (latest release). The error from checkhealth looks like this:

  • INFO: Using: g:python3_host_prog = "/usr/local/bin/python3"
  • INFO: Executable: /usr/local/bin/python3
  • ERROR: Command error (job=16, exit code 1): '/usr/local/bin/python3' -c 'import sys; print(".".join(str(x) for x in sys.version_info[:3]))' (in '/Users/user/dotfiles') Output: Fatal Python error: config_get_locale_encoding: failed to get the locale encoding: nl_langinfo(CODESET) failedPython runtime state: preinitialized Stderr: Fatal Python error: config_get_locale_encoding: failed to get the locale encoding: nl_langinfo(CODESET) failedPython runtime state: preinitialized
  • ERROR: Command error (job=17, exit code 1): '/usr/local/bin/python3' -c 'import sys; sys.path.remove(""); import neovim; print(neovim.__file__)' (in '/Users/user/dotfiles') Output: Fatal Python error: config_get_locale_encoding: failed to get the locale encoding: nl_langinfo(CODESET) failedPython runtime state: preinitialized Stderr: Fatal Python error: config_get_locale_encoding: failed to get the locale encoding: nl_langinfo(CODESET) failedPython runtime state: preinitialized
  • WARNING: Unexpected Python version. This could lead to confusing error messages.
  • WARNING: Python 3.3+ is recommended.
  • INFO: Python version: Fatal Python error: config_get_locale_encoding: failed to get the locale encoding: nl_langinfo(CODESET) failedPython runtime state: preinitialized
  • INFO: pynvim version: unable to load neovim Python module
  • ERROR: pynvim is not installed. Error: unable to load neovim Python module
    • ADVICE:
      • Run in shell: pip3 install pynvim

You know what? This is ridiculous. I already installed pynvim, and running

/usr/local/bin/python3 -c 'import sys; print(".".join(str(x) for x in sys.version_info[:3]))'

or

/usr/local/bin/python3 -c 'import sys; sys.path.remove(""); import neovim; print(neovim.__file__)'

resulted with no error on my shell, so why the hell is it failing on neovim's checkhealth?

After hours of searching the internet and even tried to build neovim from source (nightly build - but failed due to another issue with the fucking luajit), still I couldn't get away with the issue. But once I downgraded to [email protected], the issue just went away!

Tired of hitting my head against the wall, I decided to install both [email protected] (for neovim plugins) and [email protected] (dependency of other homebrew packages), and have [email protected] first in my path to finally make peace with it.


Sunday 2020-07-12 08:06:26 by petrero

  1. It Works! 372. Cleaning Up with ComponentWillUnmount(Section 26: Implementing Streaming Video)

All right my friends this video is going to be the moment of truth.

We're going to figure out whether or not we are able to stream some video and see it inside of our browser.

So to get started we're going to first do a little bit of configuration of OBSS if you recall when you

looked at the Noad Media Server documentation.

There was a section inside of your Tukey about how to receive video from OBSS.

So essentially want to set up a streaming at your l of RCMP local host slash live and then the stream

key that we use is going to be the stream name which for us is going to be the ID of the stream object

that we are looking at on the screen.

So I'm going to pull on OBSS right here I'm going to find the settings button on the left hand side

of select stream and then I'll select a stream type of custom streaming server for the Eurail going

to enter TTP or the RCMP.

My mistake.

Colon slash slash local host slash life.

And then my stream key again it's going to be the ID of the stream that I'm viewing inside of my browser.

So in this case I'm at stream's slash one so I'm looking at the stream with an idea of one if you're

looking at a different idea you need to enter that different ID because I'm at one I'm going to enter

one right there so I have simply one as my stream key OK it's going to hit OK.

And then finally I'm going to hit start streaming and you'll notice in the background what do I see.

I see my stream start to appear.

If you do not immediately see or stream appear right here the first thing to do is try refreshing the

page when you refresh the page you should then see the video player appear with your desktop image inside

of it.

So now I can click on play right here and I this is kind of strange but I could hear myself talking.

What I was saying just a couple of seconds ago.

I got meet that audio right there.

But if everything worked out correctly you should see the stream of video on here.

And if you have a microphone and you're talking into it you should hear yourself as well.

Now keep in mind that the entire stream process usually there is a time lag in it.

It might take up to 10 or 15 seconds for your video to catch up and actually be visible inside the browser.

All right.

So this looks pretty awesome.

It looks like everything is working out as we expected.

There's just one last little thing I want to point out here.

If I go over to click on streaming and navigate away from this page and then going to go back over to

OBSS and I'm going to stop the stream and you'll notice that when I did so we see a little console log

over here you might have not quite noticed it if you didn't have your console open if you didn't notice

it.

Try turning on your stream again inside of obese and then go back over to your stream clean out your

counsel make sure you play the video then navigate back to the list of streams.

And then here it is one more time even though I don't see that video player on the screen any more.

Click on stop streaming and then after a second or two you're going to see a little console log over

there and it says media source on source ended.

So to know something seems a little bit strange about that.

Well let's come back the next section.

I'll tell you about why we're seeing that little console right there and some little bit of last minute

cleanup that we need to do just to make sure that our application is not going to crazy so to speak.

So quick pause and we'll take care of this last task in the next video.

  1. Cleaning Up with ComponentWillUnmount

In the last video we got our video player working.

But I made a big deal about the fact that if we have our video streaming and then we go back over to

our index page and then we stop our stream.

It's going to stop my stream right now.

We then very quickly see an error message or a little console log inside of our javascript console.

So in this video I want to figure out what is going on there.

Well essentially what's going on is that our streams show component.

Remember this thing is creating AFL the video player.

When our component is unmounted from the DOM.

In other words when we navigate away from the stream show component there is no code that tells this

video player that we create to stop streaming video from our video server.

So essentially even though we are no longer looking at that video player the video player is still attempting

to download and process video.

And that's why when we stop our stream we eventually see this console log over here of media source

on source and it is because that video player is still connected to that stream.

And it was still trying to receive new information.

Now as you might guess we probably don't want to try to download a stream or process any of that video

when the video player is not present on the screen.

So in this section we're going to figure out how to deal with that.

If you recall something we spoke about way long ago in the course when we are talking about lifecycle

methods we had spoken about how we had lifecycle methods like component did mount and did update and

we also had another one called component will on Mount.

So let's add that into our component right now component will unmount when we spoke about this we had

said that this was a great lifecycle to method to use any time that we wanted to clean up some resources

that were being used by our component lets out in the console like here right now.

We'll just say something like I was on mounted I'm going to save this.

Then flip back over to my application on navigate to the stream show page and then I will navigate away

for it.

You'll see that's when the console log appears.

So like I just said component will and mount is a perfect place to do a little bit of cleanup and take

care of any resources that our component might have created.

So to handle that inside of component will unmount.

I'm going to remove that console log and we're going to attempt to clean up this video player resource

so to do so.

I'm going to call this star player.

Don't destroy like so when we call destroy on the player it's going to essentially tell the player to

stop attempting to stream video and detach itself from that video element that we had created down inside

of that render method.

All right.

Let's try this out again now with the component will on mt life cycle method inside of your screen when

to flip back on which my application I'm going to refresh the page I'm going to pull open OBSS again

and I'm going to start streaming and then I'll go to the same stream.

I was going to before remember you have to make sure you go to that appropriate stream ID.

Now I can start the video playing now I will go back to the index page.

I'll go back over to OBSS and I'll stop the stream.

And now I no longer see a message over here saying oh yeah.

Media source ended or something like that because when we navigated away we cleaned up that video player

and it's no longer attempting to download any video.

All right so that's it.

That's the last little piece of functionality that we had to add to our application.

All right.

So I hope you enjoy this application.

I know this was a rather long project that we put together but I thought it was a pretty neat little

project that we did.

So we have the ability to have users stream video to these different streams which is something that

is you know just generally kind of interesting.

Now I do want to mention the one obvious limitation to this application we put together is that right

now any user can stream any video to like any stream so long as you have that stream ID you can send

a video to it.

Now in this case I would kind of call that a feature.

So you know I don't know maybe I'll call that a feature.

Obvious it's obviously it's a little bit of a limitation of our program.

Ideally we would have only the user who owns or created a stream able to stream video to a given Stream.

Now that would be ideal but that would require a pretty good amount of work on the back end of our application

which I didn't really think that we would probably want to go through inside of a reaction redux course.

Having said that I do hope you enjoyed the application and we still have some other stuff to go through.

So let's take a quick pause right here and we'll continue in the next video.


Sunday 2020-07-12 08:06:26 by petrero

  1. Creating a FLV Player(Section 26: Implementing Streaming Video)

In the last video we got a video player to display on the screen.

So now we need to make sure that this video player somehow requests video to come from that RCMP server

in order to do so.

We're going to be making use of that F.L. the package at this point you might be all a bit confused

why we installed FLC at all because we just appeared to get a video player on the screen without it

will essentially F.L. Wii is about downloading that video stream and then converting it to some file

that can actually played inside of this normal HVM video player.

You can almost think of LBJ as being a little bit like X-posts in that it's going to reach out to some

remote server get some resource and then serve up that data to their application to be consumed on the

screen.

So in this video we're going to start to set up F.L. the inside of our streams show component the actual

setup of this is going to be just about identical to what we just saw inside of the node Media Server

documentation specifically F.L. veejay us over FLC.

So as we saw just a moment ago when we looked at this documentation we're going to take the rest to

the video element and then pass it off to this create player call.

You'll notice that inside of create player we also have to specify the or else that we're going to get

that stream from.

So we'll have to investigate that in just a little bit.

Right now I want to think about where we should be writing this code inside of streams show to set up

that video player.

I think that inappropriate place to do it would be the component did MT lifecycle method.

So we'll say that right after we call that stream it we could write this code before just to be clear.

Doesn't really matter what side of this we place the creation of the video player on of fecche Stream

we're going to call F.L..

Create player and we'll pass in an options object the options object is going to have type Filby to

designate the type of video we're trying to receive.

And then we're also going to specify a or L right here.

So let's take a look at the node Media Server documentation again and figure out how we specify that

your l.

So you'll see right here we're going to specify localhost eight thousand member.

We had said that that is where video is going to be served up from from that RCMP server port eight

thousand and then we're going to access the live route and then stream name right here.

So this is going to be the name of our stream of video.

Now you might think that this is going to be like the title of our stream from the API.

Remember the title of a stream that is stored on our API is completely separate and independent from

all of this actual RTM piece server stuff.

The stream name right here is actually specified when a user streams video from their video streaming

software.

In our case OBSS if you actually scroll up in this documentation right here just a little bit there's

a section on how to configure OBSS to stream to our RCMP server.

So inside of OBSS we're going to go to settings then stream we're going to select a custom streaming

server and we're going to attempt to stream video from OBSS over to our GMP local host live and then

we're also going to designate and site of OBSS something called a stream key.

And that stream key is going to be equal to our stream name.

So the stream name is actually designated by OBSS essentially when a streamer starts to stream video

to our application.

They are going to designate a stream name and so we just need to make sure that our viewers receive

or make use of the exact same stream name right there.

So the approach that we're going to take for this is going to be really straightforward.

We're going to say that our stream name is going to be the idea of the stream that we're looking at.

So in this case I'm looking at stream with ID number one that is going to be our stream name.

So a streamer using OBSS is going to enter a stream key of like ID one if they're trying to stream to

stream with idea of one.

And then on site of our video player when we set that up we'll put the ID of the stream that the user

is looking at in place of this little stream name part right here.

Now I know that's a little bit confusing but honestly once we put all that stuff together it'll definitely

make a lot of sense.

All right so I'm going to flip back over to my editor and for my you are Elle I'm going to use a little

bit of a template string right here so yes 20:15 syntax.

We're going to say HTP colon slash slash localhost 8000 slash live slash curly braces like so.

And inside of here we want to put the idea of our stream now.

We already accessed the ID right up here on the line above it.

So I think that we can probably save a little bit of typing here by destructuring off id from destock.

Props.

Match.com prams.

And then when we call fecche dream we can just pass in the ID like so and now we can reuse that ID variable

inside of R U R L as well.

So we're going to get video from Live ID Daut F.L. be like so OSL looks pretty good.

So now the next thing we're going to do if we follow the documentation you saw over here is a sign that

create player call to some variable and then we're going to take that variable and we're going to call

attached media elements.

We're going to pass in the reference to the actual video element that we are rendering inside of our

component.

So back over here I'm going to assign the result of create player to this dot player like so and then

right after it I'll say this dot player dot attach media element and I'll pass in a reference to this.

The video ref.

Current like so.

And then finally to load up the player we'll call this player.

Load.

Now you might notice back in the documentation they've got the play call on here as well.

Play is going to attempt to get the video player playing automatically.

But I've actually found that that doesn't quite work so well a lot of modern browsers browsers prevent

video from being played automatically when the user first accesses the page.

So for you and me we're just going to load up the player and we're not going to try to automatically

play any video.

We'll allow the user to click on the play button to get the video to start to play.

OK.

Let's save this and then we'll flip back over to our browser and you'll notice that we very quickly

get a nasty error message right here which is totally fine.

Let's take a quick pause when we come back the next section we're going to start to investigate this

air and figure out what's going on because it definitely seems like something is not quite going expected

when we attempt to attach the video player to that video ref.

So quick pause and I'll see you in just a minute.


Sunday 2020-07-12 08:06:26 by petrero

  1. Showing a Stream(Section 26: Implementing Streaming Video)

Now that we fixed up our navigation issues we can focus on the stream show component again as a quick

reminder the component for streams show is going to show the title and description down at the bottom.

So effectively we have to go through the exact same process that we went through for stream delete and

stream edit as well.

We need to read the ID out of the L.

We need to call the action creator to fetch that particular stream and then use a map state to prop's

function to get that stream out of our redux store and into our component.

So lets get to it inside my code editor.

I'll open up my streams show a component right here at the top.

I'm going to import connect from re-act redux and I'll also get my fetch stream action creator from

up to directory's actions.

Next up I will hook up the connect function down at the bottom so it plays connect and call it and then

OLAP stream show at the second set of parentheses.

We do not yet have a mouse stage props functions all pass and NULL for the first argument and then the

second argument will be a fetch stream inside of an object.

Next up we definitely want to make streams show into a class based component so we can use a lifecycle

method.

So I'm going to just delete the entire functional component and replace it with class stream.

Show extends re-act dot component.

Well defined my render method in there.

And right now I will return a div with the text stream show and then I will also define a component.

Did mt life cycle method and inside if you're going to go through the same process Winther previously.

We want to call this prop's not fetch.

Stream and we need to make sure that we pass in the appropriate ID for the stream that we want to fetch.

So we've seen that once before.

Member to get this little idea right here.

We will reference this dot prop's match harams ID.

OK so let's save this right here and we'll test inside the browser so going to flip back over.

I'm going to open up my network request Lague and filter by ex-aide char requests and then I will refresh

the page while I am looking at streams 4 and so I should see a request right here to get stream with

ID.

For now remember you might not be looking at the stream with an idea for you might have created a number

of different streams so you might be looking at like streams 12 or something like that.

Essentially you just want to make sure that you see a request pop up right here to go and fetch some

given stream.

I guess that looks pretty good.

So now we need to somehow get that stream out of our redux store and get it inside of our component.

So as usual we'll define map state to prop's.

We're going to get both our state argument and own props and then inside of your we will return an object

of stream and that will be states streams and we need to get own prop's dot match BRAMs Id like Zo and

Eclipse's sidebar so you can see that whole line

all right now let's take maps to props and pass it off to our next function.

So map state to prop's And then finally we'll try to show some information about that stream inside

of a render method.

Now let's not forget the same scenario we have gone through many times before if we have not yet fetched

the stream we need to handle that appropriately.

So inside of my render method I'll say if there is no stream so if not this Propst stream then I want

to return a div with the text loading otherwise I'm going to return a little bit of GSX here so I'll

delete that div with just dream show.

I'm going to make a multi-line gests X block right here and I'll put in a div with a h one inside of

the H one will show the stream's title.

So this Scott prop's stream title.

And then after that I'll place about five little bit similar text and inside there will do this up props

stream description get the stream's description on there as well.

Now if you want to we could do a little bit of yes 20:15 destructuring here to avoid the repetition

of this Propst stream.

Let's just do that really quickly.

So we'll pull off title and description from this prop's stream.

And now we don't have to duplicate this not not stream twice inside of that return statement.

So it'll go to be just title and just description like so.

All right let's save this now.

If I flip back over all see my it titled My stream as a H-1 and I'll see the 5 underneath it with the

strings description.

Now I should be able to go back to my list of streams and click on another one and see the title and

description for that stream as well.

And there's another one as well.

And then don't forget we need to also make sure that we can refresh the page and still see the appropriate

stream.

So I will refresh and I still see the stream appear.

And so that ensures that our component is fetching the data that it needs.

And we are not dependent upon going to the stream List screen first getting our list of screens and

then going to a individual page.

OK so this looks fantastic.

So let's take a pause right here.

It will continue in the next video.


Sunday 2020-07-12 08:06:26 by petrero

  1. Viewing a Stream(Section 26: Implementing Streaming Video)

All right my friends we now have the ability to list out streams create them edit them and delete them.

So in this video we're going to start working on the last big page of our application the show stream

page.

Now whenever a user comes to the path of streams slash three we're going to want to show this page right

here that has some details about the stream and eventually that video player as well.

Remember we're not going to really worry about the video player or the actual streaming of video until

the very end of the application because the real idea behind us app was to show you crud operations

remember create replays update destroy Razmi create read update destroy.

So we're going to first focus on just making sure that we can load up this particular stream and show

some details about it on the page.

That entire process is going to be just about identical to what we've now gone through with edits and

delete.

So we're going to want to make a class based component that's going to attempt to look at the your l

find the ID inside there fetch that stream get the stream out of our redux store and then show it inside

the render method pretty much the same thing we've now done twice over.

So let's get to it to get started.

Going to first open up my apt J.S. file inside of aptest.

Yes I'm going to make sure that I update my route right here from streams slash show because remember

that was kind of like a stand in route to instead be streams slash colon Id like so.

So then I'll save this and now the next thing we want to do is make sure that on our stream list so

the stream list over here any time that we click on like this header right here I want to navigate over

to the appropriate component like I want to navigate over two streams slash.

The idea that stream I had just clicked on.

So in order to do so I'm going to open up my stream list file stream list I'm going to scroll down a

little bit and I'll find render list right here.

So inside of render list we've got the div that contains the stream's title.

So we're going to want to wrap that with a link element from re-act Rotterdam so that whenever user

clicks on that title right there we attempt to navigate the user over to the appropriate page.

So I going to first make sure that we have imported the link tag or the link component from re-act Rotterdam.

So go up to the top here really quickly.

Yep we've got that import right there.

So go back down to render list and I'm going to wrap that stream title with link.

It's now going to pass this thing a prop.

Now just as we've seen many times before.

We're going to want to customize the path that this attempt to navigate to only when this thing gets

rendered because we essentially want to take the idea off the stream and customize that path.

So inside of a set of curly braces I'm going to place back ticks as usual not single quotes here we're

making use of tactics.

And I'll say slash dreams slash dollar sign Crilley brace stream dot ID.

So that's going to generate a path very much like the one that we want it will be streamed slash in

on the idea of the stream that we're trying to visit.

I'm also going to add on a class name to this link element of Hetter.

Like so.

All right.

Let's now save this and we'll flip back over.

And it looks like I now have links on the title of each of those different streams.

So let's now try clicking on one of these and just see what happens.

OK.

So I come over here and I see it streams show up on the screen.

I can go back and go to other stream.

Notice how I'm now at stream's slashed too.

And if I go back to the original one I meant streams slash 1.

OK.

That looks pretty darn good.

Now let's take a quick pause right here.

When we come back the next section will start working on our stream show component.


Sunday 2020-07-12 08:06:26 by petrero

361.1. Switches with React-Router(Section 26: Implementing Streaming Video)

In the last video we got our links working for each of these different streams so I can now click on

a title and see streams show appear.

Now before we start to develop streams show too much I want to show you some really interesting behavior

here is something that's probably going to be pretty unexpected.

I going to go back to my list of streams and then I'm going to click on the Create stream button on

the bottom right hand side and when I do so I see the Create stream component but you'll notice at the

bottom we see something really interesting we see stream show.

So it appears that when we go to stream slash new we see both the Create stream component and streams

show at the same exact time.

So what's going on here.

Well this is kind of one of the downsides to react router and how they choose to implement navigation

with these different route objects.

All right so let's flip back over to our J.S. file.

So inside of apts just remember we have all of our route configurations so essentially we are running

into a scenario where if we go to streams slash new we see both stream create but we also see stream

show.

Now I want to remind you when we first started talking about re-act router Dom we spoke about how re-act

router tries to match these different paths greedily.

In other words if a given path matches a route the route will be shown no matter what re-act router

Dohm doesn't try to just show one route.

It's going to show every single route that matches the given path.

So with that in mind I want you to look at streams slash new right here look at that route.

So streams slash new and and look at the route or the path of streams show down here at the bottom streams

slash wild card are kind of like variable here on the end.

Now up to this point we've been accessing routes of like streams slash five or 20 or three or 100 or

whatever the I.D. was.

But remember the Colan right here is essentially a variable.

It does not only match variables that are numbers it will match anything in that part of the or else.

So in this case this route right here with streams show when we go to stream slashed new ID right here

is essentially taking the text new because it thinks New Right here is like a variable or a idea of

sorts.

And so that's why you're seeing both stream create and streams show.


Sunday 2020-07-12 08:06:26 by petrero

370.1. Optional Player Building(Section 26: Implementing Streaming Video)

An last video we set up a bunch of stuff around the Felty player but then we very quickly got confronted

with a nasty error message here.

It's kind of hard to decipher what's going on with this error message but you'll notice in sight of

this component in Mount print up right here it appears that things are starting to go wrong.

When we tried to attach the media player to the video player ref.

So let's try adding a console log of the video ref inside of component dismount and figure out what's

going wrong.

So inside of component amount going to add a console that log for this video ref and I'll save this

and we'll see what happens.

OK.

So I still see the same error message inside my console over here.

And scroll up just a little bit and I'll see the console log right here.

So it says Current is null.

Now why could that be.

This essentially means that we are not getting the correct reference to that video element.

Well let's kind of think about this a little bit.

If we go down to a render method you'll recall that we have a little bit of a check inside of here and

we say if we do not yet have access to our stream then we're going to just show a div with loading.

So when our component first renders if we don't have the stream we are not creating the video element

at all.

Instead we just immediately return the Stiv right here.

We never create the video and we never attach our ref to that video element.

So that's essentially what's happening when our component first gets rendered.

We're making the div.

The video does not get created because we do not yet have our stream.

However I bet you anything that if we dismiss this message right here or excuse me we don't need to

dismiss it we can just go back to localhost 3000.

And then if we then attempt to click on one of these elements we will see the video player appear successfully.

That's because if we go back to the original list screen we're going to load up the stream with the

idea of one.

And so that's going to be inside of our redux store when we then attempt to render streams show we are

already in control of the appropriate stream.

So we don't encounter this case where we have not yet loaded up.

However if we refresh the page while we are here then we have to wait for the Ajax request or the network

request to be completed to go and get that stream object.

And that's the case where we run into this error message right here.

So how can we fix this.

Well there's more than one way to do it.

We can either say that we do not want to render anything inside this component until we fetch the stream

and essentially continue what we're doing right here and then add in some better logic inside of component

and mount to decide whether or not we are actually ready to attempt to attach the video player to the

video ref.

Alternatively because our render method or the entire component itself only tries to print up the title

and description from the stream.

We could only guard against printing out the H1 and h 5 right here until we actually get the stream.

So in other words always try to show the video player but wait to show the title and description until

we get the stream.

So we get totally do that approach because the video player does not actually depend upon the stream

being fetched.

Now that would be a really easy approach or real easy solution but I want to show you the slightly more

complicated solution where we're going to essentially make sure that we do not attempt to attach that

video player until we successfully get the stream because I think that's more realistic of what's going

to happen in real life.

The reason I say it's more realistic is because when we specify the you are right here raising the ID

which is already known ahead of time before we load up the appropriate stream.

But it's entirely possible that the oil right here might need to reference some property inside of our

stream object in order to side what the actual R L is.

So we might need to reference some like I don't know internal stream or id or streamer tokin or something

like that when specifying the You Are All Right here.

And if we wanted to do that we would definitely need to have access to the stream.

All right.


Sunday 2020-07-12 08:06:26 by petrero

364.1. RTMP Server Setup{yarn add node-media-server --save}(Section 26: Implementing Streaming Video)

We now have a full crud example put together with react and read us so we can see a list of records

we can create a new record we can edit that record and then we can go ahead and delete it if we want

to.

And of course we can show a individual record as well.

These are the basic operations that are included for the vast majority of web apps out there just about

every app as we discussed much earlier on has these very basic operations around reading showing listing

all that kind of good stuff different records.

So at this point this application for the most part is complete and I would encourage you to do a get

commit if you're making use of get or even just copy the project directory and just have all the code

we've put together as a backup so that you can reference it in the future because what you see right

here is a pretty good base for creating any application you might want to work on.

So at this point moving forward we're going to start continuing on the streaming aspect of this application.

Now remember the streaming part is 100 percent optional and a lot of what we're going to do here is

not really related to react in redux at all.

I just want to complete the application I told you we were going to build but going to the string stuff

is not at all a requirement for underthings understanding how react and redux works to that end.

If you have any trouble going through the streaming stuff and getting it to work I'm probably not going

to offer you a lot of support for troubleshooting issues because again this is just not really relevant

for the course.

I just want to make sure that we can complete the example nonetheless.

Okay.

So we're gonna start working on the streaming aspect of the supplication now.

So let me tell you about exactly what we need to do.

I guess we looked at this diagram previously.

Remember we had said that we were going to develop that API that had a list of streams and we've already

gone through that process and our web application running inside of a browser has the ability to list

out those different streams create new ones and do all that good stuff.

So now the next thing we're going to do is set up this RCMP server which is going to be responsible

for receiving different video streams and broadcasting them out to different users browsers.

Now remember I had told you setting up this RTM RCMP server was going to be really easy and straightforward

and that's not a lie at all.

It really will be very simple to put together.

So here's what we're going to do.

I'm going to flip on over to my terminal where I'm inside of my client directory right here.

So remember the client folder is where we have put together all the react and redux parts of our application.

So I'm going to go up one level and out here I've got the API project and the client project as well.

So inside of this folder inside of the streams overall general project folder I'm going to make a new

folder called Arti MP server like zone and then I'm going to change into that directory and inside of

there I'm going to generate a new package not just on file with NPM in it.

Once I run NPM minute I'll be prompted for a couple of different inputs and I'm going to hit enter to

go through each of them and I eventually get kicked back out to my terminal.

OK so now we've generated a package not just on file.

Let me tell you about how we're going to put that server together.

All right.

So I've got some documentation on here on the screen or a link to some documentation for the RCMP server

that we're going to make use of.

So I'm going to open up a new browser tab and navigate to that link.

All right so this is a no js implementation of a RCMP server and this is how we are going to eventually

stream video from a program like say OBSS member that's open broadcaster over to the RCMP server making

use of the node media server package is really easy and straightforward as a matter of fact we're just

going to take the default example that you can see if you scroll down a little bit and find the usage

section.

So underneath the usage section you'll see NPM version right here and it says single core mode.

So there's a single core mode and a multi-core cluster mode.

We're going to use single core because we do not really expect to have a lot of traffic on this RCMP

server that we are putting together.

So essentially all we have to do is install this package node media server and then you and I are going

to run exactly the code you see right here.

We're not going make any changes to it.

We're just going to use the base default configuration.

All right so I'm going to flip back over to my RCMP server directory and over here I'm going to run

NPM install dash dash save node dash media dash server Lexa and then well that runs I'm going to also

open up my code editor inside of that RCMP server directory.


Sunday 2020-07-12 08:50:22 by k21971

More tweaks, fixes, and changes with Infidel role.

A few more adjustments to the Infidel role:

  • Corrected some grammar mistakes with the quest text.
  • Changed how the Infidel is addressed upon ascension - instead of demon lord/lady, it's 'Archfiend of Moloch' (if crowned) or 'Emissary of Moloch' (if not crowned), both are independent of gender.
  • Fixed (with the Amulet), changed it to (with the Idol) for ascending Infidels.
  • Changed the name of the quest leader, from 'preacher of Moloch' to 'Magistra of Moloch' and specified female gender. This naming convention follows the hierarchy of the Church of Satan; their current chairmistress is referred to as 'Magistra'. The title 'preacher' makes me think of a small town pastor somewhere in the bible belt preaching to their flock... had to be changed.
  • Add PM_DEMON to is_placeholder()
  • Removed the magic marker from the High Priest of Moloch's inventory (sanctum) and placed it within a crystal chest right next to the altar instead. Reason being - since that marker is potentially the only one that can ever be found in the game, having it in the priests possession effectively screws over Infidels, since that priest is peaceful towards them, and killing a co-aligned priest is frowned upon.
  • Removed several alignment/luck penalties for Infidels killing peaceful types. Killing pets or a co-aligned priest is still bad... don't do it.

At this point, the changes to the Infidel role has strayed far enough from the original patch, that will need to be made clear on the NetHackWiki.


Sunday 2020-07-12 08:54:52 by lee

Merge remote-tracking branch 'origin/newbranch' fuck you github


Sunday 2020-07-12 09:10:43 by Exotic-Retard

Change default database from rackover to spooky

First off, i have no idea what im doing, and so if this doesnt work i wouldnt be surprised in the slightest. (forgive me)

Also, an issue request but i thought it would go along easier if i tried to do it myself first

Anyway, the brick i want to sell is this: the spooky db is good and beautiful while the rackover db is bad and ugly. the rack one is also without a maintainer while the spooky one does have a maintainer.

I also think that the spooky one should be integrated into faf completely while the rackover one retired, but thats a separate thing. for now i would like for the spooky one to be made default, Check out this comparison:

also, later there will be a version 2 of the database which is even better: This one however isnt done yet so half its features are missing at the moment.


Sunday 2020-07-12 11:24:40 by skoglol

Merge pull request #51854 from MrDoomBringer/supplyprettypod

Please check out this EPIC OFFICIAL PR TRAILER before reading (very important) https://youtu.be/4RckVdx20oQ the video is kinda autistic

dont forget to upvote About The Pull Request

All sprites and epic meme videos made with love by yours truly Except for the 2 missile sprites. Those were taken and modified from NSV13 who in turn ported them from TGMC nupod_all_decals

Anyways, this adds: New pod, reverse-pod, and target indicator sprites Pod-ground collision effects (impact craters basically) Cool looking vapor trails a la the half-life 2 headcrab shells

And also: Fixes seethrough pods not actually working Makes reverse-mode a bit more predictable Has some minor code improvements with how supplypod-reverse-mode works


Sunday 2020-07-12 12:56:32 by Marko Grdinić

"2:40pm. Though I've been having breakfast, this whole time I've been thinking about join point specialization and renaming.

Conclussion:

I am going to get rid of hash consing as it serves little purpose. Instead for the second join point key I will just use the hash nodes. And during renaming, I will change variable and functions to tags. The way I will do that is if I have a tuple of say...

var 2 : i32, var 2 : i32, var 2 : i32

I will rename this to...

var 0 : i32, var_tag 0, var 1 : i32

I'll do a similar thing for functions. Now that I've figured out how to do compilation of mutually recursive function blocks everything is much easier for me. The reason for the thing above is to make it easier to use the unbuilt hashing and equality. The function one is especially important for this if I do not want exponential slowdowns.

2:45pm. Something great will come out of doing the language server.

Assuming I do not do specialization wholesale and do some boxing, I will be able to reuse the results of past compilation. I'll have the first part of the join point key be a weak reference through the weak conditional table.

2:50pm. This will give me incremental compilation ability even in the partial evaluator. That sort of thing is to die for. I'll even be able to extend this to the codegen.

v0.2 is going to come out as good as a single person can humanly make it.

Damn it, I meant to start work on the parser and I did, but now thoughts of specialization are taking over. Let me step away from the screen for a bit. I might as well do the chores here and take a nap after that.

I'll get it out of my system and into code eventually.

2:55pm. Actually since I will never be decompressing join point keys, I can get away with tagging everything. That would be the easiest thing to implement and would be the most efficient for hashing, equality and comparison."


Sunday 2020-07-12 13:06:22 by mikomyazaki

Removes tobacco damage. (#9335)

Fixes #9265

Chewing tobacco causes pain message spam due to the organ damage. This organ damage is on the order of 1e-5 per life tick, and is therefore completely negligible and instantly healed by the player due to the low strength of the tobacco reagent.

In my opinion this damage does not need to be simulated. The tobacco organ damage will never reach a meaningful number in the length of a round even when smoking/chewing tobacco constantly. People overdoing smoking will suffer the nicotine overdose effects.


Sunday 2020-07-12 14:57:57 by Petr Mladek

kthread: add kthread_create_worker*()

Kthread workers are currently created using the classic kthread API, namely kthread_run(). kthread_worker_fn() is passed as the @threadfn parameter.

This patch defines kthread_create_worker() and kthread_create_worker_on_cpu() functions that hide implementation details.

They enforce using kthread_worker_fn() for the main thread. But I doubt that there are any plans to create any alternative. In fact, I think that we do not want any alternative main thread because it would be hard to support consistency with the rest of the kthread worker API.

The naming and function of kthread_create_worker() is inspired by the workqueues API like the rest of the kthread worker API.

The kthread_create_worker_on_cpu() variant is motivated by the original kthread_create_on_cpu(). Note that we need to bind per-CPU kthread workers already when they are created. It makes the life easier. kthread_bind() could not be used later for an already running worker.

This patch does not convert existing kthread workers. The kthread worker API need more improvements first, e.g. a function to destroy the worker.

IMPORTANT:

kthread_create_worker_on_cpu() allows to use any format of the worker name, in compare with kthread_create_on_cpu(). The good thing is that it is more generic. The bad thing is that most users will need to pass the cpu number in two parameters, e.g. kthread_create_worker_on_cpu(cpu, "helper/%d", cpu).

To be honest, the main motivation was to avoid the need for an empty va_list. The only legal way was to create a helper function that would be called with an empty list. Other attempts caused compilation warnings or even errors on different architectures.

There were also other alternatives, for example, using #define or splitting __kthread_create_worker(). The used solution looked like the least ugly.

Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Petr Mladek [email protected] Acked-by: Tejun Heo [email protected] Cc: Oleg Nesterov [email protected] Cc: Ingo Molnar [email protected] Cc: Peter Zijlstra [email protected] Cc: Steven Rostedt [email protected] Cc: "Paul E. McKenney" [email protected] Cc: Josh Triplett [email protected] Cc: Thomas Gleixner [email protected] Cc: Jiri Kosina [email protected] Cc: Borislav Petkov [email protected] Cc: Michal Hocko [email protected] Cc: Vlastimil Babka [email protected] Signed-off-by: Andrew Morton [email protected] Signed-off-by: Linus Torvalds [email protected] Signed-off-by: celtare21 [email protected] Signed-off-by: YousefAlgadri [email protected]


Sunday 2020-07-12 16:12:36 by Marko Grdinić

"3:05pm. Done with chores. Let me go to bed again. I will Think.

5:05pm. I've thought. I definitely do not feel like programming now, but let me write down my thoughts.

First of all, incremental compilation of the partial evaluation pass is impossible. Prototypes couple everything together. It might be possible to eliminate some of that cost using complex analysis, but it would be to costly in terms of developer effort. And possible might not be worth it in the end. It is not even worth considering.

It would be possible to do incremental compilation without prototypes, but the language would be too poor to bother using in that case.

I keep thinking how to improve compilation speeds.

I had the idea of deferring compilation at join points - this would require a specialized runtime for Spiral, but this would only be a benefit on code that is never run, but is partially evaluated.

I do not think this situation would occur that often in practice.

The that leaves one last thing - forget partial evaluation and just do evaluation. Just interpret the AST like a dynamic language would. And leave enough information so that at join points that lead to Cuda or other such things you can just compile the method on the fly.

This would work well.

It would be the easiest way to speed up Spiral. It would give the fastest possible compilation. One issue is that macros would not work in that case. This method would require some integration with the target platform.

But once again, there are dynamic languages on the .NET platform, so this is quite realitic as a plan. I just haven't dove properly into it yet. In 2017 I did put a decent amount of effort into making use of .NET reflection for .NET types under the hood, but it turned out to be difficult to deal with so I scrapped that idea.

5:15pm. Ok, one interesting thing. I've completely forgotten that I've decided to associate nominal names with symbols...

Actually, no. Forget that. Since I've decided that peval...

Hmmm, actually let me go with the idea. It would simply destructuring of nominals.

...Ah wait. If the nominal symbol is the identity, then it really would be hard to shadow them.

Shadowing is allowed in Spiral, and I do not want that a nominal declared in some library somewhere ever conflicts with user code.

5:25pm. At any rate, not doing incremental partial evaluation will simplify memory management.

If I were doing it incrementally, how would I get rid of dead join points? I have no idea.

5:30pm. I'll have nominals ids have their own namespace. The same goes for prototypes ids.

The symbol dictionary is one consideration I need to think about.

I'll use an immutable map for it. Since the prepass will work on a block by block basis, I do not want to copy that dictionary. Though I could keep track of the additions and undo them, a map would be easier.

5:35pm. No forget deciding that now. I'll do that when the time comes.

Regardless of how thing turn out, in the long term the dual language strategy will be the dominant one. It sort of already is given the dominance of Java and C#, but their design is just so poor. Spiral is much better designed for that kind of thing.

5:40pm. What do I need to do? Bring my vision to fruition.

Today've decided on a few things like how to do specialization and deal with nominals.

I wanted to do some serious work on the parser, but the above thoughts hijacked my mind.

5:45pm. Tomorrow, I think I will leave my compilation concerns aside and try following the plan. Do the parser.

It won't be that hard. It is mostly done anyway in the prototype and I just have to adapt the code.

I have to believe in join points. They are the most realistic solution to all kinds of compilation issues that plague the current crop of languages. The version of Spiral I am doing is whole-program optimizing, but v0.3 will no doubt allow switching between various compilation modes using join points.

5:50pm. I have to believe that v0.2 will be enough to get me to that next level. That it will give me the power to make those excellent ensemble agents.

Alexis King argued against whole-program optimization, but Haskell is not going to do shit for me. Forget about language interop with it. In order to write the kind of code that I want, I need Spiral period.

Hell, I will decide it! I will state it here and now!

If it turns out that the programs grow so large that whole program optimization is killing productivity - I will implement a straightforward interpreter integrated with .NET for Spiral.

I just have to decide to that if it comes to that.

For now, forget it. I have everything else to deal with first.

5:55pm. I can sort of imagine it - I think the way agents will program will be different. They will have a far greater degree of integration with the language they are using. It won't be syntax based like us humans are doing. They'll probably work on ASTs directly represented in their mind. Coupled with their speeds that will lead to entirely different language design constraints.

That will be then and this is now.

For the kind of programs I want to use Spiral for - long running optimization processes, it will be very hard to beat what I am trying to do with Spiral v0.2. I do not have to worry about it. Spiral v0.09 was few secs for a few kLOC, and v0.2 will be at least 10 times that. Just swapping immutable maps for arrays, and adding the prepass would be worth that much on its own. Once I add the top level inlining, it will be even more.

Under 10s for 100k LOC will be an acceptable level of performance for anything I might do personally.

It might not be a level acceptable for huge corporate projects, but it will be for anything a single person can create. Honestly, if C++ can be viable in the real world, then so can Spiral.

I won't worry about it.

6:05pm. And now that I've decided this, that means I can get rid of the slow weak conditional table (in favor in vanilla dict) everywhere and not think about hash consing. Merely just memoizing hashes in join point keys will be enough.

Tomorrow, I will definitely focus on the parser. I've probed and tested my opponent enough. It is time that I switch to aggressively attacking the problems in front of me. I will deal with the parsing, prepass, partial evaluation and codegen passes. I will deal with editor support. Then I will have v0.2 completed.

During 2021 I will spend the time doing the finishing touches for editor support and package management, but otherwise I expect to be fully using the language.

In fact 2021 is too late for my taste.

Is there any reason why I should not already start using it next month? I think not.

I could do a large amount of work in 2.5 weeks assuming I can sit down and start writing.

6:10pm. Let me stop here for the day. That SAO thread made me want to check out the novels and the manga for GGO so I will get to that. I really liked GGO. I wanted to like regular SAO as well, but it got too boring and cringy for me past the first half of S1 so I dropped it."


Sunday 2020-07-12 16:32:09 by Jared Reynolds

Add files via upload

fuck you collin i can commit directly to master i am art man


Sunday 2020-07-12 19:28:59 by Aoibhinn Nic Aoidh

White it's my new obsession...

Yeah, white it's not even a question White on the lips of your lover, cause White is the love you discovah White as the bing on your cherry White cause you are so very White it's the color of passion A-cause today it just goes with the fashion


Sunday 2020-07-12 21:53:54 by KunleADE

REadme

How to share data with a statistician

This is a guide for anyone who needs to share data with a statistician or data scientist. The target audiences I have in mind are:

Collaborators who need statisticians or data scientists to analyze data for them
Students or postdocs in various disciplines looking for consulting advice
Junior statistics students whose job it is to collate/clean/wrangle data sets

The goals of this guide are to provide some instruction on the best way to share data to avoid the most common pitfalls and sources of delay in the transition from data collection to data analysis. The Leek group works with a large number of collaborators and the number one source of variation in the speed to results is the status of the data when they arrive at the Leek group. Based on my conversations with other statisticians this is true nearly universally.

My strong feeling is that statisticians should be able to handle the data in whatever state they arrive. It is important to see the raw data, understand the steps in the processing pipeline, and be able to incorporate hidden sources of variability in one's data analysis. On the other hand, for many data types, the processing steps are well documented and standardized. So the work of converting the data from raw form to directly analyzable form can be performed before calling on a statistician. This can dramatically speed the turnaround time, since the statistician doesn't have to work through all the pre-processing steps first. What you should deliver to the statistician

To facilitate the most efficient and timely analysis this is the information you should pass to a statistician:

The raw data.
A tidy data set
A code book describing each variable and its values in the tidy data set.
An explicit and exact recipe you used to go from 1 -> 2,3

Let's look at each part of the data package you will transfer. The raw data

It is critical that you include the rawest form of the data that you have access to. This ensures that data provenance can be maintained throughout the workflow. Here are some examples of the raw form of data:

The strange binary file your measurement machine spits out
The unformatted Excel file with 10 worksheets the company you contracted with sent you
The complicated JSON data you got from scraping the Twitter API
The hand-entered numbers you collected looking through a microscope

You know the raw data are in the right format if you:

Ran no software on the data
Did not modify any of the data values
You did not remove any data from the data set
You did not summarize the data in any way

If you made any modifications of the raw data it is not the raw form of the data. Reporting modified data as raw data is a very common way to slow down the analysis process, since the analyst will often have to do a forensic study of your data to figure out why the raw data looks weird. (Also imagine what would happen if new data arrived?) The tidy data set

The general principles of tidy data are laid out by Hadley Wickham in this paper and this video. While both the paper and the video describe tidy data using R, the principles are more generally applicable:

Each variable you measure should be in one column
Each different observation of that variable should be in a different row
There should be one table for each "kind" of variable
If you have multiple tables, they should include a column in the table that allows them to be joined or merged

While these are the hard and fast rules, there are a number of other things that will make your data set much easier to handle. First is to include a row at the top of each data table/spreadsheet that contains full row names. So if you measured age at diagnosis for patients, you would head that column with the name AgeAtDiagnosis instead of something like ADx or another abbreviation that may be hard for another person to understand.

Here is an example of how this would work from genomics. Suppose that for 20 people you have collected gene expression measurements with RNA-sequencing. You have also collected demographic and clinical information about the patients including their age, treatment, and diagnosis. You would have one table/spreadsheet that contains the clinical/demographic information. It would have four columns (patient id, age, treatment, diagnosis) and 21 rows (a row with variable names, then one row for every patient). You would also have one spreadsheet for the summarized genomic data. Usually this type of data is summarized at the level of the number of counts per exon. Suppose you have 100,000 exons, then you would have a table/spreadsheet that had 21 rows (a row for gene names, and one row for each patient) and 100,001 columns (one row for patient ids and one row for each data type).

If you are sharing your data with the collaborator in Excel, the tidy data should be in one Excel file per table. They should not have multiple worksheets, no macros should be applied to the data, and no columns/cells should be highlighted. Alternatively share the data in a CSV or TAB-delimited text file. (Beware however that reading CSV files into Excel can sometimes lead to non-reproducible handling of date and time variables.) The code book

For almost any data set, the measurements you calculate will need to be described in more detail than you can or should sneak into the spreadsheet. The code book contains this information. At minimum it should contain:

Information about the variables (including units!) in the data set not contained in the tidy data
Information about the summary choices you made
Information about the experimental study design you used

In our genomics example, the analyst would want to know what the unit of measurement for each clinical/demographic variable is (age in years, treatment by name/dose, level of diagnosis and how heterogeneous). They would also want to know how you picked the exons you used for summarizing the genomic data (UCSC/Ensembl, etc.). They would also want to know any other information about how you did the data collection/study design. For example, are these the first 20 patients that walked into the clinic? Are they 20 highly selected patients by some characteristic like age? Are they randomized to treatments?

A common format for this document is a Word file. There should be a section called "Study design" that has a thorough description of how you collected the data. There is a section called "Code book" that describes each variable and its units. How to code variables

When you put variables into a spreadsheet there are several main categories you will run into depending on their data type:

Continuous
Ordinal
Categorical
Missing
Censored

Continuous variables are anything measured on a quantitative scale that could be any fractional number. An example would be something like weight measured in kg. Ordinal data are data that have a fixed, small (< 100) number of levels but are ordered. This could be for example survey responses where the choices are: poor, fair, good. Categorical data are data where there are multiple categories, but they aren't ordered. One example would be sex: male or female. This coding is attractive because it is self-documenting. Missing data are data that are unobserved and you don't know the mechanism. You should code missing values as NA. Censored data are data where you know the missingness mechanism on some level. Common examples are a measurement being below a detection limit or a patient being lost to follow-up. They should also be coded as NA when you don't have the data. But you should also add a new column to your tidy data called, "VariableNameCensored" which should have values of TRUE if censored and FALSE if not. In the code book you should explain why those values are missing. It is absolutely critical to report to the analyst if there is a reason you know about that some of the data are missing. You should also not impute/make up/ throw away missing observations.

In general, try to avoid coding categorical or ordinal variables as numbers. When you enter the value for sex in the tidy data, it should be "male" or "female". The ordinal values in the data set should be "poor", "fair", and "good" not 1, 2 ,3. This will avoid potential mixups about which direction effects go and will help identify coding errors.

Always encode every piece of information about your observations using text. For example, if you are storing data in Excel and use a form of colored text or cell background formatting to indicate information about an observation ("red variable entries were observed in experiment 1.") then this information will not be exported (and will be lost!) when the data is exported as raw text. Every piece of data should be encoded as actual text that can be exported. The instruction list/script

You may have heard this before, but reproducibility is a big deal in computational science. That means, when you submit your paper, the reviewers and the rest of the world should be able to exactly replicate the analyses from raw data all the way to final results. If you are trying to be efficient, you will likely perform some summarization/data analysis steps before the data can be considered tidy.

The ideal thing for you to do when performing summarization is to create a computer script (in R, Python, or something else) that takes the raw data as input and produces the tidy data you are sharing as output. You can try running your script a couple of times and see if the code produces the same output.

In many cases, the person who collected the data has incentive to make it tidy for a statistician to speed the process of collaboration. They may not know how to code in a scripting language. In that case, what you should provide the statistician is something called pseudocode. It should look something like:

Step 1 - take the raw file, run version 3.1.2 of summarize software with parameters a=1, b=2, c=3
Step 2 - run the software separately for each sample
Step 3 - take column three of outputfile.out for each sample and that is the corresponding row in the output data set

You should also include information about which system (Mac/Windows/Linux) you used the software on and whether you tried it more than once to confirm it gave the same results. Ideally, you will run this by a fellow student/labmate to confirm that they can obtain the same output file you did. What you should expect from the analyst

When you turn over a properly tidied data set it dramatically decreases the workload on the statistician. So hopefully they will get back to you much sooner. But most careful statisticians will check your recipe, ask questions about steps you performed, and try to confirm that they can obtain the same tidy data that you did with, at minimum, spot checks.

You should then expect from the statistician:

An analysis script that performs each of the analyses (not just instructions)
The exact computer code they used to run the analysis
All output files/figures they generated.

This is the information you will use in the supplement to establish reproducibility and precision of your results. Each of the steps in the analysis should be clearly explained and you should ask questions when you don't understand what the analyst did. It is the responsibility of both the statistician and the scientist to understand the statistical analysis. You may not be able to perform the exact analyses without the statistician's code, but you should be able to explain why the statistician performed each step to a labmate/your principal investigator.


< 2020-07-12 >