POPULARITY
Today's guest, Nicholas Carlini, a research scientist at DeepMind, argues that we should be focusing more on what AI can do for us individually, rather than trying to have an answer for everyone."How I Use AI" - A Pragmatic ApproachCarlini's blog post "How I Use AI" went viral for good reason. Instead of giving a personal opinion about AI's potential, he simply laid out how he, as a security researcher, uses AI tools in his daily work. He divided it in 12 sections:* To make applications* As a tutor* To get started* To simplify code* For boring tasks* To automate tasks* As an API reference* As a search engine* To solve one-offs* To teach me* Solving solved problems* To fix errorsEach of the sections has specific examples, so we recommend going through it. It also includes all prompts used for it; in the "make applications" case, it's 30,000 words total!My personal takeaway is that the majority of the work AI can do successfully is what humans dislike doing. Writing boilerplate code, looking up docs, taking repetitive actions, etc. These are usually boring tasks with little creativity, but with a lot of structure. This is the strongest arguments as to why LLMs, especially for code, are more beneficial to senior employees: if you can get the boring stuff out of the way, there's a lot more value you can generate. This is less and less true as you go entry level jobs which are mostly boring and repetitive tasks. Nicholas argues both sides ~21:34 in the pod.A New Approach to LLM BenchmarksWe recently did a Benchmarks 201 episode, a follow up to our original Benchmarks 101, and some of the issues have stayed the same. Notably, there's a big discrepancy between what benchmarks like MMLU test, and what the models are used for. Carlini created his own domain-specific language for writing personalized LLM benchmarks. The idea is simple but powerful:* Take tasks you've actually needed AI for in the past.* Turn them into benchmark tests.* Use these to evaluate new models based on your specific needs.It can represent very complex tasks, from a single code generation to drawing a US flag using C:"Write hello world in python" >> LLMRun() >> PythonRun() >> SubstringEvaluator("hello world")"Write a C program that draws an american flag to stdout." >> LLMRun() >> CRun() >> VisionLLMRun("What flag is shown in this image?") >> (SubstringEvaluator("United States") | SubstringEvaluator("USA")))This approach solves a few problems:* It measures what's actually useful to you, not abstract capabilities.* It's harder for model creators to "game" your specific benchmark, a problem that has plagued standardized tests.* It gives you a concrete way to decide if a new model is worth switching to, similar to how developers might run benchmarks before adopting a new library or framework.Carlini argues that if even a small percentage of AI users created personal benchmarks, we'd have a much better picture of model capabilities in practice.AI SecurityWhile much of the AI security discussion focuses on either jailbreaks or existential risks, Carlini's research targets the space in between. Some highlights from his recent work:* LAION 400M data poisoning: By buying expired domains referenced in the dataset, Carlini's team could inject arbitrary images into models trained on LAION 400M. You can read the paper "Poisoning Web-Scale Training Datasets is Practical", for all the details. This is a great example of expanding the scope beyond the model itself, and looking at the whole system and how ti can become vulnerable.* Stealing model weights: They demonstrated how to extract parts of production language models (like OpenAI's) through careful API queries. This research, "Extracting Training Data from Large Language Models", shows that even black-box access can leak sensitive information.* Extracting training data: In some cases, they found ways to make models regurgitate verbatim snippets from their training data. Him and Milad Nasr wrote a paper on this as well: Scalable Extraction of Training Data from (Production) Language Models. They also think this might be applicable to extracting RAG results from a generation.These aren't just theoretical attacks. They've led to real changes in how companies like OpenAI design their APIs and handle data. If you really miss logit_bias and logit results by token, you can blame Nicholas :)We had a ton of fun also chatting about things like Conway's Game of Life, how much data can fit in a piece of paper, and porting Doom to Javascript. Enjoy!Show Notes* How I Use AI* My Benchmark for LLMs* Doom Javascript port* Conway's Game of Life* Tic-Tac-Toe in one printf statement* International Obfuscated C Code Contest* Cursor* LAION 400M poisoning paper* Man vs Machine at Black Hat* Model Stealing from OpenAI* Milad Nasr* H.D. Moore* Vijay Bolina* Cosine.sh* uuencodeTimestamps* [00:00:00] Introductions* [00:01:14] Why Nicholas writes* [00:02:09] The Game of Life* [00:05:07] "How I Use AI" blog post origin story* [00:08:24] Do we need software engineering agents?* [00:11:03] Using AI to kickstart a project* [00:14:08] Ephemeral software* [00:17:37] Using AI to accelerate research* [00:21:34] Experts vs non-expert users as beneficiaries of AI* [00:24:02] Research on generating less secure code with LLMs.* [00:27:22] Learning and explaining code with AI* [00:30:12] AGI speculations?* [00:32:50] Distributing content without social media* [00:35:39] How much data do you think you can put on a single piece of paper?* [00:37:37] Building personal AI benchmarks* [00:43:04] Evolution of prompt engineering and its relevance* [00:46:06] Model vs task benchmarking* [00:52:14] Poisoning LAION 400M through expired domains* [00:55:38] Stealing OpenAI models from their API* [01:01:29] Data stealing and recovering training data from models* [01:03:30] Finding motivation in your workTranscriptAlessio [00:00:00]: Hey everyone, welcome to the Latent Space podcast. This is Alessio, partner and CTO-in-Residence at Decibel Partners, and I'm joined by my co-host Swyx, founder of Smol AI.Swyx [00:00:12]: Hey, and today we're in the in-person studio, which Alessio has gorgeously set up for us, with Nicholas Carlini. Welcome. Thank you. You're a research scientist at DeepMind. You work at the intersection of machine learning and computer security. You got your PhD from Berkeley in 2018, and also your BA from Berkeley as well. And mostly we're here to talk about your blogs, because you are so generous in just writing up what you know. Well, actually, why do you write?Nicholas [00:00:41]: Because I like, I feel like it's fun to share what you've done. I don't like writing, sufficiently didn't like writing, I almost didn't do a PhD, because I knew how much writing was involved in writing papers. I was terrible at writing when I was younger. I do like the remedial writing classes when I was in university, because I was really bad at it. So I don't actually enjoy, I still don't enjoy the act of writing. But I feel like it is useful to share what you're doing, and I like being able to talk about the things that I'm doing that I think are fun. And so I write because I think I want to have something to say, not because I enjoy the act of writing.Swyx [00:01:14]: But yeah. It's a tool for thought, as they often say. Is there any sort of backgrounds or thing that people should know about you as a person? Yeah.Nicholas [00:01:23]: So I tend to focus on, like you said, I do security work, I try to like attacking things and I want to do like high quality security research. And that's mostly what I spend my actual time trying to be productive members of society doing that. But then I get distracted by things, and I just like, you know, working on random fun projects. Like a Doom clone in JavaScript.Swyx [00:01:44]: Yes.Nicholas [00:01:45]: Like that. Or, you know, I've done a number of things that have absolutely no utility. But are fun things to have done. And so it's interesting to say, like, you should work on fun things that just are interesting, even if they're not useful in any real way. And so that's what I tend to put up there is after I have completed something I think is fun, or if I think it's sufficiently interesting, write something down there.Alessio [00:02:09]: Before we go into like AI, LLMs and whatnot, why are you obsessed with the game of life? So you built multiplexing circuits in the game of life, which is mind boggling. So where did that come from? And then how do you go from just clicking boxes on the UI web version to like building multiplexing circuits?Nicholas [00:02:29]: I like Turing completeness. The definition of Turing completeness is a computer that can run anything, essentially. And the game of life, Conway's game of life is a very simple cellular 2D automata where you have cells that are either on or off. And a cell becomes on if in the previous generation some configuration holds true and off otherwise. It turns out there's a proof that the game of life is Turing complete, that you can run any program in principle using Conway's game of life. I don't know. And so you can, therefore someone should. And so I wanted to do it. Some other people have done some similar things, but I got obsessed into like, if you're going to try and make it work, like we already know it's possible in theory. I want to try and like actually make something I can run on my computer, like a real computer I can run. And so yeah, I've been going on this rabbit hole of trying to make a CPU that I can run semi real time on the game of life. And I have been making some reasonable progress there. And yeah, but you know, Turing completeness is just like a very fun trap you can go down. A while ago, as part of a research paper, I was able to show that in C, if you call into printf, it's Turing complete. Like printf, you know, like, which like, you know, you can print numbers or whatever, right?Swyx [00:03:39]: Yeah, but there should be no like control flow stuff.Nicholas [00:03:42]: Because printf has a percent n specifier that lets you write an arbitrary amount of data to an arbitrary location. And the printf format specifier has an index into where it is in the loop that is in memory. So you can overwrite the location of where printf is currently indexing using percent n. So you can get loops, you can get conditionals, and you can get arbitrary data rates again. So we sort of have another Turing complete language using printf, which again, like this has essentially zero practical utility, but like, it's just, I feel like a lot of people get into programming because they enjoy the art of doing these things. And then they go work on developing some software application and lose all joy with the boys. And I want to still have joy in doing these things. And so on occasion, I try to stop doing productive, meaningful things and just like, what's a fun thing that we can do and try and make that happen.Alessio [00:04:39]: Awesome. So you've been kind of like a pioneer in the AI security space. You've done a lot of talks starting back in 2018. We'll kind of leave that to the end because I know the security part is, there's maybe a smaller audience, but it's a very intense audience. So I think that'll be fun. But everybody in our Discord started posting your how I use AI blog post and we were like, we should get Carlini on the podcast. And then you were so nice to just, yeah, and then I sent you an email and you're like, okay, I'll come.Swyx [00:05:07]: And I was like, oh, I thought that would be harder.Alessio [00:05:10]: I think there's, as you said in the blog posts, a lot of misunderstanding about what LLMs can actually be used for. What are they useful at? What are they not good at? And whether or not it's even worth arguing what they're not good at, because they're obviously not. So if you cannot count the R's in a word, they're like, it's just not what it does. So how painful was it to write such a long post, given that you just said that you don't like to write? Yeah. And then we can kind of run through the things, but maybe just talk about the motivation, why you thought it was important to do it.Nicholas [00:05:39]: Yeah. So I wanted to do this because I feel like most people who write about language models being good or bad, some underlying message of like, you know, they have their camp and their camp is like, AI is bad or AI is good or whatever. And they like, they spin whatever they're going to say according to their ideology. And they don't actually just look at what is true in the world. So I've read a lot of things where people say how amazing they are and how all programmers are going to be obsolete by 2024. And I've read a lot of things where people who say like, they can't do anything useful at all. And, you know, like, they're just like, it's only the people who've come off of, you know, blockchain crypto stuff and are here to like make another quick buck and move on. And I don't really agree with either of these. And I'm not someone who cares really one way or the other how these things go. And so I wanted to write something that just says like, look, like, let's sort of ground reality and what we can actually do with these things. Because my actual research is in like security and showing that these models have lots of problems. Like this is like my day to day job is saying like, we probably shouldn't be using these in lots of cases. I thought I could have a little bit of credibility of in saying, it is true. They have lots of problems. We maybe shouldn't be deploying them lots of situations. And still, they are also useful. And that is the like, the bit that I wanted to get across is to say, I'm not here to try and sell you on anything. I just think that they're useful for the kinds of work that I do. And hopefully, some people would listen. And it turned out that a lot more people liked it than I thought. But yeah, that was the motivation behind why I wanted to write this.Alessio [00:07:15]: So you had about a dozen sections of like how you actually use AI. Maybe we can just kind of run through them all. And then maybe the ones where you have extra commentary to add, we can... Sure.Nicholas [00:07:27]: Yeah, yeah. I didn't put as much thought into this as maybe was deserved. I probably spent, I don't know, definitely less than 10 hours putting this together.Swyx [00:07:38]: Wow.Alessio [00:07:39]: It took me close to that to do a podcast episode. So that's pretty impressive.Nicholas [00:07:43]: Yeah. I wrote it in one pass. I've gotten a number of emails of like, you got this editing thing wrong, you got this sort of other thing wrong. It's like, I haven't just haven't looked at it. I tend to try it. I feel like I still don't like writing. And so because of this, the way I tend to treat this is like, I will put it together into the best format that I can at a time, and then put it on the internet, and then never change it. And this is an aspect of like the research side of me is like, once a paper is published, like it is done as an artifact that exists in the world. I could forever edit the very first thing I ever put to make it the most perfect version of what it is, and I would do nothing else. And so I feel like I find it useful to be like, this is the artifact, I will spend some certain amount of hours on it, which is what I think it is worth. And then I will just...Swyx [00:08:22]: Yeah.Nicholas [00:08:23]: Timeboxing.Alessio [00:08:24]: Yeah. Stop. Yeah. Okay. We just recorded an episode with the founder of Cosine, which is like an AI software engineer colleague. You said it took you 30,000 words to get GPT-4 to build you the, can GPT-4 solve this kind of like app. Where are we in the spectrum where chat GPT is all you need to actually build something versus I need a full on agent that does everything for me?Nicholas [00:08:46]: Yeah. Okay. So this was an... So I built a web app last year sometime that was just like a fun demo where you can guess if you can predict whether or not GPT-4 at the time could solve a given task. This is, as far as web apps go, very straightforward. You need basic HTML, CSS, you have a little slider that moves, you have a button, sort of animate the text coming to the screen. The reason people are going here is not because they want to see my wonderful HTML, right? I used to know how to do modern HTML in 2007, 2008. I was very good at fighting with IE6 and these kinds of things. I knew how to do that. I have no longer had to build any web app stuff in the meantime, which means that I know how everything works, but I don't know any of the new... Flexbox is new to me. Flexbox is like 10 years old at this point, but it's just amazing being able to go to the model and just say, write me this thing and it will give me all of the boilerplate that I need to get going. Of course it's imperfect. It's not going to get you the right answer, and it doesn't do anything that's complicated right now, but it gets you to the point where the only remaining work that needs to be done is the interesting hard part for me, the actual novel part. Even the current models, I think, are entirely good enough at doing this kind of thing, that they're very useful. It may be the case that if you had something, like you were saying, a smarter agent that could debug problems by itself, that might be even more useful. Currently though, make a model into an agent by just copying and pasting error messages for the most part. That's what I do, is you run it and it gives you some code that doesn't work, and either I'll fix the code, or it will give me buggy code and I won't know how to fix it, and I'll just copy and paste the error message and say, it tells me this. What do I do? And it will just tell me how to fix it. You can't trust these things blindly, but I feel like most people on the internet already understand that things on the internet, you can't trust blindly. And so this is not like a big mental shift you have to go through to understand that it is possible to read something and find it useful, even if it is not completely perfect in its output.Swyx [00:10:54]: It's very human-like in that sense. It's the same ring of trust, I kind of think about it that way, if you had trust levels.Alessio [00:11:03]: And there's maybe a couple that tie together. So there was like, to make applications, and then there's to get started, which is a similar you know, kickstart, maybe like a project that you know the LLM cannot solve. It's kind of how you think about it.Nicholas [00:11:15]: Yeah. So for getting started on things is one of the cases where I think it's really great for some of these things, where I sort of use it as a personalized, help me use this technology I've never used before. So for example, I had never used Docker before January. I know what Docker is. Lucky you. Yeah, like I'm a computer security person, like I sort of, I have read lots of papers on, you know, all the technology behind how these things work. You know, I know all the exploits on them, I've done some of these things, but I had never actually used Docker. But I wanted it to be able to, I could run the outputs of language model stuff in some controlled contained environment, which I know is the right application. So I just ask it like, I want to use Docker to do this thing, like, tell me how to run a Python program in a Docker container. And it like gives me a thing. I'm like, step back. You said Docker compose, I do not know what this word Docker compose is. Is this Docker? Help me. And like, you'll sort of tell me all of these things. And I'm sure there's this knowledge that's out there on the internet, like this is not some groundbreaking thing that I'm doing, but I just wanted it as a small piece of one thing I was working on. And I didn't want to learn Docker from first principles. Like I, at some point, if I need it, I can do that. Like I have the background that I can make that happen. But what I wanted to do was, was thing one. And it's very easy to get bogged down in the details of this other thing that helps you accomplish your end goal. And I just want to like, tell me enough about Docker so I can do this particular thing. And I can check that it's doing the safe thing. I sort of know enough about that from, you know, my other background. And so I can just have the model help teach me exactly the one thing I want to know and nothing more. I don't need to worry about other things that the writer of this thinks is important that actually isn't. Like I can just like stop the conversation and say, no, boring to me. Explain this detail. I don't understand. I think that's what that was very useful for me. It would have taken me, you know, several hours to figure out some things that take 10 minutes if you could just ask exactly the question you want the answer to.Alessio [00:13:05]: Have you had any issues with like newer tools? Have you felt any meaningful kind of like a cutoff day where like there's not enough data on the internet or? I'm sure that the answer to this is yes.Nicholas [00:13:16]: But I tend to just not use most of these things. Like I feel like this is like the significant way in which I use machine learning models is probably very different than most people is that I'm a researcher and I get to pick what tools that I use and most of the things that I work on are fairly small projects. And so I can, I can entirely see how someone who is in a big giant company where they have their own proprietary legacy code base of a hundred million lines of code or whatever and like you just might not be able to use things the same way that I do. I still think there are lots of use cases there that are entirely reasonable that are not the same ones that I've put down. But I wanted to talk about what I have personal experience in being able to say is useful. And I would like it very much if someone who is in one of these environments would be able to describe the ways in which they find current models useful to them. And not, you know, philosophize on what someone else might be able to find useful, but actually say like, here are real things that I have done that I found useful for me.Swyx [00:14:08]: Yeah, this is what I often do to encourage people to write more, to share their experiences because they often fear being attacked on the internet. But you are the ultimate authority on how you use things and there's this objectively true. So they cannot be debated. One thing that people are very excited about is the concept of ephemeral software or like personal software. This use case in particular basically lowers the activation energy for creating software, which I like as a vision. I don't think I have taken as much advantage of it as I could. I feel guilty about that. But also, we're trending towards there.Nicholas [00:14:47]: Yeah. No, I mean, I do think that this is a direction that is exciting to me. One of the things I wrote that was like, a lot of the ways that I use these models are for one-off things that I just need to happen that I'm going to throw away in five minutes. And you can.Swyx [00:15:01]: Yeah, exactly.Nicholas [00:15:02]: Right. It's like the kind of thing where it would not have been worth it for me to have spent 45 minutes writing this, because I don't need the answer that badly. But if it will only take me five minutes, then I'll just figure it out, run the program and then get it right. And if it turns out that you ask the thing, it doesn't give you the right answer. Well, I didn't actually need the answer that badly in the first place. Like either I can decide to dedicate the 45 minutes or I cannot, but like the cost of doing it is fairly low. You see what the model can do. And if it can't, then, okay, when you're using these models, if you're getting the answer you want always, it means you're not asking them hard enough questions.Swyx [00:15:35]: Say more.Nicholas [00:15:37]: Lots of people only use them for very small particular use cases and like it always does the thing that they want. Yeah.Swyx [00:15:43]: Like they use it like a search engine.Nicholas [00:15:44]: Yeah. Or like one particular case. And if you're finding that when you're using these, it's always giving you the answer that you want, then probably it has more capabilities than you're actually using. And so I oftentimes try when I have something that I'm curious about to just feed into the model and be like, well, maybe it's just solved my problem for me. You know, most of the time it doesn't, but like on occasion, it's like, it's done things that would have taken me, you know, a couple hours that it's been great and just like solved everything immediately. And if it doesn't, then it's usually easier to verify whether or not the answer is correct than to have written in the first place. And so you check, you're like, well, that's just, you're entirely misguided. Nothing here is right. It's just like, I'm not going to do this. I'm going to go write it myself or whatever.Alessio [00:16:21]: Even for non-tech, I had to fix my irrigation system. I had an old irrigation system. I didn't know how I worked to program it. I took a photo, I sent it to Claude and it's like, oh yeah, that's like the RT 900. This is exactly, I was like, oh wow, you know, you know, a lot of stuff.Swyx [00:16:34]: Was it right?Alessio [00:16:35]: Yeah, it was right.Swyx [00:16:36]: It worked. Did you compare with OpenAI?Alessio [00:16:38]: No, I canceled my OpenAI subscription, so I'm a Claude boy. Do you have a way to think about this like one-offs software thing? One way I talk to people about it is like LLMs are kind of converging to like semantic serverless functions, you know, like you can say something and like it can run the function in a way and then that's it. It just kind of dies there. Do you have a mental model to just think about how long it should live for and like anything like that?Nicholas [00:17:02]: I don't think I have anything interesting to say here, no. I will take whatever tools are available in front of me and try and see if I can use them in meaningful ways. And if they're helpful, then great. If they're not, then fine. And like, you know, there are lots of people that I'm very excited about seeing all these people who are trying to make better applications that use these or all these kinds of things. And I think that's amazing. I would like to see more of it, but I do not spend my time thinking about how to make this any better.Alessio [00:17:27]: What's the most underrated thing in the list? I know there's like simplified code, solving boring tasks, or maybe is there something that you forgot to add that you want to throw in there?Nicholas [00:17:37]: I mean, so in the list, I only put things that people could look at and go, I understand how this solved my problem. I didn't want to put things where the model was very useful to me, but it would not be clear to someone else that it was actually useful. So for example, one of the things that I use it a lot for is debugging errors. But the errors that I have are very much not the errors that anyone else in the world will have. And in order to understand whether or not the solution was right, you just have to trust me on it. Because, you know, like I got my machine in a state that like CUDA was not talking to whatever some other thing, the versions were mismatched, something, something, something, and everything was broken. And like, I could figure it out with interaction with the model, and it gave it like told me the steps I needed to take. But at the end of the day, when you look at the conversation, you just have to trust me that it worked. And I didn't want to write things online that were this, like, you have to trust me that what I'm saying. I want everything that I said to like have evidence that like, here's the conversation, you can go and check whether or not this actually solved the task as I said that the model does. Because a lot of people I feel like say, I used a model to solve this very complicated task. And what they mean is the model did 10%, and I did the other 90% or something, I wanted everything to be verifiable. And so one of the biggest use cases for me, I didn't describe even at all, because it's not the kind of thing that other people could have verified by themselves. So that maybe is like, one of the things that I wish I maybe had said a little bit more about, and just stated that the way that this is done, because I feel like that this didn't come across quite as well. But yeah, of the things that I talked about, the thing that I think is most underrated is the ability of it to solve the uninteresting parts of problems for me right now, where people always say, this is one of the biggest arguments that I don't understand why people say is, the model can only do things that people have done before. Therefore, the model is not going to be helpful in doing new research or like discovering new things. And as someone whose day job is to do new things, like what is research? Research is doing something literally no one else in the world has ever done before. So this is what I do every single day, 90% of this is not doing something new, 90% of this is doing things a million people have done before, and then a little bit of something that was new. There's a reason why we say we stand on the shoulders of giants. It's true. Almost everything that I do is something that's been done many, many times before. And that is the piece that can be automated. Even if the thing that I'm doing as a whole is new, it is almost certainly the case that the small pieces that build up to it are not. And a number of people who use these models, I feel like expect that they can either solve the entire task or none of the task. But now I find myself very often, even when doing something very new and very hard, having models write the easy parts for me. And the reason I think this is so valuable, everyone who programs understands this, like you're currently trying to solve some problem and then you get distracted. And whatever the case may be, someone comes and talks to you, you have to go look up something online, whatever it is. You lose a lot of time to that. And one of the ways we currently don't think about being distracted is you're solving some hard problem and you realize you need a helper function that does X, where X is like, it's a known algorithm. Any person in the world, you say like, give me the algorithm that, have a dense graph or a sparse graph, I need to make it dense. You can do this by doing some matrix multiplies. It's like, this is a solved problem. I knew how to do this 15 years ago, but it distracts me from the problem I'm thinking about in my mind. I needed this done. And so instead of using my mental capacity and solving that problem and then coming back to the problem I was originally trying to solve, you could just ask model, please solve this problem for me. It gives you the answer. You run it. You can check that it works very, very quickly. And now you go back to solving the problem without having lost all the mental state. And I feel like this is one of the things that's been very useful for me.Swyx [00:21:34]: And in terms of this concept of expert users versus non-expert users, floors versus ceilings, you had some strong opinion here that like, basically it actually is more beneficial for non-experts.Nicholas [00:21:46]: Yeah, I don't know. I think it could go either way. Let me give you the argument for both of these. Yes. So I can only speak on the expert user behalf because I've been doing computers for a long time. And so yeah, the cases where it's useful for me are exactly these cases where I can check the output. I know, and anything the model could do, I could have done. I could have done better. I can check every single thing that the model is doing and make sure it's correct in every way. And so I can only speak and say, definitely it's been useful for me. But I also see a world in which this could be very useful for the kinds of people who do not have this knowledge, with caveats, because I'm not one of these people. I don't have this direct experience. But one of these big ways that I can see this is for things that you can check fairly easily, someone who could never have asked or have written a program themselves to do a certain task could just ask for the program that does the thing. And you know, some of the times it won't get it right. But some of the times it will, and they'll be able to have the thing in front of them that they just couldn't have done before. And we see a lot of people trying to do applications for this, like integrating language models into spreadsheets. Spreadsheets run the world. And there are some people who know how to do all the complicated spreadsheet equations and various things, and other people who don't, who just use the spreadsheet program but just manually do all of the things one by one by one by one. And this is a case where you could have a model that could try and give you a solution. And as long as the person is rigorous in testing that the solution does actually the correct thing, and this is the part that I'm worried about most, you know, I think depending on these systems in ways that we shouldn't, like this is what my research says, my research says is entirely on this, like, you probably shouldn't trust these models to do the things in adversarial situations, like, I understand this very deeply. And so I think that it's possible for people who don't have this knowledge to make use of these tools in ways, but I'm worried that it might end up in a world where people just blindly trust them, deploy them in situations that they probably shouldn't, and then someone like me gets to come along and just break everything because everything is terrible. And so I am very, very worried about that being the case, but I think if done carefully it is possible that these could be very useful.Swyx [00:23:54]: Yeah, there is some research out there that shows that when people use LLMs to generate code, they do generate less secure code.Nicholas [00:24:02]: Yeah, Dan Bonet has a nice paper on this. There are a bunch of papers that touch on exactly this.Swyx [00:24:07]: My slight issue is, you know, is there an agenda here?Nicholas [00:24:10]: I mean, okay, yeah, Dan Bonet, at least the one they have, like, I fully trust everything that sort of.Swyx [00:24:15]: Sorry, I don't know who Dan is.Swyx [00:24:17]: He's a professor at Stanford. Yeah, he and some students have some things on this. Yeah, there's a number. I agree that a lot of the stuff feels like people have an agenda behind it. There are some that don't, and I trust them to have done the right thing. I also think, even on this though, we have to be careful because the argument, whenever someone says x is true about language models, you should always append the suffix for current models because I'll be the first to admit I was one of the people who was very much on the opinion that these language models are fun toys and are going to have absolutely no practical utility. If you had asked me this, let's say, in 2020, I still would have said the same thing. After I had seen GPT-2, I had written a couple of papers studying GPT-2 very carefully. I still would have told you these things are toys. And when I first read the RLHF paper and the instruction tuning paper, I was like, nope, this is this thing that these weird AI people are doing. They're trying to make some analogies to people that makes no sense. It's just like, I don't even care to read it. I saw what it was about and just didn't even look at it. I was obviously wrong. These things can be useful. And I feel like a lot of people had the same mentality that I did and decided not to change their mind. And I feel like this is the thing that I want people to be careful about. I want them to at least know what is true about the world so that they can then see that maybe they should reconsider some of the opinions that they had from four or five years ago that may just not be true about today's models.Swyx [00:25:47]: Specifically because you brought up spreadsheets, I want to share my personal experience because I think Google has done a really good job that people don't know about, which is if you use Google Sheets, Gemini is integrated inside of Google Sheets and it helps you write formulas. Great.Nicholas [00:26:00]: That's news to me.Swyx [00:26:01]: Right? They don't maybe do a good job. Unless you watch Google I.O., there was no other opportunity to learn that Gemini is now in your Google Sheets. And so I just don't write formulas manually anymore. It just prompts Gemini to do it for me. And it does it.Nicholas [00:26:15]: One of the problems that these machine learning models have is a discoverability problem. I think this will be figured out. I mean, it's the same problem that you have with any assistant. You're given a blank box and you're like, what do I do with it? I think this is great. More of these things, it would be good for them to exist. I want them to exist in ways that we can actually make sure that they're done correctly. I don't want to just have them be pushed into more and more things just blindly. I feel like lots of people, there are far too many X plus AI, where X is like arbitrary thing in the world that has nothing to do with it and could not be benefited at all. And they're just doing it because they want to use the word. And I don't want that to happen.Swyx [00:26:58]: You don't want an AI fridge?Nicholas [00:27:00]: No. Yes. I do not want my fridge on the internet.Swyx [00:27:03]: I do not want... Okay.Nicholas [00:27:05]: Anyway, let's not go down that rabbit hole. I understand why some of that happens, because people want to sell things or whatever. But I feel like a lot of people see that and then they write off everything as a result of it. And I just want to say, there are allowed to be people who are trying to do things that don't make any sense. Just ignore them. Do the things that make sense.Alessio [00:27:22]: Another chunk of use cases was learning. So both explaining code, being an API reference, all of these different things. Any suggestions on how to go at it? I feel like one thing is generate code and then explain to me. One way is just tell me about this technology. Another thing is like, hey, I read this online, kind of help me understand it. Any best practices on getting the most out of it?Swyx [00:27:47]: Yeah.Nicholas [00:27:47]: I don't know if I have best practices. I have how I use them.Swyx [00:27:51]: Yeah.Nicholas [00:27:51]: I find it very useful for cases where I understand the underlying ideas, but I have never usedSwyx [00:27:59]: them in this way before.Nicholas [00:28:00]: I know what I'm looking for, but I just don't know how to get there. And so yeah, as an API reference is a great example. The tool everyone always picks on is like FFmpeg. No one in the world knows the command line arguments to do what they want. They're like, make the thing faster. I want lower bitrate, like dash V. Once you tell me what the answer is, I can check. This is one of these things where it's great for these kinds of things. Or in other cases, things where I don't really care that the answer is 100% correct. So for example, I do a lot of security work. Most of security work is reading some code you've never seen before and finding out which pieces of the code are actually important. Because, you know, most of the program isn't actually do anything to do with security. It has, you know, the display piece or the other piece or whatever. And like, you just, you would only ignore all of that. So one very fun use of models is to like, just have it describe all the functions and just skim it and be like, wait, which ones look like approximately the right things to look at? Because otherwise, what are you going to do? You're going to have to read them all manually. And when you're reading them manually, you're going to skim the function anyway, and not just figure out what's going on perfectly. Like you already know that when you're going to read these things, what you're going to try and do is figure out roughly what's going on. Then you'll delve into the details. This is a great way of just doing that, but faster, because it will abstract most of whatSwyx [00:29:21]: is right.Nicholas [00:29:21]: It's going to be wrong some of the time. I don't care.Swyx [00:29:23]: I would have been wrong too.Nicholas [00:29:24]: And as long as you treat it with this way, I think it's great. And so like one of the particular use cases I have in the thing is decompiling binaries, where oftentimes people will release a binary. They won't give you the source code. And you want to figure out how to attack it. And so one thing you could do is you could try and run some kind of decompiler. It turns out for the thing that I wanted, none existed. And so I spent too many hours doing it by hand. Before I first thought, why am I doing this? I should just check if the model could do it for me. And it turns out that it can. And it can turn the compiled source code, which is impossible for any human to understand, into the Python code that is entirely reasonable to understand. And it doesn't run. It has a bunch of problems. But it's so much nicer that it's immediately a win for me. I can just figure out approximately where I should be looking, and then spend all of my time doing that by hand. And again, you get a big win there.Swyx [00:30:12]: So I fully agree with all those use cases, especially for you as a security researcher and having to dive into multiple things. I imagine that's super helpful. I do think we want to move to your other blog post. But you ended your post with a little bit of a teaser about your next post and your speculations. What are you thinking about?Nicholas [00:30:34]: So I want to write something. And I will do that at some point when I have time, maybe after I'm done writing my current papers for ICLR or something, where I want to talk about some thoughts I have for where language models are going in the near-term future. The reason why I want to talk about this is because, again, I feel like the discussion tends to be people who are either very much AGI by 2027, orSwyx [00:30:55]: always five years away, or are going to make statements of the form,Nicholas [00:31:00]: you know, LLMs are the wrong path, and we should be abandoning this, and we should be doing something else instead. And again, I feel like people tend to look at this and see these two polarizing options and go, well, those obviously are both very far extremes. Like, how do I actually, like, what's a more nuanced take here? And so I have some opinions about this that I want to put down, just saying, you know, I have wide margins of error. I think you should too. If you would say there's a 0% chance that something, you know, the models will get very, very good in the next five years, you're probably wrong. If you're going to say there's a 100% chance that in the next five years, then you're probably wrong. And like, to be fair, most of the people, if you read behind the headlines, actually say something like this. But it's very hard to get clicks on the internet of like, some things may be good in the future. Like, everyone wants like, you know, a very, like, nothing is going to be good. This is entirely wrong. It's going to be amazing. You know, like, they want to see this. I want people who have negative reactions to these kinds of extreme views to be able to at least say, like, to tell them, there is something real here. It may not solve all of our problems, but it's probably going to get better. I don't know by how much. And that's basically what I want to say. And then at some point, I'll talk about the safety and security things as a result of this. Because the way in which security intersects with these things depends a lot in exactly how people use these tools. You know, if it turns out to be the case that these models get to be truly amazing and can solve, you know, tasks completely autonomously, that's a very different security world to be living in than if there's always a human in the loop. And the types of security questions I would want to ask would be very different. And so I think, you know, in some very large part, understanding what the future will look like a couple of years ahead of time is helpful for figuring out which problems, as a security person, I want to solve now. You mentioned getting clicks on the internet,Alessio [00:32:50]: but you don't even have, like, an ex-account or anything. How do you get people to read your stuff? What's your distribution strategy? Because this post was popping up everywhere. And then people on Twitter were like, Nicholas Garlini wrote this. Like, what's his handle? It's like, he doesn't have it. It's like, how did you find it? What's the story?Nicholas [00:33:07]: So I have an RSS feed and an email list. And that's it. I don't like most social media things. On principle, I feel like they have some harms. As a person, I have a problem when people say things that are wrong on the internet. And I would get nothing done if I would have a Twitter. I would spend all of my time correcting people and getting into fights. And so I feel like it is just useful for me for this not to be an option. I tend to just post things online. Yeah, it's a very good question. I don't know how people find it. I feel like for some things that I write, other people think it resonates with them. And then they put it on Twitter. And...Swyx [00:33:43]: Hacker News as well.Nicholas [00:33:44]: Sure, yeah. I am... Because my day job is doing research, I get no value for having this be picked up. There's no whatever. I don't need to be someone who has to have this other thing to give talks. And so I feel like I can just say what I want to say. And if people find it useful, then they'll share it widely. You know, this one went pretty wide. I wrote a thing, whatever, sometime late last year, about how to recover data off of an Apple profile drive from 1980. This probably got, I think, like 1000x less views than this. But I don't care. Like, that's not why I'm doing this. Like, this is the benefit of having a thing that I actually care about, which is my research. I would care much more if that didn't get seen. This is like a thing that I write because I have some thoughts that I just want to put down.Swyx [00:34:32]: Yeah. I think it's the long form thoughtfulness and authenticity that is sadly lacking sometimes in modern discourse that makes it attractive. And I think now you have a little bit of a brand of you are an independent thinker, writer, person, that people are tuned in to pay attention to whatever is next coming.Nicholas [00:34:52]: Yeah, I mean, this kind of worries me a little bit. I don't like whenever I have a popular thing that like, and then I write another thing, which is like entirely unrelated. Like, I don't, I don't... You should actually just throw people off right now.Swyx [00:35:01]: Exactly.Nicholas [00:35:02]: I'm trying to figure out, like, I need to put something else online. So, like, the last two or three things I've done in a row have been, like, actually, like, things that people should care about.Swyx [00:35:10]: Yes. So, I have a couple of things.Nicholas [00:35:11]: I'm trying to figure out which one do I put online to just, like, cull the list of people who have subscribed to my email.Swyx [00:35:16]: And so, like, tell them, like,Nicholas [00:35:16]: no, like, what you're here for is not informed, well-thought-through takes. Like, what you're here for is whatever I want to talk about. And if you're not up for that, then, like, you know, go away. Like, this is not what I want out of my personal website.Swyx [00:35:27]: So, like, here's, like, top 10 enemies or something.Alessio [00:35:30]: What's the next project you're going to work on that is completely unrelated to research LLMs? Or what games do you want to port into the browser next?Swyx [00:35:39]: Okay. Yeah.Nicholas [00:35:39]: So, maybe.Swyx [00:35:41]: Okay.Nicholas [00:35:41]: Here's a fun question. How much data do you think you can put on a single piece of paper?Swyx [00:35:47]: I mean, you can think about bits and atoms. Yeah.Nicholas [00:35:49]: No, like, normal printer. Like, I gave you an office printer. How much data can you put on a piece of paper?Alessio [00:35:54]: Can you re-decode it? So, like, you know, base 64A or whatever. Yeah, whatever you want.Nicholas [00:35:59]: Like, you get normal off-the-shelf printer, off-the-shelf scanner. How much data?Swyx [00:36:03]: I'll just throw out there. Like, 10 megabytes. That's enormous. I know.Nicholas [00:36:07]: Yeah, that's a lot.Swyx [00:36:10]: Really small fonts. That's my question.Nicholas [00:36:12]: So, I have a thing. It does about a megabyte.Swyx [00:36:14]: Yeah, okay.Nicholas [00:36:14]: There you go. I was off by an order of magnitude.Swyx [00:36:16]: Yeah, okay.Nicholas [00:36:16]: So, in particular, it's about 1.44 megabytes. A floppy disk.Swyx [00:36:21]: Yeah, exactly.Nicholas [00:36:21]: So, this is supposed to be the title at some point. It's a floppy disk.Swyx [00:36:24]: A paper is a floppy disk. Yeah.Nicholas [00:36:25]: So, this is a little hard because, you know. So, you can do the math and you get 8.5 by 11. You can print at 300 by 300 DPI. And this gives you 2 megabytes. And so, every single pixel, you need to be able to recover up to like 90 plus percent. Like, 95 percent. Like, 99 point something percent accuracy. In order to be able to actually decode this off the paper. This is one of the things that I'm considering. I need to get a couple more things working for this. Where, you know, again, I'm running into some random problems. But this is probably, this will be one thing that I'm going to talk about. There's this contest called the International Obfuscated C-Code Contest, which is amazing. People try and write the most obfuscated C code that they can. Which is great. And I have a submission for that whenever they open up the next one for it. And I'll write about that submission. I have a very fun gate level emulation of an old CPU that runs like fully precisely. And it's a fun kind of thing. Yeah.Swyx [00:37:20]: Interesting. Your comment about the piece of paper reminds me of when I was in college. And you would have like one cheat sheet that you could write. So, you have a formula, a theoretical limit for bits per inch. And, you know, that's how much I would squeeze in really, really small. Yeah, definitely.Nicholas [00:37:36]: Okay.Swyx [00:37:37]: We are also going to talk about your benchmarking. Because you released your own benchmark that got some attention, thanks to some friends on the internet. What's the story behind your own benchmark? Do you not trust the open source benchmarks? What's going on there?Nicholas [00:37:51]: Okay. Benchmarks tell you how well the model solves the task the benchmark is designed to solve. For a long time, models were not useful. And so, the benchmark that you tracked was just something someone came up with, because you need to track something. All of deep learning exists because people tried to make models classify digits and classify images into a thousand classes. There is no one in the world who cares specifically about the problem of distinguishing between 300 breeds of dog for an image that's 224 or 224 pixels. And yet, like, this is what drove a lot of progress. And people did this not because they cared about this problem, because they wanted to just measure progress in some way. And a lot of benchmarks are of this flavor. You want to construct a task that is hard, and we will measure progress on this benchmark, not because we care about the problem per se, but because we know that progress on this is in some way correlated with making better models. And this is fine when you don't want to actually use the models that you have. But when you want to actually make use of them, it's important to find benchmarks that track with whether or not they're useful to you. And the thing that I was finding is that there would be model after model after model that was being released that would find some benchmark that they could claim state-of-the-art on and then say, therefore, ours is the best. And that wouldn't be helpful to me to know whether or not I should then switch to it. So the argument that I tried to lay out in this post is that more people should make benchmarks that are tailored to them. And so what I did is I wrote a domain-specific language that anyone can write for and say, you can take tasks that you have wanted models to solve for you, and you can put them into your benchmark that's the thing that you care about. And then when a new model comes out, you benchmark the model on the things that you care about. And you know that you care about them because you've actually asked for those answers before. And if the model scores well, then you know that for the kinds of things that you have asked models for in the past, it can solve these things well for you. This has been useful for me because when another model comes out, I can run it. I can see, does this solve the kinds of things that I care about? And sometimes the answer is yes, and sometimes the answer is no. And then I can decide whether or not I want to use that model or not. I don't want to say that existing benchmarks are not useful. They're very good at measuring the thing that they're designed to measure. But in many cases, what that's designed to measure is not actually the thing that I want to use it for. And I expect that the way that I want to use it is different the way that you want to use it. And I would just like more people to have these things out there in the world. And the final reason for this is, it is very easy. If you want to make a model good at some benchmark, to make it good at that benchmark, you can find the distribution of data that you need and train the model to be good on the distribution of data. And then you have your model that can solve this benchmark well. And by having a benchmark that is not very popular, you can be relatively certain that no one has tried to optimize their model for your benchmark.Swyx [00:40:40]: And I would like this to be-Nicholas [00:40:40]: So publishing your benchmark is a little bit-Swyx [00:40:43]: Okay, sure.Nicholas [00:40:43]: Contextualized. So my hope in doing this was not that people would use mine as theirs. My hope in doing this was that- You should make yours. Yes, you should make your benchmark. And if, for example, there were even a very small fraction of people, 0.1% of people who made a benchmark that was useful for them, this would still be hundreds of new benchmarks that- not want to make one myself, but I might want to- I might know the kinds of work that I do is a little bit like this person, a little bit like that person. I'll go check how it is on their benchmarks. And I'll see, roughly, I'll get a good sense of what's going on. Because the alternative is people just do this vibes-based evaluation thing, where you interact with the model five times, and you see if it worked on the kinds of things that you just like your toy questions. But five questions is a very low bit output from whether or not it works for this thing. And if you could just automate running it 100 questions for you, it's a much better evaluation. So that's why I did this.Swyx [00:41:37]: Yeah, I like the idea of going through your chat history and actually pulling out real-life examples. I regret to say that I don't think my chat history is used as much these days, because I'm using Cursor, the native AI IDE. So your examples are all coding related. And the immediate question is, now that you've written the How I Use AI post, which is a little bit broader, are you able to translate all these things to evals? Are some things unevaluable?Nicholas [00:42:03]: Right. A number of things that I do are harder to evaluate. So this is the problem with a benchmark, is you need some way to check whether or not the output was correct. And so all of the kinds of things that I can put into the benchmark are the kinds of things that you can check. You can check more things than you might have thought would be possible if you do a little bit of work on the back end. So for example, all of the code that I have the model write, it runs the code and sees whether the answer is the correct answer. Or in some cases, it runs the code, feeds the output to another language model, and the language model judges was the output correct. And again, is using a language model to judge here perfect? No. But like, what's the alternative? The alternative is to not do it. And what I care about is just, is this thing broadly useful for the kinds of questions that I have? And so as long as the accuracy is better than roughly random, like, I'm okay with this. I've inspected the outputs of these, and like, they're almost always correct. If you ask the model to judge these things in the right way, they're very good at being able to tell this. And so, yeah, I probably think this is a useful thing for people to do.Alessio [00:43:04]: You complain about prompting and being lazy and how you do not want to tip your model and you do not want to murder a kitten just to get the right answer. How do you see the evolution of like prompt engineering? Even like 18 months ago, maybe, you know, it was kind of like really hot and people wanted to like build companies around it. Today, it's like the models are getting good. Do you think it's going to be less and less relevant going forward? Or what's the minimum valuable prompt? Yeah, I don't know.Nicholas [00:43:29]: I feel like a big part of making an agent is just like a fancy prompt that like, you know, calls back to the model again. I have no opinion. It seems like maybe it turns out that this is really important. Maybe it turns out that this isn't. I guess the only comment I was making here is just to say, oftentimes when I use a model and I find it's not useful, I talk to people who help make it. The answer they usually give me is like, you're using it wrong. Which like reminds me very much of like that you're holding it wrong from like the iPhone kind of thing, right? Like, you know, like I don't care that I'm holding it wrong. I'm holding it that way. If the thing is not working with me, then like it's not useful for me. Like it may be the case that there exists a way to ask the model such that it gives me the answer that's correct, but that's not the way I'm doing it. If I have to spend so much time thinking about how I want to frame the question, that it would have been faster for me just to get the answer. It didn't save me any time. And so oftentimes, you know, what I do is like, I just dump in whatever current thought that I have in whatever ill-formed way it is. And I expect the answer to be correct. And if the answer is not correct, like in some sense, maybe the model was right to give me the wrong answer. Like I may have asked the wrong question, but I want the right answer still. And so like, I just want to sort of get this as a thing. And maybe the way to fix this is you have some default prompt that always goes into all the models or something, or you do something like clever like this. It would be great if someone had a way to package this up and make a thing I think that's entirely reasonable. Maybe it turns out that as models get better, you don't need to prompt them as much in this way. I just want to use the things that are in front of me.Alessio [00:44:55]: Do you think that's like a limitation of just how models work? Like, you know, at the end of the day, you're using the prompt to kind of like steer it in the latent space. Like, do you think there's a way to actually not make the prompt really relevant and have the model figure it out? Or like, what's the... I mean, you could fine tune itNicholas [00:45:10]: into the model, for example, that like it's supposed to... I mean, it seems like some models have done this, for example, like some recent model, many recent models. If you ask them a question, computing an integral of this thing, they'll say, let's think through this step by step. And then they'll go through the step by step answer. I didn't tell it. Two years ago, I would have had to have prompted it. Think step by step on solving the following thing. Now you ask them the question and the model says, here's how I'm going to do it. I'm going to take the following approach and then like sort of self-prompt itself.Swyx [00:45:34]: Is this the right way?Nicholas [00:45:35]: Seems reasonable. Maybe you don't have to do it. I don't know. This is for the people whose job is to make these things better. And yeah, I just want to use these things. Yeah.Swyx [00:45:43]: For listeners, that would be Orca and Agent Instruct. It's the soda on this stuff. Great. Yeah.Alessio [00:45:49]: That's a few shot. It's included in the lazy prompting. Like, do you do a few shot prompting? Like, do you collect some examples when you want to put them in? Or...Nicholas [00:45:57]: I don't because usually when I want the answer, I just want to get the answer. Brutal.Swyx [00:46:03]: This is hard mode. Yeah, exactly.Nicholas [00:46:04]: But this is fine.Swyx [00:46:06]: I want to be clear.Nicholas [00:46:06]: There's a difference between testing the ultimate capability level of the model and testing the thing that I'm doing with it. What I'm doing is I'm not exercising its full capability level because there are almost certainly better ways to ask the questions and sort of really see how good the model is. And if you're evaluating a model for being state of the art, this is ultimately what I care about. And so I'm entirely fine with people doing fancy prompting to show me what the true capability level could be because it's really useful to know what the ultimate level of the model could be. But I think it's also important just to have available to you how good the model is if you don't do fancy things.Swyx [00:46:39]: Yeah, I would say that here's a divergence between how models are marketed these days versus how people use it, which is when they test MMLU, they'll do like five shots, 25 shots, 50 shots. And no one's providing 50 examples. I completely agree.Nicholas [00:46:54]: You know, for these numbers, the problem is everyone wants to get state of the art on the benchmark. And so you find the way that you can ask the model the questions so that you get state of the art on the benchmark. And it's good. It's legitimately good to know. It's good to know the model can do this thing if only you try hard enough. Because it means that if I have some task that I want to be solved, I know what the capability level is. And I could get there if I was willing to work hard enough. And the question then is, should I work harder and figure out how to ask the model the question? Or do I just do the thing myself? And for me, I have programmed for many, many, many years. It's often just faster for me just to do the thing than to figure out the incantation to ask the model. But I can imagine someone who has never programmed before might be fine writing five paragraphs in English describing exactly the thing that they want and have the model build it for them if the alternative is not. But again, this goes to all these questions of how are they going to validate? Should they be trusting the output? These kinds of things.Swyx [00:47:49]: One problem with your eval paradigm and most eval paradigms, I'm not picking on you, is that we're actually training these things for chat, for interactive back and forth. And you actually obviously reveal much more information in the same way that asking 20 questions reveals more information in sort of a tree search branching sort of way. Then this is also by the way the problem with LMSYS arena, right? Where the vast majority of prompts are single question, single answer, eval, done. But actually the way that we use chat things, in the way, even in the stuff that you posted in your how I use AI stuff, you have maybe 20 turns of back and forth. How do you eval that?Nicholas [00:48:25]: Yeah. Okay. Very good question. This is the thing that I think many people should be doing more of. I would like more multi-turn evals. I might be writing a paper on this at some point if I get around to it. A couple of the evals in the benchmark thing I have are already multi-turn. I mentioned 20 questions. I have a 20 question eval there just for fun. But I have a couple others that are like, I just tell the model, here's my get thing, figure out how to cherry pick off this other branch and move it over there. And so what I do is I just, I basically build a tiny little agency thing. I just ask the model how I do it. I run the thing on Linux. This is what I want a Docker for. I spin up a Docker container. I run whatever the model told me the output to do is. I feed the output back into the model. I repeat this many rounds. And then I check at the very end, does the git commit history show that it is correctly cherry picked in
Episodio 257. Hay 2 tipos de personas que van a Wendy's: El coleccionista de paños que va a Epcot por la tarde a buscar ají dulce y un escéptico sano con un montón de libritos Moleskine en modo cínico. Hay cosas que yo puedo decir, yo creo que son estas cosas, pero tengo mucho que hablar y me voy temprano. ✅ Follow Up Otra semana otros Vision Pro Creo que short changed la caja negra de AI. Alienación y Herbert Marcuse Consejos para mantenerse tecnológica y artísticamente joven Cómo Alfredo maneja sus notas Mi visita a Orlando Dos cosas raras con Vision Pro: Optic ID y iPhone en Vision Pro Jaime arma una Mac
Kevin Tufts is the real deal when it comes to tech and design. With over two decades of experience working across a number of companies in the Bay Area — Lyft, SendGrid, and Twilio, to name a few — he's now a product designer at Meta working on their Creation team. So believe me, we had a LOT to talk about.Our conversation begin with a look at the current climate inside Meta (pre-Threads, FYI), and he gave some thoughts on where the company is going as it approaches its 20th anniversary. From there, Kevin talked about his path to becoming a product designer, and we took a trip down memory lane recalling the early days of web design and what it was like working during such rapidly changing times. He also spoke on what he loves about product design now, and how he wants to help the next generation of designers through mentorship.Kevin's secrets to success are simple: seize opportunities for growth where you can, embrace collaboration, and remain flexible. Now that's something I think we could all take to heart!LinksKevin Tufts' WebsiteKevin Tufts on LinkedInFor a full transcript of this interview, visit revisionpath.com.==========Donate to Revision PathFor 10 years, Revision Path has been dedicated to showcasing Black designers and creatives from all over the world. In order to keep bringing you the content that you love, we need your support now more than ever.Click or tap here to make either a one-time or monthly donation to help keep Revision Path running strong.Thank you for your support!==========Follow and SubscribeLike this episode? Then subscribe to us on Apple Podcasts, Spotify, or wherever you find your favorite shows. Follow us, and leave us a 5-star rating and a review!You can also follow Revision Path on Instagram and Twitter.==========CreditsRevision Path is brought to you by Lunch, a multidisciplinary creative studio in Atlanta, GA.Executive Producer and Host: Maurice CherryEditor and Audio Engineer: RJ BasilioIntro Voiceover: Music Man DreIntro and Outro Music: Yellow SpeakerTranscripts are provided courtesy of Brevity and Wit.☎️ Call 626-603-0310 and leave us a message with your comments on this episode!Thank you for listening!==========Sponsored by Brevity & WitBrevity & Wit is a strategy and design firm committed to designing a more inclusive and equitable world. They are always looking to expand their roster of freelance design consultants in the U.S., particularly brand strategists, copywriters, graphic designers and Web developers.If you know how to deliver excellent creative work reliably, and enjoy the autonomy of a virtual-based, freelance life (with no non-competes), check them out at brevityandwit.com.Brevity & Wit — creative excellence without the grind.
EPISODE TRANSCRIPTSpeaker1: [00:00:09] Elle and Miriam are two Black homeschooling moms embarking on a self-defining journey. Listen in on conversations that will encourage you to be your authentic self while uplifting your spirit and motivating your inherent potential. They're defining what culture is for their families and want you to do the same. Bring your children along too, so they can meet the cleverly cultured kids. They're all for teaching the babies while they're young, adapting to the challenges of parenting, homeschooling, and being willing to learn the lessons that the children have to offer. It's all about uplifting one another and reclaiming your innate greatness.Speaker2: [00:01:10] Hello. Hello. Hello. Welcome back to another episode of the cleverly changing podcast. I am one of your co-hosts, Miriam. I am an urban farmer, a homeschooling mom of four. And an all-around creative genius. Okay. I don't know about genius, but that's okay. I'm going to do my best to try to stay focused. Elle usually keeps me on track. And now today, it's my job to keep myself on track. Let's see how this goes. Today I'm going to take you all on a short hop, skip and a jump through using free resources. Every homeschooler loves a good free resource. I mean, anything from YouTube to worksheets to things that are outside the house. Museums and things. Why? Because they're free. And who doesn't appreciate free?Speaker2: [00:02:31] Now, let's go ahead and think about how we can best utilize things that are free. Now, it's very, very, very important to understand that we get what you pay for.Speaker2: [00:02:52] Or don't pay for.Speaker2: [00:02:55] In some instances. So, when we're thinking about what resources that we want to use that are free. It would be in our best interest to see how that free resource would fit into our plan, whether it's a lesson plan, whether it's a broad plan for learning something, or even if it's supposed to be something. Just fun. Right? There's a way to weave it into what we're doing. And just because it's free doesn't mean it's going to be good. And just because it's free doesn't mean it's going to be helpful. So we have to think about these. Types of things when we're making use of the freebies. Now, I know that when I first started, I was like, I'm going to use everything free. I'm not paying for anything. I mean, it's possible it's doable, but you kind of miss out on certain things. So like around here in the Maryland, DC, Virginia areas, there are lots of things to do. There are lots of free things to do. But there are also discounted things to do too. Don't forget about the discounted things, folks. I know we're talking about free resources, but I just wanted to throw that in there. You know, a $15 homeschool day at the Baltimore Aquarium, that's a great deal. Let's not skip out on that. Well, I mean, you know, you don't want to skip out on some things that don't fall under the overarching theme of I'm going to homeschool for free guys, so, you know, do what you want to do. Do what works for you and your family.Speaker2: [00:04:58] Do what feels comfortable, what feels good, and what's going to further your educational goals for your family. That's the most important thing here. So let's get back to Free 99. See what I'm saying when I say I tend to go off a little bit. I'm trying, I'm trying. I'm trying to follow my notes, but that's no fun. Okay, so where are we with our free resources? I know we've talked about some of these before, but for those who are new who have not listened to Elle and I before, or who haven't gotten back to some of those previous episodes where we discussed things that you can utilize for free, I want to take you back. I'm also going to give you some newbies. I hope that newbies, maybe you've heard of them before, I don't know, but I'm going to share them to remind you or to put you on any hook. So let's talk about things that are outside the house first. Museums. Now, not every museum is free, but tons of them are. And even some of the ones that were not free are now offering free virtual visits. And that's great. That's one of the I guess I'll say cool things about the pandemic, right? A lot of things. A lot of entities, a lot of places, organizations, what have you. They've made this shift to being available virtually so you can peruse some of these museum collections online in the comfort of your home and the comfort of your car wherever, and see all of the cool things you can still get the little blurb that goes with it about whatever the piece is, who created it, how it got to be in the museum, all that kind of stuff.Speaker2: [00:07:19] So museums are, you know, easily one of the coolest. I'm a nerd—one of the coolest freebies you can find. The Smithsonian, I believe, has a free virtual learning center. I believe it's called Smithsonian Learning Center. You can check that out. And you can find a large range of topics from history to art too, you know, the Smithsonian. They got it all. You could also check with your National Park Service. So in addition to the national parks, you've got your regional parks. And within regional parks, there's often a lot more than one would think would be available. You can find wildlife preserves, nature refuges, and nature refuges. You can find themed playgrounds. You can find fishing opportunities. There's lots of things in the parks. Botanical gardens. And a lot of times, they're free or very, very minimally priced. There's a place in Maryland. It's called Brookside Gardens. My parents used to take me there all the time when I was a kid, and it was so much fun. So many flowers, so many open spaces, so many trees, so many shrubs. It's nice. And I don't think Brookside Garden charges. So you could find loads of places like these around the country, wherever you are, that have these sorts of offerings.Speaker2: [00:09:44] Now, the other suggestion that is no way. Last place, ask around. There are tons of hidden gems right under your nose. Ask around. What are you all do for fun? Where have you been that you thought was really interesting? You know, you could post these kinds of questions on your social media feed for your friends and family, and you'd be surprised at some of the responses, things you didn't even know existed. So don't be afraid to leverage your own personal network to find out what kinds of things are going on, where you can go, what you can do—the newspapers, you know, those little stands that are near the exit of your grocery store. There you go. They're free. Pick them up, and flip through those pages. You'll probably find a couple of events that are going on in your area that you can get to that are free, low cost, and full cost. But you're going to find some things that you and your family just might be interested in. Let's see. Oh, volunteer work. Not only is it a good chance for you to help out and learn things, but it's also a great free resource. It's free. Nobody charges you to volunteer. They're charging you your time. I guess. There are so many places that accept volunteers, like an urban farm. Farms need volunteers. There are tons of places you'll find animal rights groups, like pet shelters and things like that. You'll also find other environmental groups like taking care of watersheds and rivers to volunteer at.Speaker2: [00:12:06] Frankly, you can volunteer everywhere in churches and schools. There's a lot of volunteer work around soup kitchens. I'm trying to think of one that's a little maybe off the beaten path but that's plenty of things that you can volunteer to do. And not only are you helping your community, but you're gaining some experience or some knowledge in whatever the area of volunteering is. So that's fun. With COVID going on, I don't know if some of these options are still available, but I have heard of families taking their children to like a post office or a bakery. Glass blowing shops, places of business where they will, you know, let your children see how this works, how it gets done. So you can check that out. A local bakery or something. They want to know how you guys pump out 500 donuts a day and things like that. You'd be surprised at how open some places are, especially when they feel like you're really interested in what they do. So I'm going to move into the online space. Now, the Internet is a wonderful and vast place. Cue the Star Wars music. But you got to be careful out there. These Internet streets are not for the faint of heart. You put in your search query, and in a Google second, boom, you've got thousands of listings. To prove it can be a little overwhelming sometimes.Speaker3: [00:14:25] Huh? I know.Speaker2: [00:14:28] However. There are some that are really, really good and really worth your time and looking at. So Khan Academy. I used to use it a lot. Not so much anymore because, we go with the flow around here. But Khan Academy has a large variety of topics, subjects, course material for all ages, even for you, Mamas and Babas. Okay. They've got a lot of stuff. So even if you're just wanting to graze the top of a particular interest. That's the spot to be. Let's see. Who else? Oh, there's something called iCivics. So for your history needs, social study needs. Legislation needs. That's a good place to check out some free items on IE6. Now, I haven't checked this place out personally. However, I've heard good things about. It's called The Good and the Beautiful. And I do believe it is a curriculum that I would pay for. But I have heard tell that they have free worksheets and resources and that I think it's divided by topic. Even so, you can check them out if you're looking for a couple of free things to add to your repertoire. Now, some of these things, as I said before, you get what you pay for. You also want to make sure that it fits into what you're doing. You don't want to just grab something because it's free. Just for the free of it. Yeah. Have a plan. Try to integrate it into what you're already doing. Easy peasy. Lemon squeezy. It's just called easy peasy. All around home school, I believe they have a free All-in-One curriculum, as it says in the name. During homeschool vacation is a great time to try them out. Look into them. Next, the library. Oh, my God. I can't say enough about the library. The library is my jam. The library is where you want to be. Library should probably be your starting point. The library has more dangerous books around these parts. The libraries have tons of events beyond reading Circle Time. You can. See live events from authors. You can see live events on STEM subjects tailored just for kids, and they get to leave with their own little STEM item that they have created. We'll see—animal events. I remember we went one time, and we got to see a tarantula and this huge turtle and a bearded dragon.Speaker3: [00:17:59] It was kind of cool.Speaker2: [00:18:00] Will you see an African drumming shows there? I'm telling you, the library is one of your communities—brightest diamonds of so amazing. You may also be surprised that your library has access to some of these paid-for sites. Kind of our library gives you access to places like ancestry.com. I do believe you have to be on library grounds or on library Wi-Fi to access that particular one. But there are others that you can from home, like mango languages, ABC maps, and things like that.Speaker3: [00:18:46] So look into.Speaker2: [00:18:49] Your local library if you don't want to do it online. Feel free to walk into your local branch and get to ask questions. Some libraries even have seed banks. Now I have a problem with seeds. I'm a little obsessed. I've got hundreds. I've got thousands. I've got seeds for dates. But your library may also have seeds for dates, and they give them away for free. They do like it when you bring seeds back. And not that you would be returning seeds you planted, as that isn't impossible. You would save the seeds from the crops you planted to give back to the seed bank so they could be passed on to other growers. I think that's so amazing. I love saving seeds. I love seeds. Okay. I said that already, but I love seeds a lot. Now your library is one of your best places. I cannot say that enough. You can find so many, many things. Things that I'm sure I have even discovered yet. But they're there.Speaker3: [00:20:17] Oh, yeah, they are there. You too.Speaker2: [00:20:21] Blessing and a curse. You got to. You gotta kiss a few frogs before you find the prince. That's how YouTube works. Now I'm going to give you a couple of channels that I find helpful. I'm certain there are many, many, many more.Speaker3: [00:20:45] There are.Speaker2: [00:20:48] Some things aren't so child friendly, but there are some things that are older, child friendly, and there's just craziness. So once again.Speaker2: [00:21:00] So again, use at your own risk.Speaker2: [00:21:01] But where are these channels? So, kids, black history. I really enjoy Little Miss Raya. She's so much fun, and she's so full of excitement in life. It's great—Gracie's Corner. Now, Gracie's Corner is a vibe. She's got little bop, her little jams. If you're trying to teach him, skip counting, counting 200, all kinds of things.Speaker2: [00:21:31] We also have Crash Course Kids. That is a lot of science. And I think I've seen a couple of historical things in there. But crash course kids, there's also a crash course for adults or the older audience outside. Uh, Jewels TV. They're fun entertainment, black children's books read aloud.Speaker3: [00:22:06] Um. That's more.Speaker2: [00:22:10] There are not leaving out that I use personally, but there's plenty of things. So type in your topic. I wouldn't suggest you do it with the kids present. YouTube takes a little planning because you come across a lot of junk before you come across what you actually want. So to, you know, kind of quell the disappointment if you starting a video and then being like, oh, nope, and and looking for something else, go ahead and do that beforehand. Research what you want to play. So then you could be playing the right things and not having to go through all the crap over. Uh, let's see what else we got. What else we got? Oh, the Boys and Girls Club. So a lot of times their programming is free now. Everything's not going to be free, but a lot of things will be. You can do like open gym night, things like that. If you're going to play a sport, you're probably going to have to pay something. But you can even ask them, you know, of opportunities for things. And hey, you never know what the answer is going to be. So Boys and Girls Club, is an excellent choice. And there's also a prodigy. It's a little math game with little kids are these wizards and they're zooming through the forest and countering all these obstacles. And in order to win and fight these obstacles, you kind of answer these math questions. It's fun. There is also a paid version, but the only difference between the paid and free versions is the. The points, the rewards, or whatever it's called. You just get like different little, little items for the avatar. It's whatever. It's the same thing. But Prodigy is really good. It's great. It's fun. They're answering math questions. There's a couple other little extra things in there that make it feel a little more gamey, but they're getting those mathematical practices and.Speaker3: [00:24:29] Worksheet works.Speaker2: [00:24:32] I like worksheet works. You can print worksheets that have already been created. You can create your own. I particularly like them for handwriting practice. I can create, you know, worksheets that say paper. You are amazing. And he can write that, you know, things. That go with what you're doing specifically so you can create your own who doesn't like a create your own. But I guess if you're looking for something quick, fast and in a hurry, you might want to use one of the pre-done worksheets. But they have more than handwriting. They have math, they have grammar. They've got a couple of things in there. There's also. A local homeschool group. Some of them there is like a yearly fee or something like that, but a lot of them are free. And where you would pay would be if you were. Participating in certain events, classes, what have you.Speaker3: [00:25:42] But if you link up with a Homeschool group. Keep in mind, you're probably not going to like everything about it or everyone in it. But it is a resource that can definitely do you very well. I love my homeschool group. I'm not even going to lie. It's amazing. I don't think there's anything about it that I don't care for.Speaker3: [00:26:11] Yeah. I can't.Speaker2: [00:26:13] Yeah. Thank God for homeschool groups. Check it out, y'all. I'm teaching a class. It's called Anansi's Corner African. Mr. Kids. And we're going through. Yes. Shameless plug. Coming your way already in your face. And we're going through stories and we are identifying the parts of the story. We go into oral tradition. We go into all the elements of literary devices that make a good story. And then on our final class, we sit down together and create our own myth. It's so much fun. So head on over to Sankofa Homeschool Collective and register your brown baby today. Um. Class starts.Speaker3: [00:27:02] Next, Funbrain.Speaker2: [00:27:17] That's online. I'm kind of jumping around here. That one just popped into my head.Speaker2: [00:27:24] Thonburi. That's what it's called. Now you will find a plethora of things that are free if you join a homeschool group. Why? Because every homeschooler, as I've already said, loves a good freebie.[00:27:47] We love them. Why not? It's free.Speaker2: [00:27:53] So ask those in the homeschool groups what things do y'all find for free, and share those resources with us so we can share them with others. So by joining a network and joining a community, you are leveraging their knowledge as well. You'll be surprised at how many hidden gems are right under your nose. So I think I'm going to go ahead and wrap this up. And thanks so much for sitting with me, sitting through me. I love you all. I do. I hope you all are having a wonderful, wonderful day week. Whatever time of the year you find this, I hope these resources have been helpful. I would encourage you to go to the cleverly changing podcast website and check out our homeschool planner. That's excellent. I'm one of the designers. No, but seriously, I did design this with you all in mind to help you better organize your thoughts, your goals, your record keeping, and things so that you can have a successful homeschooling journey so that you would be able to make the best use of resources like the ones I just shared their partner, like the ones that I just shared with you. So please check that out. We've also got some other merch, some t-shirts, and things. Sweatshirts. They're great. I wear it. I have it. I'm going to have to take a picture for you guys one day. However, I'm going to wrap it up. I hope you all enjoyed this episode, and I can't wait to hear more from you and I can't wait to share more.[00:30:14] Did you know we sell merchandise to keep our podcast going? Order a hoodie, t-shirt, mugs, and more today!Speaker1: [00:30:32] Visit cleverly changing.com and click on the shop tab to place your order. ★ Support this podcast on Patreon ★
Jørgen gleder seg til NDC Ole Petter skal få nye briller Er Safari 16 fortsatt den nye IE6? Er daglige standups bortkastet? Meta gjør MemLab open source Adobe har kjøpt Figma, bør vi være bekymra? Utviklere må slutte å kalle seg ingeniører Google stenger ned halvparten av oppstartene sine kode24-klubben diskuterer politiets jobbannonser (?), forvirrende Ruter-app, Coops BankID-innlogging Jørgen liker Norsk Beefer på NRK Ole Petter liker Royalteen og andre norske tenåringsfilmer Vi gjør et dypdykk i spørsmålet; hvem er egentlig vitsespaltisten Yrjar? See omnystudio.com/listener for privacy information.
Michelle来自四川,2013年在成都的lesbian酒吧遇到了自己的妻子,来自美国加州的Pat(小鱼)。她们在成都举办了一场公开的大型婚礼,向身边所有人出柜。后来她们搬到了硅谷,创办了一个华人移民公益社群「愉园社」。Michelle和小鱼的婚礼纪录片:https://www.bilibili.com/video/BV1u64y1u76a YouTube链接:https://youtu.be/iE6_bya-AGMSupport the show
2021-09-07 Weekly News - Episode 118Watch the video version on YouTube at https://youtu.be/pzKWPhzBpqI Hosts: Eric Peterson - Senior Developer for Ortus Solutions Brad Wood - Software Consultant for Ortus Solutions Thanks to our Sponsor - Ortus SolutionsThe makers of ColdBox, CommandBox, ForgeBox, TestBox and almost every other Box out there. A few ways to say thanks back to Ortus Solutions: Like and subscribe to our videos on YouTube. Sign up for a free or paid account on CFCasts, which is releasing new content every week Become an ITB Sponsor - https://www.intothebox.org/#sponsors-2021 Buy Ortus's new Book - 102 ColdBox HMVC Quick Tips and Tricks on GumRoad (http://gum.co/coldbox-tips) Patreon SupportWe have 39 patreons providing 100% of the funding for our Modernize or Die Podcasts via our Patreon site: https://www.patreon.com/ortussolutions. We are now 41% of the way to our next goal, fully funding the ForgeBox.io site.Now offering Annual Memberships, pay for the year and save 10% - great for businesses.News and EventsAdobe ColdFusion Summit 2021Dec 7-8, 2021 - VirtualRegister now for this year's ColdFusion Summit!https://cfsummit.vconfex.com/site/adobe-cold-fusion-summit-2021/1290Special Into the Box Announcement coming on Thursday, September 9th, 2021Adobe 1 Day Workshop - Adobe ColdFusion Workshop with Damien BruyndonckxWed, September 22, 202109:00 - 17:00 CEST EUROPEANJoin the Adobe ColdFusion Workshop to learn how you and your agency can leverage ColdFusion to create amazing web content. This one-day training will cover all facets of Adobe ColdFusion that developers need to build applications that can run across multiple cloud providers or on-premise.https://coldfusion-workshop.meetus.adobeevents.com/ Adobe Webinar for September - Head in the clouds: Installing ColdFusion on Azure and AWS with Mark TakataWed, September 22, 202109:00 - 10:00 PDTIf you've been thinking about getting your CF instance moved into the cloud but don't know where to start, this webinar will get you rolling. We will explore how to install, configure and update CF2021 installs in both Amazon AWS and Microsoft Azure and give you tips and tricks on how to get things off the ground.https://installing-coldfusion-on-azure-and-aws.meetus.adobeevents.com/ CFCasts Content Updateshttps://www.cfcasts.com Just ReleasedUp and Running with Quick The N+1 Problem and Eager Loading Step 7 Exercise Scopes Coming this weekMore Up and Running with QuickSend your suggestions at https://cfcasts.com/supportConferences and TrainingInto the Box 2021 - live in Person in Texas.September 23rd and 24th.No workshops this year.Speakers and Schedule Released!!https://intothebox.orghttps://itb2021.eventbrite.comAdobe ColdFusion Summit 2021December 7th and 8thVirtualhttps://cfsummit.vconfex.com/site/adobe-cold-fusion-summit-2021/1290ITB Latam 2021 - live in personDecember 2nd or 3rd 2021 (confirming dates asap)More conferencesNeed more conferences, this site has a huge list of conferences for almost any language/community.https://confs.tech/Blogs, Tweets and Videos of the WeekBlog - Mark Takata - An introduction to the ColdFusion CLIYou might have heard that ColdFusion has a command line interface (well… actually we have a couple!), but what can it do? Turns out, quite a lot! Let's get you introduced to the CF CLI!https://coldfusion.adobe.com/2021/08/introduction-coldfusion-cli/Blog - Ben Nadel - Using Relative File Paths To Configure Application Mappings In Lucee CFML 5.3.8.201Lucee CFML has a lot of really nice developer ergonomics; one of which is its attitude towards relative file paths. In general, relative file paths "just work". They work when performing file I/O; and, as we now know, they work when configuring ColdFusion application mappings.https://www.bennadel.com/blog/4106-using-relative-file-paths-to-configure-application-mappings-in-lucee-cfml-5-3-8-201.htmBlog - Ben Nadel - Maintaining Route Information During SPA (Single-Page Application) Authentication In Lucee CFMLThe InVision platform is composed of a series of SPAs - Single-Page Applications - that are rendered with AngularJS on the front-end and powered by Lucee CFML on the back-end. Within each SPA, the current route is stored in the URL fragment (aka, the hash), which allowed client-side routing to work in older browsers such as IE6. The biggest challenge presented by fragment-based routing is that the fragment is never sent to the server during navigation. This makes it hard to maintain proper routing during external login events such as Single Sign-On (SSO). To get around this, I've started to use URL query-string parameters when defining routes in the transactional emails sent out from our Lucee CFML application.https://www.bennadel.com/blog/4108-maintaining-route-information-during-spa-single-page-application-authentication-in-lucee-cfml.htmBlog - Ben Nadel - I Wish My Relational Database Tables Were NarrowerNaming things is one of the hardest parts of computer science. Which I believe is a big part of why data modeling is so hard: it's challenging to see how one concept can be decomposed into multiple concepts when you don't know what those smaller concepts are called. This is why my relational database tables tend to get wider over time (ie, gain additional columns). But, after many years of building data-driven application using SQL and ColdFusion, I've come to appreciate how powerful it can be to keep database tables narrower.https://www.bennadel.com/blog/4107-i-wish-my-relational-database-tables-were-narrower.htmCFML JobsSeveral positions available on https://www.getcfmljobs.com/Listing over 180 ColdFusion positions from 85 companies across 111 locations in 5 Countries.2 new jobs listedFull-Time - Senior Coldfusion Developer at Remote - United States Posted Sept 4 https://www.getcfmljobs.com/jobs/index.cfm/united-states/Senior-Coldfusion-Developer-LATAM-at-Colon-PA/11327Full-Time Contract - ColdFusion Software Developer - Mid to Senior Level at Remote - United States Posted Sept 4https://www.getcfmljobs.com/jobs/index.cfm/united-states/ColdFusion-Software-Developer-Mid-to-Senior-Level-Remote-Position-at-Denver-CO/11328ForgeBox Module of the WeekCBSecurity by Ortus SolutionsNow with Refresh Token support!Refresh token endpoint /cbsecurity/refreshToken for secure refresh token generationManual refresh token method on the JwtService : refreshToken( token )Auto refresh token header interceptions for JWT validatorshttps://forgebox.io/view/cbsecurityhttps://coldbox-security.ortusbooks.com/VS Code Hint Tips and Tricks of the WeekSQL ServerMicrosoft - 924,675 downloads - 5 starsWelcome to mssql for Visual Studio Code! An extension for developing Microsoft SQL Server, Azure SQL Database and SQL Data Warehouse everywhere with a rich set of functionalities, including: Connect to Microsoft SQL Server, Azure SQL Database and SQL Data Warehouses. Create and manage connection profiles and most recently used connections. Write T-SQL script with IntelliSense, Go to Definition, T-SQL snippets, syntax colorizations, T-SQL error validations and GO batch separator. Execute your scripts and view results in a simple to use grid. Save the result to json or csv file format and view in the editor. Customizable extension options including command shortcuts and more. https://marketplace.visualstudio.com/items?itemName=ms-mssql.mssqlhttps://docs.microsoft.com/en-us/sql/tools/visual-studio-code/sql-server-develop-use-vscode?view=sql-server-ver15Thank you to all of our Patreon SupportersThese individuals are personally supporting our open source initiatives to ensure the great toolings like CommandBox, ForgeBox, ColdBox, ContentBox, TestBox and all the other boxes keep getting the continuous development they need, and funds the cloud infrastructure at our community relies on like ForgeBox for our Package Management with CommandBox. You can support us on Patreon here https://www.patreon.com/ortussolutionsNow offering Annual Memberships, pay for the year and save 10% - great for businesses. Bronze Packages and up, now get a ForgeBox Pro and CFCasts subscriptions as a perk for their Patreon Subscription. All Patreon supporters have a Profile badge on the Community Website All Patreon supporters have their own Private Forum access on the Community Website Patreons John Wilson - Synaptrix Don Bellamy Eric Hoffman David Belanger Dean Maunder Gary Knight Giancarlo Gomez Jonathan Perret Mario Rodrigues Jeffry McGee - Sunstar Media Yogesh Mathur Joseph Lamoree Ben Nadel Brett DeLine Carl Von Stetten Charlie Arehart Dan Card Daniel Garcia Didier Lesnicki Edgardo Cabezas Jan Jannek Jason Daiger Jeff McClain Jeremy Adams Jonas Eriksson Jordan Clark Kai Koenig Laksma Tirtohadi Leon Seremelis Matthew Darby Matthew Clemente Mingo Hagen Patrick Flynn Ross Phillips Scott Steinbeck Shawn Oden Stephany Monge Steven Klotz You can see an up to date list of all sponsors on Ortus Solutions' Websitehttps://ortussolutions.com/about-us/sponsors ★ Support this podcast on Patreon ★
(収録日: 2021/06/23) 今回は @hasegawayosuke さんをゲストにお招きし、個人的なIEと脆弱性のエピソードについて教えてもらっています。 なお、ここでいうIEの脆弱性は「Webアプリケーションに影響を与える部分」の範囲で、バッファオーバーフローやプラグイン周りの脆弱性はふくまれていません。 感想はtwitterでハッシュタグ「#secure旅団 #secureLiaison」やGoogle Formにいただけると嬉しいです。 内容 Internet Explorer は Microsoft Edge へ – Windows 10 の Internet Explorer 11 デスクトップアプリは 2022 年 6 月 15 日にサポート終了 ウェブブラウザの年表 とか眺めてあらためてすげー大作だなと感心していたところ IE11 サポート終了の歴史 サポート終了するために数年に渡ってフラグを立てていたんだなーと 若い世代が知らない2000年代のHTMLコーディングの地獄 よくIE対応が辛いとは聞いていたけど何が具体的に辛いのか良くわかってなかったので勉強になる 「ぼくたちの愛したIE8 IE8はセキュリティにすごく力を入れていた。 IEが引き起こした脆弱性といえば UTF-7によるXSS を外すわけにはいかない 2010年シアトルレドモンド訪問 IE6の“葬儀”行われる Microsoftから献花も X-XSS-Nightmare: 1; mode=attack ~XSSフィルターを利用したXSS攻撃~ Masato Kinugawa 5文字で書くJavaScript/ Shibuya.XSS techtalk #10 安心相談窓口だより:IPA 独立行政法人 情報処理推進機構 で2022年6月「Internet Explorer」サポートが終了へ ~ サポートが継続する他のブラウザへの切り替えを ~ のアナウンス Browser Market Share Japan 直近12ヶ月の日本でのIEのシェアは2.64% IE6 bot https://twitter.com/ie6bot 他 主宰: ken5(@ken5scal) ゲスト: 松本さん(@ym405nm), ykyanさん BGM: "A Fool in Love" by Imprismed ジングル: @hajipion
Guest Jordan Harband Panelists Eric Berry | Justin Dorfman | Alyssa Wright | Richard Littauer Show Notes Hello and welcome to Sustain! We are all very excited to have as our guest today, Jordan Harband, referred to as “Mr. Perfect” by the panelists! He is a longtime open source enthusiast, maintainer, coder, works at Coinbase, a TC39 Delegate, and heavily involved with Node for years. Today, Jordan gives us his perspective of being a maintainer of repositories and code. We find out how he is so successful at being a maintainer of so many open source projects, how he deals with ethics, how to ethically license your stuff, and how he handles hundreds of repos which he helps maintain. Jordan tells us what he’s doing to help other people out and shares some tips to a path if you’re interested in becoming more experienced. Download this episode now to find out much more and to get some fresh inspiration! [00:01:39] Jordan tells us how he got started with Node. [00:03:42] Justin wonders how Jordan maintains all of his notifications that he has and how does he deal with it. Also, he tells us if sponsorship plays a part of him having that passion and not getting overwhelmed which is why he’s so successful. [00:09:23] Jordan explains how he is nowhere close enough in terms of revenue stream from sponsorships to be able to consider quitting a job and working full-time on open source. [00:11:34] Richard brings up a book called, Drive by Daniel Pink, and wonders how Jordan chooses which open source projects to invest in and how does he feel like they’re actually giving him value because you’re making something that’s meaningful to you. [00:14:06] Justin asks Jordan if IE6 will ever die. [00:16:32] Jordan explains how to deal with ethics and open source, and how to ethically license your stuff. Richard wonders what he thinks the ethical obligations are of the maintainer who has a package. [00:20:29] Richard wonders since Jordan has hundreds of repos which he helps maintain, and how he deals with deciding to take on more work. [00:21:35] We find out what Jordan’s involvement is with the Airbnb JavaScript Style Guide. [00:24:08] Jordan shares advice to somebody who is just starting out in open source looking to build in a sustainable way for themselves and for the code they’re making. [00:27:05] Eric asks Jordan if he ever considered setting up a counselling program for open source maintainers since he seems to have it all figured out. Also, Jordan shares when he had a challenging moment in his life. [00:32:33] Richard wonders if Jordan is doing anything to systematically change open source to make sure that other people also have the opportunities to work on open source if they want to, he shares what he is doing, and mentions one of the programs he’s involved with called Major League Hacking. [00:36:37] Find out where you can follow Jordan along with his “perfectness.” Quotes [00:04:05] “I try to treat those notifications in an asynchronous manner so that I’m not, like I don’t have any push notifications set up for those things, so it’s not bothering me when I’m doing something else, whether that’s doing coding or other work, or whether that’s spending time with family or friends.” [00:06:14] “None of the parts of my career have been specifically for my open source projects.” [00:07:01] “The rise of sponsorship models, Tidelift, Open Collective, GitHub sponsors, etc.., what that does to me is it’s a demonstration of interest and appreciation in a way that is more concrete than someone clicking a GitHub emoji, giving me kinda invisible internet points. It’s something concrete.” [00:08:02] “The ability of someone to contribute even a dollar, five dollars a month is a concrete gesture that for the majority of people is actually really significant.” [00:08:12] “There’s that whole concept of how, when a very wealthy person will donate a large amount of money to a charitable cause and then a number of people point out that in terms of the percentage of their net worth, it’s actually like you giving three dollars, and it’s still meaningful because it’s three hundred million dollars, but it’s much more significant I think when an individual gives sixty dollars a year, which is like my lowest tier on GitHub sponsors is five dollars, so if somebody is paying sixty dollars a year for most people that’s something, that’s significant.” [00:09:53] “It’s not life changing, as I said, in the sense of paying my bills or not, but it would be life changing in a sense that I would be able to consider, well, I love my job, but do I love my job more than I would love working full-time on open source.” [00:13:46] “So there is a trade-off there, but the upside is that ninety-eight of those packages need three minutes of maintenance every five years.” [00:14:30] “But I think there are a lot of engineers that are frustrated supporting old environments, old Node versions, or old browsers, and it sort of violates a sense of aesthetics to have to deal with that messiness.” [00:14:59] “And whenever people talk about dropping browser support they talk about percentages, but .01% of internet users is like the population of this country or something like that, I don’t know, I haven’t done the math. I’m probably off by a factor of ten or a hundred or something, but it’s still a significant number of human beings.” [00:24:27] “One is remember that code is not the only important thing. Even just updating docs and READMEs and tutorials and things on projects is immensely valuable, and you don’t have to have any expertise in programming, necessarily, to be able to do that. So, there’s lots of ways you can get familiar with a project without touching any code at all.” [00:26:50] “And so, in the same way I think that for oneself, knowing your own behavior patterns and what is a good fit for you and what works well for your life and your mental health and so on, is probably the most effective tool to making sure that happens.” Spotlight [00:37:23] Eric’s spotlight is a GitHub project called the README project. [00:37:59] Justin’ spotlight is a funny woman on Twitter called Alexis Gay, who does hilarious Bay area tweets. [00:38:37] Alyssa’s spotlights are acknowledging one year of COVID lockdown, LISTSERV, and watching Coming 2 America. [00:39:20] Richard’s spotlight is a book by Daniel Pink called Drive. [00:39:38] Jordan’s spotlight is Tidelift. Links Jordan Harband Twitter (https://twitter.com/ljharb?lang=en) Jordan Harband Linkedin (https://www.linkedin.com/in/ljharb/) Jordan Harband GitHub (https://github.com/ljharb) Coinbase (https://www.coinbase.com/) Tidelift- How Jordan Harband maintains hundreds of npm packages (https://blog.tidelift.com/how-jordan-harband-maintains-hundreds-of-npm-packages) globalThis-ECMAScript Proposal-GitHib (https://github.com/tc39/proposal-global) MLH-Major League Hacking (https://mlh.io/) Airbnb JavaScript Style Guide (https://github.com/airbnb/javascript) The ReadME Project-Maintaining kindness and commits by Jordan Harband (https://github.com/readme/jordan-harband) Alexis Gay-Twitter (video) (https://twitter.com/yayalexisgay/status/1369346460911734784) LISTSERV (http://www.lsoft.com/products/listserv.asp) Coming 2 America (https://www.imdb.com/title/tt6802400/) [Drive: The Surprising Truth About What Motivates Us by Daniel H. Pink](https://www.amazon.com/Drive-Surprising-Truth-About-Motivates/dp/1594484805/ref=sr14?dchild=1&keywords=daniel+pink&qid=1615855737&sr=8-4) Tidelift (https://tidelift.com/) Sustain (https://sustainoss.org/) Credits Produced by Richard Littauer (https://www.burntfen.com/) Edited by Paul M. Bahr at Peachtree Sound (https://www.peachtreesound.com/) Show notes by DeAnn Bahr at Peachtree Sound (https://www.peachtreesound.com/) Special Guest: Jordan Harband.
In this episode of Syntax, Scott and Wes talk about tales from web dev past — clearfix, floats, flash, cufon, guestbooks, hit counters, and more! Sanity - Sponsor Sanity.io is a real-time headless CMS with a fully customizable Content Studio built in React. Get a Sanity powered site up and running in minutes at sanity.io/create. Get an awesome supercharged free developer plan on sanity.io/syntax. Sentry - Sponsor If you want to know what’s happening with your errors, track them with Sentry. Sentry is open-source error tracking that helps developers monitor and fix crashes in real time. Cut your time on error resolution from five hours to five minutes. It works with any language and integrates with dozens of other services. Syntax listeners can get two months for free by visiting Sentry.io and using the coupon code “tastytreat”. Show Notes 04:28 - Float-based layouts Clearfix ☠️ Killed by Flexbox, and then Grid 09:29 - Loading Screens: Two websites - one flash and one HTML Splash screen 11:22 - Hit counters 12:28 - Guestbooks 13:28 - Flash 3rd party player Media dragged its feet FOREVER ☠️ Killed by Steve Jobs 18:46 - Fonts The Golden Layout Cufon / sIFR / Images of text Typekit ☠️ Killed by font-face 24:15 - Folder-based version control ☠️ Killed by Git 26:22 - FTP ☠️ Killed by Git, then many other things 28:40 - CSS Zen Garden CSS Zen Garden ☠️ Killed by CSS being better 32:02 - TextMate Coda Notepad++ Adobe GoLive FrontPage Macromedia / Dreamweaver ☠️ Killed by Sublime Text, then VSCode 33:58 - Sliding doors A technique for rounded corners on buttons ☠️ Killed by CSS 35:29 - PNG Fix ☠️ Killed by the death of IE6 37:53 - 9-Panel layouts ☠️ Killed by CSS 39:20 - CSS 3 Please CSS 3 Please Paul Irish ☠️ Killed by modern CSS Links Silverlight Chris Coyier ××× SIIIIICK ××× PIIIICKS ××× Scott: Fancierstudio 600 LED Light Panel Kit Wes: Allen Key Drill Bit Set Shameless Plugs Scott: React 3D and Advanced Animating React with Framer Motion - Sign up for the year and save 25%! Wes: Master Gatsby Course - Use the coupon code ‘Syntax’ for $10 off! Tweet us your tasty treats! Scott’s Instagram LevelUpTutorials Instagram Wes’ Instagram Wes’ Twitter Wes’ Facebook Scott’s Twitter Make sure to include @SyntaxFM in your tweets
Динамические импорты в EcmaScript 2019, как проводить Code Review по версии Google, как разработчики YouTube убили Internet Exporer 6, а также новые AirPods Pro и iOS 13.2 beta от Apple. ПАГНАААААААЛЕ!!!11 Поддержите наш проект на Patreon: uWebDesign на Patreon. Спасибо всем за поддержку! Тему к следующему выпуску предлагайте здесь: reddit.com/r/uwebdesign. Пробуйте супер хостинг SmartApe. Теперь и с NVMe SSD!↓ Темы подкаста AirPods Pro от Apple. Первая бета Apple iOS 13.2. Как проводить Code Review по версии Google. 7 примеров динамических импортов в JavaScript ES10. Заговор против IE6, как разработчики YouTube практически убили IE6 в 2009 году. Восстановленные смартфоны, выгода или обман. Спасибо всем за внимание, дай вам Бог на эти коротенькие семь дней!
"If you're not paying for a product, then you are the product" luidt een bekend gezegde. Het duidt op het feit dat gratis diensten hun geld verdienen met jouw aandacht en advertenties. Maar wat als je wel betaalt voor een product? Kun je dan alsnog ook het product zijn? Ja, is het antwoord. Kijk maar naar de Xiaomi Mi 9, die onlangs uitkwam en die standaard advertenties in de software toont. Of het feit dat Google is begonnen met het testen van tekstadvertenties in Google Assistent-resultaten. Datzelfde Google doet ook een pilot met gesponsorde content in de interface van Android TV. Dat je betaalt voor een product, betekent niet altijd dat je ook advertentievrij bent. In deze aflevering van de podcast bespreken we dit soort voorbeelden en vragen we ons af hoe erg dit is en waar de grens ligt, want is korting op een telefoon als je naar advertenties kijkt geen goede deal? Verder vragen we ons af wie die meer dan twee miljoen Amerikanen zijn die nog steeds dvd's bij Netflix huren via de post. Waarom doen ze dat? En is films per post ontvangen in bepaalde opzichten niet beter dan streaming? Jur doet intussen een live factcheck om te achterhalen waarom een bedrijf dat begon met pakketjes versturen, 'Net' in de naam heeft staan. Ook behandelen we Microsofts nieuwste editie van zijn Edge-browser, die gebaseerd is op Chromium, het opensourceproject van Google achter zijn Chrome-browser. Wout merkt dat het dankzij die gedeelde fundering eenvoudig is om over te stappen, maar halen we ons hiermee niet een soort IE6-situatie op de hals? Arnoud legt verder nog uit hoe sprinten met zijn zoon naar het schoolplein verband houdt met de ontwikkelingen op de 5g-markt. 00:20 Opening 01:28 Mensen blijken nog dvd's via Netflix te kijken 09:05 De sprint tussen Korea en de VS naar de 5g-finish 12:30 Jur beantwoordt de vraag van de week 14:31 Wordt Chromium het nieuwe Internet Explorer 6? 19:18 Zijn advertenties in producten die je koopt, een goede zaak? 26:01 Google voegt reclame toe aan de Assistant; waar eindigt dat? 34:27 Tracking en advertenties in televisies 43:42 De Europese Commissie mengt zich in de ai-discussie 50:19 Kan wetgeving ooit ai beteugelen? 54:12 Sneakpeek Support the show.
We join the fight between Apple and Spotify, and debate the meaning of 'fair play' in the App Store and the browser wars. Plus some thoughts on the lessons learned from the 737 MAX, an Elastic Beanstalk PSA, and more!
Blake Johnston is a lover of tacos and beer and a is a Javascript developer at RevUnit in Bentonville, AR. He notes that Javascript is taking over the world and the poor guy thinks that's a good thing. Casey holds Blake personally responsible for left-pad 2.0 and demands answers. Tyrel proudly discovers that a e-commerce website he built with IE6 compatibility lives on in the halls of the internet. The whole crew has mixed feelings about Microsoft bowing out of the browser wars. One thing we can all agree on: none of us enjoy fixing printers. http://friday.hirelofty.com/ https://facebook.com/fridaydeploy https://twitter.com/fridaydeploy Livestream from this episode: https://www.youtube.com/watch?v=lCOyJlVxvCI Mentioned in this Episode I’m harvesting credit card numbers and passwords from your site. Here’s how, Hackernoon Tech Support Cheat Sheet, xkcd Browser wars update: Microsoft gives up, MetaFilter Microsoft Edge Web Browser Coming to the Mac Over 15 Years After Internet Explorer for Mac, MacRumors
[block id="424" title="Podcast Links"] Episode 4 has landed where I talk about my recent web browser history and switching back to Firefox as well as Android getting ready to embrace the notch. Thanks for tuning in and visit pixelswim.com for all my links, articles and other general info. Episode Links 34th Chicago Latino Film Festival: https://chicagolatinofilmfestival.org/ Chrome becoming IE6: https://www.theverge.com/2018/1/4/16805216/google-chrome-only-sites-internet-explorer-6-web-standards W3Schools Browser Statistics: https://www.w3schools.com/browsers/default.asp Android P preparing for the "Notch": XDA coverage: https://www.xda-developers.com/android-p-atypical-display-types-material-design-2/ Working around the notch: https://mobiforge.com/news-comment/iphone-x-notch-advice-for-web-developers The Lumia 650XL that never was: https://www.windowscentral.com/lumia-650-xl-review PixelBin Bargain of the Week: Unlocked LG G4 on Swappa for $95: https://swappa.com/listing/UKC988/view LG G4 Incipio cases on eBay: https://www.ebay.com/sch/i.html?_from=R40&_trksid=p2380057.m570.l1313.TR1.TRC0.A0.H0.Xlg+g4+incipio.TRS0&_nkw=lg+g4+incipio&_sacat=0 5,000mAh battery replacement: https://www.ebay.com/itm/5000mAh-Extended-Slim-battery-For-LG-G4-VS986-H810-LS991-H811-US991-H815-Phone/253294179724?hash=item3af982758c:m:mIc27cXGIh5WGkHTs4j6aOw
Panel: Charles Max Wood Guest: Austin McDaniel This week on My JavaScript Story/My Angular Story, Charles speaks with Austin McDaniel. Austin is a return guest and was previously featured on JavaScript Jabber episode 275 . Austin talks about his journey getting into programming as an 11year old, to recently, as a web developer with more complex technologies. Austin talks about building widgets, working in Angular, JavaScript, and more in-depth web development on many different platforms. Lastly, Austin talks about his contributions to NGX Charts and speaking at a variety of developer conferences. In particular, we dive pretty deep on: How did you get into programming? 11 years old Cue Basic Web developer College jobs was in web developing IE6 Building Widgets Components jquery Web is the future How did you get into Angular? 2013, v1.2 Backbone Angular 1 & 2 NG X Charts Speaking at Conferences Augmented Reality and VR Web AR Angular Air Podcast Working as a contractor with Google and much, much more! Links: JavaScript Jabber episode 275 jquery http://amcdnl.com Angular Air Podcast @amcdnl github.com/amcdnl Picks Austin Todd Motto Charles NG Conf Angular Dev Summit Angular Air Podcast
Panel: Charles Max Wood Guest: Austin McDaniel This week on My JavaScript Story/My Angular Story, Charles speaks with Austin McDaniel. Austin is a return guest and was previously featured on JavaScript Jabber episode 275 . Austin talks about his journey getting into programming as an 11year old, to recently, as a web developer with more complex technologies. Austin talks about building widgets, working in Angular, JavaScript, and more in-depth web development on many different platforms. Lastly, Austin talks about his contributions to NGX Charts and speaking at a variety of developer conferences. In particular, we dive pretty deep on: How did you get into programming? 11 years old Cue Basic Web developer College jobs was in web developing IE6 Building Widgets Components jquery Web is the future How did you get into Angular? 2013, v1.2 Backbone Angular 1 & 2 NG X Charts Speaking at Conferences Augmented Reality and VR Web AR Angular Air Podcast Working as a contractor with Google and much, much more! Links: JavaScript Jabber episode 275 jquery http://amcdnl.com Angular Air Podcast @amcdnl github.com/amcdnl Picks Austin Todd Motto Charles NG Conf Angular Dev Summit Angular Air Podcast
Panel: Charles Max Wood Guest: Austin McDaniel This week on My JavaScript Story/My Angular Story, Charles speaks with Austin McDaniel. Austin is a return guest and was previously featured on JavaScript Jabber episode 275 . Austin talks about his journey getting into programming as an 11year old, to recently, as a web developer with more complex technologies. Austin talks about building widgets, working in Angular, JavaScript, and more in-depth web development on many different platforms. Lastly, Austin talks about his contributions to NGX Charts and speaking at a variety of developer conferences. In particular, we dive pretty deep on: How did you get into programming? 11 years old Cue Basic Web developer College jobs was in web developing IE6 Building Widgets Components jquery Web is the future How did you get into Angular? 2013, v1.2 Backbone Angular 1 & 2 NG X Charts Speaking at Conferences Augmented Reality and VR Web AR Angular Air Podcast Working as a contractor with Google and much, much more! Links: JavaScript Jabber episode 275 jquery http://amcdnl.com Angular Air Podcast @amcdnl github.com/amcdnl Picks Austin Todd Motto Charles NG Conf Angular Dev Summit Angular Air Podcast
Charles Max Wood Guest: Austin McDaniel This week on My JavaScript Story, Charles speaks with Austin McDaniel. Austin is a return guest and was previously featured on JavaScript Jabber episode 275. Austin talks about his journey getting into programming as an 11year old, to recently, as a web developer with more complex technologies. Austin talks about building widgets, working in Angular, JavaScript, and more in-depth web development on many different platforms. Lastly, Austin talks about his contributions to projects like NGX Charts and speaking at a variety of developer conferences. In particular, we dive pretty deep on: How did you get into programming? 11 years old Cue Basic Web developer College jobs was in web developing IE6 Building Widgets Components jquery Web is the future How did you get into Angular? 2013, v1.2 Backbone Angular 1 & 2 NG X Charts Speaking at Conferences Augmented Reality and VR Web AR Angular Air Podcast Working as a contractor with Google and much, much more! Links: JavaScript Jabber episode 275 jquery http://amcdnl.com Angular Air Podcast @amcdnl github.com/amcdnl Picks Austin Todd Motto Shai Reznik Charles NG Conf Angular Dev Summit Angular Air Podcast
Charles Max Wood Guest: Austin McDaniel This week on My JavaScript Story, Charles speaks with Austin McDaniel. Austin is a return guest and was previously featured on JavaScript Jabber episode 275. Austin talks about his journey getting into programming as an 11year old, to recently, as a web developer with more complex technologies. Austin talks about building widgets, working in Angular, JavaScript, and more in-depth web development on many different platforms. Lastly, Austin talks about his contributions to projects like NGX Charts and speaking at a variety of developer conferences. In particular, we dive pretty deep on: How did you get into programming? 11 years old Cue Basic Web developer College jobs was in web developing IE6 Building Widgets Components jquery Web is the future How did you get into Angular? 2013, v1.2 Backbone Angular 1 & 2 NG X Charts Speaking at Conferences Augmented Reality and VR Web AR Angular Air Podcast Working as a contractor with Google and much, much more! Links: JavaScript Jabber episode 275 jquery http://amcdnl.com Angular Air Podcast @amcdnl github.com/amcdnl Picks Austin Todd Motto Shai Reznik Charles NG Conf Angular Dev Summit Angular Air Podcast
Charles Max Wood Guest: Austin McDaniel This week on My JavaScript Story, Charles speaks with Austin McDaniel. Austin is a return guest and was previously featured on JavaScript Jabber episode 275. Austin talks about his journey getting into programming as an 11year old, to recently, as a web developer with more complex technologies. Austin talks about building widgets, working in Angular, JavaScript, and more in-depth web development on many different platforms. Lastly, Austin talks about his contributions to projects like NGX Charts and speaking at a variety of developer conferences. In particular, we dive pretty deep on: How did you get into programming? 11 years old Cue Basic Web developer College jobs was in web developing IE6 Building Widgets Components jquery Web is the future How did you get into Angular? 2013, v1.2 Backbone Angular 1 & 2 NG X Charts Speaking at Conferences Augmented Reality and VR Web AR Angular Air Podcast Working as a contractor with Google and much, much more! Links: JavaScript Jabber episode 275 jquery http://amcdnl.com Angular Air Podcast @amcdnl github.com/amcdnl Picks Austin Todd Motto Shai Reznik Charles NG Conf Angular Dev Summit Angular Air Podcast
Kubernetes Joe Beda @jbeda | Heptio | eightypercent.net Show Notes: 00:51 - What is Kubernetes? Why does it exist? 07:32 - Kubernetes Cluster; Cluster Autoscaling 11:43 - Application Abstraction 14:44 - Services That Implement Kubernetes 16:08 - Starting Heptio 17:58 - Kubernetes vs Services Like Cloud Foundry and OpenShift 22:39 - Getting Started with Kubernetes 27:37 - Working on the Original Internet Explorer Team Resources: Google Compute Engine Google Container Engine Minikube Kubernetes: Up and Running: Dive into the Future of Infrastructure by Kelsey Hightower, Brendan Burns, and Joe Beda Joe Beda: Kubecon Berlin Keynote: Scaling Kubernetes: How do we grow the Kubernetes user base by 10x? Wordpress with Helm Sock Shop: A Microservices Demo Application Kelsey Hightower Keynote: Kubernetes Federation Joe Beda: Kubernetes 101 AWS Quick Start for Kubernetes by Heptio Open Source Bridge: Enter the coupon code PODCAST to get $50 off a ticket! The conference will be held June 20-23, 2017 at The Eliot Center in downtown Portland, Oregon. Transcript: CHARLES: Hello everybody and welcome to The Frontside Podcast, Episode 70. With me is Elrick Ryan. ELRICK: Hey, what's going on? CHARLES: We're going to get started with our guest here who many of you may have heard of before. You probably heard of the technology that he created or was a key part of creating, a self-described medium deal. [Laughter] JOE: Thanks for having me on. I really appreciate it. CHARLES: Joe, here at The Frontside most of what we do is UI-related, completely frontend but obviously, the frontend is built on backend technology and we need to be running things that serve our clients. Kubernetes is something that I think I started hearing about, I don't know maybe a year ago. All of a sudden, it just started popping up in my Twitter feed and I was like, "Hmm, that's a weird word," and then people started talking more and more about it and move from something that was behind me into something that was to the side and now it's edging into our peripheral vision more and more as I think more and more people adopt it, to build things on top of it. I'm really excited to have you here on the show to just talk about it. I guess we should start by saying what is the reason for its existence? What are the unique set of problems that you were encountering or noticed that everybody was encountering that caused you to want to create this? JOE: That's a really good set up, I think just for way of context, I spent about 10 years at Google. I learned how to do software on the server at Google. Before that, I was at Microsoft working on Internet Explorer and Windows Presentation Foundation, which maybe some of your listeners had to actually go ahead and use that. I learned how to write software for the server at Google so my experience in terms of what it takes to build and deploy software was really warped by that. It really doesn't much what pretty much anybody else in the industry does or at least did. As my career progressed, I ended up starting this project called Google Compute Engine which is Google's virtual machine as a service, analogous to say, EC2. Then as that became more and more of a priority for the company. There was this idea that we wanted internal Google developers to have a shared experience with external users. Internally, Google didn't do anything with virtual machines hardly. Everything was with containers and Google had built up some really sophisticated systems to be able to manage containers across very large clusters of computers. For Google developers, the interface to the world of production and how you actually launched off and monitor and maintain it was through this toolset, Borg and all these fellow travelers that come along with it inside of Google. Nobody really actually managed machines using traditional configuration management tools like Puppet or Chef or anything like that. It's a completely different experience. We built a compute engine, GCE and then I had a new boss because of executive shuffle and he spun up a VM and he'd been at Google for a while. His reaction to the thing was like, "Now, what?" I was like I'm sitting there at the root prompt go and like, "I don't know what to do now." It turns out that inside of Google that was actually a common thing. It just felt incredibly primitive to actually have a raw VM that you could have SSH into because there's so much to be done above that to get to something that you're comfortable with building a production grade service on top of. The choice as Google got more and more serious about cloud was to either have everybody inside of Google start using raw VMs and live the life that everybody outside of Google's living or try and bring the experience around Borg and this idea of very dynamic, container-centric, scheduled-cluster thinking bring that outside of Google. Borg was entangled enough with the rest of Google systems that sort of porting that directly and externalizing that directly wasn't super practical. Me and couple of other folks, Brendan Burns and Craig McLuckie pitched this crazy idea of starting a new open source project that borrowed from a lot of the ideas from Borg but really melded it with a lot of the needs for folks outside of Google because again, Google is a bit of a special case in so many ways. The core problem that we're solving here is how do you move the idea of deploying software from being something that's based on these physical concepts like virtual machines, where the amount of problems that you have to solve, to actually get that thing up and running is actually pretty great. How do we move that such that you have a higher, more logical set of abstractions that you're dealing with? Instead of worrying about what kernel you're running on, instead of worrying about individual nodes and what happens if a node goes down, you can instead just say, "Make sure this thing is running," and the system will just do its best to make sure that things are running and then you can also do interesting things like make sure 10 of these things are running, which is at Google scale that ends up being important. CHARLES: When you say like a thing, you're talking about like a database server or API server or --? JOE: Yeah, any process that you could want to be running. Exactly. The abstraction that you think about when you're deploying stuff into the cloud moves from a virtual machine to a process. When I say process, I mean like a process plus all the things that it needs so that ends up being a container or a Docker image or something along those lines. Now the way that Google does it internally slightly different than how it's done with Docker but you can squint at these things and you can see a lot of parallels there. When Docker first came out, it was really good. I think at Docker and containers people look for three things out of it. The first one is that they want a packaged artifact, something that I can create, run on my laptop, run in a data center and it's mostly the same thing running in both places and that's an incredibly useful thing, like on your Mac you have a .app and it's really a directory but the finder treats it as you can just drag it around and the thing runs. Containers are that for the server. They just have this thing that you can just say, run this thing on the server and you're pretty sure that it's going to run. That's a huge step forward and I think that's what most folks really see in the value with respect to Docker. Other things that folks look at with containerized technology is a level of efficiency of being able to pack a lot of stuff onto a little bit of hardware. That was the main driver for Google. Google has so many computers that if you improve utilization by 1%, that ends up being real money. Then the last thing is, I think a lot of folks look at this as a security boundary and I think there's some real nuance conversations to have around that. The goal is to take that logical infrastructure and make it such that, instead of talking about raw VMs, you're actually talking about containers and processes and how these things relate to each other. Yet, you still have the flexibility of a tool box that you get with an infrastructure level system versus if you look at something like Heroku or App Engine or these other platform as a service. Those things are relatively fixed function in terms of their architectures that you can build. I think the container cluster stuff that you see with things like Kubernetes is a nice middle ground between raw VMs and a very, very opinionated platform as a service type of thing. It ends up being a building block for building their more specialized experiences. There's a lot to digest there so I apologize. CHARLES: Yeah, there's a lot to digest there but we can jump right into digesting it. You were talking about the different abstractions where you have your hardware, your virtual machine and the containers that are running on top of that virtual machine and then you mentioned, I think I'm all the way up there but then you said Kubernetes cluster. What is the anatomy of a Kubernetes cluster and what does that entail? And what can you do with it? JOE: When folks talk about Kubernetes, I think there's two different audiences and it's important to talk about the experience from each audience. There's the audience from the point of view of what it takes to actually run a cluster -- this is a cluster operator audience -- then there's the audience in terms of what it takes to use a cluster. Assuming that somebody else is running a cluster for me, what does it look like for me to go ahead and use this thing? This is really different from a lot of different dev app tools which really makes these things together. We've tried to create a clean split here. I'm going to skip past what it means to launch and run a Kubernetes cluster because it turns out that over time, this is going to be something that you can just have somebody else do for you. It's like running your own MySQL database versus using RDS in Amazon. At some point, you're going to be like, "You know what, that's a pain in the butt. I want to make that somebody else's problem." When it comes to using the cluster, pretty much what it comes down to is that you can tell a cluster. There's an API to a cluster and that API is sort of a spiritual cousin to something like the EC2 API. You can talk to this API -- it's a RESTful API -- and you can say, "Make sure that you have 10 of these container images running," and then Kubernetes will make sure that ten of those things are running. If a node goes down, it'll start another one up and it will maintain that. That's the first piece of the puzzle. That creates a very dynamic environment where you can actually program these things coming and going, scaling up and down. The next piece of the puzzle that really, really starts to be necessary then is that if you have things moving around, you need a way to find them. There is built in ideas of defining what a service is and then doing service discovery. Service discovery is a fancy name for naming. It's like I have a name for something, I want to look that up to an IP address so that I can talk to it. Traditionally we use DNS. DNS is problematic in the super dynamic environments so a lot of folks, as they build backend systems within the data center, they really start moving past DNS to something that's a lot more dynamic and purpose-built for that. But you can think about it in your mind as a fancy super-fast DNS. CHARLES: The customer is itself something that's abstract so I can change it state and configure it and say, "I want 10 instances of Postgres running," or, "I want between five and 15 and it will handle all of that for you." How do you then make it smart so that you can react to load, for example like all of the sudden, this thing is handling more load so I need to say... What's the word I'm looking for, I need to handle -- JOE: Autoscale? CHARLES: Yeah, autoscale. Are there primitives for that? JOE: Exactly. Kubernetes itself was meant to be a tool box that you can build on top of. There are some common community-built primitives for doing it's called -- excuse the nomenclature here because there's a lot of it in Kubernetes and I can define it -- Horizontal Pod Autoscaling. It's this idea that you can have a set of pods and you want to tune the number of replicas to that pod based on load. That's something that's built in. But now maybe you're cluster, you don't have enough nodes in your cluster as you go up and down so there's this idea of cluster autoscaling where I want to add more capacity that I'm actually launching these things into. Fundamentally, Kubernetes is built on top of virtual machines so at the base, there's a bunch of virtual or physical machines hardware that's running and then it's the idea of how do I schedule stuff into that and then I can pack things into that cluster. There's this idea of scaling the cluster but then also scaling workloads running on top of the cluster. If you find that some of these algorithms or methods for how you want to scale things when you want to launch things, how you want to hook them up, if those things don't work for you, the Kubernetes system itself is programmable so you can build your own algorithms for how you want to launch and control things. It's really built from the get go to be an extensible system. CHARLES: One question that's keeps coming up is as I hear you describing these things is the Kubernetes cluster then, it's not application-oriented so you could have multiple applications running on a single cluster? JOE: Very much so. CHARLES: How do you then layer on your application abstraction on top of this cluster abstraction? JOE: An application is made up of a bunch of running bits, whether it'd be a database. I think as we move towards microservices, it's not just going to be one set of code. It can be a bunch of sets of codes that are working together or bunch of servers that are working together. There are these ideas are like I want to run 10 of these things, I want to run five of these things, I want to run three of these things and then I want them to be able to find each other and then I want to take this thing and I want to expose it out to the internet through a load balancer on Amazon, for example. Kubernetes can help to set up all those pieces. It turns out that Kubernetes doesn't have an idea of an application. There is no actually object inside a Kubernetes called application. There is this idea of running services and exposing services and if you bring a bunch of services together, that ends up being an application. But in a modern world, you actually have services that can play double duty across applications. One of the things that I think is exciting about Kubernetes is that it can grow with you as you move from a single application to something that really becomes a service mesh, as your application, your company grows. Imagine that you have some sort of app and then you have your customer service portal for your internal employees. You can have those both being frontend applications, both running on a Kubernetes cluster, talking to a common backend with a hidden API that you don't expose to customers but it's something that's exposed to both of those frontends and then that API may talk to a database. Then as you understand your problems, you can actually spawn off different microservices that can be managed separately by different teams. Kubernetes becomes a platform where you can actually start with something relatively simple and then grow with that and have it stretch from single application to multiple service microservice-base application to a larger cluster that can actually stretch across multiple teams and there's a bunch of facilities for folks not stepping on each other's toes as they do this stuff. Just to be clear, this is what Kubernetes is as it's based. I think one of the powerful things that you can do is that there's a whole host to folks that are building more platform as a service like abstractions on top of Kubernetes. I'm not going to say it's a trivial thing but it's a relatively straightforward thing to build a Heroku-like experience on top of Kubernetes. But the great thing is that if you find that that Heroku experience, if some of the opinions that were made as part of that don't work for you, you can actually drop down to a level that's more useful than going all the way down to raw VM because right now, if you're running on Heroku and something doesn't work for you, it's like, "Here's a raw VM. Good luck with that." There's a huge cliff as you actually want to start coloring outside the lines for, as I mix my metaphors here for these platform services. ELRICK: What services that are out there that you can use that would implement Kubernetes? JOE: That's a great question. There are a whole host there. One of the folks in the community has pulled together a spreadsheet of all the different ways to install and run Kubernetes and I think there were something like 60 entries on it. It's an open source system. It's credibly adaptable in terms of running in all sorts of different mechanisms for places and there are really active startups that are helping folks to run that stuff. In terms of the easiest turnkey things, I would probably start with Google Container Engine, which is honestly one click. It fits within a Free Tier. It can get you up and running so that you can actually play with Kubernetes super easy. There's this thing from the folks at CoreOS called minikube that lets you run it on your laptop as a development environment. That's a great way to kick the tires. If you're on Amazon, my company Heptio has a quick start that we did with some of the Amazon community folks. It's a cloud formation template that launches a Kubernetes stack that you can get up and running and really understand what's happening. I think as users, understand what value it brings at the user level then they'll figure out whether they want to invest in terms of figuring out what the best place to run and the best way to run it for them is. I think my advice to folks would be find some way to start getting familiar with it and then decide if you have to go deep in terms of how to be a cluster operator and how to run the thing. ELRICK: Yup. That was going to be my next question. You just brought up your company, Heptio. What was the reason for starting that startup? JOE: Heptio was founded by Craig McLuckie, one of the other Kubernetes founders and me. We started about six months or seven months ago now. The goal here is to bring Kubernetes to enterprises and how do we bridge the gap of bringing some of this technology forward company thinking to think about companies like Google and Twitter and Facebook. They have a certain way of thinking about building a deployment software. How do we bring those ideas into more mainstream enterprise? How do we bridge that gap and we're really using doing Kubernetes as the tool to do that? We're doing a bunch of things to make that happen. The first being that we're offering training, support and services so right now, if companies want to get started today, they can engage with us and we can help them understand what makes sense there. Over time, we want to make that be more self-service, easier to do so that you actually don't have to hire someone like us to get started and to be successful there. We want to invest in the community in terms of making Kubernetes easier to approach, easier to run and then more applicable to a more diverse set of audiences. This conversation that we're having here, I'm hoping that at some point, we won't have to have this because Kubernetes will be easy enough and self-describing enough that folks won't feel like they have to dig deep to get started. Then the last thing that we're going to be doing is offering commercial services and software that really helps teach Kubernetes into the fabric of how large companies work. I think there's a set of tools that you need as you move from being a startup or a small team to actually dealing within the structure of a large enterprise and that's really where we're going to be looking to create and sell product. ELRICK: Gotcha. CHARLES: How does Kubernetes then compare in contrast to other technologies that we hear when we talk about integrating with the enterprise and having enterprise clients managing their own infrastructure things like Cloud Foundry, for example. From someone who's kind of ignorant of both, how do you discriminate between the two? JOE: Cloud Foundry is a more of a traditional platform as a service. There's a lot to like there and there are some places where the Kubernetes community and the Cloud Foundry community are starting to cooperate. There is a common way for provisioning and creating external services so you can say, "I want MySQL database." We're trying to make that idea of, "Give me MySQL database. I don't care who and where it's running." We're trying to make those mechanisms common across Cloud Foundry and Kubernetes so there is some effort going in there. But Cloud Foundry is more of a traditional platform as a service. It's opinionated in terms of the right way to create, launch, roll out, hooks services together. Whereas, Kubernetes is more of a building block type of thing. Kubernetes is, at least raw Kubernetes in some ways a more of a lower levels building block technology than something like Cloud Foundry. The most applicable competitor in this world to Cloud Foundry, I would say would be OpenShift from Red Hat. Open Shift is a set of extensions built on top of it. Right now, it's a little bit of a modified version of Kubernetes but over time that teams working to make it be a set of pure extensions on top of Kubernetes that adds a platform as a service layer on top of the container cluster layer. The experience for Open Shift will be comparable to the experience for Cloud Foundry. There's other folks like Microsoft just bought the small company called Deis. They offer a thing called Workflow which gives you a little bit of the flavor of a platform as a service also. There's multiple flavors of platforms built on top of Kubernetes that would be more apples to apples comparable to something like Cloud Foundry. Now the interesting thing with thing Deis' Workflow or Open Shift or some of the other platforms built on top of Kubernetes is that, again if you find yourself where that platform doesn't work for you for some reason, you don't have to throw out everything. You can actually start picking and choosing what primitives you want to drop down to in the Kubernetes world without having to go down to raw VMs. Whereas, Cloud Foundry really doesn't have a widely supported, sort of more raw interface to run in containers and services. It's kind of subtle. CHARLES: Yeah, it's kind of subtle. This is an analogy that just popped into my head while I was listening to you and I don't know if this is way off base. But when you were describing having... What was the word you used? You said a container clast --? It was a container clustered... JOE: Container orchestrator, container cluster. These are all -- CHARLES: Right and then kind of hearkening back to the beginning of our conversation where you were talking about being able to specify, "I want 10 of these processes," or an elastic amount of these processes that reminded me of Erlang VM and how kind of baked into that thing is the concept of these lightweight processes and be able to manage communication between these lightweight processes and also supervise these processes and have layers of supervisors supervising other supervisors to be able to declare a configuration for a set of processes to always be running. Then also propagate failure of those processes and escalate and stuff like that. Would you say that there is an analogy there? I know there are completely separate beast but is there a co-evolution there? JOE: I've never used Erlang in Anger so it's hard for me to speak super knowledgeably about it. For what I understand, I think there is a lot in common there. I think Erlang was originally built by Nokia for telecoms switches, I believe which you have these strong availability guarantees so any time when you're aiming for high availability, you need to decouple things with outside control loops and ways to actually coordinate across pieces of hardware and software so that when things fail, you can isolate that and have a blast radius for a failure and then have higher level mechanisms that can help recover. That's very much what happens with something like Kubernetes and container orchestrator. I think there's a ton of parallels there. CHARLES: I'm just trying to grasp at analogies of things that might be -- ELRICK: I think they call that the OTP, Open Telecom Platform or something like that in Erlang. CHARLES: Yeah, but it just got a lot of these things -- ELRICK: Very similar. CHARLES: Yeah, it seems very similar. ELRICK: Interestingly enough, for someone that's starting from the bottom, an initiated person to Kubernetes containers, Docker images, Docker, where would they start to ramp up themselves? I know you mentioned that you are writing a book --? JOE: Yes. ELRICK: -- 'Kubernetes: Up and Running'. Would that be a good place to start when it comes out or is there like another place they should start before they get there. What is your thoughts on that? JOE: Definitely, check out the book. This is a book that I'm writing with Kelsey Hightower who's one of the developer evangelists for Google. He is the most dynamic speaker I've ever seen so if you ever have a chance to see him live, it's pretty great. But Kelsey started this and he's a busy guy so he brought in Brendan Burns, one of the other Kubernetes co-founders and me to help finish that book off and that should be coming out soon. It's Kubernetes: Up and Running. Definitely check that out. There's a bunch of good tutorials out there also that start introducing you to a lot of the concepts in Kubernetes. I'm not going to go through all of those concepts right now. There's probably like half a dozen different concepts and terminology, things that you have to learn to really get going with it and I think that's a problem right now. There's a lot to import before you can get started. I gave a talk at the Kubernetes Conference in Berlin, a month or two ago and it was essentially like, yeah we got our work cut out for us to actually make the stuff applicable to wider audience. But if you want to see the power, I think one of the things that you can do is there's the system built on top of Kubernetes called Helm, H-E-L-M, like a ship's helm because we love our nautical analogies here. Helm is a package manager for Kubernetes and just like you can login to say, in Ubuntu machine and do apps get install MySQL and you have a database up and running. With Helm you can say, create and install 'WordPress install' on my Kubernetes cluster and it'll just make that happen. It takes this idea of package management of describing applications up to the next level. When you're doing regular sysadmin stuff, you can actually go through and do the system to [Inaudible] files or to [Inaudible] files and copy stuff out and use Puppet and Chef to orchestrate all of that stuff. Or you can take the stuff that sort of package maintainers for the operating system have done and actually just go ahead and say, "Get that installed." We want to be able to offer a similar experience at the cluster level. I think that's a great way to start seeing the power. After you understand all these concepts here is how easy you can make it to bring up and run these distributed systems that are real applications. The Weaveworks folks, there are company that do container networking and introspection stuff based out of London. They have this example application called Sock Shop. It's like the pet shop example but distributed and built to show off how you can build an application on top of Kubernetes that pulls a lot of moving pieces together. Then there's some other applications out there like that that give you a little bit of an idea of what things look like as you start using this stuff to its fullest extent. I would say start with something that feels concrete where you can start poking around and seeing how things work before you commit. I know some people are sort of depth first learners and some are breadth first learners. If you're depth first, go and read the book, go to Kubernetes documentation site. If you're breadth first, just start with an application and go from there. ELRICK: Okay. CHARLES: I think I definitely fall into that breadth first. I want to build something with it first before trying to manage my own cluster. ELRICK: Yeah. True. I think I watched your talk and I did watch one of Kelsey's talks: container management. There was stuff about replicators and schedulers and I was like, "The ocean just getting deeper and deeper," as I listened to his talk. JOE: Actually, I think this is one of the cultural gaps to bridge between frontend and backend thinking. I think a lot of backend folks end up being these depths first types of folks, where when they want to use a technology, they want to read all the source code before they first apply it. I'm sure everybody has met those type of developers. Then I think there's folks that are breadth first where they really just want to understand enough to be effective, they want to get something up and running, they want to like if they hit a problem, then they'll go ahead and fix that problem but other than that, they're very goal-oriented towards, I want to get this thing running. Kubernetes right now is kind of built by systems engineers for systems engineers and it shows so we have our work cut out for us, I think to bridge that gap. It's going to be an ongoing thing. ELRICK: Yeah, I'm like a depth first but I have to keep myself in check because I have to get work done as a developer. [Laughter] JOE: That sounds about right, yeah. Yeah, so you're held accountable for writing code. CHARLES: Yeah. That's where real learning happens when you're depth first but you've got deadlines. ELRICK: Yes. CHARLES: I think that's a very effective combination. Before we go, I wanted to switch topic away from Kubernetes for just a little bit because you mentioned something when we were emailing that, I guess in a different lifetime you were actually on the original IE team or at the very beginning of the Internet Explorer team at Microsoft? JOE: Yes, that's where I started my career. Back in '97, I've done a couple of internships at Microsoft and then went to join full time, moved up here to Seattle and I had a choice between joining the NT kernel team or the Internet Explorer team. This was after IE3 before IE4. I don't know if this whole internet thing is going to pan out but it looks like that gives you a lot of interesting stuff. You got to understand the internet, it wasn't an assumed thing back then, right? ELRICK: Yeah, that's true. JOE: I don't know, this internet thing. CHARLES: I know. I was there and I know that like old school IE sometimes gets a bad rap. It does get a bad rap for being a little bit of an albatross but if you were there for the early days of IE, it really was the thing that blew it wide open like people do not give credit. It was extraordinarily ahead of its time. That was [Inaudible] team that coin DHTML back to when it was called DHTML. I remember, actually using it for the first time, I think about '97 is about what I was writing raw HTML for everything. CSS wasn't even a thing hardly. When I realized, all these static things when we render them, they're etched in stone. The idea that every one of these properties which I already knew is now dynamic and completely reflected, just moment to moment. It was just eye-opening. It was mind blowing and it was kind of the beginning of the next 20 years. I want to just talk a little bit about that, about where those ideas came from and what was the impetus for that? JOE: Oh, man. There's so much history here. First of all, thank you for calling out. I think we did a lot of really interesting groundbreaking work then. I think the sin was not in IE6 as it was but in [inaudible]. I think the fact that -- CHARLES: IE6 was actually an amazing browser. Absolutely an amazing browser. JOE: And then the world moved past it, right? It didn't catch up. That was the problem. For its time when it was released, I was proud of that release. But four years on, things get a little bit long in the tooth. I think IE3 was based on rendering engine that was very static, very similar to Netscape at the time. The thing to keep in mind is that Netscape at that time, it would download a webpage, parse it and display it. There was no idea of a DOM at Netscape at that point so it would throw away a lot of the information and actually only store stuff that was very specific to the display context. Literally, when you resize the window for Netscape back then, it would actually reparse the original HTML to regenerate things. It wasn't even able to actually resize the window without going through and reparsing. What we did with IE4 -- and I joined sort of close to the tail on IE4 so I can't claim too much credit here -- is bringing some of the ideas from something like Visual Basic and merge those into the idea of the browser where you actually have this programming model which became the DOM of where your controls are, how they fit together, being able to live modify these things. This was all part and parcel of how people built Windows applications. It turns out that IE4 was the combination of the old IE3 rendering engine, sort of stealing stuff from there but then this project that was built as a bunch of Active X controls for Office called [inaudible]. As you smash that stuff together and turn it into a browser rendering engine, that browser rendering engine ended up being called Trident. That's the thing that got a nautical theme. I don't think it's connected and that's the thing that that I joined and started working on at the time. This whole idea that you have actually have this DOM, that you can modify a programmable representation of DHTML and have it be live updated on screen, that was only with IE4. I don't think anybody had done it at that point. The competing scheme from Netscape was this thing called layers where it was essentially multiple HTML documents where you could replace one of the HTML documents and they would be rendered on top of each other. It was awful and it lost to the mist of time. CHARLES: I remember marketing material about layers and hearing how layers was just going to be this wonderful thing but I don't ever remember actually, did they ever even ship it? JOE: I don't know if they did or not. The thing that you got to understand is that anybody who spent any significant amount of time at Microsoft, you just really internalize the idea of a platform like no place else. Microsoft lives and breathes platforms. I think sometimes it does them a disservice. I've been out of Microsoft for like 13 years now so maybe some of my knowledge is a little outdated here but I still have friends over there. But Microsoft is like the poor schmuck that goes to Vegas and pulls the slot machine and wins the jackpot on the first pull. I'm not saying that there wasn't a lot of hard work that went behind Windows but like they hit the goldmine with that from a platform point of view and then they essentially did it again with Office. You have these two incredibly powerful platforms that ended up being an enormous growth engine for the company over time so that fundamentally changed the world view of Microsoft where they really viewed everything as a platform. I think there were some forward thinking people at Netscape and other companies but I think, Microsoft early on really understood what it meant to be a platform and we saw back then what the web could be. One of the original IE team members, I'm going to give a shout out to him, Chris Wilson who's now on the Chrome team, I think. I don't know where he is these days. Chris was on the original IE team. He's still heavily involved in web standards. None of this stuff is a surprise to us. I look at some of the original so after we finished IE6, a lot of the IE team rolled off to doing Avalon which became Windows Presentation Foundation, which was really looking to sort of reinvent Windows UI, importing a bunch of the ideas from web and modern programming there. That's where we came up with XAML and eventually begat Silverlight for good or ill. But some of our original demos for Avalon, if you go back in time and look at that, that was probably... I don't know, 2000 or something like that. They're exactly the type of stuff that people are building with the web platform today. Back then, they'll flex with the thing. We're reinventing this stuff over and over again. I like where it's going. I think we're in a good spot right now but we see things like the Shadow DOM come up and I look at that and I'm like, "We had HTC controls which did a lot of Shadow DOM stuff like stuff in IE early on." These things get reinvented and refined over time and I think it's great but it's fascinating to be in the industry long enough that you can see these patterns repeat. CHARLES: It is actually interesting. I remember doing UI in C++ and in Java. We did a lot of Java and it was a long time. I felt like I was wandering in the wilderness of the web where I was like, "Oh, man. I just wish we had these capabilities of things that we could do in swing, 10 or 15 years ago," but the happy ending is that I really actually do feel we are in a place now, finally where you have options for it really is truly competitive as a developer experience to the way it was, these many years ago and it's also a testament just how compelling the deployment model of the web is, that people were willing to forgo all of that so they could distribute their applications really easily. JOE: Never underestimate the power of view source. CHARLES: Yeah. [Laughter] ELRICK: I think that's why this sort of conversations are very powerful, like going back in time and looking at the development up until now because like they say that people that don't know their history, they're doomed to repeat it. I think this is a beautiful conversation. JOE: Yeah. Because I've done that developer focused frontend type of stuff. I've done the backend stuff. One of the things that I noticed is that you see patterns repeat over and over again. Let's be honest, it probably more like a week, I was going to say a weekend and learn the React the other day and the way that it encapsulate state up and down, model view, it's like these things are like there's different twists on them that you see in different places but you see the same patterns repeat again and again. I look at the way that we do scheduling in Kubernetes. Scheduling is this idea that you have a bunch of workloads that have a certain amount of CPU and RAM that they require like you want to play this Tetris game of being able to fit these things in, you look at scheduling like that and there are echoes for how layout happens in a browser. There is a deeper game coming on here and as you go through your career and if you're like me and you always are interested in trying new things, you never leave it all behind. You always see things that influence your thinking moving forward. CHARLES: Absolutely. I kind of did the opposite. I started out on the backend and then moved over into the frontend but there's never been any concept that I was familiar with working on server side code that did not come to my aid at some point working on the frontend. I can appreciate that fully. ELRICK: Yup. I can agree with the same thing. I jump all around the board, learning things that I have no use currently but somehow, they come back to help me. CHARLES: That will come back to help you. You thread them together at some point. ELRICK: Yup. CHARLES: As they said in one of my favorite video games in high school, Mortal Kombat there is no knowledge that is not power. JOE: I was all Street Fighter. CHARLES: Really? [Laughter] JOE: I cut class in high school and went to play Street Fighter at the mall. CHARLES: There is no knowledge that isn't power except for... I'm not sure that the knowledge of all these little mashy key buttons combinations, really, I don't think there's much power in that. JOE: Well, the Konami code still shows up all the time, right? [Laughter] CHARLES: I'm surprised how that's been passed down from generation to generation. JOE: You still see it show up in places that you wouldn't expect. One of the sad things that early on in IE, we had all these Internet Explorer Easter eggs where if you type this right combination into the address bar, do this thing and you clicked and turn around three times and face west, you actually got this cool DHTML thing and those things are largely disappearing. People don't make Easter eggs like they used to. I think there's probably legal reasons for making sure that every feature is as spec. But I kind of missed those old Easter eggs that we used to find. CHARLES: Yeah, me too. I guess everybody save their Easter eggs for April 1st but -- JOE: For the release notes, [inaudible]. CHARLES: All right. Well, thank you so much for coming by JOE. I know I'm personally excited. I'm going to go find one of those Kubernetes as a services that you mentioned and try and do a little breadth first learning but whether you're depth first or breadth first, I say go to it and thank you so much for coming on the show. JOE: Well, thank you so much for having me on. It's been great. CHARLES: Before we go, there is actually one other special item that I wanted to mention. This is the Open Source Bridge which is a conference being held in Portland, Oregon on the 20th to 23rd of June this year. The tracks are activism, culture hacks, practice and theory and podcast listeners may be offered a discount code for $50 off of the ticket by entering in the code 'podcast' on the Event Brite page, which we will link to in the show notes. Thank you, Elrick. Thank you, Joe. Thank you everybody and we will see you next week.
文 | 刘宝辰我们每天上网,用的最多的应用软件之一是浏览器,我们用浏览器看新闻,看视频,基本上,只要是现在上网,大部分人都是使用浏览器。浏览器也有很多,但是,总体上分为四个半流派,第一个是微软公司出的Intenet Explore, 这个占有率很高,尤其是中国的市场上;第二个流派是谷歌公司出的Chome浏览器;第三个流派是Mozilla公司出的Firefox流派;第四个流派是苹果公司出的Safari;第五个流派是Opera基本上就是这些吧。有同学可能问,我从来不用上面这些浏览器,我用的是360浏览器,QQ浏览器或者各种百度全家桶浏览器,其实,这些有中国特色的自主研发的软件,都是基于以上我说的那些浏览器来改版的。比如说加了一个外壳,让浏览器可以记录密码,同步书签等功能。我这次节目不做浏览器的测评,不评价哪个浏览器好用,主要是讲浏览器的一个工作原理。以前我做过一期,名字叫钻钻牛角尖,电脑开机开了啥。那一期是研究电脑开机的,结果,有人告诉我没必要这么复杂,装个360软件,就能加速电脑开机。而且我还和那个朋友争吵了一下,最后不欢而散吧。我这一期节目,没啥用处,即使研究浏览器的原理,也不会让上网速度变快。这只是一个程序员的怪癖,我就是喜欢研究这种东西。以后我还会讲各种音频格式之间的差别,各种图片格式之间的差别,各种视频格式之间的差别,还有各种自拍加的滤镜的工作原理等等,怎么说的,研究这个并没有卵用,只是我自己的业余爱好,希望不喜欢听的同学不要去留言说,你研究这个有啥用了,我也知道,真的没啥用。因为我上一次做电脑开机的那个音频,非得有人去问研究这个能让电脑变快么?如果不能,还不如装个360一键加速呢...在这个节目里,主要讲两个浏览器,一个是Firefox,一个是chrome和safari和Opera。至于为什么把chrome和safari还有Opera放在一起讲呢?那是因为这三个浏览器用的是相同的排版引擎,是苹果的WebKit,是开源的。其实这个项目最初也不是苹果原创的,而是苹果基于另一个开源项目,那个开源项目是KDE的HTML排版引擎,名字叫KHTML,还有一个KDE的另一个Javascript引擎,名字叫KJS。苹果公司开始的时候是基于这两个开源项目,做出了自己的项目,名字分别是WebCore,这个对应于KDE的KHTML,另一个项目叫JavascriptCore,这个对应于KDE的KJS这个项目。这个两个项目的目的是可以移植到OS X系统上,毕竟人家苹果是商业公司,而且苹果做的事情非常的合乎法律,给KDE的KHTML和KJS也作出了不少的技术改进,然后KDE的这两个项目,也获益匪浅吧,起码开始的时候是这样。如果用过苹果电脑的同学,尤其是早期的苹果电脑,苹果电脑上是没有一个特别靠谱的浏览器,这东西可能是不太容易做。苹果电脑上一度装微软出的InternetExplore 5浏览器,其实微软和苹果之间,有说不清道不明的爱慕关系,经常互相帮助,相爱相杀。苹果公司就基于这两个东西,然后就推出了自己的浏览器,也就是safari浏览器,,2003年发布的,safari浏览器。这个浏览器我用过,因为那时候我正在读本科,要去做实验,学校的实验室里新买了一批设备,这批设备需要处理数据的就是一台iMac,当年是新款的,那也是我第一次使用苹果电脑。刚开始感觉并不好用。现在记忆最深刻的就是这台苹果电脑,还有一台离心机,非常大的离心机,可能得有直径1米多,然后我有个同学突发奇想,把刚洗过的衬衫塞进去,想看看能不能把衣服甩干,然后甩了10来分钟,衬衫甩成了破布,已经不能穿了。实验室去了好几年,结果,就记住了这两件事情,一台苹果电脑,一个离心机,其它的都忘记了。继续来说苹果,然后苹果对webkit的改进越来越多,和开源社区也就越走越远,再后来,就彻底分手了。这个分手只是和KHTML那个项目分手了,具体的分手过程,我记得KDE的一个开发者曾经写过一个文章,来吐槽这件事情,当年在开源届也算引起过不大不小的轰动,甚至让Apple公司吓得赶紧联系KHTML的开发者,看看还能不能复婚,别那么快离婚。后来KHTML这个项目确实又从Apple中接受了不少新的特性,来改进KHTML的渲染速度。但是,我猜测的一个原因,Apple是商业公司,KDE是开源组织,商业组织是向钱看,我说的向钱看是金钱的钱,开源组织是不太注重金钱驱动的,结果呢,这些开源的项目因为不赚钱,大家紧张了一阵子,又开始跟不上苹果的节奏了,因为商业公司的项目推进能力,远远高于开源组织,结果,最后还是闹分手了。其实,开源组织有时候吧,赚不到钱,只能兼职做做,很多时候项目的质量并没有商业公司高,在后来,Apple的webkit在很多方面全面超越了KHTML。当然,KDE也知道这件事儿,从KDE4.5开始,KDE就已经使用苹果的webkit这个开源组件,当然了,开源的那个KHTML还是继续开发,也继续用在KDE上吗。苹果也在继续开发webkit,开发的成果也继续开源。可能有很多人觉得,苹果太尼玛封闭了,其实不是的,苹果是个商业公司,他肯定首先考虑的是商业利益,如果开源能获得巨大的商业利益,他肯定开源,所以,苹果开源了几个大杀器,黑科技。其中我知道的几个有前面我说的这个webki,还有一个大杀器是llvm,这个项目也极其重要,既然说到这里了,我就稍微的说一下,llvm呢,是一个开源的编译器项目,是C++写的。以前,包括现在,最重要的开源的编译器是gcc,就是理查德斯托曼做的那个gcc项目,曾经,gcc是开源届的核心地位,现在也差不多,因为几乎所有的开源软件,都需要使用gcc来编译成二进制代码,然后,这个组织脾气不太好,基本上处于那个地位,可能总是有缺点吧,而且处于核心地位,缺点也容易被放大,gcc可以说是在所有开源项目中,受到的批评最多的一个,比linux都多。但是,即使收到批评,你还不得不用它,苹果就是这样,给gcc捐献了大笔的钞票,没啥效果,因为有求于gcc的,可不止苹果一家。然后,苹果公司就搞了一个LLVM项目,来代替gcc在开源中的地位,LLVM是一个简称,全称是Low Level Vitual Machine,全称没啥人知道,我也是google一下,才敢写在这里。然后,LLVM太重要了,还获得了ACM颁发的一个大奖,来奖励Apple开源的这个LLVM项目。然后Apple率先垂范,把Gcc从默认编译器的位置拉了下来。因为Gcc这个项目组,和其它大的开源项目组,之间的龌龊事情也不少,比如FreeBSD项目也是早就看Gcc不爽了,但是,苦于自己没有编译器,只能忍气吞声,结果LLVM一出来,FreeBSD马上就把GCC给集成进来的,然后,一个以前看起来非常狂妄自大的计划被FreeBSD提上了日程,不光gcc,而是要把所有GNU组件都替换出来,然后就有了lldb, libc,compiler-rt这一系列项目,个人觉得,以FreeBSD社区那种比较高贵的气质,完全替换掉GNU项目,是有很大可能的。这一切,都是Apple花了5年时间,搞出来了一个LLVM,然后把这个编译器项目开源的原因。llvm的logo是我最喜欢的logo稍微跑了一下题,拐到编译器上了,再强行拐回来,继续说Apple这个webkit。苹果继续改进webkit,然后webkit也就越来越好用,速度越来越快,然后呢,另一家公司叫Google,也打算做个浏览器,二话不说,直接把苹果开源的这个引擎webkit拿过来就用,这是合乎法律的,因为开源么。然后一贯嘴上说不作恶的google公司实际上恶心事儿也干过不少的google和一贯表面非常高冷但是私底下对政府部门低三下四的apple公司又杠上了。chrome继承了apple公司的webkit,然后加以改进,把认为不行的代码丢了,尤其是javascript的部分,用了自己引以为豪的v8引擎,这个v8引擎的横空出世,让很多人也是惊讶的不行,然后javascript开始从前端到后段,差点儿通吃。让不少程序员惊呼,我操,js这是要上天么?然后,后来发现这种担心是多余的,因为前段进入了百花齐放的时代,每年都会出现至少365个javascript写的库,每天一个吧,然后循环往复,至今已经持续了好几年了。这个话题太容易引起争端,那个前端库更好呢?这个得看情况,因为一旦争论结束,又会出现更多新的js库,没办法,程序员就是这么搞笑,还是老老实实的用php这个世界上最好的语言靠谱。然后google的chrome是世界上占有率第一的浏览器,由于在中国某种神秘的力量,chrome的占有率很可能是倒数第一,如果你看到有人用chrome,很可能他就是个程序员。接下来,还有一个更小众的浏览器,他的名字叫Opera,据说已经被中国的360公司收购了,这家公司浏览器的引擎,也是webkit。因此,chrome/safari/opera,这三个浏览器,在渲染方面,大同小异,来自一个妈。另外一个分支就是大名鼎鼎的火狐浏览器,Firefox,这个在国内可能用的人也不多,如果你看到有人用firefox,可能,也是个程序员,如果你看到桌面上有三四个浏览器,并且同时使用,那100%是个前端程序员,尤其是你看到有人还在测试Internet Explorer 6这个浏览器,那100%是个给中国国企开发软件的前端程序员,中国国企和IE6这个浏览器,已经水乳交融,今生今世都不再分离了,即使这个浏览器已经15岁了,15岁,在IT行业,和永远一样远。但是,大型国企爱IE6,比如说,在2016年,我看到过某大型钢铁企业,赫然写着网站要支持IE6,真是让我百思不得其解的一件事情。火狐浏览器用的引擎的名字叫Gecko, 这个软件,曾经一度讨论要不要也把引擎换成webkit,最后,还是继续用这个Gecko,在英语中是壁虎的意思。好了,背景就介绍到这里,微软的不考虑了,他有自己独特的渲染引擎,但是,可以研究他家引擎源代码的,就是微软的人,网上可以找到的材料并不多。这里只讲这两个引擎,一个是webkit,用这个引擎的有三个浏览器,chrome,safari和opera;还有一个是Gecko,用这个引擎的是Firefox。·这些浏览器虽然各不相同,但是作用是类似的,就是能把你要求的东西显示出来,并且,不同的浏览器,显示的样子大同小异,稍微的有一些不同。因为不同的厂商出品的浏览器,是有一些细微的不同。之所以能显示的大同小异,是因为,这些厂商都要遵守一个协议,这些标准就是HTML和CSS,这些标准由一个公益组织来管理,这个公益组织的名字叫W3C,中文名叫万维网联盟来维护。我们上网的过程,就是把HTML和CSS的内容从网站上下载下来,然后将这些内容解析以后,显示在屏幕上。这个过程,需要用到的核心技术就是我上面所提到的两个引擎,webkit和Gecko的工作。负责显示请求的内容,把网站上下载下来的HTML和CSS,解析以后,展现出来。我对这个过程非常的好奇,好多年前,我就对浏览器是如何工作的非常的好奇,然后就研究了一下,自以为可以把自己给糊弄过去了,因此,我就说一下那两个引擎的工作原理。主要的流程是这样的,显示引擎会从网络层请求需要显示的文档,然后引擎开始工作。因为所有的网页都是HTML和CSS文档,引擎开始解析这个HTML文档,将整个文档解析成两棵树,一棵树叫内容树,这棵树上的节点是HTML的标记。还有一棵树叫呈现树,这棵树势解析样式元素,呈现树是节点的样式,比如字体的大小,颜色等等。呈现树主要是带有视觉属性比如颜色啊,尺寸啊,背景等等的一些矩形,这些矩形呢,就按照一定的顺序显示在屏幕上。当这个视觉效果显示出来以后,也就是一些矩形。再进入下一个阶段,就是将内容树的节点,计算一个坐标,每个节点都有一个独一无二的位置。有了这两个信息,再然后就是根据这两个信息,把内容绘制到屏幕上,引擎会遍历整棵树,然后将树上的每个节点,都画在屏幕上。web browser architecture为了能有更好的用户体验,引擎肯定是将内容以最快的速度画到屏幕上,而不是等所有的内容都下载完毕,才开始绘图,那样是非常影响用户体验的。所以,我们经常会碰到这种情况,某个地方的图片还没有显示出来,只显示一个空白,文字比图片更快的显示出来。这是一种特征,不是bug。引擎不是等所有的HTML文档都解析完毕以后,才开始绘制,如果那样,碰到一个网速很慢的,网页很大的,黄花菜都凉了,那样会非常的影响用户体验。正确的展示流程是,有多少显示多少,只要有内容过来,就赶紧的先给用户看一点,不必等所有内容都下载完成。那是不是webkit和Gecko是一样的呢?当然不是一样的,如果是一样的,那何必还要两个引擎呢?但是这两个引擎所采用的方法肯定不会有质的差别,如果有质的差别,两个都是开源的项目,那开发人员早就抄袭了,显然,这两个引擎所采用的方法大同小异。接下来呢,我要具体的描述这两个引擎所采用的方法。在讲技术之前,先得讲一个网页的技术,叫DOM,这个做前端的程序员肯定都是知道的,Web就是基于DOM的,比如说现在前端用的最多的一个javascript库叫jQuery,这个库本质上就是一个操作DOM的工具,这个库现在是越来越大,1.8的时候,原始大小200多K,优化以后也得100来k,其实这样挺大的,尤其是考虑到大部分人用jQuery就是实现了1-2个效果,结果让自己的网页增加了100多K,想想我这个不是前端的程序员,就很不爽,当然也有解决方案,比如zepto.js就是解决这个问题的,只增加了20多k。那唠叨了这么多,到底什么是DOM呢?这是一个英文的缩写,全称是Document Object Model。我们可以把DOM看作是节点,每个节点就是一个HTML的标签,那如何解析成树呢?这就是一个编译原理的问题了。还记得前面我讲苹果开源的那个LLVM么?那就是编译器,因为我试图把这个问题讲清楚,起码能加深我自己的印象,这次的时间又到了,下次,我要讲如何把HTML文档解析成一棵树,期间会用到编译器的知识,就是解析器和词法分析器。好了,下次再见。如果你喜欢我讲的这种钻牛角尖的内容,欢迎关注我的微信公众号——软件那些事儿——我这个公众号不扰民,每周推送一次,每次的观看量大概是300次左右。
文 | 刘宝辰我们每天上网,用的最多的应用软件之一是浏览器,我们用浏览器看新闻,看视频,基本上,只要是现在上网,大部分人都是使用浏览器。浏览器也有很多,但是,总体上分为四个半流派,第一个是微软公司出的Intenet Explore, 这个占有率很高,尤其是中国的市场上;第二个流派是谷歌公司出的Chome浏览器;第三个流派是Mozilla公司出的Firefox流派;第四个流派是苹果公司出的Safari;第五个流派是Opera基本上就是这些吧。有同学可能问,我从来不用上面这些浏览器,我用的是360浏览器,QQ浏览器或者各种百度全家桶浏览器,其实,这些有中国特色的自主研发的软件,都是基于以上我说的那些浏览器来改版的。比如说加了一个外壳,让浏览器可以记录密码,同步书签等功能。我这次节目不做浏览器的测评,不评价哪个浏览器好用,主要是讲浏览器的一个工作原理。以前我做过一期,名字叫钻钻牛角尖,电脑开机开了啥。那一期是研究电脑开机的,结果,有人告诉我没必要这么复杂,装个360软件,就能加速电脑开机。而且我还和那个朋友争吵了一下,最后不欢而散吧。我这一期节目,没啥用处,即使研究浏览器的原理,也不会让上网速度变快。这只是一个程序员的怪癖,我就是喜欢研究这种东西。以后我还会讲各种音频格式之间的差别,各种图片格式之间的差别,各种视频格式之间的差别,还有各种自拍加的滤镜的工作原理等等,怎么说的,研究这个并没有卵用,只是我自己的业余爱好,希望不喜欢听的同学不要去留言说,你研究这个有啥用了,我也知道,真的没啥用。因为我上一次做电脑开机的那个音频,非得有人去问研究这个能让电脑变快么?如果不能,还不如装个360一键加速呢...在这个节目里,主要讲两个浏览器,一个是Firefox,一个是chrome和safari和Opera。至于为什么把chrome和safari还有Opera放在一起讲呢?那是因为这三个浏览器用的是相同的排版引擎,是苹果的WebKit,是开源的。其实这个项目最初也不是苹果原创的,而是苹果基于另一个开源项目,那个开源项目是KDE的HTML排版引擎,名字叫KHTML,还有一个KDE的另一个Javascript引擎,名字叫KJS。苹果公司开始的时候是基于这两个开源项目,做出了自己的项目,名字分别是WebCore,这个对应于KDE的KHTML,另一个项目叫JavascriptCore,这个对应于KDE的KJS这个项目。这个两个项目的目的是可以移植到OS X系统上,毕竟人家苹果是商业公司,而且苹果做的事情非常的合乎法律,给KDE的KHTML和KJS也作出了不少的技术改进,然后KDE的这两个项目,也获益匪浅吧,起码开始的时候是这样。如果用过苹果电脑的同学,尤其是早期的苹果电脑,苹果电脑上是没有一个特别靠谱的浏览器,这东西可能是不太容易做。苹果电脑上一度装微软出的InternetExplore 5浏览器,其实微软和苹果之间,有说不清道不明的爱慕关系,经常互相帮助,相爱相杀。苹果公司就基于这两个东西,然后就推出了自己的浏览器,也就是safari浏览器,,2003年发布的,safari浏览器。这个浏览器我用过,因为那时候我正在读本科,要去做实验,学校的实验室里新买了一批设备,这批设备需要处理数据的就是一台iMac,当年是新款的,那也是我第一次使用苹果电脑。刚开始感觉并不好用。现在记忆最深刻的就是这台苹果电脑,还有一台离心机,非常大的离心机,可能得有直径1米多,然后我有个同学突发奇想,把刚洗过的衬衫塞进去,想看看能不能把衣服甩干,然后甩了10来分钟,衬衫甩成了破布,已经不能穿了。实验室去了好几年,结果,就记住了这两件事情,一台苹果电脑,一个离心机,其它的都忘记了。继续来说苹果,然后苹果对webkit的改进越来越多,和开源社区也就越走越远,再后来,就彻底分手了。这个分手只是和KHTML那个项目分手了,具体的分手过程,我记得KDE的一个开发者曾经写过一个文章,来吐槽这件事情,当年在开源届也算引起过不大不小的轰动,甚至让Apple公司吓得赶紧联系KHTML的开发者,看看还能不能复婚,别那么快离婚。后来KHTML这个项目确实又从Apple中接受了不少新的特性,来改进KHTML的渲染速度。但是,我猜测的一个原因,Apple是商业公司,KDE是开源组织,商业组织是向钱看,我说的向钱看是金钱的钱,开源组织是不太注重金钱驱动的,结果呢,这些开源的项目因为不赚钱,大家紧张了一阵子,又开始跟不上苹果的节奏了,因为商业公司的项目推进能力,远远高于开源组织,结果,最后还是闹分手了。其实,开源组织有时候吧,赚不到钱,只能兼职做做,很多时候项目的质量并没有商业公司高,在后来,Apple的webkit在很多方面全面超越了KHTML。当然,KDE也知道这件事儿,从KDE4.5开始,KDE就已经使用苹果的webkit这个开源组件,当然了,开源的那个KHTML还是继续开发,也继续用在KDE上吗。苹果也在继续开发webkit,开发的成果也继续开源。可能有很多人觉得,苹果太尼玛封闭了,其实不是的,苹果是个商业公司,他肯定首先考虑的是商业利益,如果开源能获得巨大的商业利益,他肯定开源,所以,苹果开源了几个大杀器,黑科技。其中我知道的几个有前面我说的这个webki,还有一个大杀器是llvm,这个项目也极其重要,既然说到这里了,我就稍微的说一下,llvm呢,是一个开源的编译器项目,是C++写的。以前,包括现在,最重要的开源的编译器是gcc,就是理查德斯托曼做的那个gcc项目,曾经,gcc是开源届的核心地位,现在也差不多,因为几乎所有的开源软件,都需要使用gcc来编译成二进制代码,然后,这个组织脾气不太好,基本上处于那个地位,可能总是有缺点吧,而且处于核心地位,缺点也容易被放大,gcc可以说是在所有开源项目中,受到的批评最多的一个,比linux都多。但是,即使收到批评,你还不得不用它,苹果就是这样,给gcc捐献了大笔的钞票,没啥效果,因为有求于gcc的,可不止苹果一家。然后,苹果公司就搞了一个LLVM项目,来代替gcc在开源中的地位,LLVM是一个简称,全称是Low Level Vitual Machine,全称没啥人知道,我也是google一下,才敢写在这里。然后,LLVM太重要了,还获得了ACM颁发的一个大奖,来奖励Apple开源的这个LLVM项目。然后Apple率先垂范,把Gcc从默认编译器的位置拉了下来。因为Gcc这个项目组,和其它大的开源项目组,之间的龌龊事情也不少,比如FreeBSD项目也是早就看Gcc不爽了,但是,苦于自己没有编译器,只能忍气吞声,结果LLVM一出来,FreeBSD马上就把GCC给集成进来的,然后,一个以前看起来非常狂妄自大的计划被FreeBSD提上了日程,不光gcc,而是要把所有GNU组件都替换出来,然后就有了lldb, libc,compiler-rt这一系列项目,个人觉得,以FreeBSD社区那种比较高贵的气质,完全替换掉GNU项目,是有很大可能的。这一切,都是Apple花了5年时间,搞出来了一个LLVM,然后把这个编译器项目开源的原因。llvm的logo是我最喜欢的logo稍微跑了一下题,拐到编译器上了,再强行拐回来,继续说Apple这个webkit。苹果继续改进webkit,然后webkit也就越来越好用,速度越来越快,然后呢,另一家公司叫Google,也打算做个浏览器,二话不说,直接把苹果开源的这个引擎webkit拿过来就用,这是合乎法律的,因为开源么。然后一贯嘴上说不作恶的google公司实际上恶心事儿也干过不少的google和一贯表面非常高冷但是私底下对政府部门低三下四的apple公司又杠上了。chrome继承了apple公司的webkit,然后加以改进,把认为不行的代码丢了,尤其是javascript的部分,用了自己引以为豪的v8引擎,这个v8引擎的横空出世,让很多人也是惊讶的不行,然后javascript开始从前端到后段,差点儿通吃。让不少程序员惊呼,我操,js这是要上天么?然后,后来发现这种担心是多余的,因为前段进入了百花齐放的时代,每年都会出现至少365个javascript写的库,每天一个吧,然后循环往复,至今已经持续了好几年了。这个话题太容易引起争端,那个前端库更好呢?这个得看情况,因为一旦争论结束,又会出现更多新的js库,没办法,程序员就是这么搞笑,还是老老实实的用php这个世界上最好的语言靠谱。然后google的chrome是世界上占有率第一的浏览器,由于在中国某种神秘的力量,chrome的占有率很可能是倒数第一,如果你看到有人用chrome,很可能他就是个程序员。接下来,还有一个更小众的浏览器,他的名字叫Opera,据说已经被中国的360公司收购了,这家公司浏览器的引擎,也是webkit。因此,chrome/safari/opera,这三个浏览器,在渲染方面,大同小异,来自一个妈。另外一个分支就是大名鼎鼎的火狐浏览器,Firefox,这个在国内可能用的人也不多,如果你看到有人用firefox,可能,也是个程序员,如果你看到桌面上有三四个浏览器,并且同时使用,那100%是个前端程序员,尤其是你看到有人还在测试Internet Explorer 6这个浏览器,那100%是个给中国国企开发软件的前端程序员,中国国企和IE6这个浏览器,已经水乳交融,今生今世都不再分离了,即使这个浏览器已经15岁了,15岁,在IT行业,和永远一样远。但是,大型国企爱IE6,比如说,在2016年,我看到过某大型钢铁企业,赫然写着网站要支持IE6,真是让我百思不得其解的一件事情。火狐浏览器用的引擎的名字叫Gecko, 这个软件,曾经一度讨论要不要也把引擎换成webkit,最后,还是继续用这个Gecko,在英语中是壁虎的意思。好了,背景就介绍到这里,微软的不考虑了,他有自己独特的渲染引擎,但是,可以研究他家引擎源代码的,就是微软的人,网上可以找到的材料并不多。这里只讲这两个引擎,一个是webkit,用这个引擎的有三个浏览器,chrome,safari和opera;还有一个是Gecko,用这个引擎的是Firefox。·这些浏览器虽然各不相同,但是作用是类似的,就是能把你要求的东西显示出来,并且,不同的浏览器,显示的样子大同小异,稍微的有一些不同。因为不同的厂商出品的浏览器,是有一些细微的不同。之所以能显示的大同小异,是因为,这些厂商都要遵守一个协议,这些标准就是HTML和CSS,这些标准由一个公益组织来管理,这个公益组织的名字叫W3C,中文名叫万维网联盟来维护。我们上网的过程,就是把HTML和CSS的内容从网站上下载下来,然后将这些内容解析以后,显示在屏幕上。这个过程,需要用到的核心技术就是我上面所提到的两个引擎,webkit和Gecko的工作。负责显示请求的内容,把网站上下载下来的HTML和CSS,解析以后,展现出来。我对这个过程非常的好奇,好多年前,我就对浏览器是如何工作的非常的好奇,然后就研究了一下,自以为可以把自己给糊弄过去了,因此,我就说一下那两个引擎的工作原理。主要的流程是这样的,显示引擎会从网络层请求需要显示的文档,然后引擎开始工作。因为所有的网页都是HTML和CSS文档,引擎开始解析这个HTML文档,将整个文档解析成两棵树,一棵树叫内容树,这棵树上的节点是HTML的标记。还有一棵树叫呈现树,这棵树势解析样式元素,呈现树是节点的样式,比如字体的大小,颜色等等。呈现树主要是带有视觉属性比如颜色啊,尺寸啊,背景等等的一些矩形,这些矩形呢,就按照一定的顺序显示在屏幕上。当这个视觉效果显示出来以后,也就是一些矩形。再进入下一个阶段,就是将内容树的节点,计算一个坐标,每个节点都有一个独一无二的位置。有了这两个信息,再然后就是根据这两个信息,把内容绘制到屏幕上,引擎会遍历整棵树,然后将树上的每个节点,都画在屏幕上。web browser architecture为了能有更好的用户体验,引擎肯定是将内容以最快的速度画到屏幕上,而不是等所有的内容都下载完毕,才开始绘图,那样是非常影响用户体验的。所以,我们经常会碰到这种情况,某个地方的图片还没有显示出来,只显示一个空白,文字比图片更快的显示出来。这是一种特征,不是bug。引擎不是等所有的HTML文档都解析完毕以后,才开始绘制,如果那样,碰到一个网速很慢的,网页很大的,黄花菜都凉了,那样会非常的影响用户体验。正确的展示流程是,有多少显示多少,只要有内容过来,就赶紧的先给用户看一点,不必等所有内容都下载完成。那是不是webkit和Gecko是一样的呢?当然不是一样的,如果是一样的,那何必还要两个引擎呢?但是这两个引擎所采用的方法肯定不会有质的差别,如果有质的差别,两个都是开源的项目,那开发人员早就抄袭了,显然,这两个引擎所采用的方法大同小异。接下来呢,我要具体的描述这两个引擎所采用的方法。在讲技术之前,先得讲一个网页的技术,叫DOM,这个做前端的程序员肯定都是知道的,Web就是基于DOM的,比如说现在前端用的最多的一个javascript库叫jQuery,这个库本质上就是一个操作DOM的工具,这个库现在是越来越大,1.8的时候,原始大小200多K,优化以后也得100来k,其实这样挺大的,尤其是考虑到大部分人用jQuery就是实现了1-2个效果,结果让自己的网页增加了100多K,想想我这个不是前端的程序员,就很不爽,当然也有解决方案,比如zepto.js就是解决这个问题的,只增加了20多k。那唠叨了这么多,到底什么是DOM呢?这是一个英文的缩写,全称是Document Object Model。我们可以把DOM看作是节点,每个节点就是一个HTML的标签,那如何解析成树呢?这就是一个编译原理的问题了。还记得前面我讲苹果开源的那个LLVM么?那就是编译器,因为我试图把这个问题讲清楚,起码能加深我自己的印象,这次的时间又到了,下次,我要讲如何把HTML文档解析成一棵树,期间会用到编译器的知识,就是解析器和词法分析器。好了,下次再见。如果你喜欢我讲的这种钻牛角尖的内容,欢迎关注我的微信公众号——软件那些事儿——我这个公众号不扰民,每周推送一次,每次的观看量大概是300次左右。
文 | 刘宝辰我们每天上网,用的最多的应用软件之一是浏览器,我们用浏览器看新闻,看视频,基本上,只要是现在上网,大部分人都是使用浏览器。浏览器也有很多,但是,总体上分为四个半流派,第一个是微软公司出的Intenet Explore, 这个占有率很高,尤其是中国的市场上;第二个流派是谷歌公司出的Chome浏览器;第三个流派是Mozilla公司出的Firefox流派;第四个流派是苹果公司出的Safari;第五个流派是Opera基本上就是这些吧。有同学可能问,我从来不用上面这些浏览器,我用的是360浏览器,QQ浏览器或者各种百度全家桶浏览器,其实,这些有中国特色的自主研发的软件,都是基于以上我说的那些浏览器来改版的。比如说加了一个外壳,让浏览器可以记录密码,同步书签等功能。我这次节目不做浏览器的测评,不评价哪个浏览器好用,主要是讲浏览器的一个工作原理。以前我做过一期,名字叫钻钻牛角尖,电脑开机开了啥。那一期是研究电脑开机的,结果,有人告诉我没必要这么复杂,装个360软件,就能加速电脑开机。而且我还和那个朋友争吵了一下,最后不欢而散吧。我这一期节目,没啥用处,即使研究浏览器的原理,也不会让上网速度变快。这只是一个程序员的怪癖,我就是喜欢研究这种东西。以后我还会讲各种音频格式之间的差别,各种图片格式之间的差别,各种视频格式之间的差别,还有各种自拍加的滤镜的工作原理等等,怎么说的,研究这个并没有卵用,只是我自己的业余爱好,希望不喜欢听的同学不要去留言说,你研究这个有啥用了,我也知道,真的没啥用。因为我上一次做电脑开机的那个音频,非得有人去问研究这个能让电脑变快么?如果不能,还不如装个360一键加速呢...在这个节目里,主要讲两个浏览器,一个是Firefox,一个是chrome和safari和Opera。至于为什么把chrome和safari还有Opera放在一起讲呢?那是因为这三个浏览器用的是相同的排版引擎,是苹果的WebKit,是开源的。其实这个项目最初也不是苹果原创的,而是苹果基于另一个开源项目,那个开源项目是KDE的HTML排版引擎,名字叫KHTML,还有一个KDE的另一个Javascript引擎,名字叫KJS。苹果公司开始的时候是基于这两个开源项目,做出了自己的项目,名字分别是WebCore,这个对应于KDE的KHTML,另一个项目叫JavascriptCore,这个对应于KDE的KJS这个项目。这个两个项目的目的是可以移植到OS X系统上,毕竟人家苹果是商业公司,而且苹果做的事情非常的合乎法律,给KDE的KHTML和KJS也作出了不少的技术改进,然后KDE的这两个项目,也获益匪浅吧,起码开始的时候是这样。如果用过苹果电脑的同学,尤其是早期的苹果电脑,苹果电脑上是没有一个特别靠谱的浏览器,这东西可能是不太容易做。苹果电脑上一度装微软出的InternetExplore 5浏览器,其实微软和苹果之间,有说不清道不明的爱慕关系,经常互相帮助,相爱相杀。苹果公司就基于这两个东西,然后就推出了自己的浏览器,也就是safari浏览器,,2003年发布的,safari浏览器。这个浏览器我用过,因为那时候我正在读本科,要去做实验,学校的实验室里新买了一批设备,这批设备需要处理数据的就是一台iMac,当年是新款的,那也是我第一次使用苹果电脑。刚开始感觉并不好用。现在记忆最深刻的就是这台苹果电脑,还有一台离心机,非常大的离心机,可能得有直径1米多,然后我有个同学突发奇想,把刚洗过的衬衫塞进去,想看看能不能把衣服甩干,然后甩了10来分钟,衬衫甩成了破布,已经不能穿了。实验室去了好几年,结果,就记住了这两件事情,一台苹果电脑,一个离心机,其它的都忘记了。继续来说苹果,然后苹果对webkit的改进越来越多,和开源社区也就越走越远,再后来,就彻底分手了。这个分手只是和KHTML那个项目分手了,具体的分手过程,我记得KDE的一个开发者曾经写过一个文章,来吐槽这件事情,当年在开源届也算引起过不大不小的轰动,甚至让Apple公司吓得赶紧联系KHTML的开发者,看看还能不能复婚,别那么快离婚。后来KHTML这个项目确实又从Apple中接受了不少新的特性,来改进KHTML的渲染速度。但是,我猜测的一个原因,Apple是商业公司,KDE是开源组织,商业组织是向钱看,我说的向钱看是金钱的钱,开源组织是不太注重金钱驱动的,结果呢,这些开源的项目因为不赚钱,大家紧张了一阵子,又开始跟不上苹果的节奏了,因为商业公司的项目推进能力,远远高于开源组织,结果,最后还是闹分手了。其实,开源组织有时候吧,赚不到钱,只能兼职做做,很多时候项目的质量并没有商业公司高,在后来,Apple的webkit在很多方面全面超越了KHTML。当然,KDE也知道这件事儿,从KDE4.5开始,KDE就已经使用苹果的webkit这个开源组件,当然了,开源的那个KHTML还是继续开发,也继续用在KDE上吗。苹果也在继续开发webkit,开发的成果也继续开源。可能有很多人觉得,苹果太尼玛封闭了,其实不是的,苹果是个商业公司,他肯定首先考虑的是商业利益,如果开源能获得巨大的商业利益,他肯定开源,所以,苹果开源了几个大杀器,黑科技。其中我知道的几个有前面我说的这个webki,还有一个大杀器是llvm,这个项目也极其重要,既然说到这里了,我就稍微的说一下,llvm呢,是一个开源的编译器项目,是C++写的。以前,包括现在,最重要的开源的编译器是gcc,就是理查德斯托曼做的那个gcc项目,曾经,gcc是开源届的核心地位,现在也差不多,因为几乎所有的开源软件,都需要使用gcc来编译成二进制代码,然后,这个组织脾气不太好,基本上处于那个地位,可能总是有缺点吧,而且处于核心地位,缺点也容易被放大,gcc可以说是在所有开源项目中,受到的批评最多的一个,比linux都多。但是,即使收到批评,你还不得不用它,苹果就是这样,给gcc捐献了大笔的钞票,没啥效果,因为有求于gcc的,可不止苹果一家。然后,苹果公司就搞了一个LLVM项目,来代替gcc在开源中的地位,LLVM是一个简称,全称是Low Level Vitual Machine,全称没啥人知道,我也是google一下,才敢写在这里。然后,LLVM太重要了,还获得了ACM颁发的一个大奖,来奖励Apple开源的这个LLVM项目。然后Apple率先垂范,把Gcc从默认编译器的位置拉了下来。因为Gcc这个项目组,和其它大的开源项目组,之间的龌龊事情也不少,比如FreeBSD项目也是早就看Gcc不爽了,但是,苦于自己没有编译器,只能忍气吞声,结果LLVM一出来,FreeBSD马上就把GCC给集成进来的,然后,一个以前看起来非常狂妄自大的计划被FreeBSD提上了日程,不光gcc,而是要把所有GNU组件都替换出来,然后就有了lldb, libc,compiler-rt这一系列项目,个人觉得,以FreeBSD社区那种比较高贵的气质,完全替换掉GNU项目,是有很大可能的。这一切,都是Apple花了5年时间,搞出来了一个LLVM,然后把这个编译器项目开源的原因。llvm的logo是我最喜欢的logo稍微跑了一下题,拐到编译器上了,再强行拐回来,继续说Apple这个webkit。苹果继续改进webkit,然后webkit也就越来越好用,速度越来越快,然后呢,另一家公司叫Google,也打算做个浏览器,二话不说,直接把苹果开源的这个引擎webkit拿过来就用,这是合乎法律的,因为开源么。然后一贯嘴上说不作恶的google公司实际上恶心事儿也干过不少的google和一贯表面非常高冷但是私底下对政府部门低三下四的apple公司又杠上了。chrome继承了apple公司的webkit,然后加以改进,把认为不行的代码丢了,尤其是javascript的部分,用了自己引以为豪的v8引擎,这个v8引擎的横空出世,让很多人也是惊讶的不行,然后javascript开始从前端到后段,差点儿通吃。让不少程序员惊呼,我操,js这是要上天么?然后,后来发现这种担心是多余的,因为前段进入了百花齐放的时代,每年都会出现至少365个javascript写的库,每天一个吧,然后循环往复,至今已经持续了好几年了。这个话题太容易引起争端,那个前端库更好呢?这个得看情况,因为一旦争论结束,又会出现更多新的js库,没办法,程序员就是这么搞笑,还是老老实实的用php这个世界上最好的语言靠谱。然后google的chrome是世界上占有率第一的浏览器,由于在中国某种神秘的力量,chrome的占有率很可能是倒数第一,如果你看到有人用chrome,很可能他就是个程序员。接下来,还有一个更小众的浏览器,他的名字叫Opera,据说已经被中国的360公司收购了,这家公司浏览器的引擎,也是webkit。因此,chrome/safari/opera,这三个浏览器,在渲染方面,大同小异,来自一个妈。另外一个分支就是大名鼎鼎的火狐浏览器,Firefox,这个在国内可能用的人也不多,如果你看到有人用firefox,可能,也是个程序员,如果你看到桌面上有三四个浏览器,并且同时使用,那100%是个前端程序员,尤其是你看到有人还在测试Internet Explorer 6这个浏览器,那100%是个给中国国企开发软件的前端程序员,中国国企和IE6这个浏览器,已经水乳交融,今生今世都不再分离了,即使这个浏览器已经15岁了,15岁,在IT行业,和永远一样远。但是,大型国企爱IE6,比如说,在2016年,我看到过某大型钢铁企业,赫然写着网站要支持IE6,真是让我百思不得其解的一件事情。火狐浏览器用的引擎的名字叫Gecko, 这个软件,曾经一度讨论要不要也把引擎换成webkit,最后,还是继续用这个Gecko,在英语中是壁虎的意思。好了,背景就介绍到这里,微软的不考虑了,他有自己独特的渲染引擎,但是,可以研究他家引擎源代码的,就是微软的人,网上可以找到的材料并不多。这里只讲这两个引擎,一个是webkit,用这个引擎的有三个浏览器,chrome,safari和opera;还有一个是Gecko,用这个引擎的是Firefox。·这些浏览器虽然各不相同,但是作用是类似的,就是能把你要求的东西显示出来,并且,不同的浏览器,显示的样子大同小异,稍微的有一些不同。因为不同的厂商出品的浏览器,是有一些细微的不同。之所以能显示的大同小异,是因为,这些厂商都要遵守一个协议,这些标准就是HTML和CSS,这些标准由一个公益组织来管理,这个公益组织的名字叫W3C,中文名叫万维网联盟来维护。我们上网的过程,就是把HTML和CSS的内容从网站上下载下来,然后将这些内容解析以后,显示在屏幕上。这个过程,需要用到的核心技术就是我上面所提到的两个引擎,webkit和Gecko的工作。负责显示请求的内容,把网站上下载下来的HTML和CSS,解析以后,展现出来。我对这个过程非常的好奇,好多年前,我就对浏览器是如何工作的非常的好奇,然后就研究了一下,自以为可以把自己给糊弄过去了,因此,我就说一下那两个引擎的工作原理。主要的流程是这样的,显示引擎会从网络层请求需要显示的文档,然后引擎开始工作。因为所有的网页都是HTML和CSS文档,引擎开始解析这个HTML文档,将整个文档解析成两棵树,一棵树叫内容树,这棵树上的节点是HTML的标记。还有一棵树叫呈现树,这棵树势解析样式元素,呈现树是节点的样式,比如字体的大小,颜色等等。呈现树主要是带有视觉属性比如颜色啊,尺寸啊,背景等等的一些矩形,这些矩形呢,就按照一定的顺序显示在屏幕上。当这个视觉效果显示出来以后,也就是一些矩形。再进入下一个阶段,就是将内容树的节点,计算一个坐标,每个节点都有一个独一无二的位置。有了这两个信息,再然后就是根据这两个信息,把内容绘制到屏幕上,引擎会遍历整棵树,然后将树上的每个节点,都画在屏幕上。web browser architecture为了能有更好的用户体验,引擎肯定是将内容以最快的速度画到屏幕上,而不是等所有的内容都下载完毕,才开始绘图,那样是非常影响用户体验的。所以,我们经常会碰到这种情况,某个地方的图片还没有显示出来,只显示一个空白,文字比图片更快的显示出来。这是一种特征,不是bug。引擎不是等所有的HTML文档都解析完毕以后,才开始绘制,如果那样,碰到一个网速很慢的,网页很大的,黄花菜都凉了,那样会非常的影响用户体验。正确的展示流程是,有多少显示多少,只要有内容过来,就赶紧的先给用户看一点,不必等所有内容都下载完成。那是不是webkit和Gecko是一样的呢?当然不是一样的,如果是一样的,那何必还要两个引擎呢?但是这两个引擎所采用的方法肯定不会有质的差别,如果有质的差别,两个都是开源的项目,那开发人员早就抄袭了,显然,这两个引擎所采用的方法大同小异。接下来呢,我要具体的描述这两个引擎所采用的方法。在讲技术之前,先得讲一个网页的技术,叫DOM,这个做前端的程序员肯定都是知道的,Web就是基于DOM的,比如说现在前端用的最多的一个javascript库叫jQuery,这个库本质上就是一个操作DOM的工具,这个库现在是越来越大,1.8的时候,原始大小200多K,优化以后也得100来k,其实这样挺大的,尤其是考虑到大部分人用jQuery就是实现了1-2个效果,结果让自己的网页增加了100多K,想想我这个不是前端的程序员,就很不爽,当然也有解决方案,比如zepto.js就是解决这个问题的,只增加了20多k。那唠叨了这么多,到底什么是DOM呢?这是一个英文的缩写,全称是Document Object Model。我们可以把DOM看作是节点,每个节点就是一个HTML的标签,那如何解析成树呢?这就是一个编译原理的问题了。还记得前面我讲苹果开源的那个LLVM么?那就是编译器,因为我试图把这个问题讲清楚,起码能加深我自己的印象,这次的时间又到了,下次,我要讲如何把HTML文档解析成一棵树,期间会用到编译器的知识,就是解析器和词法分析器。好了,下次再见。如果你喜欢我讲的这种钻牛角尖的内容,欢迎关注我的微信公众号——软件那些事儿——我这个公众号不扰民,每周推送一次,每次的观看量大概是300次左右。
文 | 刘宝辰我们每天上网,用的最多的应用软件之一是浏览器,我们用浏览器看新闻,看视频,基本上,只要是现在上网,大部分人都是使用浏览器。浏览器也有很多,但是,总体上分为四个半流派,第一个是微软公司出的Intenet Explore, 这个占有率很高,尤其是中国的市场上;第二个流派是谷歌公司出的Chome浏览器;第三个流派是Mozilla公司出的Firefox流派;第四个流派是苹果公司出的Safari;第五个流派是Opera基本上就是这些吧。有同学可能问,我从来不用上面这些浏览器,我用的是360浏览器,QQ浏览器或者各种百度全家桶浏览器,其实,这些有中国特色的自主研发的软件,都是基于以上我说的那些浏览器来改版的。比如说加了一个外壳,让浏览器可以记录密码,同步书签等功能。我这次节目不做浏览器的测评,不评价哪个浏览器好用,主要是讲浏览器的一个工作原理。以前我做过一期,名字叫钻钻牛角尖,电脑开机开了啥。那一期是研究电脑开机的,结果,有人告诉我没必要这么复杂,装个360软件,就能加速电脑开机。而且我还和那个朋友争吵了一下,最后不欢而散吧。我这一期节目,没啥用处,即使研究浏览器的原理,也不会让上网速度变快。这只是一个程序员的怪癖,我就是喜欢研究这种东西。以后我还会讲各种音频格式之间的差别,各种图片格式之间的差别,各种视频格式之间的差别,还有各种自拍加的滤镜的工作原理等等,怎么说的,研究这个并没有卵用,只是我自己的业余爱好,希望不喜欢听的同学不要去留言说,你研究这个有啥用了,我也知道,真的没啥用。因为我上一次做电脑开机的那个音频,非得有人去问研究这个能让电脑变快么?如果不能,还不如装个360一键加速呢...在这个节目里,主要讲两个浏览器,一个是Firefox,一个是chrome和safari和Opera。至于为什么把chrome和safari还有Opera放在一起讲呢?那是因为这三个浏览器用的是相同的排版引擎,是苹果的WebKit,是开源的。其实这个项目最初也不是苹果原创的,而是苹果基于另一个开源项目,那个开源项目是KDE的HTML排版引擎,名字叫KHTML,还有一个KDE的另一个Javascript引擎,名字叫KJS。苹果公司开始的时候是基于这两个开源项目,做出了自己的项目,名字分别是WebCore,这个对应于KDE的KHTML,另一个项目叫JavascriptCore,这个对应于KDE的KJS这个项目。这个两个项目的目的是可以移植到OS X系统上,毕竟人家苹果是商业公司,而且苹果做的事情非常的合乎法律,给KDE的KHTML和KJS也作出了不少的技术改进,然后KDE的这两个项目,也获益匪浅吧,起码开始的时候是这样。如果用过苹果电脑的同学,尤其是早期的苹果电脑,苹果电脑上是没有一个特别靠谱的浏览器,这东西可能是不太容易做。苹果电脑上一度装微软出的InternetExplore 5浏览器,其实微软和苹果之间,有说不清道不明的爱慕关系,经常互相帮助,相爱相杀。苹果公司就基于这两个东西,然后就推出了自己的浏览器,也就是safari浏览器,,2003年发布的,safari浏览器。这个浏览器我用过,因为那时候我正在读本科,要去做实验,学校的实验室里新买了一批设备,这批设备需要处理数据的就是一台iMac,当年是新款的,那也是我第一次使用苹果电脑。刚开始感觉并不好用。现在记忆最深刻的就是这台苹果电脑,还有一台离心机,非常大的离心机,可能得有直径1米多,然后我有个同学突发奇想,把刚洗过的衬衫塞进去,想看看能不能把衣服甩干,然后甩了10来分钟,衬衫甩成了破布,已经不能穿了。实验室去了好几年,结果,就记住了这两件事情,一台苹果电脑,一个离心机,其它的都忘记了。继续来说苹果,然后苹果对webkit的改进越来越多,和开源社区也就越走越远,再后来,就彻底分手了。这个分手只是和KHTML那个项目分手了,具体的分手过程,我记得KDE的一个开发者曾经写过一个文章,来吐槽这件事情,当年在开源届也算引起过不大不小的轰动,甚至让Apple公司吓得赶紧联系KHTML的开发者,看看还能不能复婚,别那么快离婚。后来KHTML这个项目确实又从Apple中接受了不少新的特性,来改进KHTML的渲染速度。但是,我猜测的一个原因,Apple是商业公司,KDE是开源组织,商业组织是向钱看,我说的向钱看是金钱的钱,开源组织是不太注重金钱驱动的,结果呢,这些开源的项目因为不赚钱,大家紧张了一阵子,又开始跟不上苹果的节奏了,因为商业公司的项目推进能力,远远高于开源组织,结果,最后还是闹分手了。其实,开源组织有时候吧,赚不到钱,只能兼职做做,很多时候项目的质量并没有商业公司高,在后来,Apple的webkit在很多方面全面超越了KHTML。当然,KDE也知道这件事儿,从KDE4.5开始,KDE就已经使用苹果的webkit这个开源组件,当然了,开源的那个KHTML还是继续开发,也继续用在KDE上吗。苹果也在继续开发webkit,开发的成果也继续开源。可能有很多人觉得,苹果太尼玛封闭了,其实不是的,苹果是个商业公司,他肯定首先考虑的是商业利益,如果开源能获得巨大的商业利益,他肯定开源,所以,苹果开源了几个大杀器,黑科技。其中我知道的几个有前面我说的这个webki,还有一个大杀器是llvm,这个项目也极其重要,既然说到这里了,我就稍微的说一下,llvm呢,是一个开源的编译器项目,是C++写的。以前,包括现在,最重要的开源的编译器是gcc,就是理查德斯托曼做的那个gcc项目,曾经,gcc是开源届的核心地位,现在也差不多,因为几乎所有的开源软件,都需要使用gcc来编译成二进制代码,然后,这个组织脾气不太好,基本上处于那个地位,可能总是有缺点吧,而且处于核心地位,缺点也容易被放大,gcc可以说是在所有开源项目中,受到的批评最多的一个,比linux都多。但是,即使收到批评,你还不得不用它,苹果就是这样,给gcc捐献了大笔的钞票,没啥效果,因为有求于gcc的,可不止苹果一家。然后,苹果公司就搞了一个LLVM项目,来代替gcc在开源中的地位,LLVM是一个简称,全称是Low Level Vitual Machine,全称没啥人知道,我也是google一下,才敢写在这里。然后,LLVM太重要了,还获得了ACM颁发的一个大奖,来奖励Apple开源的这个LLVM项目。然后Apple率先垂范,把Gcc从默认编译器的位置拉了下来。因为Gcc这个项目组,和其它大的开源项目组,之间的龌龊事情也不少,比如FreeBSD项目也是早就看Gcc不爽了,但是,苦于自己没有编译器,只能忍气吞声,结果LLVM一出来,FreeBSD马上就把GCC给集成进来的,然后,一个以前看起来非常狂妄自大的计划被FreeBSD提上了日程,不光gcc,而是要把所有GNU组件都替换出来,然后就有了lldb, libc,compiler-rt这一系列项目,个人觉得,以FreeBSD社区那种比较高贵的气质,完全替换掉GNU项目,是有很大可能的。这一切,都是Apple花了5年时间,搞出来了一个LLVM,然后把这个编译器项目开源的原因。llvm的logo是我最喜欢的logo稍微跑了一下题,拐到编译器上了,再强行拐回来,继续说Apple这个webkit。苹果继续改进webkit,然后webkit也就越来越好用,速度越来越快,然后呢,另一家公司叫Google,也打算做个浏览器,二话不说,直接把苹果开源的这个引擎webkit拿过来就用,这是合乎法律的,因为开源么。然后一贯嘴上说不作恶的google公司实际上恶心事儿也干过不少的google和一贯表面非常高冷但是私底下对政府部门低三下四的apple公司又杠上了。chrome继承了apple公司的webkit,然后加以改进,把认为不行的代码丢了,尤其是javascript的部分,用了自己引以为豪的v8引擎,这个v8引擎的横空出世,让很多人也是惊讶的不行,然后javascript开始从前端到后段,差点儿通吃。让不少程序员惊呼,我操,js这是要上天么?然后,后来发现这种担心是多余的,因为前段进入了百花齐放的时代,每年都会出现至少365个javascript写的库,每天一个吧,然后循环往复,至今已经持续了好几年了。这个话题太容易引起争端,那个前端库更好呢?这个得看情况,因为一旦争论结束,又会出现更多新的js库,没办法,程序员就是这么搞笑,还是老老实实的用php这个世界上最好的语言靠谱。然后google的chrome是世界上占有率第一的浏览器,由于在中国某种神秘的力量,chrome的占有率很可能是倒数第一,如果你看到有人用chrome,很可能他就是个程序员。接下来,还有一个更小众的浏览器,他的名字叫Opera,据说已经被中国的360公司收购了,这家公司浏览器的引擎,也是webkit。因此,chrome/safari/opera,这三个浏览器,在渲染方面,大同小异,来自一个妈。另外一个分支就是大名鼎鼎的火狐浏览器,Firefox,这个在国内可能用的人也不多,如果你看到有人用firefox,可能,也是个程序员,如果你看到桌面上有三四个浏览器,并且同时使用,那100%是个前端程序员,尤其是你看到有人还在测试Internet Explorer 6这个浏览器,那100%是个给中国国企开发软件的前端程序员,中国国企和IE6这个浏览器,已经水乳交融,今生今世都不再分离了,即使这个浏览器已经15岁了,15岁,在IT行业,和永远一样远。但是,大型国企爱IE6,比如说,在2016年,我看到过某大型钢铁企业,赫然写着网站要支持IE6,真是让我百思不得其解的一件事情。火狐浏览器用的引擎的名字叫Gecko, 这个软件,曾经一度讨论要不要也把引擎换成webkit,最后,还是继续用这个Gecko,在英语中是壁虎的意思。好了,背景就介绍到这里,微软的不考虑了,他有自己独特的渲染引擎,但是,可以研究他家引擎源代码的,就是微软的人,网上可以找到的材料并不多。这里只讲这两个引擎,一个是webkit,用这个引擎的有三个浏览器,chrome,safari和opera;还有一个是Gecko,用这个引擎的是Firefox。·这些浏览器虽然各不相同,但是作用是类似的,就是能把你要求的东西显示出来,并且,不同的浏览器,显示的样子大同小异,稍微的有一些不同。因为不同的厂商出品的浏览器,是有一些细微的不同。之所以能显示的大同小异,是因为,这些厂商都要遵守一个协议,这些标准就是HTML和CSS,这些标准由一个公益组织来管理,这个公益组织的名字叫W3C,中文名叫万维网联盟来维护。我们上网的过程,就是把HTML和CSS的内容从网站上下载下来,然后将这些内容解析以后,显示在屏幕上。这个过程,需要用到的核心技术就是我上面所提到的两个引擎,webkit和Gecko的工作。负责显示请求的内容,把网站上下载下来的HTML和CSS,解析以后,展现出来。我对这个过程非常的好奇,好多年前,我就对浏览器是如何工作的非常的好奇,然后就研究了一下,自以为可以把自己给糊弄过去了,因此,我就说一下那两个引擎的工作原理。主要的流程是这样的,显示引擎会从网络层请求需要显示的文档,然后引擎开始工作。因为所有的网页都是HTML和CSS文档,引擎开始解析这个HTML文档,将整个文档解析成两棵树,一棵树叫内容树,这棵树上的节点是HTML的标记。还有一棵树叫呈现树,这棵树势解析样式元素,呈现树是节点的样式,比如字体的大小,颜色等等。呈现树主要是带有视觉属性比如颜色啊,尺寸啊,背景等等的一些矩形,这些矩形呢,就按照一定的顺序显示在屏幕上。当这个视觉效果显示出来以后,也就是一些矩形。再进入下一个阶段,就是将内容树的节点,计算一个坐标,每个节点都有一个独一无二的位置。有了这两个信息,再然后就是根据这两个信息,把内容绘制到屏幕上,引擎会遍历整棵树,然后将树上的每个节点,都画在屏幕上。web browser architecture为了能有更好的用户体验,引擎肯定是将内容以最快的速度画到屏幕上,而不是等所有的内容都下载完毕,才开始绘图,那样是非常影响用户体验的。所以,我们经常会碰到这种情况,某个地方的图片还没有显示出来,只显示一个空白,文字比图片更快的显示出来。这是一种特征,不是bug。引擎不是等所有的HTML文档都解析完毕以后,才开始绘制,如果那样,碰到一个网速很慢的,网页很大的,黄花菜都凉了,那样会非常的影响用户体验。正确的展示流程是,有多少显示多少,只要有内容过来,就赶紧的先给用户看一点,不必等所有内容都下载完成。那是不是webkit和Gecko是一样的呢?当然不是一样的,如果是一样的,那何必还要两个引擎呢?但是这两个引擎所采用的方法肯定不会有质的差别,如果有质的差别,两个都是开源的项目,那开发人员早就抄袭了,显然,这两个引擎所采用的方法大同小异。接下来呢,我要具体的描述这两个引擎所采用的方法。在讲技术之前,先得讲一个网页的技术,叫DOM,这个做前端的程序员肯定都是知道的,Web就是基于DOM的,比如说现在前端用的最多的一个javascript库叫jQuery,这个库本质上就是一个操作DOM的工具,这个库现在是越来越大,1.8的时候,原始大小200多K,优化以后也得100来k,其实这样挺大的,尤其是考虑到大部分人用jQuery就是实现了1-2个效果,结果让自己的网页增加了100多K,想想我这个不是前端的程序员,就很不爽,当然也有解决方案,比如zepto.js就是解决这个问题的,只增加了20多k。那唠叨了这么多,到底什么是DOM呢?这是一个英文的缩写,全称是Document Object Model。我们可以把DOM看作是节点,每个节点就是一个HTML的标签,那如何解析成树呢?这就是一个编译原理的问题了。还记得前面我讲苹果开源的那个LLVM么?那就是编译器,因为我试图把这个问题讲清楚,起码能加深我自己的印象,这次的时间又到了,下次,我要讲如何把HTML文档解析成一棵树,期间会用到编译器的知识,就是解析器和词法分析器。好了,下次再见。如果你喜欢我讲的这种钻牛角尖的内容,欢迎关注我的微信公众号——软件那些事儿——我这个公众号不扰民,每周推送一次,每次的观看量大概是300次左右。
Bonjour, bienvenue pour l’épisode 4 ! Beaucoup de gens y compris des devs expérimentés ont des soucis de CSS. Il y a l’attitude défaitiste qui dit que vous n’y arriverez jamais, il y a l’attitude “pas mon problème” qui refile le bébé à quelqu’un d’autre, et il y a l’attitude snob qui méprise carrément le problème. … et bien sûr il y a l’attitude qui consiste à tester, à apprendre, et à livrer de la valeur à ses utilisateurs et ses clients :) OK, c’est dur C’est vrai que ce n’est pas simple. De manière générale, HTML et CSS c’est dur. Il y a eu des tas de normes qui s’empilent les unes sur les autres, mais le vrai souci était la variété des navigateurs qui ne gèraient pas tout pareil. Ça va un peu mieux et ça va me permettre de ne pas vous parler des astuces IE6, difficiles à contourner mais qu’on connaissait bien, ou IE7, un peu mieux a priori mais que finalement on connaissait moins. Pourquoi c’est dur ? L’intention est louable : on veut séparer la forme et le fond. Vous avez un contenu HTML, que j’aime visualiser comme des boîtes dans des boîtes dans des boîtes… etc. On souhaite garder les informations d’affichage à côté pour pouvoir changer de design sans changer le code, et vice-versa. On veut alors ajouter des informations sur ce que représentent ces boîtes, essentiellement son tag, sa classe, et son identifiant. À partir de tout cela, vous faites un autre fichier, une CSS pour Cascading Style Sheets, Feuille de Style qui s’appliquent en Cascade (pour une fois qu’on a un nom explicite !) qui contient une liste de règles, des directives CSS. Elles sont toutes à prendre en compte, mais pas aussi séquentiellement que du code où il y a un ordre précis, mais plutôt “toutes ensembles”. C’est comme si tout le monde venait parler en même temps dans une conversation ! Du coup la moindre règle modifie les autres, ce que l’on appelle des “effets de bord”, et c’est exactement ce qu’on essaie d’éviter de faire quand on code. Comment faire du sens dans ce bruit ? Dans la vraie vie, quand vous avez des gens qui parlent ensemble, quand vous avez plusieurs consignes au travail qui semblent en conflit, vous rangez aussi par priorités. Imaginez : on vous dit un jour de traiter tous les dossiers d’une certaine manière, mais s’ils sont bleus d’une autre. On vous dit que si un dossier traîne depuis trop longtemps, il est prioritaire. Que si le client est VIP, c’est prioritaire. Que si le patron le veut de suite, c’est ultra prioritaire. Qu’est-ce que vous faites ? Comme tout le monde : quand tout est prioritaire, rien n’est prioritaire, et vous tentez de retrouver un ordre décent dans tout cela. (D’ailleurs petite parenthèse : c’est pour cela que je refuse d’utiliser la directive CSS !important et que je ne la recommande pas.) On s’arrête, on réfléchit, et on décide qu’on traitera le dossier du patron en premier, puis les VIP, puis les anciens, puis les dossiers normaux, qui passent en bas de la pile. La règle de priorisation CSS marche pareil : qui le dit, quand est-ce qu’on le dit, mais surtout à propos de quoi on le dit. Qui parle quand ? Certaines pages Web n’ont pas d’information CSS. Elles sont très rares, mais il y a bien une information qui existe : quand vous écrivez une page HTML pure avec des titres H1 et H2, ils sont grands et en gras quand vous mettez une liste OL ou UL, ses éléments sont en retrait et avec un chiffre ou une puce quand vous utilisez une balise P pour paragraphe, il y a un espace vide autour (padding) les liens non visités sont bleus, les visités sont violets On voit qu’il existe une CSS par défaut du navigateur, mais c’est la moins importante de toutes. Ensuite, vous pouvez utiliser des CSS que vous importez via @import, link, ou dans le header, ou en ouvrant des balises dans le corps de la page (mais ce n'est pas propre) C'est le deuxième niveau de priorité. Au sein de ce même niveau de priorité, celui qui parle le dernier a raison. Enfin, vous pouvez utiliser le style “inline” (écrit directement dans le HTML sur l’attribut style de l’élément, mais ce n’est vraiment pas propre) : c’est le dernier à parler, il est exactement là où vous voulez l’appliquer, on considère que c’est celui qui écrase tout le reste et qui aura raison au final. Qui parle de quoi ? On a cinq manière d’identifier des éléments HTML, cinq sélecteurs disponibles dans nos règles CSS : l’élément, ou le tag, c’est le type de boîte HTML (DIV par exemple) la classe, précédée par un point, quelque chose que vous pouvez ajouter pour noter la similarité entre plusieurs éléments (sur mes dossiers, la couleur rouge ou bleu, écrit au marqueur ou au stylo, le fait que ce soit un client VIP…) l’identifiant, précédé par un dièse, quand le dossier est nommé (le cas de Mr Tartempion) des pseudo-sélecteurs, avec des symboles “deux points” et des sélecteurs par attributs (avec des crochets) depuis CSS3 Si vous utilisez ces deux derniers vous savez un peu comment ça marche, alors je vais me concentrer sur les bases : élément, classe, identifiant. En plus, on peut les enchaîner : tous les dossiers bleus à condition qu’ils soient dans une armoire, voire expressément les dossiers bleus dans une armoire bleue. L’élément vaut un point : UL LI A vaut alors trois points. Une classe vaut dix points : UL.menu ou .menu LI valent onze points. L’identifiant vaut cent points. On donne ainsi une “prime à la précision” : plus le sélecteur est précis, plus votre règle monte en priorité, et plus c’est elle qui aura raison. Qui dit quoi ? Enfin, on sait de quoi vous parler, mais il faut savoir quoi faire dessus. Vous listez des propriétés CSS que vous voulez appliquer. Certaines s’appliqueront à tous ses enfants (toutes les boîtes dans cette boîte), d’autres non. Et tout finit par s’appliquer en même temps ! Dans la vraie vie, un humain l’oublierait probablement, mais pas un ordinateur : si une règle très peu prioritaire dit d’écrire en vert et toutes les règles plus prioritaires ne changent que la taille et les bordures de l’élément, le texte est toujours vert. Si vous voulez changer cela, vous allez réécrire cette propriété plus tard, prendre la précédence sur ce qui a été dit avant. On dit que le droit est le métier des exceptions, mais le développement aussi : je vous demande de faire un certain traitement, sauf dans tel cas, mais sauf dans tel cas encore plus précis, auquel cas on réécrit encore par dessus les deux règles moins importantes. Boni On vient de voir que c’est un sujet complexe. Il y a de plus en plus d’outils pour vous aider, c’est bien, et de pratiques à apprendre, ce qui peut porter à confusion et ajoute à la complexité ambiante. Je voulais garder l’épisode “low-tech” pour ne perdre personne et parce que je crois qu’il y a de la valeur dans les bases et l’historique. J’avais parlé d’un épisode philosophique, l’écriture n’est pas venue aussi naturellement que je pensais, je le garde au chaud pour plus tard. De même j’hésite à faire des épisodes business, ce qui sort clairement de la ligne annoncée mais qui a également beaucoup de valeur. De plus, à mon sens, on ne peut se contenter de faire son job, il y a toujours de vastes considérations à prendre en compte autour de votre périmètre précis, que ce soit pour progresser, pour maximiser les opportunités, ou pour deviner ce qui va vous tomber dessus et anticiper un peu. Bref, n’hésitez pas, je suis ouvert aux commentaires sur Twitter @zen_m4 :) Merci et à bientôt !
(function() { var b=window,f="chrome",g="tick",k="jstiming";(function(){function d(a){this.t={};this.tick=function(a,d,c){var e=void 0!=c?c:(new Date).getTime();this.t[a]=[e,d];if(void 0==c)try{b.console.timeStamp("CSI/"+a)}catch(h){}};this[g]("start",null,a)}var a;b.performance&&(a=b.performance.timing);var n=a?new d(a.responseStart):new d;b.jstiming={Timer:d,load:n};if(a){var c=a.navigationStart,h=a.responseStart;0=c&&(b[k].srt=h-c)}if(a){var e=b[k].load;0=c&&(e[g]("_wtsrt",void 0,c),e[g]("wtsrt_","_wtsrt",h),e[g]("tbsd_","wtsrt_"))}try{a=null, b[f]&&b[f].csi&&(a=Math.floor(b[f].csi().pageT),e&&0
(function() { var b=window,f="chrome",g="tick",k="jstiming";(function(){function d(a){this.t={};this.tick=function(a,d,c){var e=void 0!=c?c:(new Date).getTime();this.t[a]=[e,d];if(void 0==c)try{b.console.timeStamp("CSI/"+a)}catch(h){}};this[g]("start",null,a)}var a;b.performance&&(a=b.performance.timing);var n=a?new d(a.responseStart):new d;b.jstiming={Timer:d,load:n};if(a){var c=a.navigationStart,h=a.responseStart;0=c&&(b[k].srt=h-c)}if(a){var e=b[k].load;0=c&&(e[g]("_wtsrt",void 0,c),e[g]("wtsrt_","_wtsrt",h),e[g]("tbsd_","wtsrt_"))}try{a=null, b[f]&&b[f].csi&&(a=Math.floor(b[f].csi().pageT),e&&0
(function() { var b=window,f="chrome",g="tick",k="jstiming";(function(){function d(a){this.t={};this.tick=function(a,d,c){var e=void 0!=c?c:(new Date).getTime();this.t[a]=[e,d];if(void 0==c)try{b.console.timeStamp("CSI/"+a)}catch(h){}};this[g]("start",null,a)}var a;b.performance&&(a=b.performance.timing);var n=a?new d(a.responseStart):new d;b.jstiming={Timer:d,load:n};if(a){var c=a.navigationStart,h=a.responseStart;0=c&&(b[k].srt=h-c)}if(a){var e=b[k].load;0=c&&(e[g]("_wtsrt",void 0,c),e[g]("wtsrt_","_wtsrt",h),e[g]("tbsd_","wtsrt_"))}try{a=null, b[f]&&b[f].csi&&(a=Math.floor(b[f].csi().pageT),e&&0
(function() { var b=window,f="chrome",g="tick",k="jstiming";(function(){function d(a){this.t={};this.tick=function(a,d,c){var e=void 0!=c?c:(new Date).getTime();this.t[a]=[e,d];if(void 0==c)try{b.console.timeStamp("CSI/"+a)}catch(h){}};this[g]("start",null,a)}var a;b.performance&&(a=b.performance.timing);var n=a?new d(a.responseStart):new d;b.jstiming={Timer:d,load:n};if(a){var c=a.navigationStart,h=a.responseStart;0=c&&(b[k].srt=h-c)}if(a){var e=b[k].load;0=c&&(e[g]("_wtsrt",void 0,c),e[g]("wtsrt_","_wtsrt",h),e[g]("tbsd_","wtsrt_"))}try{a=null, b[f]&&b[f].csi&&(a=Math.floor(b[f].csi().pageT),e&&0
(function() { var b=window,f="chrome",g="tick",k="jstiming";(function(){function d(a){this.t={};this.tick=function(a,d,c){var e=void 0!=c?c:(new Date).getTime();this.t[a]=[e,d];if(void 0==c)try{b.console.timeStamp("CSI/"+a)}catch(h){}};this[g]("start",null,a)}var a;b.performance&&(a=b.performance.timing);var n=a?new d(a.responseStart):new d;b.jstiming={Timer:d,load:n};if(a){var c=a.navigationStart,h=a.responseStart;0=c&&(b[k].srt=h-c)}if(a){var e=b[k].load;0=c&&(e[g]("_wtsrt",void 0,c),e[g]("wtsrt_","_wtsrt",h),e[g]("tbsd_","wtsrt_"))}try{a=null, b[f]&&b[f].csi&&(a=Math.floor(b[f].csi().pageT),e&&0
(function() { var b=window,f="chrome",g="tick",k="jstiming";(function(){function d(a){this.t={};this.tick=function(a,d,c){var e=void 0!=c?c:(new Date).getTime();this.t[a]=[e,d];if(void 0==c)try{b.console.timeStamp("CSI/"+a)}catch(h){}};this[g]("start",null,a)}var a;b.performance&&(a=b.performance.timing);var n=a?new d(a.responseStart):new d;b.jstiming={Timer:d,load:n};if(a){var c=a.navigationStart,h=a.responseStart;0=c&&(b[k].srt=h-c)}if(a){var e=b[k].load;0=c&&(e[g]("_wtsrt",void 0,c),e[g]("wtsrt_","_wtsrt",h),e[g]("tbsd_","wtsrt_"))}try{a=null, b[f]&&b[f].csi&&(a=Math.floor(b[f].csi().pageT),e&&0
(function() { var b=window,f="chrome",g="tick",k="jstiming";(function(){function d(a){this.t={};this.tick=function(a,d,c){var e=void 0!=c?c:(new Date).getTime();this.t[a]=[e,d];if(void 0==c)try{b.console.timeStamp("CSI/"+a)}catch(h){}};this[g]("start",null,a)}var a;b.performance&&(a=b.performance.timing);var n=a?new d(a.responseStart):new d;b.jstiming={Timer:d,load:n};if(a){var c=a.navigationStart,h=a.responseStart;0=c&&(b[k].srt=h-c)}if(a){var e=b[k].load;0=c&&(e[g]("_wtsrt",void 0,c),e[g]("wtsrt_","_wtsrt",h),e[g]("tbsd_","wtsrt_"))}try{a=null, b[f]&&b[f].csi&&(a=Math.floor(b[f].csi().pageT),e&&0
(function() { var b=window,f="chrome",g="tick",k="jstiming";(function(){function d(a){this.t={};this.tick=function(a,d,c){var e=void 0!=c?c:(new Date).getTime();this.t[a]=[e,d];if(void 0==c)try{b.console.timeStamp("CSI/"+a)}catch(h){}};this[g]("start",null,a)}var a;b.performance&&(a=b.performance.timing);var n=a?new d(a.responseStart):new d;b.jstiming={Timer:d,load:n};if(a){var c=a.navigationStart,h=a.responseStart;0=c&&(b[k].srt=h-c)}if(a){var e=b[k].load;0=c&&(e[g]("_wtsrt",void 0,c),e[g]("wtsrt_","_wtsrt",h),e[g]("tbsd_","wtsrt_"))}try{a=null, b[f]&&b[f].csi&&(a=Math.floor(b[f].csi().pageT),e&&0
Michael Argast talks with Chet about Apple's new test release of OS X, codenamed Lion. They also chat about Microsoft begging people to stop using IE6, providing social media access to your employer, the rise in Facebook scams and the recent spat of malware on the Android Market.
Aus Mangel an aktuellen Themen geben Peter, Stefan und der Schepp einen Rundumschlag zum Thema Mobile Browser. Wir plaudern fröhlich aus dem Nähkästchen, erzählen von unseren Erfahrungen und präsentieren die irrsinnigsten Browserquirks, die selbst dem IE6 alle Ehre gemacht hätten. [00:00:17] News Adobe Generator for Photoshop CC Echtzeit Assets direkt aus Photoshop in eure App? […]
Carl and Richard talk to Colin Bowern about his experiences developing web applications in the enterprise. Colin talks about how web got into the enterprise in the first place, and how far behind most enterprises are with their web applications. And yes, IE6 gets mentioned. The conversation digs into the strengths and weaknesses of building mobile and tablet applications using web vs. native, as well as other enterprise considerations like security and policy models. Is web really enterprise ready? Colin thinks so!
Full post >>Windows 8 guru Thomas Lewis shares his list of top Windows 8 blogs to watch, tools to check out, designer resources, social connections, and developer resources.THOMAS LEWISThomas Lewis is a Principal Technical Evangelist who at 8 years old thought that there was a frog apocalypse happening in his yard. It just turned out that the rain made all the frogs come out and hop around. He has been at Microsoft for over 12 years and has evangelized everything from Visual Basic 6 to HTML5 to Design for web developers and designers world-wide. He even once ate a "century egg" while in China. He is bent on eradicating IE6 from the planet and will never stop, never.D³: LIVE & INTERACTiVE In case you haven't heard about the show, Developers, Developers, Developers: LIVE & INTERACTIVE (D³) is a monthly show hosted by Jonathan Rozenblit. The show airs live every first Wednesday of the month at 12:00 PM ET and features the latest updates on what's new and exciting in the world of development; featured presentations; and guests. LIVE and INTERACTIVE means that you'll be part of the show – You're invited to interact with us; ask questions and get them answered; and share your thoughts and opinions. Join the Canadian Developer Connection LinkedIn group Follow @devsdevdevs Like D³ on Facebook Subscribe to podcasts via iTunes, Zune, or RSSMore D³: LIVE & INTERACTIVE >>
Episode 26 - JavaScript UI Widget Libraries Subscribe on iTunes Subscribe to RSS Download MP3 Show notes hosted by Jared Brown Brandon Corbin joined by Edward Rudd JS Widget Libs for Desktop and then Mobile Questions: What do people look for in each lib? How do you choose one over another? Desktop: Great for Intranet software, enterprise, engineering and scientific web apps Mobile: Progressive (mobile site) vs native-feeling app (typically wrapped in something like PhoneGap)? Actively developed or stale? JS Widget LibrariesLarge screenjQuery UIGrid coming to v2.1 Movement to clean up the API Lots of dev momentum lately Kendo UI by TelerikUses jQuery Recently out of beta Free for GPL Compatible open source projects $399 per developer (sounds like M$ style licensing.. inherited from the “.NET” background) Mention DataViz and Mobile Has custom theme builder for it’s widgets (not jquery UI’s builder) Doesn’t support IE6 Native UI on each device wijmoBased on jQuery UI (in fact, some of the team works on jQuery UI) Uses jQuery UI themes native has a cdn for access. Free version includes 18 OpenSource widgets Commercial versionIncludes 40+ widgets $299+ (per developer) (or $499 w/ support) Ext JSby SenchaMention Sencha Touch (free) $329 - one developer license (no support) MobilejQuery Mobile - jQuery70 kb http://codiqa.com/ (web GUI prototyping tool) Open source Broad device support Degrades Gracefully (progressive?) yes Has a theme builder (jQuery UI style) Kendo Mobile - TelerikNo pricing yet (in beta) Ready for PhoneGap Sencha Touch - SenchaHow is it diff from jQTouch?Much more programmatic to work with jQTouch is more web dev friendly Support for tables while jQTouch doesn’t http://9-bits.com/post/723711597/jqtouch-and-sencha-touch Free for non-OEMs Touch charts Looks like Android & iOS styling is a more manual thing to do jQTouch(problems with Android?) - SenchaWorks with Zepto or jQueryZepto is a minimal, jQuery syntax compatible lib SASS-based theming In beta Progressive Free ~20 kb Others to consider (both free, open source)JoNot easy to see which UI widgets it offers Looks to have less popularity GWT MobileFrom Google (but code is on GitHub) PhoneGap wrapper Great for pure client-side Java devs PhoneGap + XUI.jsOpen source Zirb Twitter Bootstrap Notes: Kendo UI Licensing. Kendo is dual-licensed under GPLv3/commercial license, jQuery UI is MIT/GPLv2. Support. Purchasing a Kendo commercial license entitles you to support (options here). Professional jQuery UI support is offered by appendTo and the filament group. Feature set. Kendo has some components that are missing in jQuery UI (Grid, Chart, TreeView, Upload, Templates, and soon - MVVM). You might need to stitch plug-ins by different authors if you want to use such functionality alongside jQuery UI. Roadmap. Kendo has a fixed release cycle (3 releases per year), with a fixed roadmap for the next release. The jQuery roadmap does not guarantee when the features will be included. Openness. You can browse the latest jQuery UI source at all times. With Kendo, you get only the source code for major releases when you don’t have a commercial license. If you purchase one, you get all the latest source code. http://jqueryuivskendoui.com/ Discuss comparison table Sencha Touch Aaron Weyenberg on Quora - “Sencha Touch takes much much longer to learn and become comfortable with, but it’s more robust. Sencha Touch documentation and examples, however, are quite unrefined in my opinion. There’s almost no MVC architecture support docs, so be prepared to do a lot of reverse engineering. jQuery Mobile can get you up and running in a day, but it’s not as feature rich, and seems not quite as smooth in terms of transitions and effects.” http://www.quora.com/Were-deciding-between-jQuery-Mobile-and-Sencha-Touch-What-are-the-pros-and-cons-for-each James Pearce, Developer Relations @ Sencha Inc Of course it very much depends on the use-case, your skill set and your desired architecture. If you want an easy, declarative, markup-configured mobile site, then jQuery Mobile’s progressive enhancements is an obvious option. If you want a richer, more standalone (say, MVC) app, built using a programmatic, RIA philosophy, then the Sencha Touch route would probably be better. It’s more likely that you’d take this approach if you were keen to wrap the app up in PhoneGap to deploy in an app store, for example. jQTouch Sencha touch is a little more complicated for those used to web design to use, in that it is almost a purely programmatic model (you don’t design pages in html, you programmatically add elements to a page). It does, however, have a much richer widget model and is a lot more fleshed out than jQTouch (it is also a lot bigger)… http://stackoverflow.com/questions/3446186/sencha-touch-vs-jqtouch Recommendations DEPENDS ON THE USE CASE Desktop jQuery UI Mobile jQuery Mobile
Dnes si budeme povídat o IE6 a vy si budete moci zasoutěžit o pěkná trička. Dalším tématem bude děravé Wi-Fi a nakonec přijde Tomáš a povídat si budeme o letošním CESu.
Koreabridge Hangout w/ Matthew Weigand, Stafford Lumsden, & Jeff Lebow August 1, 2011 Tech in KoreaTopics: Google Privacy IssuesIE6 finally on its way outMinerva & Korea Defamation LawKoreans encouraged to switch from Naver to GoogleGalaxy Tab 10.1 Subscribe to Koreabridge Hangouts
Koreabridge Hangout w/ Matthew Weigand, Stafford Lumsden, & Jeff Lebow August 1, 2011 Tech in KoreaTopics: Google Privacy IssuesIE6 finally on its way outMinerva & Korea Defamation LawKoreans encouraged to switch from Naver to GoogleGalaxy Tab 10.1 Subscribe to Koreabridge Hangouts
Apple says Amazon's AppStore isn't an 'App Store', Wordpress drops support for IE6, Kindle books are now outselling print books and a Footballer takes proceedings against Twitter If you enjoy The Two Techies, please subscribe to our other shows at munchtech.tv You can also subscribe to our newsletter at munchtech.tv/newsletter Thanks for listening.
Ulstein LAN og The Gathering, Battlefield 3 ingame, Gmail problemer, Android apps med trojaner, Charlie Sheen på Twitter, Ipad2 lansert, Bing med HTML5 versjon, Kutt ut IE6 hilsen Microsoft, WebGL ferdig Medvirkende: Einar Holten (@TCi82) og Jan Espen Pedersen (@Jan_Espen) Gikk direkte: 7 Mars 2011 kl 21:30-22:30 Takk til: DreamScene.org (animated background), Elliot Simons, "Hit the Decks"(music)
En este programa: Intel presenta "Thunderbolt", la tecnología "Light Peak" llega a los usuarios; Microsoft Windos 8 ppuede salir antes de lo esperado y... ya hay algunas imágenes; Firefox 4 ya tiene su beta 12 y se acerca al lanzamiento; más información sobre ACTA; el record Guinnes de twitter roto por Charlie Sheen; además del comentario de Software Libre (dos comentarios en esta ocasión) a cargo de @UbuntuDF... y mucho más.
As SVG and Canvas come of age, every developer who loves standards is wanting to use them in production to make eye-popping effects. But then they come up against the inevitable lack of support in IE6 to 8, and promptly give up the ghost. Fear not! Raphaël provides a developer friendly API to create graphics that work in Firefox 3.0+, Safari 3.0+, Opera 9.5+ and Internet Explorer 6.0+. Yes, you read that correctly, IE6. In this session Dmitry Baranovskiy, Raphaël's creator will walk you through its possibilities and will open up new horizons for web graphics that will work in all almost every browser. Dmitry has over ten years experience in creating web applications. Having started as a back end developer, more recently he has changed his orientation to front end development and even pure design. These days he spends his working hours as Software Architect at Sencha. He is also the creator of Raphaël, the JavaScript Library, as well as a Optimus, the Microformats transformer. At any given moment he is always working on three secret projects, though no one knows where he gets the time for any of this. Licensed as Creative Commons Attribution-Share Alike 3.0 (http://creativecommons.org/licenses/by-sa/3.0/).
iPad installation on your new BMW, IBM's Battery 500 project, more Internet Explorer 9 and Facebook phone is it real? Show Notes 1. BMW brings Apple's iPad to the back seat in X3 Need a bracket holder for your new iPad on those long road trips? Do you have a BMW X3 Crossover? If so, you are in luck! BMW is introducing a new holder during their Paris Showroom Event. These optional holders should save the consumer a few bucks and avoid using other misfitted and awkward units. 2. IE 9 review As discussed in Episode 57, Steve provides an in-depth look into the features and functions of IE 9 Beta. Items such as Pinned Sites, Performance Advisors, and Download Manager are on the table. But what is Steve's favorite element of IE 9. Listen in and find out. Our listeners provide feedback as well. From Facebook Fans: Robert: I have. Tons better than IE8, but still has some quirks. Some pages simply don't load correctly. Especially pages that have fields that need input. Mathew: lookin a lot like chrome to me but it looks nice id say it performs better than 8 for sure WOT: Though I'm on a Mac's I did test it in a VM. Certainly the best IE yet but what I like is IE finally conforms to W3C standards Mathew: that is very nice one site fits all WOT: So true! Eventually no more separate CSS code for IE. Eventually. We still write to e IE6 compatible. Ugh. 3. IE 9 Architect The Waves of Tech crew is noticing a trend. Everytime a architect or engineering hits the pinnacle of success at a company, he or she jumps ships to another company. The head IE 9 architect is now employed by Google. 4. IBM's “Battery 500 Project” IBM is in the process of using Lithium-Ion battery technology to create a battery with nearly 500 miles per charge cycle. This new battery is called “Lithium Air.” IBM hopes to cash in on the movement in China that calls for 50% of their vehicles to be battery operated by 2020. What do Steve and Dave think of the possibility of this technology being introduced into the US car industry? 5. Facebook Phone? What is Facebook up to now?!?! There have been questions swirling the tech world that Facebook is getting ready to manufacture a phone. Are they attempting to saturate the social media platform? Steve and Dave discuss the implications of more cell phone options and whether Facebook should really venture into this market.
While at Tech Ed Australia, Richard caught up with Chris Jackson to talk about the latest problem in application compatibility - web applications dependent on IE6. When released ten years ago, IE6 was a paragon of web standards, but the world has moved on and now IE6 is a pariah. Chris talks about how web applications dependent on IE6 are actually blocking XP to Windows 7 upgrades, but that ultimately the reason to move your applications off IE6 is a web standards issue.
The US Government say it's legal to Jailbreak, why does broadband speed vary so much and will the UK Government switch from IE6?
Melodi Grand Prix, Seagate HDD Hybrid, IE6 support, Pac-Man 30 år, Windows 3.0 20 år, Linux Mint 9 "Isadora", Facebook personvern, Google Chrome 5 lansert, Sony med bøyelig OLED skjerm, Apple større enn Microsoft, Ny 3Dmark annonsert av Futuremark, iPad launch i flere land, MeeGo, Opera 10.60 Alpha 1, Call of Duty Black Ops Medvirkende: Einar Holten og Jan Espen Pedersen Gikk direkte: 31 mai 2010 kl 21:30-22:46
Hints and tips for media appearances, speaking and social media. This week; Me, Sven and Two Showgirls; An Award; Off to Spain; A Funeral for IE6; RBS; Now you're here; Fight or Flight?; What's it all for?; An Interview with Phil Hall; Music from Eamonn O'Connor
CG Realism iPhone 4G Parts Netflix HD Streaming iPhone being compared to IE6
Here are the shownotes for episode #53 for the Global Geek News Podcast: Stories: * E-reader owners buy more books * New York Times will start charging for online news in 2011 * Microsoft asks users to dump IE6, XP because of security problems * Microsoft merges Zune Software and Xbox teams * Microsoft may drop points system from Xbox, Zune * Study: Gamers have bigger brains, better learners * Kids less happy as they are more plugged in to music/tv/web? * Larry and Sergey plan to give up control of Google * Judge cuts P2P lawsuit damages by 97% * Court: WHOIS privacy is illegal for spammers * Hulu considering $5/mo charge for older episodes Tips of the Week: * 10 blog topics that anyone can use * 18 blog tips that will help you succeed in 2010 Fan Global Geek News on Facebook and follow it on Twitter! Host: Jeremy Bray & Wesley Faulkner For more news, check out the Global Geek News Blog
Here are the shownotes for episode #53 for the Global Geek News Podcast: Stories: * E-reader owners buy more books * New York Times will start charging for online news in 2011 * Microsoft asks users to dump IE6, XP because of security problems * Microsoft merges Zune Software and Xbox teams * Microsoft may drop points system from Xbox, Zune * Study: Gamers have bigger brains, better learners * Kids less happy as they are more plugged in to music/tv/web? * Larry and Sergey plan to give up control of Google * Judge cuts P2P lawsuit damages by 97% * Court: WHOIS privacy is illegal for spammers * Hulu considering $5/mo charge for older episodes Tips of the Week: * 10 blog topics that anyone can use * 18 blog tips that will help you succeed in 2010 Fan Global Geek News on Facebook and follow it on Twitter! Host: Jeremy Bray & Wesley Faulkner For more news, check out the Global Geek News Blog
After Google's entry into to Microsoft territory, Microsoft has announced a web version of Microsoft Office 2010. It matches and as Saket mention trumps Google Docs in a few ways. In other news, Facebook never disappoints in finding new ways to get itself into privacy trouble.This time it's for using user photos in ads that are being served on facebook, Amazon didnot want to get left behind in pissing off its clients and decided to delete a book sold to Kindle users. Other stories include Pirate bay's new business model, Youtue dumping IE6, and Apple kills Palm pre support.
After Google's entry into to Microsoft territory, Microsoft has announced a web version of Microsoft Office 2010. It matches and as Saket mention trumps Google Docs in a few ways. In other news, Facebook never disappoints in finding new ways to get itself into privacy trouble.This time it's for using user photos in ads that are being served on facebook, Amazon didnot want to get left behind in pissing off its clients and decided to delete a book sold to Kindle users. Other stories include Pirate bay's new business model, Youtue dumping IE6, and Apple kills Palm pre support.
With the growth of interactivity in web applications we are pushing Javascript to its limits, not to mention the limits of HTML and CSS. And so we spend our days resorting to Flash, waiting for that distant time when browser support for CSS3 will come to our rescue and allow us to create the UIs we dream of. But this is not the way it has to be: there is a little known secret weapon right here in most modern browsers. Yes, even in IE6. Dmitry Baranovskiy is here to tell you about Canvas, SVG and VML. Come along and be amazed by standards based UI wizardry you can start implementing in projects right here, right now. Dmitry has over 8 years experience in creating web applications. Having started as a back end developer, more recently he has changed his orientation to front end development and even pure design. These days he spends his working hours trying to embrace a wide range of front end technologies while working as a UI Developer for Atlassian. He is also the creator of Optimus, the Microformats transformer, as well as a Microformats based conference scheduler creator. At any given moment he is always working on three secret projects, though no one knows where he gets the time for any of this. Licensed as Creative Commons Attribution-Share Alike 3.0 (http://creativecommons.org/licenses/by-sa/3.0/).
・So-netがJustNetを買収 ・HPがCompaqを吸収合併 ・MSがPcket PC 2002を発表 ・米司法省がMS分割を断念 ・ニフティーフォーラム訴訟 2審はシスオペの責任認めず ・Yahoo!BB予約は100万、開通は4万 ・Yahoo!BBで接続トラブル対策にReachDSL ・フレッツADSLで固定IPサービス ・IE6シェア拡大 ・日本テレコムとJR東日本が東京駅で無線LAN実験 ・WinMEでY2K(2001年9月9日問題) ・TurboLinux7workstaion製品発表会 ・DocomoがFOMAサービスを10月に開始 ・サーカムの猛威がまだまだ、さらにコード・ブルーも 後半は、CompaqやJustNetについての考察
・So-netがJustNetを買収 ・HPがCompaqを吸収合併 ・MSがPcket PC 2002を発表 ・米司法省がMS分割を断念 ・ニフティーフォーラム訴訟 2審はシスオペの責任認めず ・Yahoo!BB予約は100万、開通は4万 ・Yahoo!BBで接続トラブル対策にReachDSL ・フレッツADSLで固定IPサービス ・IE6シェア拡大 ・日本テレコムとJR東日本が東京駅で無線LAN実験 ・WinMEでY2K(2001年9月9日問題) ・TurboLinux7workstaion製品発表会 ・DocomoがFOMAサービスを10月に開始 ・サーカムの猛威がまだまだ、さらにコード・ブルーも 後半は、CompaqやJustNetについての考察
・X-BOX 2002/2/22に発売延期 ・フレッツADSL値下げ ・Yahoo!BB9/1サービス開始 ・スピードネットが光有線接続 ・IE6.0ダウンロード開始 ・日本語ドメインIE5以降のみでスタート ・IIS最新パッチ 対CodeRed ・スカイパーフェクTVがブロードバンド向けコンテンツ配信を ・Lモードで不具合 ・Linux world ・2ちぇんねる売ります? ・東芝が工場3割閉鎖、ゲートウエイの日本撤退 ・米EAのマジェスティックという仮想現実ネットワークゲーム 後半は・・世はIT不景気!なのに不足するITエンジニア そこにはどんなジレンマが???
・X-BOX 2002/2/22に発売延期 ・フレッツADSL値下げ ・Yahoo!BB9/1サービス開始 ・スピードネットが光有線接続 ・IE6.0ダウンロード開始 ・日本語ドメインIE5以降のみでスタート ・IIS最新パッチ 対CodeRed ・スカイパーフェクTVがブロードバンド向けコンテンツ配信を ・Lモードで不具合 ・Linux world ・2ちぇんねる売ります? ・東芝が工場3割閉鎖、ゲートウエイの日本撤退 ・米EAのマジェスティックという仮想現実ネットワークゲーム 後半は・・世はIT不景気!なのに不足するITエンジニア そこにはどんなジレンマが???
Carl and Richard talk to Scott Allen about Modernizr, an open-source JavaScript library that helps you build the next generation of HTML5 and CSS3-powered websites by reporting browser features. Scott talks about how Modernizr focuses on actually testing for the availability of features on a browser, rather than just relying on the browser useragent and a browser capabilities file. Along the way there is plenty of IE6 bashing. Support this podcast at — https://redcircle.com/net-rocks/donations