text:
Free CRM Trial
Hampus Jakobsson of Brisk and TAT
Founder Coffee episode 023
I'm Jeroen from Salesflare and this is Founder Coffee.
Every two weeks I have coffee with a different founder. We discuss life, passions, learnings, … in an intimate talk, getting to know the person behind the company.
For this twenty-third episode, I talked to Hampus Jakobsson, co-founder of Brisk.io and The Astonishing Tribe, and now Partner at BlueYard.
Hampus started with a group of friends in a dorm room and quickly embarked on an epic journey, sailing where the wind would blow.
He made user interfaces for the big phone manufacturers, sold his company to BlackBerry for $150 million, worked there in mergers and acquisitions, started angel investing (in now 90+ companies), launched a new software startup to get more experience at raising money and is now at the other side of the table, investing in tech startups that are about to change the world.
We theorize about how the world works, about the two different stages of a startup, the state of venture capital, work-life balance, and why you should not build someone else's company.
Welcome to Founder Coffee.
Prefer listening? You can find this episode on:
iTunes / Apple Podcasts
Jeroen: Hi Hampus, it's great to have you on Founder Coffee.
Hampus: Great to be here.
Jeroen: You are currently a VC at BlueYard but formerly you were a Founder at The Astonishing Tribe, and then at Brisk.io. Normally I ask people to introduce the company or where they are but maybe you can introduce the three of them very quickly, to kind of give us an overview of your journey?
Hampus: Of course. When I was young, in university, I started a company with five of my friends, which we literally stumbled into. There were six friends actually. I was working at an arts company in London as an intern. I got back and with one of my friends then, using the inspiration I got from there, we were able to build a big arts installation. We were like, "Whoa, that's great, but we probably have to start a company to invoice that." Another two friends were building a consultancy doing image recognition and video stuff. They wanted to start a company around that. Another friend was working with special effects for movies, and we were all really close friends. We just said, "Hey, let's just start this company together," even though we were doing three completely different things.
Jeroen: What was the company exactly about? It was about arts?
Hampus: It was something completely crazy. Think about this like, dorm-room, completely random stuff. Everything was about, essentially, experiences, like video compression technology, arts, special effects for movies. Everything and the kitchen sink. We started this as a hobby project while in university and then started having a lot of fun. We were doing great and invoicing customers, and spent a lot lesser time at the university than we probably should have sometimes. Then what happened was that a friend of ours pinged us and said, "Oh, I'm working at Sony, and Sony and Ericsson just merged. We're building a mobile phone." And we had actually worked quite a long time in computer arts. that's why we did these activities.
Hampus: So he said, "Oh, can you help us build the first products for the mobile phone and get the software for that?" We just said, "No way!" Because we had worked for the gaming start-up before mobile gaming started up and we just felt mobile phones in 2001, that's never going to come anywhere. Mobile phones and touch screens were getting smaller and smaller. But this guy was like, "Hey, save my ass." So we said, "Okay, sure. We'll help you out." And we started talking to them and came into the first meeting and we had built a prototype for them.
Hampus: They come in, they look at we did and they say, "Wow, how much is this? Can we license it." We had no idea what that amounts to, so we said, "Yep, it's 40,000 Euros." And they were like, "Yeah, per mobile phone model?" We just said, "What? Yes, yes. Exactly." So that was it. The company turned from this dorm room craziness to something very focused on one thing, which was mobile user interfaces and the software to empower that. Essentially, everything you see on your phone, which is now the menu system or the popups or the notifications and everything – the operating system essentially, the top layer of it.
Hampus: What we did is that we licensed this software to Motorola, Samsung, Sony Ericsson, Nokia, all of those kind of players, and they paid us crazy money, like five million Euros per year. But it took forever to sell to these companies. We ended up designing the user interface for Android, for lots of Orange projects, Vodafone, Disney, lots of different things. And we didn't raise money because, hey, remember, this is a dorm room crazy company that does everything.
Hampus: 2010 we were 180 people in Sweden, Korea, the US, and then some people in Taiwan and Japan. And then BlackBerry came out of nowhere and said, "Hey, we would like to acquire you." BlackBerry then, 2010, you might not remember it now, but they were the leading smartphone manufacturer in the world. We'd never met with them, but they were essentially the only ones except Apple that had started tinkering with it, who did really impressive work with smartphones. Got an offer by them, $150 million. We didn't have venture capital, so it was completely crazy.
Hampus: And then I worked two years from BlackBerry doing M&A, which means acquiring companies, which was very, very interesting. I'm on the other side of the table. Suddenly, I get to see all these companies going like, "Oh, they're presenting themselves pretty strangely," or "They don't understand corporates. Why are they doing this and that?"
Hampus: After two years there, I decided to start another company. So I started Brisk for multiple reasons. I had angel invested quite a lot, and I felt quite painfully that I didn't know the ventures world. I didn't know how to raise money because I'd never done that. And the other thing is that I was so interested in figuring out how to help people to do data-driven decision-making because I'd just seen how corporates are pretty bad at working with data to decide stuff.
Hampus: Me and one of the other founders of TAT, we started this company, raised two million dollars, and started building after a couple of micro pivots around it. We started building this sales tool that took in data from the CRM, the calendar, the emails, all the small data around the salesperson, and made a recommendation to them to sell. Either I'm like, "Hey, you forgot Colin at AT&T. It's another opportunity with CRM." And then either the salesperson said, "Okay, I'll call Colin." or the salesperson is like, "AT&T, that's a lost opportunity." Either they pushed the deal forward or they updated the CRM data. Essentially, it felt like a great idea.
Hampus: What was not a great idea was the complex onboarding on top of another CRM system like Salesforce. What ended up happening is even though we signed really nice customers like LinkedIn, Intercom, BoostSuite, Evernote, lots of nice American big companies who really liked the product, the onboarding was very, very complicated. We ended up selling the company for peanuts and legal fees and handed out money to investors.
Hampus: Then I started an angel group. I started a startup community. I started an accelerator. And after that, I joined BlueYard which is a venture fund that invests in infrastructure around a couple of different theses, But I would generally say it's about lot of things trapped in silos right now. Data's trapped in silos and even work, you have to have certain skills. For example, electricity or anything is trapped in the old way of doing it, and BlueYard essentially is about lowering these hedges that offer tools for the new labor economy. Tools for liberating data out of the internet or tools for easy communication. And not like web conferencing or startups, but essentially thinking about stuff like net neutrality or the Chinese firewall or just data being trapped in strange places like big pharma, where they're actually not helping the society.
Hampus: That's where I work today, and I really, really enjoy it.
Jeroen: That's a serious journey, and it seems that it's a journey that you didn't really think through from the start. It sort of happened, right?
Hampus: Completely planned. No, I was kidding.
Hampus: I believe in planning, but I don't believe in executing the plan you planned. I think that everybody should sit back, journal, plan the week, have the goals for the year, all of that. But I think that if we believe that we're going to follow the plan, we can only do things that are obvious. Christopher Columbus could never have found America if he was going after finding America.
Hampus: I think the reason Christopher Columbus found America was that he wanted to get a shorter path to India, and I think what he did was he pitched the idea to the Portuguese royalty saying, "Hey, you've seen all these traders going around Africa, and you've seen all these gradual improvements of 5% year-by-year, they're getting slightly faster, bigger ships, yada yada. But we have this great idea that if we go west, it is going to be much, much faster. It's much higher risk, but it's going to go faster. And we found this actual thing that another guy found a couple of years earlier, but this wind is going to work. And we're getting to India. This is a high bet. If it works, it's going to be 10X faster, 100X better". And I think that if he would have said, "We're going to find America," he would never have found it.
Hampus: I think the thing is if people plan their life and meticulously implement that plan, they're not going to get there. But people who act like a sailboat on the sea, that goes where the wind blows, they're not going to get anywhere either.
Hampus: I really believe in creating plans and thinking stuff through and essentially, creating an operating system for life thinking, "What do I want to achieve? How do I want to achieve it? Why do I want to achieve it?" So that suddenly, when an opportunity comes knocking, you can think about it.
Hampus: Is this the big direction I want to go? And if it is, then let's lean in. If it's not in the big direction, I go, "I'm going to say no." If somebody said, "Hey, do you want to do an internship at The Economist?" If you want to go into that kind of world, yes. If you hate the idea, then just say no, and no angst. The day after, you did what your "plan" told you, but if you had a plan that said, "I want to work at The Economist," I would tell you that most of the time you're going to be very sad.
Jeroen: So how do I need to imagine that? Do you have some kind of mission in mind or is it just based on some sort of intuition?
Hampus: The way that I implement it is I very much create a direction. I start by creating a plan of exactly what I want to do. Like, "I want to do this, that, this, that, this, that." And then I start and try to zoom out of that and ask myself, "What does that mean? Why would I want to do that?" In some of these things, I realize the goal is that I want to learn or I want to be more creative or I want to create more meaningful connections or personal health, or something like that. Then I look at that goal and realize those are actually the goals. Then I try to make those concrete.
Hampus: Instead I have four or five big goals, like personal health or connections or something, and then under those I have more examples of ways to reach that for myself. On a weekly basis, on a monthly basis, I try to pursue the things that are under the big headline because otherwise I can't just sit there and go, "Health, what to do with health?" One of the things is I try to run 20K every Sunday morning, but sometimes I fall off the horse, and I don't. I'm don't literally fall off the horse, but sometimes I don't run 20K in the mornings. So my goal is to make sure I average 10K per week all year.
Hampus: And that goal is a very concrete goal, and the sub-goal is to run 20K on Sundays. But the top goal is health which means that my goal closest to now I must complete is run 20K on Sundays. I fail that every second week, and then I go out and run an average of 10K per week, so I succeed with that goal. But then I make sure to try to run 10K as well. So I average slightly more so I can fail more often. And then I look at the big goal, which is health which is done that way. But, if I suddenly feel that running 20K would be very unhealthy for me for some reason, then maybe I should change the more concrete goal, like the zoomed in goal.
Hampus: I do this for a lot of different things, and I think that's so good. Another goal is to meet new, interesting people, and I have three or four methods of doing that. And all those methods are interchangeable, and they change over the weeks and months and quarters of the year. But the big goal I have is to really enjoy meeting interesting people with interesting ideas. How I solve that depends on the occasion.
Jeroen: It sounds like if you've been doing a lot of different things. On this path, you start off with a hobby-project that becomes a huge start-up or grows on a huge scale-up. Then you go into a corporate job, end up in a new start-up that remains small. And now, a VC fund. Do you see yourself going back to running a start-up after this?
Hampus: No, I don't think I'm going to start a start-up ever again, actually. I'll tell you the reason. My goal now, if you look at my top-line goal or the big goal I have, it is really to get to know myself, accept who I am, and be comfortable with who I am. The thing is, when I run a start-up, I really work against that goal because I am a maximizer-optimizer. It means when I run a start-up, I'm not trying to be the best of myself. I'm trying to be the best company. I start doing stuff which is super unhealthy for me. And also, not only unhealthy, but they're also not in line with the goal of getting to know myself and accept myself. They're in line with winning.
Hampus: Whereas being in a VC and as an angel investor who has invested in some 90+ companies, the good thing about that, is that it really resonates with the things I want to learn. I enjoy meeting ambitious, interesting people. That's great if you're an investor. I enjoy learning new subjects constantly. That's great if you're an investor. I enjoy massive variation, which is great. This evening I have a quantum computing company I'm talking to. Three days ago, I dived into fusion technology. I'm doing due diligence on a developer platform. I think it's just superb because my brain just has to jump from all these different subjects all the time.
Hampus: And I pair this up when running, reading series of fiction and cooking, quite a lot, which is on the other end of the spectrum. If I was running a start-up, I wouldn't cook, I wouldn't run, I wouldn't read. I would read stuff which is in line with my company. I would run to sleep well. And I really think that people who run start-ups, sadly, or maybe not, but I think that one has to really focus on one thing to really succeed with doing something really new – especially if you're trying to build an exponentially scaling company. Therefore, I just found that I end up learning less. I end up being less creative. I end up living unhealthily. And those are my goals. I love learning, and learning is not what a start-up is about. In the beginning it's about that, but after a while it's about running the business.
Jeroen: It depends on how you look at learning, I guess. I used to be a consultant previously. I had a lot of different projects, but I always felt like I was only touching the surface while now that I run a company, I really learn things deeply, and it really matters. It's another type of learning, I think.
Hampus: The thing is I think that I learned extremely much. I learned so much from both my start-ups. I don't think I've ever learned that much about so many things because, as you grow, you force yourself to having to figure stuff out. There's just, how do you need people or how do you do internet marketing or whatever. There's just so many things you actually really have to figure out. The thing I found more lately is that since I've done two start-up journeys and angel-invested in 90+ startups with the funds and joined angel committees to invest more, now when I look around me, there's somebody who is 10 times better at hardware than I am. There's somebody who is 10 times better at internet marketing and there's somebody 10 times better at leading people.
Hampus: And I started to feel more and more that if I start a new company, I would only focus on, essentially, three things. I would focus on setting the vision, recruiting the greatest people, and making sure that we have great culture and communication internally because those are the things that I could master. But everything else, I just feel like, there's somebody who is just so much better than I am. And obviously, on those three parts, there are probably people that are much better than I am as well. Very quickly I would feel, "Oh, okay. Let's take a step back."
Hampus: As an angel investor or a VC, I get to do those things and that's why I enjoy it. I get to work with the company on those three things – fund raising, communication and culture. For me, I am so happy that all these people I work with, they put up with me because I am a horrible person to work with. I really drive people crazy.
Jeroen: Do you?
Hampus: Yes, I do. I'm extremely intense. I really think things should just go so much faster. When somebody says, "We can't do this." One of my favourite jokes from a couple that I always use and now is going to be recorded, is where a man comes to a doctor and says, "Doctor, when I hold my hand like this, it hurts." And the doctor, she says, "Well, don't do that, then." The thing is that's kind of how I view it. When an entrepreneur says, "Aw, this is really painful." Then I go, "Just don't do it, then." And they go, "What do you mean?" But if you think it's painful building a company, I can tell you it's going to get worse. I haven't worked with so many companies.
Hampus: I think there are two different stages of the start-up. The pre-product market fit which is the phase when you wake up at 2:00 a.m. and ask yourself why you're doing this thing, and you have to tell your spouse, tell your best friends that it's a great idea. Not at 2:00 a.m. in the morning, hopefully, but you're sitting there like, "I'm lying to them." And you have to go to work at 8:00 a.m. in the morning and tell your investors and employees and everyone else, "You're killing it. This is a great idea." And you really don't know why you're doing it and not because of fatigue, but because it's just confusion. One customer's saying, "Yes" and another's saying, "No." One developer's happy, another is unhappy. It's just confusion.
Hampus: And then, suddenly, you get the product market fit and with product market fit, you move to the phase of waking up at 2:00 a.m. to just feeling completely insufficient. Customers are asking for the product faster than you can build it. Developers asking to hire more developers faster than you can hire developers. And things are just breaking everywhere, and you just feel, "Why am I the person running this thing?"
Hampus: Both of those phases, I love them. The first phase is essentially an artist phase. And the second is like extremely special, strangely cultural, and mental expansion and growth space. But most start-ups that I work with, they hate the first phase, and they hate the second phase. But some people I work with, they really thrive, and they create extraordinary companies.
Hampus: One thing that I think is so strange is that most people believe that the more valued company somebody runs, the smarter they are. People look at Larry Page or Elon Musk or, I don't know, Jeff Bezos, and they say, "Jeff Bezos must be the smartest person in the world," or, "Larry Page must be the smartest person in the world." No, not at all. Jeff Bezos and Larry Page, they're naturally smart otherwise they wouldn't have gotten there. They have grit, they have smarts, they have social skills, whatever is needed, maybe not social skills for all of them, but they're not linearly smarter with derivation. And I think that that's what I find so many people misunderstanding.
Hampus: I know companies that have reached a ten million dollar turnover. They're some of the smartest people I know. It's just that they were "unlucky" to get a local maximum of an idea, where someone else might be so, so smart, kind of, smarter than average and they're more gritty and ambitious than average, but they happen to land on an amazing idea completely randomly. I think that what I enjoy is not how smart people are, but seeing people grow and helping them grow. And that's really what I like.
Jeroen: Is that in growing within these two phases or growing from the one phase to the other?
Hampus: For me it's just growth. It's like mental growth. I know people that are just extraordinary in the first phase and then, suddenly, as they get in the second phase, they just don't like it anymore. And either they can do "lateral move" and become the chief innovation officer or marketing person or whatever, or they can just step out and start another company. I think that both of those are fine. The ones I think fail, personally fail, are the ones that stay as the CEOs, stay as the VP engineering, stay as the VP marketing or whatever, and they're not good at it and they become a bottleneck of the company. And they hate it, but they can't admit that they hate it because of status. I think that's the complicated thing – how do you understand that maybe you are not at your best self right now.
Hampus: That's why I think I love growth. I meet people who are going through the first phase and when they get to the second phase, they choose something new. I meet people who are struggling in the first phase a lot and then they get to the second phase, and they just flourish. And then I meet people who go through different phases and they just grow and grow and grow and grow. I like all three. I really just help people being the best of themselves. And I have many people that I meet and recommend stepping off the boat because they're going to hurt themselves. Don't do this.
Jeroen: You mentioned that you went into the VC world because you wanted to learn about raising money, being at the other side of the table. What is it that you've learned? Can you give us an example of something you've learned since you are at BlueYard?
Hampus: The learning began from I started Brisk since I'd never raised money. I really wanted to raise money so I kind of understood how that game even started. What I think I've learned is, at BlueYard particularly, is that money is seasonal. And right now, we're in a post-capital season. There are just extraordinary amounts of capital that want to invest in start-ups, beyond what anybody can believe. Look at SoftBank Vision Fund, when you see one of those funds you realize, okay, there's a lot of capital out there.
Hampus: That means that there's a new type of founder that's really needed. If you look 10 years ago, the best founders were the people who were able to create a product market fit – start crafting the product, selling it, and recruiting the first people. And then what happened 10 or 15 years ago is that you hired an external CEO to help scale the company. That's completely changed because now there's just so much capital, first of all. Also, people skills have ramped up because of the internet. People can learn so much faster.
Hampus: That means that the new kind of start-up founders are much more of people who can do the three things I said. They're great at raising money, they're great at recruiting the best people and making sure they're focused on the right things, and creating a culture of communication. The strange thing about that is that skill is not taught anywhere. I used to have a belief where the people who I wanted to invest in were the people who could craft products and get it into the hands of the early adopters.
Hampus: Now, I am much more keen on investing in people who can assemble amazing teams, who have a shared, aligned, great vision. That's just so much more interesting. I think it's because there's so much capital out there that you can create a fusion company or you can create something completely new, which I think just 10 years ago, there was just not enough capital. And, of course, these people, they have to know what they're doing. You and I can't wake up tomorrow and say, "Oh, let's do a fusion reactor." Because we are clueless on that, so we're not going to do it.
Hampus: But it used to be that. It was all about the first phase, and I think right now it's all about leadership. And the headache of that is that leadership's not something that is institutionalized. It's really hard to learn how to become a leader. Some people do leadership training in school, and that's usually really dysfunctional, or they learn the hard way, by leading people and learning from it. And I think both are sub-optimal.
Hampus: That's why I think people should start a start-up, or join a start-up because if you join a start-up when you're young, you get to see something scale and grow and you get to understand how it is to lead super intelligent, ambitious people in something that moves really, really fast. Then you have to figure out anything from remote work, culture, credit belonging, understanding OKRs, all of those things which are applicable to whatever you do. You can go work for the UN, you can go work for a library, you can go work for another start-up or start a start-up because these skills are applicable everywhere.
Jeroen: Do you think that there's something like a current climate where your second phase experts are better at? What if it all reverses?
Hampus: I think it's going back and forth. I think that there are both macro-economical reasons why start-ups are super interesting for economic reasons, I mean. So there are the macro-economic and there are cultural reasons, but then there is also the third one – people have understood that start-ups exist as an asset class, which 20 years ago didn't exist. There's plenty of proof that it's economically a really interesting idea to be an investor, like an LLP in a fund, I mean.
Hampus: The other thing is I think that there's just, right now, flush cash because of what the interest rates are. But then I think the mid one is the one I find very interesting; which is I think we've figured out that in the start-up way there are certain problems that are much, much better at being solved a certain way than being solved by big corporates or governments or research institutions. Whereas I think that 20 years ago if somebody would've told me, "Oh, there's two guys in a shed," and I mean guys as gender-neutral, "There's a guy and a gal in a shed that's going to build a fusion reactor." I would have said, "Why are they not at Oxford, Harvard, and Stanford?" And I think now I realize because the people at Oxford, Stanford, Harvard, and Yale, whatever, they would have sit there for a long while and thought about it. They're very needed in the system.
Hampus: But it's the entrepreneurs who go on a limb and take a risk to try it. Those are the people who bring things forward, and most of them fail. But some of them will solve it. And I think that methodology is much more running evolution faster, and I think we really need that as a species. I'm not saying about upgrading minds, uploading into the clouds, or anything. I just think that if we look at the way the environment looks right now, the actual environment, not the social environment, but the carbon monoxide problems and how far we are from the Paris Agreement, if we believe that government's going to solve, it's never going to happen. We need so many start-ups that look at the sustainable issues – anything from women rights, inequality, hunger, education, climate, and attack those aggressively, ambitiously, and relentlessly, and try. And nine out of ten, it's not going to work.
Hampus: The tenth, boom, wow, we figured out a way to capture carbon and store it in some interesting way, wow. And yes, did we need some great researchers? Yes. Yes, Did we need ambitious young people? Yes. Did some corporates to refine that material? Yes. But will the corporates, the government, or the research institutions actually take the leap and take the risk? No, they won't. That's why I think that most entrepreneurs think that Elon Musk is a hero because what he did, he did what everybody in the world thought was impossible but technically, I think if you would ask the professionals, I think there were many professionals who were saying, the experts, that that's very much possible. Building electrical vehicles is very much possible. Or building rockets that are much better, it's very much possible. It's just somebody has to take a risk.
Hampus: And I think that's the thing which entrepreneurs are for, it's for taking those bets, wasting the money from LPs to try and maybe creating a better planet. But then there are certain kind of companies that are not compliant with VCs that if you would scale that idea, you would destroy the idea. They should look for VCs, and VCs should look for them. There are things that if you do it better, it's going to be unsustainable. Anything from the FMCD market, like the fast-moving consumer goods market where if your whole business model is selling clothes quicker and quicker and getting people disposing their clothes to buy new ones, then that's a very bad model to build on. It's much better figuring out a circular economy, which is, of course, a bad model for the investors but is a great model for the world. There are other kinds of funds like Zebra funds that invest in Zebras instead of scale companies, and I think that's super interesting.
Hampus: All these actors should really think about what their role is in a bigger picture. Governments should much more think about how they distribute luck. That's what governments could be really good at. They should really look at, okay, luck is really unfairly distributed or unevenly distributed. Some people are born very wealthy, some people are healthy and have no problems, a random person got sick, a random person was born into a horrible situation, or anything else. Governments should make sure that luck does not happen like that. We should distribute luck. That's what the government could do. That's what they should focus on and I think they can, but they don't. They try to do all kinds of things. The governments are really bad.
Jeroen: I understand. You're basically saying that the model for start-ups, at least VC-funded start-ups is to take a lot of money, experiment, and try to make that huge leap of faith that kind of serves a role in the economy.
Hampus: Absolutely. I think that some of them, of course, create completely societally meaningless products. The problem is we have Neolithic brains that love sugar and attention and status and things, and a pretty bad self-confidence. And we have a very medieval institution. That's how we try to run the globe. And on top of that, we have a hyper-capitalist, digital economy that moves very, very fast. And those three things can create very nasty habits.
Hampus: I think Facebook, Instagram, whatever, they're really, really bad for people. But they've also created amazing things. If it wasn't for Facebook, a lot of the democracies that have been created and a lot of the new ways of learning and connecting with people, wouldn't exist. But I think that some of these things are really bad as well. I hope we're going to iron those out in the coming 10 years. I think whenever we do these leaps, for 10 years we do something really stupid. When we get brain-machine interfaces online and they work, I think we're going to have 10 very, very horrible years, but then we might find something amazing.
Jeroen: As a VC now, how does it differ what keeps you up at night? What is it that you are personally busy with? What do you worry about?
Hampus: I'm not a person that worries. I do worry, though. I think as a VC there are a couple of different things. One is I spend my time a lot more thinking about how the world will change and what is possible now that can't be possible otherwise. Anything from, "Will this thing happen now?" And there are so many levels with that. I would say there are three levels of what you can change.
Hampus: Level one is that we can move around bits in a different place. We've seen that, think Instagram, think about the pictures you uploaded recently recently, and what industries haven't we been moving around bits in. Then we have the second level which moves around the atoms, which is like, do an Uber or self-driving cars or something where we're actually thinking about moving objects around, and what industries can we think about where we can empower that field better. And the third level is moving the culture around. Can we shift and get people to view each other in a better light or transfer wealth or move inequality. With all those three levels, every minute, every year has new possibilities. Suddenly, we can do these things better. We can attack new problems.
Hampus: A lot of things I think about revolve around when people say, "We can do this," or "This happens in the world," anything from all the three levels – bits, atoms, and culture, is that it opens up my eyes and says, "Interesting." I wonder if you can apply that model in this place, or I wonder if that idea actually works now or if it's going to take another five years, or I wonder what the bottleneck would be for making sure that actually works. I think a lot about that, and I really love that.
Hampus: But what keeps a lot of investors awake at night is that they've found, which is the boring part of how a lot of investors work, is you find something really amazing and you want to invest in it and you realize that other people realize it's amazing too. So you need to move very, very fast and you need to create an internal conviction that this is a great idea. That's a thing where you need to rush and stress and have night calls until 2:00 a.m. in the morning which nobody likes because it hurts the other part. When you have calls in the morning, your frontal lobe starts treading off, and you behave like a stupid teenager or kid or an animal. But at the same time, sometimes you need to sprint.
Jeroen: Do you mostly focus on the beginning part of the investment process?
Hampus: I do all parts. I do anything from meeting companies randomly to doing due diligence to helping out deciding to invest to doing deep diving in analytics.
Jeroen: But there's less stuff keeping you up at night lately?
Hampus: Yes, absolutely. There's normal things that keep me up at night. I think what keeps all humans up at night. I have three kids, I have other interests. Random stuff happens to make me wake up in the night.
Jeroen: You mentioned that you would have very unhealthy habits as a start-up founder, but that changed as a VC. How can we imagine the difference?
Hampus: The strange thing about a VC is that if I would spend all the time doing one thing, helping one company, you would probably do the wrong thing. Once in a blue moon you invest in a company that you realize you should probably put all your eggs in that basket, but I would say that probably doesn't happen. That means if I meet an amazing company and I get to invest in them and know how to help them scale, I will start spending four days a week helping them do that. The fund is going to be horribly bad because it's going to be a really high risk – what if this company didn't work, and the fund is going to fail?
Hampus: That means in the beginning I might help them to correct and figure out the course and recruit. But very early on, I have to start looking for new companies and building new theses. The way to optimize essentially is to be balanced, and the other thing I've learned is that I think with the years that have gone by, this might sound really stupid and cliche, I've gone from working hard to working smart.
Hampus: I know when I did my first company I just put in the hours. I could easily work 80 hours a week and thought that was a great idea. Now I know that it's extremely stupid to work 80 hours, and no one should brag about working 80 hours. People should say, "I'm working 80 hours and I'm trying to quit," because when you're working 80 hours, you're being super stupid, usually. You don't know what you're doing. You're working like a machine, and I think it's super important to figure out those balances. And the more you're a start-up, the more it actually sometimes makes sense to work 80 hours because there are just so many things to do. So, you're just rushing a task, you know exactly what to do, and you try to do it as fast as possible and with as good a quality as possible.
Hampus: Thing with investments is investments is something where there are a couple of sprints here and there, but a lot of it is a marathon. First of all, you have to keep doing it year after year. The other thing is it's quite intellectual. You have to really think about whether you believe in this thing, and you have to be very good at reading people and figuring out if these people are bullshitting or if these people are right. If I'm tired and irritated, I'm either going to no investments or bad investments. I have to stay very balanced. I have to think about what I believe about the world, which I think is extremely interesting, but it's also, of course, hard work in other sense.
Jeroen: What does staying balanced exactly mean for you? How do you do that? Is that mostly by running on Sundays or are there other ways?
Hampus: I think there are many, many ways I try to do this. I'm pretty bad at it. You don't need to try something. It happens naturally, right? The reason I tried it is because I'm bad at it. I have a lot systems, so I look at my calendar and try to make sure that my calendar has a balanced calendar – that I have enough information retrieval, that I have enough thinking, that I have enough documentation, that I have enough decision-making, that I have enough collaboration. I try to make sure that if I have a week which is just about grinding, I know that's going to be maybe a great week, but the week after is going to be pretty bad because I'm going to start becoming stupid pretty quickly.
Hampus: A method I usually use is to color my meetings. I have different colors, and I can just look at my calendar and go, "Oh, my calendar is almost completely blue-yellow. I have no purple. I have no green. That's pretty stupid." And then I start to fix that. For instance, next week I would try to cancel meetings if I can and move them around, but then the following week I try to course-correct to make sure they're more even. I don't have the perfect methodology of 20% this and 50% of that. It's more like a hunch looking at it; that this is not going to be good. And some of those things are running, meditation, mindfulness, reading, blah blah blah, but some of them are just meeting new people or documenting what I believe, writing blog posts.
Hampus: I have a very healthy relationship with my blog. I think about something, and I write a blog post to try to think it through. Almost all the blog posts I've written are either for myself or they're for a founder who I've been talking to about the subject for a long time. And instead of just saying half-thought-through things, I force myself to write something so I actually have to think it through. When I give them that or give myself that, I find it to be so different. I could really see through things better, and it enriches me for a long time.
Jeroen: I see. So slowly wrapping up and further thinking things through and thinking about the world, what are the some of the latest good books you've read and why did you choose to read them?
Hampus: I have two kinds of books I read, two kinds of books I guess people read, fiction and textbooks. I read a lot of fiction books. I really enjoy reading fiction. I think it's an amazing way of seeing the world through other people's eyes, and I think it's an amazing way of thinking of things I've never thought about. But, of course, I think textbooks are really great because textbooks also distill that viewpoint in a much more solidified version because it's a framework – a standard one. On fiction, I read massive amounts of really great fiction. Last year I had 40-45 fiction books. I think 10 of them were amazing. But in textbooks, I think they are completely different.
Hampus: There are books I think a lot of people should be reading which are about scaling life, becoming a better person. I think Finite and Infinite Games is an extraordinary book about how life works. I think The Obstacle Is the Way is an amazing book about how to attack problems and how to not be too sad about stuff. I really like the Righteous Mind, which is essentially how to understand people with very different morales than you. Surprisingly, I liked Atomic Habits, which I thought would be a pretty horrible book, but I really liked it, actually. I really felt that I learned something from all those books.
Hampus: I think that on the fiction side, first of all, I really like them. But I think there are certain books that teach us things we've never seen or thought. I really, really love, for example, A Little Life, and I think a lot of entrepreneurs should read A Little Life because it's really a book about ambition, and how ambition really hurts, and how complicated it is to be very ambitious. And then I think that there are interesting science fiction books that treat very interesting technical possibilities in the future like Three-Body Problem or Ancillary Justice or the Bobiverse Series or Fifth Season, which I think all explore a future with a technical mindset or culturally new mindset, which I think are interesting.
Hampus: So I would say reading is amazing and people should just go to Goodreads and read books that are rated more than four and then find something they like about it.
Jeroen: Definitely.
Hampus: I think everybody in the world should read The Golden Compass, because The Golden Compass is one of the best books ever written.
Jeroen: I'll add it to my Goodreads list.
Hampus: It's a young adult book, so I'm warning you.
Jeroen: Excuse me?
Hampus: It's a young adult book. You should read it.
Jeroen: Cool. I'll certainly do that. Final thought now, if you had one best piece of advice you had to give start-up founders, what would it be?
Hampus: Build the company you really want to build. What I mean by that is I think I meet so many founders that are stuck in a world where if the company succeeds they're not going to be happy because they don't want to work at that company because they would hate working for a company that was like that, if they got employed. If the company fails, they're going to be super sad because it's horrible to fail a company. Instead, I would say much rather take high risks and build a company you really want to work with, work at forever, because if you're able to create that company, it doesn't matter. You're either going to learn stuff you want to learn or you're going to be successful building the company and then going to be super happy because you can work at that company.
Hampus: And don't build someone else's company. Don't care what your parents, what your friends, what your VCs say. Build a company you want to build, but then be clearly communicating about that company so people don't get disappointed with you or angry at you. Figure that out. Build the company you want to build.
Jeroen: Definitely agree. Thank you again, Hampus, for being on Founder Coffee. It's really great to have you.
Hampus: Thanks, Jeroen. Bye.
Enjoyed it? Read Founder Coffee interviews with other founders. ☕
We hope you liked this episode.
If you did, review us on iTunes!
For more hot stuff on startups, growth and sales
👉 subscribe here
👉 follow @salesflare on Twitter or Facebook
Jeroen Corthout
Co-Founder at Salesflare
I'm Co-Founder of Salesflare, the simply powerful CRM for small businesses. I love growth, automating sales, and building beautiful products.
Latest posts by Jeroen Corthout (see all)
Omer Molad of Vervoe - July 2, 2019
Allan Wille of Klipfolio - June 11, 2019
Chris Savage of Wistia - May 21, 2019
Like it? Share it ❤
You might also like 👇
© 2019 Salesflare Blog All rights reserved


