I must decide between SharpSSH at http://www.tamirgal.com/home/dev.aspx?Item=sharpSsh and Granados SSH at http://granados.sourceforge.net/.
I guess I’ll have to evaluate both and decide, but I really wish there was a clear cut answer.
babblings of a computer loving fool
I must decide between SharpSSH at http://www.tamirgal.com/home/dev.aspx?Item=sharpSsh and Granados SSH at http://granados.sourceforge.net/.
I guess I’ll have to evaluate both and decide, but I really wish there was a clear cut answer.
This is why Generics in Mono/DotNet is FAR FAR better than Generics in Java.
I typically don’t like metablogging (I’ll stop blogging about blogging now).
I found this on Signal vs. Noise and it immediately made me think of Matt Rose.
Naturemill Home Composter
By Jason on Customer experience
This looks like an incredible product – indoor composting with no odors and no mess. You can even compost meat and fish. Simple too – one button operation. A red light comes on when the compost is ready. It’s small enough for 1 person living alone or big enough for a family of 5. Here’s a friendly interview with the Ross Cohn, the president of the company. I love his tone, honesty, humility, and the way he talks about his product. Some good insight into the design of the product and recent improvements they’ve made based on customer feedback.
Some highlights:
Another “must have” feature we added is a food pedal to open the lid – I guess our engineers don’t do enough cooking to realize that there are never enough hands in the kitchen.
One feature I really like is that you don’t have to keep adding compost cultures, or any other feed material, as with most compost systems. The machine retains a small amount of finished compost after each load, so in a way it replenishes itself with hot, fresh compost cultures. This saves a lot of money in the long term, and is very convenient too.
The new control panel has just one button. How easy is that! There isn’t even a clock to set. I’m really tired of having to “operate” all the other devices around my house, with all these beeps and dials. This is much easier. We’ve put a lot of intelligence into the software, so you can focus on gardening and cooking instead of managing your compost pile.
It’s really quite fascinating to observe composting being made, and yet not have to do any work yourself. To me it’s a little like watching an ice cream machine. Except you really don’t want to eat this stuff.If you have the means (and the place to put/use the compost) do the Earth a favor and pick one of these up.
Eric IMed me and said he couldn’t post.
Thanks for the heads up on the ssh connection sharing, I’ll definitely be checking that out.
I can’t tell if you’re implying that interfaces are somehow the same as base classes, but they definitely are not. They’re not the same as abstract base classes either.
On semi-related notes, you should check out the “open closed” principle of OO design, if you haven’t already, and the “fragile base class” problem. It sounds like you’ve hit on half of the issues those two topics cover, so they might seem like covering ground you’ve already been over, but you might find a tidbit or two that you find interesting.
I meant to say that C++ doesn’t have “interfaces” although there is nothing preventing one from making an abstract base class and using it as interface, in fact that was/is the C++ way. That is all I meant. Which is why I mentioned COM/MIDL because MIDL was created exactly to define an interface in a language which doesn’t explicitly have interfaces. I fondly remember writing MIDL for my COM interfaces, but I prefer a language which allows me to express this though the use of an interface in the language, like C# or Java (or VB.net or any of the .net languages).
I liked looking up both open-closed and fragile base problems. The open-closed thing is easy to handle IMO. I’d like to think the things which I’ve written handle it well enough. The fragile base problem I can’t say I entirely agree with. I understand the problem, but I can’t say that interface instead of implementation inheritence is the best solution. That is what VB6 and COM had, and believe me, there are many of us who really missed the implementation inheritance.
That said, I’ve usually found myself defining interfaces, implementing an abstract class, and then inheriting some implementation from the abstract class. I prefer the lazy programmers approach here. Don’t require programmers(or yourself) to reimplment things simply because you are afraid of what they may do wrong if they implement or override a function incorrectly. I argue that you can’t really solve this much more even with interfaces (short of sealing classes). Of course I’ll have to admit that my experience in this regard is limited. My approach is to define the interface, and then implement it as an abstract class. This abstract class does all the things which I expect all inheritors of the interface to do and it does any helpful nice things that I may expect implementors to need. That is it. Am I missing some piece of the fragile base class puzzle?
Whew, what an evening. It started off simple enough. After dinner I just sat down and my good friend and co-worker Chris IMed me about something or another. We were making small talk until I remembered I wanted to share with him the new SSH Connection Sharing support introduced in OpenSSH 4.0. What is it?
From the ssh_config man page, the “ControlMaster” option “Enables the sharing of multiple sessions over a single network connection.” I configured it on my system simply enough. I added an entry to my ~/.ssh/config file for each host which I connect to often enough to warrant using this feature. In my case, that is only one host. I added this the aforementioned file:
Host little.xmtp.net
ControlPath /tmp/ssh_little_jrwren
Now I can start a ControlMaster by invoking ssh -M. I can keep it around forever (or until killed) by invoking ssh -MNf. Now each time I ssh to little.xmtp.net, there is no delay. There is no TCP/IP session to open up, there is no key exchange, there is no SSH negotiation, all that is already done and waiting. I immediately get my remote bash prompt! Totally awesome feature.
Unfortunately this feature hasn’t been marketed very well. The number 1 google result for “controlmaster controlpath” (the two options for this feature) returns this GCCWiki page suggesting its use with source control systems. It occurs to me its use would be extremely benefitial with distcc when using ssh as the rsh for distcc. Anyway, I thought I’d check out the GCCWiki some, so from the Home Page, the first thing I decided to click was the Proper C++ visibility support link under the What is new in GCC 4.0 link. VERY awesome optimizations, but it isn’t what blew my mind.
This thing linked an excellent paper by Ulrich Drepper on good DSO design called How to Write Shared Libraries. This paper is great because it details just how programs use shared libraries and how the old a.out system works and ELF as well. It covers what various linker flags do, what some environment variables do to the dynamic linker, dlopen options, and probably everything (or in my case more than everything) one may wish to know. But this is still not what blew my mind.
My C skills aren’t that great. I can get by, but I’m no expert. My C++ is even worse, mostly because I haven’t used it since college and even then it was only 3 semesters, two of which were 10 years ago. I am however becoming an expert enough at C#. I like to think I have pretty good understanding of what is going on with C#, but one feature which I’ve definitely not mastered and never had need to utilize is that of Attributes. What blew my mind was that GCC has extentions for function attributes, very similar to C# attributes. OK OK C# attributes are WAY more extensible, but the concepts are similar.
One of the things I didn’t understand immediately when I started doing OOP using C++ ten years ago was the use of private members (variables or functions). I did understand what meant, what to expose, OK, I guess I understood it, but my general attibute was to just keep everything open (public). If someone wanted to use one of my members, let them. Give freedom and flexibility to someone using a class which I had written. Of course after some time I grew to appreciate following interfaces (base classes, this is c++ right? how about MIDL defined COM interfaces?) and not extending them unless necessary. I changed my tune slowly once I saw the value in it, but reading this DSO paper was extremely enlightening.(mind blowing?)
The function attributes page and the Shared Library Howto describe the visibility attribute. What I find interesting is that C++ private members should all be able to get visibility(“internal”) attributes. That is more interesting to me regarding shared library usage and C++ member protection levels. I’m sure it is nothing I will ever use, at least not in the near future, but it is definitely something new to me. I like new things. I like thinking about new things. I definitely like new light shed on old things, especially when they make me think about things which I wouldn’t otherwise.
Now it is late and I’m only 1/4 of the way through that Shared Library paper. I don’t think I can finish it, I’m too tired. That will probably be my epitaph “always too tired to finish things.”
The company for whom I work is looking to hire a good dot net programmer. If you would like to work in the Ann Arbor area and are good at dotnet programmer, please email me.
Specifically we are developing Web Services, and Sharepoint webparts, and some Windows Services. Sorry, no windows forms or mobile development here.
I love my “nekkid” pictures of Janice. A woman just walked by and said “She is beautiful. Is that your sister or your wife?” I said “My wife.” She said “She is beautiful. She is beautiful.”
That made me think of the Andrew W. K. song with those lyrics.
The “nekkid” picture is one where you cannot see any clothes on my wife. Wait wait. It is a head shot. It is her senior picture from high school actually. She was wearing an off the shoulder shirt and the way the picture was taken you cannot see any of her clothing, just her head and a shoulder. She calls it her “nekkid” picture because, well, she could have been nekkid when it was taken.
*waves* Hi honey. I love you, and not just because you are beautiful… you are hot too… and you make good pasta sauce… and you did my laundry… and you got a nice ass… umm… not just cuz you are beautiful.
All joking aside my Janice is a super smart lady. Together we could be an SAT analogy question. Jay:Computers::Janice:Genetics. If you don’t recall the SATs that is read “Jay is to computers as Janice is to Genetics.”
Jorge instant messaged me a few days ago saying that Bazaar-NG is ready for general use and that I should check it out. I didn’t understand the big deal, SVN did a great job of fixing problems with CVS and I am proficient in using both, why did I need a third? Jorge explained that Bazaar-NG (bzr for short, I think) is now called Bazaar2, and doesn’t require a server. Well, my thought is that CVS and SVN don’t really require servers either, but you just point them to a repository directory. This directory could be a local machine. Jorge’s next message was that you can just take a web site and make it versioned. It sounds to me like there is no repository directory. Interesting! Now this is definitely something different.
My next question was “Is there a TortoiseBzr so I can check it out on Windows?” Jorge’s justified response, “Jesus, Jay”. I laughed out loud and proceeded to explain the conversation to my wife, who immediately met me with a blank stare. I grumbed about how she now knows how I feel when she talks biology and genetics to me and her blank stare turned to an enraged anger stare at which point I ran away.
Oh, getting around to the point… Check out the new Bazaar (was ng, now 2). UBZ (Ubuntu Below Zero) is going on right now and it turns out TortoiseBzr is being discussed! http://bazaar.canonical.com/GraphicalUserInterface
DROP TABLE HostStatus
GO
DROP TABLE HostStatusListName
GO
CREATE TABLE HostStatusListName (
id int IDENTITY(1,1) NOT NULL PRIMARY KEY,
Name nvarchar(50) UNIQUE NOT NULL
)
GO
CREATE TABLE HostStatus (
id int IDENTITY(1,1) NOT NULL PRIMARY KEY,
HostStatusListNameID int NOT NULL REFERENCES HostStatusListName(id),
/* Hostname nvarchar(50) REFERENCES Host,
ProductName nvarchar(50) REFERENCES ProductFamily,
Environment nvarchar(50) REFERENCES Environment, */
HostID int unique REFERENCES Host,
ProductID int REFERENCES ProductFamily,
EnvironmentID int REFERENCES Environment,
IsInActiveDirectory bit NOT NULL,
IsInInventoryDB bit NOT NULL,
ManagementIP nvarchar(50),
ProductionIP nvarchar(50),
Reachable bit NOT NULL,
ReachableDate datetime NOT NULL DEFAULT getdate(),
ServerModel nvarchar(50)
)
DROP VIEW vHostStatus
GO
CREATE VIEW vHostStatus AS
SELECT hs.id, Name, Hostname, ProductName, Environment, IsInActiveDirectory, IsInInventoryDB,
ManagementIP, ProductionIP, Reachable, ReachableDate, ServerModel FROM HostStatus hs
LEFT OUTER JOIN HostStatusListName hsln ON hs.HostStatusListNameId = hsln.id
LEFT OUTER JOIN Host h ON hs.HostId = h.Machineid
LEFT OUTER JOIN ProductFamily pf ON hs.ProductID = pf.ProductID
LEFT OUTER JOIN Environment e ON hs.EnvironmentID = e.EnvironmentID
GO
DROP TRIGGER tr_vHostStatus_IO_U
GO
CREATE TRIGGER tr_vHostStatus_IO_U ON vHostStatus INSTEAD OF UPDATE AS
UPDATE HostStatus SET
HostStatusListNameid=(SELECT TOP 1 id FROM HostStatusListName hsln WHERE hsln.Name=i.Name),
Productid=(SELECT top 1 productid FROM ProductFamily pf where pf.ProductName=i.ProductName),
Hostid = ( SELECT TOP 1 Machineid FROM Host h WHERE h.Hostname=i.Hostname ),
Environmentid = ( SELECT TOP 1 Environmentid FROM Environment e WHERE e.Environment=i.Environment)
FROM inserted i
INNER JOIN HostStatus h on h.id=i.id
GO
DROP TRIGGER tr_vHostStatus_IO_I
GO
CREATE TRIGGER tr_vHostStatus_IO_I ON vHostStatus INSTEAD OF INSERT AS
DECLARE @nameid as int
DECLARE @productid as int
DECLARE @machineid as int
DECLARE @environmentid as int
DECLARE @IsInActiveDirectory as bit
DECLARE @IsInInventoryDB as bit
DECLARE @ManagementIP as nvarchar(50)
DECLARE @ProductionIP as nvarchar(50)
DECLARE @Reachable as bit
DECLARE @ReachableDate as datetime
DECLARE @ServerModel as nvarchar(50)
select top 1 @nameid=hsln.id FROM HostStatusListName hsln INNER JOIN inserted i ON hsln.Name=i.Name
select top 1 @productid = productid FROM ProductFamily pf INNER JOIN inserted i on pf.ProductName=i.ProductName
select top 1 @machineid= machineid FROM Host h INNER JOIN inserted i on h.Hostname=i.Hostname
select top 1 @environmentid = @environmentid FROM Environment e INNER JOIN inserted i on e.Environment=i.Environment
select @IsInActiveDirectory=IsInActiveDirectory, @IsInInventoryDB =IsInInventoryDB ,
@ManagementIP = ManagementIP, @ProductionIP = ProductionIP, @Reachable=Reachable,
@ReachableDate = ReachableDate, @ServerModel=ServerModel FROM inserted
INSERT INTO HostStatus (
HostStatusListNameid, Productid,
Hostid, Environmentid,
IsInActiveDirectory, IsInInventoryDB, ManagementIP, ProductionIP,
Reachable, ReachableDate, ServerModel )
VALUES ( @nameid, @productid,
@machineid, @environmentid,
@IsInActiveDirectory, @IsInInventoryDB, @ManagementIP, @ProductionIP,
@Reachable, @ReachableDate, @ServerModel
)
GO
INSERT INTO HostStatusListName (Name) VALUES (‘Etime’)
INSERT INTO HostStatusListName (Name) VALUES (‘Ehrms-unix’)
INSERT INTO HostStatusListName (Name) VALUES (‘Ehrms-windows’)
Insert INTO vHostStatus (id, Name,Hostname,ProductName, Environment, IsInActiveDirectory, IsInInventoryDB, ManagementIP,ProductionIP,Reachable,ReachableDate, ServerModel)
VALUES (1,’Etime’,’test’,’Etime’,’P’,0,0,’172.30.1.1′,’172.30.1.1′,1,getdate(),’some server’ )
SELECT * from vHostStatus
SELECT * from HostStatusListName