Digital Sidhe's Random Scribblings.
|
|
||||||||||
| This Journal is Mostly Friends-Locked |
Hello and welcome to my journal. If you're new here, you should be aware that nearly everything in this journal is locked so that it can be viewed only by people on my friends list. The stuff that's publicly available is almost entirely "my professional face"; it generally has to do with computer issues ranging from security alerts to writing about web development, coding, and anecdotes from my consulting work. (Those latter are all carefully anonymized.) If you're not on my friends list and wish to be, please email me and let me know: what your LJ username is (so I know who to add), and where I know you from (face-to-face meeting, that mailing list we were both on back in 1994, whatever). If I don't already know you, the chance that I will add you is very small. No offense is intended, but the private parts of this journal are private for a reason. |
| Monday, June 16th, 2008 |
|
|||||||
|
On our way home from Nihonmachi yesterday, This is what we saw: ![]() This needs to have some kind of Flash Gordon thing happen in front of it. This seriously needs to be the backdrop for some kind of absolutely mind-blowing photo shoot or YouTube video or something like that. Due to lack of sufficient time, costumes, and insanity, I don't think Fey and I are the right people to make this happen. Internet and Lazyweb, help! The right people for this are out there somewhere. Can you find them? |
|||||||
|
|
|
| Tuesday, June 3rd, 2008 |
|
|||||||
|
"Didn't we already have our primary, back in February?" Yeah, we did our presidential primary back then. Now we get to do the primary voting for things like... House of Representatives and a pile of state and local initiatives. If you rent, or know anyone who does, you probably want to get your ass to the polling place and vote No on 98; Yes on 99. (The easy mnemonic: "We hate ninety-eight! Ninety-nine is fine!") Personally, I think this is also a great time to vote for someone like Cindy Sheehan or Shirley Golub in the Democratic primary race for the 8th Congressional District. We all know Nancy Pelosi will retain her seat, but a decent amount of support for more liberal, progressive candidates might remind her what city she's representing, and get her to shift her position a little further leftward. If you usually vote progressive, and want the SF Bay Guardian's clip-out guide, you can grab just the data you really want — this will fit on a single piece of paper when you print it out, instead of wasting one page on the Guardian's logo and a page header. There's also some scary stuff happening with redevelopment in Bayview-Hunter's Point, and an opportunity to require that appointees to the SF Public Utilities Commission actually have some expertise or experience in the field instead of just being political hacks. I know this election seems like a surprise, but if you can make it to the polls today, please do! I'm leaving this post unlocked, just so people can easily refer their friends (and even friends' friends) to that hyperlink. |
|||||||
|
|
|
| Friday, April 11th, 2008 |
|
|||||||
|
Background The Fibonacci numbers are a series made popular in the 1200s by Italian mathematician Leonardo Fibonacci. To form this sequence, you start with 0 and 1. Each successive number is selected by adding the last two together. So the sequence looks like: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55... (For example, 3 + 5 = 8. Then 5 + 8 = 13, then 8 + 13 makes 21, and so on.) The starting zero is considered the "zeroth" Fibonacci number; the 3rd Fibonacci number is 2. Problem Write a function that takes a single integer as its argument, and returns the corresponding Fibonacci number. For example, |
|||||||
|
|
|
| Thursday, April 10th, 2008 |
|
|||||||
|
Problem Implement a Luhn checking algorithm. First, provide a function that takes a number as its input, and determines whether or not the number passes a Luhn check. Next, write a function that takes a number as input, and returns the proper "check digit" for that number. Discussion The Luhn algorithm is used to ensure that a number has been entered correctly, without accidentally dropping or doubling a digit, or transposing two digits. It's an easy way of making sure that you didn't accidentally make a typo in your credit card number when filling out a web form. The Luhn algorithm is described pretty thoroughly on Wikipedia, so I'm not going to waste my time replicating their work. ( We implement a Luhn checker in JavaScript, then run into a cute and subtle bug when we try to do the Luhn check-digit generator. We admire the bug's cuteness, then squish it dead. ) |
|||||||
|
|
|
| Saturday, March 15th, 2008 |
|
|||||||
|
Finrod is now back in operation. The GothPunk.com(Munity) and Freak Nation Web sites should be back in service, along with all email accounts and mailing lists. As proof that these things are true, this post should have a little blond elf with a blue ribbon as its mood theme icon, rather than a "broken image" icon. If you still don't see a very accomplished-looking elf even after reloading this page, or if you notice any other problems with any Internet services in the gothpunk.com, freaknation.com, or silmemar.org domains, please let me know immediately. Thank you.
|
|||||||
|
|
|
|
|||||||
|
Finrod is here and mostly running, but his network card keeps dropping packets. I'm going to try replacing it. Finrod will be up and down intermittently until further notice. |
|||||||
|
|
|
|
|||||||||
|
Finrod, the server that handles Freak Nation, the GothPunk.com(Munity), and other major Silmemar Web and email operations, is now down. I am in the process of moving Finrod to his temporary hosting facility, where he will continue operating while the Silmemar phone line and DSL connection get migrated from our old apartment to our new condo. While Finrod is down, all web pages, email accounts, and mailing lists in the gothpunk.com, freaknation.com and silmemar.org domains will be unavailable. Since my "little blond elf" mood icon images are hosted on gothpunk.com, they will be "broken image" icons until Finrod is back up.During this service outage, email sent to accounts on Finrod will be queued for later delivery on our secondary mail server. I expect to have Finrod back online and fully functional at his new location no later than noon, Pacific time. I will post further updates here if time permits. |
|||||||||
|
|
|
| Monday, March 10th, 2008 |
|
|||||||
|
Speakeasy, the broadband provider that serves Silmemar, is currently having a network service problem in San Francisco. As a result, all Finrod and Galadriel services are currently down. This includes all email and Web pages hosted at the GothPunk.com(Munity) and at Freak Nation. You can tell that these sites are down, because my mood icon looks like a little "broken image" link instead of a little blond elf with mirrorshades that have green digits scrolling through them. You'll be able to tell that we're back online when the mood icon image comes back. Unfortunately, Speakeasy has no ETR at the moment. I'll post more when/if I get any information. Edited to Add: Apparently the connection came back up around 4:30, then went back down at 5:00. It is now back up again as of 5:46; we'll see if that remains the case. |
|||||||
|
|
|
| Sunday, March 9th, 2008 |
|
|||||||
|
There is a program out there called G-Archiver. (I am not linking to it for reasons which will shortly become clear.) this program claims that you can use it to back up all the mail in your Gmail account onto your own computer. Indeed, making backups is a laudable goal. However... I'm not sure if G-Archiver will successfully back up your Gmail or not. That's not important. It will email your Gmail username and password to the author of G-Archiver. The whole sordid tale of how one programmer discovered G-Archiver's hidden secret (and the juicy things he did to monkey-wrench it) are told in a recent post at Coding Horror, a blog about programming that I read and trust. One commenter at Coding Horror points out that if you want to back up your Gmail account, you can use Thunderbird in IMAP mode to do it. There's no need to muck around with some really sketchy-looking software. (Search for "Thunderbird" to find the comment.) |
|||||||
|
|
|
| Tuesday, March 4th, 2008 |
|
|||||||||
|
Despite being a coding ninja, I can still use pirates in my examples. And as a result, my example has enough cool points that I don't need to LJ-cut it. Everyone likes reading about pirates! Problem: Write a pair of functions: one that converts rectangular coordinates to polar ones, and a second that converts polar coordinates to rectangular. Discussion: Rectangular coordinates are the standard "x, y" coordinates you probably remember from high school math classes. (The phrase "Cartesian coordinate grid" or "Cartesian plane" might also come to mind.) Things like longitude and latitude are another form of rectangular coordinates. Saying that San Francisco is at "37° north, 122° west" is just saying it's at x = -122, y = 37. But for some things, it's better to use polar coordinates, which are expressed in an angle and a distance. For example, when following directions on a pirate map, you don't see stuff like "Go three fathoms east and then four fathoms north." Instead, you'll get "Go five fathoms northeast, then turn hard aport and walk another ten paces." For this sort of navigation, you need to be able to handle "5 units at 45 degrees plus 10 units at 135 degrees". In fact, it turns out to be easier to just convert rectangular coordinates into polar ones, manipulate those as needed, and then convert back, than to find a way to do that addition purely on a Cartesian grid. Hence the usefulness of the following functions. (People who work with polar coordinates generally use the Greek letter theta: θ to represent "angle". Instead of x and y, the coordinates are given in θ and r for "radius".) Solution: function rect2polar(x, y) {Analysis: Each function returns a two-element array, which the calling code will have to unpack on its own. The square-bracket syntax in JavaScript allows us to construct anonymous arrays without bothering to give them names. (You could do the same thing in Perl using parentheses; in PHP, you'd have to do return array(x, y).)Sample Code: Here's how we could use these functions to actually find Captain Trigg's buried treasure: // start from zeroSo, who says trigonometry is boring and useless, when it can tell you that you just need to turn 108.4 degrees (counter-clockwise from east, or basically, 8 degrees west-northwest) and go 11.18 fathoms? Why follow that dead-and-buried salty dog's convoluted directions, when you could just take the shortcut to the doubloons? Yarr, matey! |
|||||||||
|
|
|
| Monday, March 3rd, 2008 |
|
|||||||
|
This one is short enough that I don't think it needs an LJ-cut. Hey, everyone, look: Some PHP code! See, it isn't really that scary, is it? Problem: Write a function that takes an array as its argument, and returns the smallest (or largest) number in the array. Naïve Solution: function min($arr) {Demonstration of Bug: Note that this function is written in PHP. Because of the way PHP handles automatic type conversion, this code has a subtle bug in it... $data = array( 10, 20, 30, 'fred', 40);This will print zero, not 10. This is because 'fred' contains the letter 'e', which means it gets evaluated as a floating-point number, and then gets determined to be zero because it doesn't have any digits. (Nor should this be taken as a condemnation of PHP; you can cause similar type-conversion bugs in pretty much any language that does automatic type inference for you. There are many valid reasons to condemn PHP, but I chose it for this example because I could easily hyperlink to the documentation of exactly how it turns strings into numbers — and that documentation is a point in PHP's favor.) Corrected Version: function min($arr) {There. Now the function only considers array values that are numbers (or that make sense when considered as numbers). This means that if you pass in an array like ('fred', 'barney', 'wilma', 'betty'), you'll get back null instead of zero. On the other hand, if you pass in (10, 30, 0, 7, 13), you actually will get back zero, and it will be the correct answer.Conclusion: Note that PHP has its own built-in min() function (as well as max(), its logical opposite). In my informal tests, the built-in function ran nearly twice as fast as the custom version.When working in an interpreted scripting language (like PHP, Perl, or JavaScript), the built-in functions will naturally be faster than the stuff you write yourself. Therefore, you should use them, unless they don't do what you want... PHP's built-in min() has the same bug as my first version. (Of course, since they documented it, they might claim "it's not a bug".)Also, neither JavaScript nor Perl has this sort of function already built in, so it'd make sense to write equivalent code in either of those languages. (Doing so is left as an exercise for the student.) |
|||||||
|
|
|
| Saturday, March 1st, 2008 |
|
|||||||
|
Problem: You have a list, or array, of sorted values. (For example, a directory listing, alphabetized by last name, or a dictionary of words.) Write a function that takes one argument, and searches the array. If the argument is found in the array, your function should return the item's index; otherwise, return -1. Make your function perform as fast as possible, even if the array is thousands of items long. Assume that the values are in |
|||||||
|
|
|
| Monday, February 18th, 2008 |
|
|||||||||
|
Is It a Palindrome? (This was a question he asked me when I interviewed at his workplace a few yonks ago. He and I and Problem Write a function that takes a single string as input, and returns a Boolean value depending on whether the string is a palindrome. Discussion A couple of commonly mentioned palindromes in English are "A man, a plan, a canal, Panama!" and "Madam, I'm Adam." These two alone are enough to make it clear that the standard "is it or ain't it a palindrome?" rule(s) in English don't really care about punctuation. Or capitals, or any of that crud. It's just a strict "letters only, case-insensitive" thing. Since Captain Holy Hippie and I already beat this one to death in Perl in my previous entry, I'll reiterate the Perl solution, then also solve it in PHP and JavaScript so that I'll have done enough work to count. |
|||||||||
|
|
|
| Monday, February 4th, 2008 |
|
|||||||
|
Users of Finrod, I am pleased to announce that I've just upgraded our copy of SpamAssassin from version 3.1.0 to 3.2.4. The new version comes with updated spam-detection rules, better adapted to find the spam of 2008 (instead of the spam of 2006). I've already run a few tests and verified that mail is still being received just fine. You shouldn't notice any changes, except for less spam in your inbox. However, if you do notice any troubles at all, don't hesitate to contact me immediately and let me know. |
|||||||
|
|
|
| Friday, February 1st, 2008 |
|
|||||||
|
We need someone skilled at front-end layout and page coding. This person doesn't need to come up with the designs and layouts (that's the Art Department's job), but does need to implement what they come up with — take it from mockup or comp to finished product. It needs to work in Firefox and IE (versions 6 and 7), pull data from the back-end as needed, and be maintainable and extensible. Critical skills, roughly in order of importance:
This person needs to be able to work with source control (we're converting from CVS to Subversion; using a GUI front end such as TortoiseCVS is fine), and work with remote developers in Eastern Europe (don't worry, they speak English; knowing Ukrainian is not a job requirement for US employees!). Now, since I've recently posted things about how dissatisfied I am, I need to say a little bit more about my employer. On an objective level, iWin is not a bad place to work. My recent gripes and grumbles are subjective; I've basically hit the point where I don't want to work here any more. A few important points:
So, that's the down-side. The up-side is considerable:
All in all, iWin is a great place to work. It's just not the right place for me any more. Note that this is not attempting to fill my own position; this is the other front-end person, who's worked here for over three years. Her last day is fast approaching. If you can do this, or you know someone who can, please let me know or direct them here. Thanks. |
|||||||
|
|
|
| Tuesday, January 29th, 2008 |
|
|||||||
|
It appears that, starting just after 9:30 this morning, someone started running a dictionary attack against Finrod (the GothPunk/Freak Nation mail server). (I have no reason to believe that we were targeted deliberately. The attack appears to originate from a cable-modem user in central Oregon, most likely someone whose machine has been "zombied" and used to launch automated attacks in the hope of finding open relays to send spam through.) At about 9:45, the volume of attacks became so high that the POP subsystem — the part that allows people to check their email — stopped responding. Since my own email program was set up to use one of the new services that I've recently been testing, I didn't initially notice the failure. As a result, Finrod users were unable to check their email from about 9:45 until about 2:15 p.m. We were still receiving email throughout this interruption, it's just that users were unable to check for their email until I got things working again. All your mail is safe and sound, in your inbox where it belongs. I'm sorry for the inconvenience, and for the excessively long downtime. In case you were wondering why my "new dictionary attack blocker" didn't stop this one, that's simple: My new blocker was designed to stop dictionary attacks using SSH (a way of logging in on the command line, for geeks); this is the first time we've gotten hit by a POP dictionary attack (which attempts to check for email as every possible user). System administration is a never-ending battle, eh? |
|||||||
|
|
|
| Wednesday, December 19th, 2007 |
|
|||||||||
|
Soon, I'm strongly considering Sonic.Net. But before I make the leap and start asking them to hook me up at my new abode, I'd like to find out if any other Bay Area geeks have experience with them. So: Anyone who's tried a Sonic connection, please let me know how it went! In case you want to know about my skills and needs: I run my own servers (Web, email, DNS, FTP, etc.), and these servers include my primary email account and my professional résumé/portfolio website. I absolutely require at least two static IP addresses and a ToS that allows me to run my own servers. I also need at least 99.9% uptime, and 99.99% would be much better. (Five nines, I do not demand. If I'm down for an hour or two per year, I can live with that.) I need outbound bandwidth almost as much as inbound, so the usual "6 gazillion yottabits down, piddly 128 Kbps up" connection will not work for me. On the other hand, I don't need any technical hand-holding. I basically call tech support when the connection goes down, to report that it's done so. That's all. Nor will I use up any email addresses or hosting space on my broadband provider's machines. All I need is the bandwidth. I'm leaving this entry public, so if you know a Bay Area broadband user with useful information, feel free to refer them to this post. Thanks! |
|||||||||
|
|
|
| Tuesday, December 18th, 2007 |
|
|||||
|
Here's wishing |
|||||
|
|
|
| Saturday, November 24th, 2007 |
|
|||||||||
|
Very soon — possibly some time tonight; definitely by Monday morning — I will be switching Finrod over from Qmail to Postfix. I've taken every possible precaution to ensure that this will go smoothly and without a hitch. But there are always unforeseen problems. If you notice any problems having to do with sending email to, or receiving email at, accounts hosted on Finrod (basically, any gothpunk.com or freaknation.com accounts or mailing lists) please let me know as soon as you can. If it seems like emailing me might not work, try phoning me. Or just post a comment here; you don't even have to be a Livejournal user to do so. (If you post as "Anonymous", please sign your name in the body of the comment so I know who the heck you are.)Here's hoping everything goes smoothly. |
|||||||||
|
|
|
| Monday, November 19th, 2007 |
|
|||||||
|
Phase 2 is apparently nausea.... Warning! If you have a sore throat now, be very very careful with yourself to try to avoid the nausea phase.... Also, I hear this comes back with a vengeance if you relapse. Take care of yourselves, people. I now feel much better about my decision to skip work today. Also, I note that this thing seems to be awfully infectious. If you have it, do your friends and co-workers a favor, and stay home. |
|||||||
|
|
|
| Thursday, September 20th, 2007 |
|
|||||||
|
First of all, I'd like to apologize for the great length of this post. However, I think it's significant enough material that I don't feel like LJ-cutting it. I hope you'll read it all, and consider it deeply. We're Leaving Livejournal. Soon. It seems Livejournal and Six Apart are slowly self-destructing under the weight of their own incompetence and inconsistency. My account is currently paid up until January 12th; Fey's is only paid until October 2nd. Once our current paid accounts revert to free accounts, we'll probably be using other services instead. To the extent possible, we'll try to make sure that either people can find our new blogs, or the posts from the new blogs are automatically sent back to LJ, or both. Fey is looking strongly at GreatestJournal; I'm likely to set up three different blogs: a "professional" (i.e., technical) one on my professional site; a separate blog on its own domain for the ninja coder; and maybe a third, personal, blog on GJ or some similar place. Our Reasons for Leaving: Over the past year or so, Livejournal has committed a number of basic blunders in relating to its own user base, and the frequency of these blunders is increasing. At the same time, they've now started doing things that make it very difficult to see them as "well-meaning but incompetent"; instead, they now appear to be actually duplicitous. Specifically:
All that was as of a few weeks ago. While I've been writing, editing, and polishing this essay, new developments have suddenly taken place that simply add to the overall "sinking ship" feeling. Much More Recent Developments: Had you heard that they've canned Barak Berkowitz? Okay, maybe they'd never actually put it in quite those terms (and certainly not in a press release). But we've come to realize that we have to read between the lines in everything Livejournal and Six Apart say, so here are the most noticeable things:
Enough is enough. We were prepared for things to be a little rocky, for a little while, after the acquisition by Six Apart. And we waited, to see if things would get better. They're not. They're getting worse. And they've gotten bad enough that, for Fey and I, leaving is not simply a matter of convenience, or of "I suppose we could find better/cheaper service somewhere else". It's a matter of conscience. We cannot, in good conscience, support Six Apart's policies any longer. We certainly can't give them any more money, but even having an active Livejournal account boosts their usage numbers, and so gives them some measure of support. So don't assume that our journals will continue to be here for much longer. So, Where Will We Be? My guess is, some combination of GreatestJournal, InsaneJournal, and our own personal domain(s). I'm currently investigating blogging packages that I can host on Finrod. We will keep you all posted on wherever we decide to go. |
|||||||
|
|
|
| Monday, August 27th, 2007 |
|
|||||||
|
I've heard a saying about customer satisfaction: "If a customer's happy, they'll tell two friends. If they're unhappy, they'll tell seven." Well, that was the old days. Now, if a customer's unhappy, they'll post about you in their blog. So, let's talk about Tempura House, on 2nd Street at Natoma. I went in and ordered a salad and some sashimi. This should be an order that takes about 30 seconds to prepare, especially since the salads are pre-mixed and sitting in little Styrofoam cups. But, no... First, they lost my order. Then they appear to have lost my order a second time (and it sounded like some other customer's order was missing, too.) Finally, they got me my food and I brought it back here to my desk to eat. The salad, of course, is a little pre-mixed green salad. It's exactly what you'd expect; nothing to write home about, but nothing wrong with it. The sashimi, on the other hand, is flat-out, without a doubt the worst sashimi I have ever had. It is cut into chunks rather than slices, and I'm not sure the meat is really sashimi-grade. Ugh. Prior to this, the worst sashimi I had ever had was the time I tried making the stuff myself. I cut the meat too thick, and didn't really have it chilled quite enough. This sashimi has basically the same problems, except much worse — and without the excuse I had. (And I wasn't charging anyone fifteen bucks for it.) And my second try was much better. And even my first try was very noticeably better than what I was just served at Tempura House. |
|||||||
|
|
|
| Saturday, August 18th, 2007 |
|
|||||||
|
Last night, at about 4:45 am PDT, Silmemar's DSL modem lost its connection with our broadband provider. I woke up shortly before 9:00 am this morning, discovered the problem, rebooted the modem, and all is now well. If you attempted to access any of our web sites during that time, you would have gotten an error message of some sort. If someone tried to send email to your account hosted on Finrod (i.e., any @gothpunk.com or @freaknation.com email address), the mail would have been queued on our secondary mail server (generously hosted by I apologize for any inconvenience. |
|||||||
|
|
|
| Friday, August 10th, 2007 |
|
|||||||
|
Since I was out at the Lucky 13 tonight, my throat is pretty badly ripped up. (Shouting over huge amounts of ambient noise is simply not my friend.) So I'm having a nice, piping hot cup of Tazo Green Ginger tea, with copious amounts of lemon juice and honey. And, having had lots of this tea back when I had a sore throat, I feel compelled to post about the pros and cons of this tea... Pro: Con: "There is a garden overlooking the Yangtze River gorge where an elderly man contemplates his life while sipping a cup of Green Ginger. Perhaps you would like to join him." I cannot possibly express how incredibly tired I am of the image of this old geezer sitting there watching the water go by, sipping his tea, and thinking: "My life. Hmmmm... there's not a whole lot to contemplate there. You know, maybe I'd have more to think about when I look back on my life if I hadn't spent so goddamn much of it just sitting here, sipping my fuckin' tea! Hey, you know what? Maybe I should have, at the very least, tried visiting the Huang He River or the Xijiang River. Or, you know what? Maybe I could have spent some of my life sipping some other beverage, like oolong tea... or even something completely other than tea, if I'd been feeling really adventurous." Do you suppose Tazo could have coughed up the extra dough to maybe put a variety of different stupid scene descriptions on their tea-bag envelopes? Then at least I wouldn't have to be bored to tears by the wasted life of this poor Chinese man every time I wanted to drink a cup of tea. Instead, there could be a whole cast of characters:
There's all kinds of places they could have gone with this, including to the friggin' teahouse of the August Moon. Instead, all we get is one lousy description about an old guy on the Yangtze River gorge. Puh-leeze. And let's not even get me started on the really annoying question that constantly bedevils my copyeditor-brain: That final sentence, about "Perhaps you would like to join him." Should that be a statement, or should it be a question? I think, if I really had to make a decision, I'd go with the option Tazo chose: it's a statement. "Perhaps it will rain." "Perhaps you would like to join him." "I don't know why she swallowed the fly. Perhaps she'll die." But every so often, especially late at night, I wonder: Wouldn't it work at least as well if phrased as a question? "Perhaps you would like to join him?" No, that doesn't work. But maybe they should have just rephrased it entirely: "Wouldn't you like to join him?" As marketing-speak goes, I think that would actually be stronger — it includes a "call to action", rather than simply being a statement. I am obviously spending far too much mental effort on this. And that just adds to the con. Pro: |
|||||||
|
|
|
| Tuesday, August 7th, 2007 |
|
|||||||
|
Although all systems are currently operational, I have noticed a brief problem with one of the Ethernet switches at Silmemar. I plan to replace that switch when I get home from work this evening, but in the meantime, there is a chance that it could fail unexpectedly. If this happens, all connections to Freak Nation and the GothPunk.com(Munity) will become unavailable, and my little elfy mood icons will all become "broken image" icons instead. If you receive email with an @freaknation.com or @gothpunk.com account, the incoming mail will be stored on our secondary, backup mail server, and will eventually be delivered to your inbox once I get the switch replaced.Once again: right now, all is working properly. This is simply a warning in case it fails during the day. |
|||||||
|
|
|
| You've been reading Digital Sidhe's Random Scribblings. | ||||||||
|
||||||||