text:
package org.wso2.developerstudio.eclipse.gmf.esb.diagram.custom.provider;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.wso2.developerstudio.eclipse.gmf.esb.EsbFactory;
import org.wso2.developerstudio.eclipse.gmf.esb.NamespacedProperty;
import org.wso2.developerstudio.eclipse.gmf.esb.diagram.custom.configure.ui.XPathSelectorDialog;
import org.wso2.developerstudio.eclipse.gmf.esb.diagram.validator.XpathValidator;
import org.wso2.developerstudio.eclipse.logging.core.IDeveloperStudioLog;
import org.wso2.developerstudio.eclipse.logging.core.Logger;
import org.wso2.developerstudio.eclipse.gmf.esb.diagram.Activator;

/**
 * A SWT based editor dialog to be used for editing namespaced properties.
 */
public class ExpressionPropertyEditorDialog extends Dialog {
    /**
     * Dialog shell.
     */
    private Shell dialogShell;

    /**
     * Group box for separating property value edit area.
     */
    private Group propertyGroupBox;

    /**
     * Text field used for manipulating property value.
     */
    private Text propertyTextField;

    /**
     * Button used to fire up the xpath editor.
     */
    private Button selectXpathButton;

    /**
     * Group box for separating namespaces edit area.
     */
    private Group namespacesGroupBox;

    /**
     * Namespace 'Prefix' label.
     */
    private Label nsPrefixLabel;

    /**
     * Namespace prefix text field.
     */
    private Text nsPrefixTextField;

    /**
     * Namespace 'URI' label.
     */
    private Label nsUriLabel;

    /**
     * Namespace URI text field.
     */
    private Text nsUriTextField;

    /**
     * Namespace list box.
     */
    private List nsListBox;

    /**
     * Add namespace button.
     */
    private Button addButton;

    /**
     * Edit namespace button.
     */
    private Button editButton;

    /**
     * Remove namespace button.
     */
    private Button removeButton;

    /**
     * Cancel button.
     */
    private Button cancelButton;

    /**
     * Ok button.
     */
    private Button okButton;

    /**
     * {@link NamespacedProperty} being edited.
     */
    private NamespacedProperty nsProperty;

    /**
     * Group box for separating json path and xpath selection area.
     */
    private Group expressionTypeSelectionGroupBox;

    /**
     * Combo box select expression type from json path and xpath.
     */
    private Combo expressionTypeSelectionComboDropDown;

    /**
     * Xpath or JSON path selection label.
     */
    private Label expressionTypeSelectionLabel;

    /**
     * Group box for text field for JSON path.
     */
    private Group jsonPathGroupBox;

    /**
     * Text box input for JSON path.
     */
    private Text jsonPathTextField;

    /**
     * Namespaces collected.
     */
    private Map<String, String> collectedNamespaces;

    /**
     * Format string used for displaying namespaces.
     */
    private static final String namespaceDisplayFormat = "xmlns:%s=\"%s\"";

    /**
     * Regex pattern used to identify a namespace string.
     */
    private static final Pattern namespaceDisplayPattern = Pattern.compile("xmlns:([^=]++)=.*+");

    /**
     * Status indicating whether this dialog was saved or cancelled.
     */
    private boolean saved;

    private String XPATH = "XPath";

    private String JSON_PATH = "JSON Path";

    private static IDeveloperStudioLog log = Logger.getLog(Activator.PLUGIN_ID);

    /**
     * Constructs a new dialog.
     *
     * @param parent parent shell.
     * @param style style.
     * @param property namespaced property to be manipulated.
     */
    public ExpressionPropertyEditorDialog(Shell parent, int style, NamespacedProperty property) {
        super(parent, style);
        this.nsProperty = property;
        this.collectedNamespaces = new HashMap<String, String>();
    }

    /**
     * Main function used for testing purposes.
     *
     * @param args arguments.
     */
    public static void main(String[] args) {
        Shell shell = Display.getDefault().getActiveShell();
        ExpressionPropertyEditorDialog dialog = new ExpressionPropertyEditorDialog(shell, SWT.NULL,
                EsbFactory.eINSTANCE.createNamespacedProperty());
        dialog.open();
    }

    /**
     * Creates ui components and opens the dialog.
     */
    public void open() {
        Shell parentShell = getParent();
        dialogShell = new Shell(parentShell, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);

        // Configure dialog shell internal layout.
        FormLayout dialogShellLayout = new FormLayout();
        dialogShellLayout.marginHeight = 5;
        dialogShellLayout.marginWidth = 5;
        dialogShell.setLayout(dialogShellLayout);

        // Configure expression type selection group box and child elements
        expressionTypeSelectionGroupBox = new Group(dialogShell, SWT.NONE);
        {
            expressionTypeSelectionGroupBox.setText("Expression Type");
            FormData groupLayoutData = new FormData();
            groupLayoutData.top = new FormAttachment(0);
            groupLayoutData.left = new FormAttachment(0);
            groupLayoutData.right = new FormAttachment(100);
            expressionTypeSelectionGroupBox.setLayoutData(groupLayoutData);

            // Configure group box internal layout.
            FormLayout xpathAndJsonBoxLayout = new FormLayout();
            xpathAndJsonBoxLayout.marginWidth = 5;
            xpathAndJsonBoxLayout.marginHeight = 5;
            expressionTypeSelectionGroupBox.setLayout(xpathAndJsonBoxLayout);

            // Configure expression type selection label
            expressionTypeSelectionLabel = new Label(expressionTypeSelectionGroupBox, SWT.NONE);
            expressionTypeSelectionLabel.setText("Select the Expression type:");
            FormData labelLayoutData = new FormData();
            labelLayoutData.top = new FormAttachment(0);
            labelLayoutData.left = new FormAttachment(0);
            expressionTypeSelectionGroupBox.setLayoutData(labelLayoutData);

            // Configure expression type selection combo box
            expressionTypeSelectionComboDropDown = new Combo(expressionTypeSelectionGroupBox,
                    SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY);
            expressionTypeSelectionComboDropDown.add(XPATH);
            expressionTypeSelectionComboDropDown.add(JSON_PATH);
            // Select XPath as the default option
            expressionTypeSelectionComboDropDown.select(0);

            // Format the combo box layout
            FormData comnboButtonLayoutData = new FormData();
            comnboButtonLayoutData.left = new FormAttachment(expressionTypeSelectionLabel, 15);
            comnboButtonLayoutData.right = new FormAttachment(100);
            comnboButtonLayoutData.top = new FormAttachment(-15);
            expressionTypeSelectionComboDropDown.setLayoutData(comnboButtonLayoutData);

        }

        // Construct and layout JSON path edit box.
        jsonPathGroupBox = new Group(dialogShell, SWT.NONE);
        {
            jsonPathGroupBox.setText("JSON Path");
            FormData jsonPathBoxLayoutData = new FormData();
            jsonPathBoxLayoutData.top = new FormAttachment(expressionTypeSelectionGroupBox, 5);
            jsonPathBoxLayoutData.left = new FormAttachment(0);
            jsonPathBoxLayoutData.right = new FormAttachment(100);
            jsonPathGroupBox.setLayoutData(jsonPathBoxLayoutData);

            // Configure group box internal layout.
            FormLayout groupBoxLayout = new FormLayout();
            groupBoxLayout.marginWidth = 5;
            groupBoxLayout.marginHeight = 5;
            jsonPathGroupBox.setLayout(groupBoxLayout);

            // JSON path editor text field.
            jsonPathTextField = new Text(jsonPathGroupBox, SWT.BORDER);
            FormData textFieldLayoutData = new FormData();
            textFieldLayoutData.right = new FormAttachment(100);
            textFieldLayoutData.top = new FormAttachment(0);
            textFieldLayoutData.left = new FormAttachment(0);
            jsonPathTextField.setLayoutData(textFieldLayoutData);
        }
        // This implementation selects XPath as the default value, so it is need to hide the json path group box
        jsonPathGroupBox.setVisible(false);

        // Construct and layout property edit box.
        propertyGroupBox = new Group(dialogShell, SWT.NONE);
        {
            propertyGroupBox.setText("Property");
            FormData groupBoxLayoutData = new FormData();
            groupBoxLayoutData.top = new FormAttachment(expressionTypeSelectionGroupBox, 5);
            groupBoxLayoutData.left = new FormAttachment(0);
            groupBoxLayoutData.right = new FormAttachment(100);
            propertyGroupBox.setLayoutData(groupBoxLayoutData);

            // Configure group box internal layout.
            FormLayout groupBoxLayout = new FormLayout();
            groupBoxLayout.marginWidth = 5;
            groupBoxLayout.marginHeight = 5;
            propertyGroupBox.setLayout(groupBoxLayout);

            // Xpath editor launch button.
            selectXpathButton = new Button(propertyGroupBox, SWT.NONE);
            selectXpathButton.setText("Select XPath");
            FormData selectXpathButtonLayoutData = new FormData();
            selectXpathButtonLayoutData.right = new FormAttachment(100);
            selectXpathButtonLayoutData.top = new FormAttachment(0);
            selectXpathButton.setLayoutData(selectXpathButtonLayoutData);

            // Property editor text field.
            propertyTextField = new Text(propertyGroupBox, SWT.BORDER);
            FormData textFieldLayoutData = new FormData();
            textFieldLayoutData.right = new FormAttachment(selectXpathButton, -5);
            textFieldLayoutData.top = new FormAttachment(selectXpathButton, 0, SWT.CENTER);
            textFieldLayoutData.left = new FormAttachment(0);
            propertyTextField.setLayoutData(textFieldLayoutData);
        }

        // OK button.
        okButton = new Button(dialogShell, SWT.NONE);
        {
            okButton.setText("OK");
            FormData okButtonLayoutData = new FormData();
            okButtonLayoutData.right = new FormAttachment(100);
            okButtonLayoutData.bottom = new FormAttachment(100);
            okButtonLayoutData.width = 80;
            okButton.setLayoutData(okButtonLayoutData);
        }

        // Cancel button.
        cancelButton = new Button(dialogShell, SWT.NONE);
        {
            cancelButton.setText("Cancel");
            FormData cancelButtonLayoutData = new FormData();
            cancelButtonLayoutData.top = new FormAttachment(okButton, 0, SWT.CENTER);
            cancelButtonLayoutData.right = new FormAttachment(okButton, -5);
            cancelButtonLayoutData.width = 80;
            cancelButton.setLayoutData(cancelButtonLayoutData);
        }

        // Construct and layout namespace edit box.
        namespacesGroupBox = new Group(dialogShell, SWT.NONE);
        {
            namespacesGroupBox.setText("Namespaces");
            FormData groupBoxLayoutData = new FormData();
            groupBoxLayoutData.top = new FormAttachment(propertyGroupBox, 5);
            groupBoxLayoutData.left = new FormAttachment(0);
            groupBoxLayoutData.right = new FormAttachment(100);
            groupBoxLayoutData.bottom = new FormAttachment(okButton, -10);
            namespacesGroupBox.setLayoutData(groupBoxLayoutData);

            // Configure group box internal layout.
            FormLayout groupBoxLayout = new FormLayout();
            groupBoxLayout.marginWidth = 5;
            groupBoxLayout.marginHeight = 5;
            namespacesGroupBox.setLayout(groupBoxLayout);

            // Namespace prefix label.
            nsPrefixLabel = new Label(namespacesGroupBox, SWT.NONE);
            {
                nsPrefixLabel.setText("Prefix:");
                FormData nsPrefixLabelLayoutData = new FormData();
                nsPrefixLabelLayoutData.top = new FormAttachment(0);
                nsPrefixLabelLayoutData.left = new FormAttachment(0);
                nsPrefixLabel.setLayoutData(nsPrefixLabelLayoutData);
            }

            // Namespace prefix text field.
            nsPrefixTextField = new Text(namespacesGroupBox, SWT.BORDER);
            {
                FormData nsPrefixTextFieldLayoutData = new FormData();
                nsPrefixTextFieldLayoutData.top = new FormAttachment(nsPrefixLabel, 0, SWT.CENTER);
                nsPrefixTextFieldLayoutData.left = new FormAttachment(nsPrefixLabel, 5);
                nsPrefixTextFieldLayoutData.width = 100;
                nsPrefixTextField.setLayoutData(nsPrefixTextFieldLayoutData);
            }

            // Namespace URI label.
            nsUriLabel = new Label(namespacesGroupBox, SWT.NONE);
            {
                nsUriLabel.setText("URI:");
                FormData nsUriLabelLayoutData = new FormData();
                nsUriLabelLayoutData.top = new FormAttachment(nsPrefixTextField, 0, SWT.CENTER);
                nsUriLabelLayoutData.left = new FormAttachment(nsPrefixTextField, 5);
                nsUriLabel.setLayoutData(nsUriLabelLayoutData);
            }

            // Add namespace button.
            addButton = new Button(namespacesGroupBox, SWT.NONE);
            {
                addButton.setText("Add");
                FormData addButtonLayoutData = new FormData();
                addButtonLayoutData.top = new FormAttachment(nsUriLabel, 0, SWT.CENTER);
                addButtonLayoutData.right = new FormAttachment(100);
                addButtonLayoutData.width = 80;
                addButton.setLayoutData(addButtonLayoutData);
            }

            // Namespace URI input text field.
            nsUriTextField = new Text(namespacesGroupBox, SWT.BORDER);
            {
                FormData nsUriTextFieldLayoutData = new FormData();
                nsUriTextFieldLayoutData.top = new FormAttachment(nsUriLabel, 0, SWT.CENTER);
                nsUriTextFieldLayoutData.left = new FormAttachment(nsUriLabel, 5);
                nsUriTextFieldLayoutData.right = new FormAttachment(addButton, -5);
                nsUriTextField.setLayoutData(nsUriTextFieldLayoutData);
            }

            // Edit namespace button.
            editButton = new Button(namespacesGroupBox, SWT.NONE);
            {
                editButton.setText("Edit");
                FormData editButtonLayoutData = new FormData();
                editButtonLayoutData.top = new FormAttachment(addButton, 10);
                editButtonLayoutData.right = new FormAttachment(100);
                editButtonLayoutData.left = new FormAttachment(addButton, 0, SWT.LEFT);
                editButton.setLayoutData(editButtonLayoutData);
            }

            // Remove namespace button.
            removeButton = new Button(namespacesGroupBox, SWT.NONE);
            {
                removeButton.setText("Remove");
                FormData removeButtonLayoutData = new FormData();
                removeButtonLayoutData.top = new FormAttachment(editButton, 5);
                removeButtonLayoutData.right = new FormAttachment(100);
                removeButtonLayoutData.left = new FormAttachment(editButton, 0, SWT.LEFT);
                removeButton.setLayoutData(removeButtonLayoutData);
            }

            // Namespaces list box.
            nsListBox = new List(namespacesGroupBox, SWT.BORDER);
            {
                FormData nsListBoxFormData = new FormData();
                nsListBoxFormData.top = new FormAttachment(editButton, 0, SWT.TOP);
                nsListBoxFormData.left = new FormAttachment(0);
                nsListBoxFormData.right = new FormAttachment(addButton, -5);
                nsListBoxFormData.bottom = new FormAttachment(100);
                nsListBox.setLayoutData(nsListBoxFormData);
            }
        }

        loadConfiguration();
        initActions();
        setTabOrder();

        // Open dialog.
        dialogShell.layout();
        dialogShell.pack();
        dialogShell.setSize(640, 415);
        centerDialog();
        dialogShell.open();
        Display display = dialogShell.getDisplay();
        while (!dialogShell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
    }

    private void loadConfiguration() {
        dialogShell.setText(String.format("Expression Property Editor", nsProperty.getPrettyName()));
        propertyGroupBox.setText(nsProperty.getPrettyName());

        if (!StringUtils.isBlank(nsProperty.getPropertyValue())) {
            // IF the existing property is JSON path expression this selects the JSON path as the expression type
            if (nsProperty.getPropertyValue().contains("json-eval")) {
                jsonPathTextField.setText(nsProperty.getPropertyValue());
                expressionTypeSelectionComboDropDown.select(1);
                showJsonPathBox();
            } else {
                propertyTextField.setText(nsProperty.getPropertyValue());
            }
        }

        // Load namespaces.
        for (Entry<String, String> nsEntry : nsProperty.getNamespaces().entrySet()) {
            addNamespace(nsEntry.getKey(), nsEntry.getValue());
        }
    }

    private void initActions() {
        selectXpathButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
                XPathSelectorDialog xpathEditorDialog = new XPathSelectorDialog(dialogShell);
                xpathEditorDialog.open();
                if (!StringUtils.isBlank(xpathEditorDialog.getSelectedXpath())) {
                    propertyTextField.setText(xpathEditorDialog.getSelectedXpath());
                }
                collectedNamespaces.clear();
                nsListBox.removeAll();
                for (Entry<String, String> nsEntry : xpathEditorDialog.getNameSpaces().entrySet()) {
                    addNamespace(nsEntry.getKey(), nsEntry.getValue());
                }
            }
        });

        addButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
                String prefix = nsPrefixTextField.getText();
                String uri = nsUriTextField.getText();
                if (XpathValidator.isValidNamespace(dialogShell, collectedNamespaces, prefix, uri)) {
                    addNamespace(prefix, uri);
                    nsPrefixTextField.setText("");
                    nsUriTextField.setText("");
                    nsPrefixTextField.setFocus();
                }
            }
        });

        removeButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
                for (String selection : nsListBox.getSelection()) {
                    removeNamespace(selection);
                }
            }
        });

        editButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
                String[] selection = nsListBox.getSelection();
                if (selection.length > 0) {
                    String selectedNamespace = selection[0];
                    String prefix = extractPrefix(selectedNamespace);
                    String uri = collectedNamespaces.get(prefix);
                    if (null != uri) {
                        collectedNamespaces.remove(prefix);
                        nsPrefixTextField.setText(prefix);
                        nsUriTextField.setText(uri);
                        nsPrefixTextField.setFocus();
                    }
                    nsListBox.remove(selectedNamespace);
                }
            }
        });

        okButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
                if (XpathValidator.isValidConfiguration(dialogShell, propertyTextField.getText(),
                        collectedNamespaces)) {
                    try {
                        saveConfiguration();
                        setSaved(true);
                    } catch (Exception ex) {
                        log.error("Error while saving namespace property", ex);
                    }
                    dialogShell.dispose();
                }
            }
        });

        cancelButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
                setSaved(false);
                dialogShell.dispose();
            }
        });

        expressionTypeSelectionComboDropDown.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
                if (expressionTypeSelectionComboDropDown.getText().equals(XPATH)) {
                    showXPathBox();
                } else if (expressionTypeSelectionComboDropDown.getText().equals(JSON_PATH)) {
                    showJsonPathBox();
                }

            }
        });

    }

    private void addNamespace(String prefix, String uri) {
        collectedNamespaces.put(prefix, uri);
        String namespaceDisplayValue = String.format(namespaceDisplayFormat, prefix, uri);
        nsListBox.add(namespaceDisplayValue);
    }

    private void removeNamespace(String namespace) {
        nsListBox.remove(namespace);
        String prefix = extractPrefix(namespace);
        if (!StringUtils.isBlank(prefix)) {
            collectedNamespaces.remove(prefix);
        }
    }

    private String extractPrefix(String namespace) {
        Matcher matcher = namespaceDisplayPattern.matcher(namespace);
        if (matcher.find()) {
            return matcher.group(1);
        }
        return null;
    }

    private void centerDialog() {
        Rectangle parentBounds = getParent().getBounds();
        Rectangle dialogBounds = dialogShell.getBounds();
        int centerX, centerY;
        centerX = (parentBounds.width - dialogBounds.width) / 2 + parentBounds.x;
        centerY = (parentBounds.height - dialogBounds.height) / 2 + parentBounds.y;
        dialogShell.setLocation(new Point(centerX, centerY));
    }

    private void setTabOrder() {
        Control[] tabOrder = new Control[] { propertyTextField, selectXpathButton };
        propertyGroupBox.setTabList(tabOrder);

        tabOrder = new Control[] { nsPrefixTextField, nsUriTextField, addButton };
        namespacesGroupBox.setTabList(tabOrder);

        tabOrder = new Control[] { propertyGroupBox, namespacesGroupBox, okButton };
        dialogShell.setTabList(tabOrder);
    }

    private void saveConfiguration() throws Exception {
        if (expressionTypeSelectionComboDropDown.getText().equals(JSON_PATH)) {
            // If the user saved value is a JSON path this will save the JSON path from the corresponding text field
            nsProperty.setPropertyValue(jsonPathTextField.getText());
            nsProperty.getNamespaces().clear();
        } else {
            nsProperty.setPropertyValue(propertyTextField.getText());
            nsProperty.getNamespaces().clear();
            nsProperty.getNamespaces().putAll(collectedNamespaces);
        }
    }

    private void setSaved(boolean saved) {
        this.saved = saved;
    }

    public boolean isSaved() {
        return saved;
    }

    public void showJsonPathBox() {
        jsonPathGroupBox.setVisible(true);
        namespacesGroupBox.setVisible(false);
        propertyGroupBox.setVisible(false);
    }

    public void showXPathBox() {
        jsonPathGroupBox.setVisible(false);
        namespacesGroupBox.setVisible(true);
        propertyGroupBox.setVisible(true);
    }
}

redpajama_set_name: RedPajamaGithub


text:
Former 1960s flower children Steven and Elyse Keaton raise their conservative son Alex, daughters Mallory and Jennifer, and later, youngest child Andrew.
Three adolescent boys, Ed, Edd "Double D", and Eddy, collectively known as "the Eds", constantly invent schemes to make money from their peers to purchase their favorite confectionery, jawbreakers. Their plans usually fail though, leaving them in various predicaments.
Half & Half is an American sitcom that aired on UPN from September 23, 2002, to May 15, 2006. The show focuses on the lives of two paternal half-sisters in their twenties who were estranged throughout their childhood, and are finally developing a close relationship. The series is set in San Francisco. It was the second-most-watched show on UPN's Monday night line-up and fourth overall on the network. The show was on The CW's first draft line-up in March 2006, but due to several circumstances—including The CW's contractual obligation to pick up Reba, the uncancelling of All of Us, and the pick-up of the Girlfriends spin-off The Game—Half & Half was left off the final Fall 2006 schedule and ended production. The series has aired in reruns on Global TV in Canada, Trouble in the UK and in local syndication in the United States. It also airs in the United States on TV One.
TV Show Star Rating : 8 Read More
After her dentist husband of 20 years leaves her for his dental hygienist, Reba Hart's seemingly perfect world is turned upside down.
The Venture Bros.
Hank and Dean Venture, with their father Doctor Venture and faithful bodyguard Brock Samson, go on wild adventures facing megalomaniacs, zombies, and suspicious ninjas, all for the glory of adventure. Or something like that.
Simon & Simon is an American detective television series that originally ran from November 24, 1981 to January 21, 1989. The series was broadcast on CBS and starred Gerald McRaney and Jameson Parker as two brothers who run a private detective agency together.

redpajama_set_name: RedPajamaCommonCrawl


text:
Argentina's capital
Mayor v president v commuters
The AmericasAug 18th 2012 edition
FOR ten days, bus queues snaked around entire city blocks, passengers packed suburban trains and traffic choked intersections, as workers on the Buenos Aires metro went on strike. On August 14th they returned to work, but the political conflict that lies behind the strike is far from settled. The 900,000 daily users of the system, known to locals as the Subte (short for underground), may face more disruption.
Metrovias, the concessionaire that has managed the Subte's six lines since 1994, relies on public subsides of around $180m a year. But at the end of last year, the government of President Cristina Fernández de Kirchner demanded that the city's mayor, Mauricio Macri, take charge of the Subte. Since Mr Macri is a foe of Ms Fernández, and the two detest each other, the transfer was never likely to go smoothly.
The two sides signed a preliminary agreement in January, but Mr Macri then backtracked after the government slashed its financial support and withdrew the federal police from the Subte's 76 stations. A crash involving a suburban train that killed 51 people in February highlighted the decay in Argentina's rail system. Since then, neither Mr Macri nor Ms Fernández has been prepared to take responsibility for the Subte. They left Metrovias to negotiate with the union over its wage claim. It offered an increase of 23% which it cannot pay without more subsidy.
In a scathing television advertisement, the government blamed the strike on Mr Macri. The mayor hit back, blaming the government for the Subte's precarious state (some of the coaches are a century old), and arguing that the handover had not been completed. The agreed deal required the government to pay within 90 days its debt of $1.4 billion to Metrovias, says a city official. The government counters that Mr Macri's decision to more than double fares in January, to 2.50 pesos (52 cents), meant he accepted the transfer.
City officials say they are prepared to take charge of the Subte if the government pays 10% of its debt to Metrovias and lets the city raise the rest from the Inter-American Development Bank and the World Bank. But the government rejects this and refuses to talk to the mayor, according to his office. Mr Macri sees this as part of a broader scheme by Ms Fernández to cripple the city financially, making it more dependent on the government. He has cited as examples the removal of electricity subsidies and the withdrawal of federal police from hospitals and schools.
Mr Macri, a conservative in his second term as mayor, plans to run for president in 2015. Rumour has it that Ms Fernández may try to change the constitution to allow her to seek a third term. She certainly seems keen to hurt potential electoral rivals. After Daniel Scioli, the governor of Buenos Aires province (the area surrounding the capital), announced his presidential candidacy, the government lopped $400m from a transfer for workers' bonuses, prompting strikes in hospitals and schools. Mr Macri may also find that tangling with a president who ruthlessly exploits the power of the public purse for political advantage costs him popularity with the city's long-suffering commuters.
This article appeared in the The Americas section of the print edition under the headline "Tunnel vision"


6,193 runners and walkers, the bulk of the participants).
in third place with a time of 30:47.
Carsten Eich (LG Braunschweig) missed a hattrick on the Kurfürstendamm.
of 32 minutes," said Eich, who also won in 1999 and 2000.
to last race of her career, came in third.
place at the same time," said Kathrin Weßel.
spectator interest," said Race Director Mark Milde.


> > which is not required to be the case.
> > to make the test valid.
> c43-rpl-bbx-002 has the same problem.
Next message: L. David Baron: "incorrect pass conditions in c525-font-wt-000 (font-weight)"
Previous message: Gérard Talbot: "Re: c43-center-000 assumes line-height 'normal' == '1'"
In reply to: L. David Baron: "c43-rpl-bbx-002 assumes line-height 'normal' == '1'"
Next in thread: Gérard Talbot: "Re: c43-center-000 assumes line-height 'normal' == '1'"


When I am not familiar with the brand, I tend to buy candles in small or votive sizes, so that I can sort of test them out to see if I like them before I invest in a larger, more expensive candle. These votives were on sale (2 for $1.00 at WalMart), and I could not pass up such a bargain. I chose Pure Linen and (I can't remember exactly, but the other one was some sort of pine or fir scent). They smell great (I especially like this one - the Pure Linen), and the strength of the scent is pretty good - not THE strongest scented candles, but enough to infuse a large room with enough fragrance to really enjoy the scent. The burn time is also decent - these are 2 oz. votives, so I didn't expect them to burn forever, but I got to enjoy each one of the votives for two or three nights. This brand of candle was available in medium and large size jars, and I feel confident enough to purchase one or two in that size, the next time I'm in WalMart (providing they're not all out of the scents that appeal to me).


Click image to view illustration.
At any time you may interrupt data entry operations to quickly scan what had been previously recorded in the current Node. This facility will display multiple entries simultaneously. It may be used, for example, to check that all Causes relating to the current keyword combination had been adequately addressed, or to remind the study team of what had already been discussed in order to prevent duplication of effort (i.e. restatement of the same problem under a different keyword combination), or perhaps to review all entries for the Node to ensure that nothing had been overlooked.
It is occasionally necessary, or perhaps desirable, to import (copy) an entire Node or Nodes from one data file to another. For example, you may have already reviewed an identical item of equipment in an earlier study. To save time and duplication of effort, you decide to transfer all the entries previously recorded for that equipment item. This would of course be followed by a careful review of each of those entries to ascertain whether it is relevant in the context of the current study, editing and/or making additional entries as considered necessary by the Study Team.
Being a database, the study data file may be queried (i.e. analysed) to select entries that match any criteria which is of interest (for example, all Consequences mentioning the word 'fire', all Actions requiring a design change or perhaps relating to operating procedures, all Responses which are overdue, Actions that are incomplete, etc.). Multiple selections may be made to progressively narrow the search.
Reports containing selected data from those entries may be printed directly from the program. Such data may also be automatically exported to Microsoft® Word or Excel, or alternatively a text file can be produced for subsequent import into other software such as an external database.


text:
<!DOCTYPE html>

    <meta charset="utf-8">

    <title>normal_forms.combinatorics — normal_forms 0.1 documentation</title>

    <link rel="stylesheet" type="text/css" href="../../_static/css/spc-bootstrap.css">
    <link rel="stylesheet" type="text/css" href="../../_static/css/spc-extend.css">
    <link rel="stylesheet" href="../../_static/scipy.css" type="text/css" >
    <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" >

    <link rel="index" title="Index" href="../../genindex.html" >
    <link rel="search" title="Search" href="../../search.html" >
    <link rel="top" title="normal_forms 0.1 documentation" href="../../index.html" >
    <link rel="up" title="Module code" href="../index.html" >

joe mckenna

normal_forms

normal_forms 0.1 documentation

Module code

        index

        modules

Source code for normal_forms.combinatorics

import numpy as np

[docs]def factorial_list(n):
    """Return a list of factorials.

    Parameters
    ----------
    n : int
        maximum index of factorial list

    Returns
    -------
    ``numpy.array(n+1,1)`` of ``dtype`` ``int``
        list of factorials :math:`0!, \\ldots, n!`
    """
    res = np.empty(n + 1, dtype=int)
    res[0] = 1
    for i in range(1, n + 1):
        res[i] = res[i - 1] * i
    return res

[docs]def simplicial_list(n, k):
    """
    Return a list of simplicial numbers.

    The simplicial number :math:`{n+j-1 \\choose j}` is the number of :math:`j^{th}` degree partial derivatives of a function :math:`f` with domain of dimension :math:`n`, i.e. the number of homogenous :math:`j^{th}` degree monoomials with unitary coefficient.

    Parameters
    ----------
    n : int
        dimension of domain of :math:`f`
    k : int
        maximum derivative degree

    Returns
    -------
    ``numpy.array(k+1,1)`` of ``dtype`` ``int``
        list of :math:`{n+j-1 \\choose j}` for :math:`j=0,\\ldots,k`
    """
    seq = np.empty(k + 1, dtype=int)
    seq[0] = 1
    for i in range(1, k + 1):
        seq[i] = seq[i - 1] * (n + i - 1) / i
    return seq

        © Copyright 2017, Joseph P. McKenna.

      Created using Sphinx 1.6.5.


Caceres: Declared World Heritage by UNESCO and surrounded by Moorish walls, Caceres is splendidly preserved. Its handsome ochre-coloured mansions – belonging to the noblemen of the 15th and 16th centuries who fought against the Moors and journeyed to the Americas as conquistadors – line the maze of twisting streets and small plazas. Plaza Santa Ana forms the hart of the old city, and the provincial museum´s excellent exhibits of regional archaeological finds and ethnographic displays are housed in the Casa de las Veletas. Beneath Veletas you descend by a stone staircase into a splendid cistern, left from the days when the building was a Moorish Alcazar (a fortified palace).
Merida: The Roman ruins in Merida particularly the amphi-theatre are outstanding, as is its award-winning Museum of Roman Art. Also Merida boasts the world´s largest Roman Bridge, and other Roman remains including the Arch of Trajano. Merida has been declared by UNESCO Heritage of mankind.
Toledo: The saying goes that if you only had one day to spend in Spain, it should be spent in Toledo. To savour this 6th century city of cobbled streets and medieval architecture, you might be tempted to confine yourself to the cathedral, one of the finest in Europe, with stained glass windows, intricate woodwork and wrought-iron grilles, plus a sacristy that doubles as a fine arts museum. Or just see the house of El Greco and the dazzling Moorish-designed synagogues. But continue on and wander around the narrow streets, taking time to relax at the main square, Plaza de Zocodover, before touring outside the walls where it is important to capture the city´s dramatic profile, as immortalised on the canvases of El Greco.
Cuenca: Cuenca, declared Heritage of Mankind by UNESCO, stands on a steep-sided spur that drops precipitously on either side to the gorges of the Jucar and Huecar rivers. Around the Moorish town´s narrow streets grew the Gothic and Renaissance city whose monuments, including a treasure-filled cathedral, were built with the profits of wool and textile trade. The heart of the town is the cafe-lined, arcaded Plaza Mayor, and Cuenca´s most amazing feature is the 14th century, cliff-hanging casas colgadas, hanging houses, that cling to the edge of a deep gorge. One house is now the Museum of Abstract Art which displays works by contemporary Spanish Artists such as Antoni Tapies and Eduardo Chillida. More ancient works can be found in the nearby Archaeological Museum. Enjoyable excursions from Cuenca include Belmonte Castle, the Romanesque church at Arcas and the Roman amphitheatre at Segobriga.
Siguenza: A charming medieval town in the northeast of La Mancha, descends in tiers from its hlltop. It is dominated by he imposing Santa Maria cathedral-fortress with spectacular interiors, and the castle (now the Parador de Siguenza).
Almagro: In the southwest of La Mancha, Almagro appears as it did in its 16th century heyday with its fine arcaded Plaza Mayor, the convent of the Knights of Calatrava and the oldest theatre in Spain: Corral de las Comedias.
The nameExtremadura relates to the fact that during the Reconquest it was a land of 'extremes' i.e. a frontier area bordering on Muslim territory. It did eventually fall to Arab invasion and later in the 14th century, Portugal began its constant attempts to conquer the region, which lasted for almost two hundred years. The region was home to the most important Conquerers of the New World, such as Pizarro and today it is one of the most beautiful, least known regions of inland Spain.
Geographically, Extremadura lies in west central Spain, just north of Andalusia and bordering Portugal. Merida is its capital, and the population of the entire region is over one million. Extremadura is divided into two provinces: Badajoz and Caceres. Mostly it is made up of vast plains with an average height of about 350 metres. Although there are three mountain ranges in the region with some peaks reaching 2000 metres. The climate here is generally continental with some regional variations. Cold winters and dry hot summers are the norm.
Castilla La Mancha dates back to pre-Roman times when it was inhabited by Celts and the Iberians. The present territory dates from the Lower Middle Ages. The period between the 17th and the 19th centuries was especially tough for the region which saw a severe decline in population. Today Castilla-La Mancha is a prosperous area where farming activities are mixed with industry. Toledo is the capital of the community consisting of 79,226 square km. The varied landscape is explained by the two rivers (Tajo and Guadiana) and several mountain ranges (Central System, Serrania de Gredos and Sierra Morena) that can be found here. The climate is Continental Mediterranean, with cold winters and hot summers. Castilla-La Mancha has a population of around 1,7 million.
Easter: Especially vibrant in Cáceres, Badajoz, Mérida and Toledo.
June: Corpus Christi celebrations in Toledo, declared of International Tourist interest.


Well, it depends on your perspective. If BO tell me it is, the it is. If I'm a liberal without any sense of right and wrong, except that which has been forced down my throat, then maybe. If our armed forces perform it for training purposes, then it's not…until BO says it is.
Is there a precedent being set that the next administration should follow? Maybe the Justice department and Obama administration should be prosecuted for NOT defending this country or the Constitution. Don't worry, it only matters what your perspective is, not necessarily what's legal, just, and moral. Yeah, if I'm President I'll prosecute…to the fullest extent of the LAW under the Constitution of the United States of America.


Might Apple Bring Back the eMac?
How Much Would You Pay For a Computer That Can Run Mac OS X and Windows Vista?
I really do hope somebody at Apple is watching Low End Mac - I want one of these!
At $299, Apple would own the low end - especially if they could bundle an OEM copy of Windows XP or Vista for an extra $99. At $399, they would make a big impact on Dell, Gateway, and the rest. At $499, the price of the original Mac mini, they would sell enough to increase the percentage of desktop vs. notebook sales, and a lot of Mac users would upgrade from old G3 and G4 models.
I envision a 7" cube (a shape we know Steve Jobs loves) with an internal power supply (unlike the Cube or Mac mini), two 3.5" drive bays, four memory sockets, and two PCI Express slots. It would have integrated graphics, 1 GB of RAM, and include a 16x dual-layer SuperDrive. There would be two FireWire 400 ports, one eSATA port, and four USB 2.0 ports on the back, two more on the front, and an iPod dock on top. Bluetooth would be standard, and AirPort Extreme optional.
Like the Mac mini, it need not include a mouse and keyboard. Build-to-order options could include larger hard drives, a second hard drive, the same video cards offered with the Mac Pro, up to 4 GB of RAM, and cost cutting options like a smaller hard drive (or perhaps none at all) and swapping a CD-ROM or Combo drive for the SuperDrive.
I'd say $399 would be the perfect price, with most buyers adding a mouse and keyboard, a fair number opting for a real video card, and a good number buying an AirPort Extreme card.
After reading the article about no more Mac mini, and possibly dropping the 17" from the iMac line, what would the possibilities be if the they redesign the iMacs and keep the 17" form factor the same but rename it as the eMac. The 17" low-end iMac is what replaced the eMac originally, and that would leave a low priced Mac for schools and new buyers. Just some thoughts.
I don't expect Apple to ever bring back the eMac name, and if the low-end 17" model is like an iMac in all respects except for screen size, it would only confuse the market not to call it an iMac.
I got a 300 MHz educational model of the blue and white "Yosemite" G3 today from a seller on eBay, and it had all of the Revision 2 embellishments, including the redesigned heatsink, better hard disk mounting bracket, and the 402 IDE controller. Yet it had a Rage Pro graphics card with the old style Mac connector and S-video/composite video port, not the Rage 128 with VGA as on the mainstream models. And yes, I did check System Profiler, and it was 300 MHz even.
You may have other experiences, but it seems weird that someone would put a 300 MHz processor in a Revision 2 case and logic board. And it even backs up my findings on the back of the case, in the genuine Apple sticker.
We've never paid close attention to what differentiates education-only models from mainstream Macs. I'd guess that this unit may have had the motherboard replaced, as I haven't heard of a 300 MHz b&w shipping from the factory with a Rev. 2 motherboard.
The keyboard has a split space bar with an extra key in the middle that I suspect is the mouse button.
If you look at the picture closely (the second one down on the right in your article), you'll see that it has a normal space bar, and below that are what appears to be two mouse buttons with what sort-kinda looks like a possible scroll wheel type device in the middle.
Thanks for writing. More recent articles I've read about the Foleo mention a scrollwheel. That's probably what it is.
I don't know how the Foleo could succeed. The American market has continually wanted powerful, compatible notebook computers. The Windows CE machines that were of the subnotebook form factor were not successful. If it can't run Vista or OS X, I don't think that the market will accept it. With Treos and Blackberrys, the palm form-factor demands a radically different user interface, but with a reasonable size screen and a full size keyboard, I think the market would expect more.
I can't predict whether the Foleo will be the breakthrough subnotebook Palm hopes for or just another casualty. I think Palm's scheme of marketing it as a smartphone accessory probably dooms it.
For the most part, the Foleo makes me wonder what Apple could do in this space with a small, lightweight MacBook designed to complement (rather than replace) your desktop Mac.
Nice photos of this unit. I've been wondering when someone is going to help themselves to Apple's nifty laptop hinge that they pioneered on the original iBooks and perfected on their current range. Well, it appears now. Nice tidy little 'business persons Internet appliance' though.
You have a good eye. I hadn't noticed the similarity between the Foleo's hinges and what Apple has been using since the dual USB iBook G3 of May 2001.
As for the photos, they are PR shots provided by Palm.
I looked up the UDMA function of Compact Flash. Found one brand that advertizes it. the Lexar Professional line. However, an 8 GB chip is around 160 dollars on Amazon. So I looked at other solutions. I found this item: A Transcend brand 8 GB IDE [flash] drive< from Newegg.com . it is only $180, and I don't need to buy the adapter. It also seems to have more error protection. Do you think something like this is a good idea? Do you have cheaper brand recommendations that you know are UDMA compatible and relatively fast to use. I would hate myself if I spent a bunch of money to do a flash upgrade and it took me 20 minutes to boot like that poor PowerBook guy.
Also, on the issue of my Pismo and PCMCIA. I found two more cards at a friend's house, a smart media adapter and a 10/100 ethernet adapter. They both make a little PC Card icon show up in OS X near the clock on my PowerBook g4, but only the ethernet adapter makes a PC Card icon show up in OS X on the Pismo. The other (now three) card readers do nothing in OS X, and in OS 9 they cause the Finder to crash on the Pismo. So strange. I really have no idea what could cause one card to work and three others to do nothing. Maybe someone on your site will know?
Googling for "'compact flash' udma" I came across some information on SanDisk. All current SanDisk cards ship as removable - and SanDisk has a utility that lets the end user change the media bit to be changed to non-removable. I don't know whether this utility works on Macs or for other brands of Compact Flash.
Since most CF cards are used in digital cameras or simply for data storage, where it doesn't matter whether the card supports Ultra DMA or not, most vendors don't mention UDMA at all. UDMA is a faster version of the DMA protocol, so I suspect any CF card that supports DMA will work - UDMA ones will just be faster.
Transcend notes that their 80x, 120x, 266x, and industrial CF cards all support DMA. PQI doesn't say, but their CF card worked in my PowerBook 1400. While older, slower cards may support DMA, I'm guessing that it's an important factor for high speed cards. In my testing, both high speed cards were bootable, but the older, slower 128 MB and 256 MB cards I had did not.
dealram lists 8 GB Transcend 120x CF cards from $89 shipped. That plus the Addonics adapter would set you back about $120 - one-third less than Transcend's IDE flash drive.
BTW, I just visited the Addonics site and discovered that they have discontinued the single-card adapter and reduced the price of the dual-card adapter to $25.99.
Hi! I enjoyed your review of MDD Dual G4 Processors options. I own an MDD Dual 1.25 G4 with 2 GB RAM and an 80 GB 7200 RPM HD (nearly full; 10 GB remaining) and additional Avid 7200 RPM FireWire HDs.
Will $600 for the Sonnet MDX Dual 1.8 Processor Upgrade noticeably help my ProTools system?
It runs great now . . . but it is nearly maxed out all the time and occasionally gives up. $1,200 will get me a Dual G5 on eBay but there will be incidentals (RAM, etc.) that will make it more like $1,600; plus the pitfalls of eBay. So the question is: Dual 1.25 G4 MDD vs. Sonnet MDX Dual 1.8. I think the upgrade will require that most of my plug-ins will have to be reauthorized, so this will not be a plug and play. Will I be surprised at the difference? I know you're guessing but your guess is much better than mine and greatly appreciated!
P.S. PLAN B: Upgrade the system drive to 10,000 RPM as follows: Add an IDE to SATA adaptor card <http://sewelldirect.com/IDE-to-SerialATA-Converter.asp> then add an external 10,000 RPM 74 GB Raptor Serial Hard Drive (in its own case) for the OS X and ProTools application.
This is a tough call. You'll trim maybe 25% from your processing time with the G4 upgrade, as it has no Level 3 cache. And a Power Mac G5 will have far better system throughput because of its very fast memory bus - 1/2 CPU speed vs. 167 MHz (1/7.5 the speed of your 1.25 GHz CPU, and just 1/10.8 the speed of the 1.8 GHz upgrade).
The G5 is going to be faster. Bare Feats found a 2 GHz G4 was about 30% faster than a dual 1.8 GHz G4 upgrade in their Photoshop CS-MP Actions test. A 2 GHz G5 will probably be about 65% faster overall than your 1.25 GHz G4 system. And it already has onboard SATA, so no need to buy an adapter.
As for reauthorizing plug-ins, you probably won't have to do that with the Sonnet upgrade, since it doesn't change your motherboard - the only advantage I see to upgrading your current Mac.


Leslie first became truly engaged in youth ministry while attending Auburn University to study Sociology. She worked as Youth Minister at Holy Trinity Episcopal Church for four years. Prior to her experience at Holy Trinity, Leslie had been a camp counselor at Camp Beckwith and a volunteer for Young Life. After leaving Holy Trinity, Leslie followed a call to Christ Church Cathedral in Nashville where she served as the Youth Ministry Coordinator. Leslie was first introduced to Ministry Architects while serving at the Cathedral. After serving at the Cathedral, Leslie served on the Diocesan youth ministry staff for the Episcopal Diocese of Alabama. In that role, she coordinated youth events, supported full-time and volunteer youth ministry in and around the Diocese, and coordinated the Episcopal non-profit, Sawyerville Day Camp, a free summer program that is staffed by high school and college age volunteers and offered for free in one of the most impoverished counties in Alabama. Under her leadership, the camp tripled in size–both in attendance and volunteer numbers but also in regards to the budget. Leslie spent a lot of her time not only coordinating and overseeing this free summer program but also fund raising and garnering awareness and support. Recently the camp expanded and added a free academic program for rising 5th and 6th graders, an incredibly successful summer learning program that is already gaining recognition all over the Southeast because of its deep impact and quick results. Currently Leslie is focusing more time at home and on her family with the recent addition of her second daughter. She can also be found serving as a coach for the Center for Youth Ministry training or working for Ministry Architects, something she has enjoyed doing since 2008. Leslie is married to the Rev. Bentley Manning, an Episcopal priest, and together they have two young daughters, Mary Bentley and Alice.


Respectable Members of the Museum, Time flies fast and the auspicious June Birthday of H.H. Dorje Chang Buddha III is coming upon us. Our H.H. Dorje Chang Buddha III Cultural and Art Museum, bearing the name of H.H. Dorje Chang Buddha III, is dedicated to the exhibition of the art and culture created by H.H. Dorje Chang Buddha III. Besides having accomplished extremely high achievements in art and culture in this world, H.H. Dorje Chang Buddha III is also the Buddha that is publicly certified by Buddhists. As such, the Cultural and Art Museum has specifically arranged a series of celebration activities in order to respectfully congratulate on the Buddha's birthday of H.H. Dorje Chang Buddha III. We hope all members of the museum and the public can join the event and celebrate it with us. In addition, we must make it clear to the public that H.H. Dorje Chang Buddha III will not participate in these activities, neither does He know that our Cultural and Art Museum is planning to hold these activities.
Because H.H. Dorje Chang Buddha III is a Buddha, and Buddhas are based on great compassion who take likings in compassionately benefiting the multitude of beings, our H.H. Dorje Chang Buddha III Cultural and Art Museum will hold an activity to release lives for benefiting the multitude of beings in order to congratulate Buddha. People have voluntarily made donations to the lives-releasing activity. You are welcome if you are willing to attend it. Or, you can also hold a lives-releasing activity by yourselves in your own hometown to celebrate the birthday of H.H. Dorje Chang Buddha III. It means the same.
Organized by the USA Wiser Sport Committee.
Please see attachment for the tournament rules and registration.