regular expressions have always amazed me. if there's one thing that's magical about programming, it's regular expressions. they can literally pull apart the written language of humans in elegant ways.
you may have heard of them, but maybe not. put simply, a regular expression (aka regex or regexp) is a way of taking apart a string of text and finding and/or extracting exactly what you want. it's very, very powerful, and they can be very intimidating to look at.
a regular expression is technically its own programming language, or better put, it's a parsing language. it goes through the text you provide to it and it parses out whatever you specify.
across the board, the core functionality of regular expressions are the same from language to language, but there are a few idiosyncrasies here and there. for the purposes of this guide, everything I show you should work similarly in PHP, Perl, Javascript, Ruby, and Python. However, I'm going to use Javascript as the primary example language, since it treats regex as its own object.
regular expressions are built into most every programming language in one way or another, so learning it once will help you most anywhere you are.
regular expressions have a huge range of uses. it's one of the most powerful tools in the ol' nerd utility belt. but what are some practical uses?
pretty much anytime you need to do something specific with text, you'll probably need a regular expression. regular expressions can turn complex convoluted functions into one single regular expression clause.
here's a very simple regular expression. remember, this is javascript, as an example.
var sometext = "Hello there!";
var regex = /there/;
if (regex.test(sometext)) {
alert('oh boy!');
} else {
alert('nope.');
}
so what are you seeing? first, we make a variable with just a string. that's fine. but then after that we have another variable -- and it's surrounded by /s?
traditionally a regular expression is contained within / characters. they denote the beginning and end of the expression. in other languages (like PHP) the regex is contained within a string, but it'll still have the starting / and the ending /
right now, the regular expression is simply the word there. that's it. nothing special about it.
the if statement uses the RegExp object's test() method, which tests the regular expression on the provided string. So we gave it the first variable and said "does the regular expression return anything?"
Of course, the word there is indeed inside the string Hello there! so if you ran this in a browser, you'd see the Oh boy! alert box.
so yeah, using just text inside a regular expression is fine, but that's not very interesting. you begin to unlock the true power of regex when you start using metacharacters, quantifiers, modifiers, and brackets.
we'll look at them one at a time! they're so exciting. let's start with something easy: modifiers. these affect the whole expression. let's try a different example than above:
var sometext = "Hello there!";
var regex = /hello/;
if (regex.test(sometext)) {
alert('oh boy!');
} else {
alert('nope.');
}
ok so all we changed was the regex from there to hello... if you run it, it won't work! Why? well, there is no hello in that string. There's a Hello... which has a capitalized H. so it's not the same. haha.
but say we don't care about case-sensitivity (case-sensitive means every character needs to be exactly-so) and we just want it to match either hello or Hello or even heLLO...
all you need to do is add the case insensitive modifier to the end of the expression:
var sometext = "Hello there!";
var regex = /hello/i;
if (regex.test(sometext)) {
alert('oh boy!');
} else {
alert('nope.');
}
haha, now it'll work. all we added, if you noticed, was the i to the end of the regular expression, outside of the expression's final /. that's where modifiers go!
the two other popular ones are g and m... g means global, meaning it'll match all of them as opposed to stopping at the first. i'll show you what i mean in a minute. m means multiline, so one expression can go across multiple lines of text if there are line-breaks.
here's another very basic regular expression example:
var sometext = "Haha well aren't we happy.";
var regex = /ha/ig;
var newtext = sometext.replace(regex, "lo");
alert(newtext);
so you can see, we have a string of text, then a regular expression, which simply looks for the text ha and it's case-insensitive and global, meaning it'll look for every instance of ha and it won't care about the case.
if you run that, you'll get back the text lolo well aren't we loppy. haha... good example. it used the regular expression to find what parts of the text it should replace with the new text "lo", get it?
so those are modifiers.
this are where things get crazy. if you read the PHP guide, you might remember me talking about escape characters, so that you can have a newline \n character inside a string (instead of having an actual new line). a metacharacter works much the same way.
metacharacters simply show what cannot be shown, or act as shortcuts to larger sets of text. for example, the \d metacharacter represents all digits. so if you just want to select all of the numbers in a string, you could easily use that to match them all.
every metacharacter starts with that slash and then another character. here are some popular ones:
so, for example, let's say we want to find the text "cat" inside a string:
var test_string_one = "cats cat caterpillar";
var regex_one = /cat/gi;
that regex, for that string, would match every instance of the text cat, no matter where it is. what if we wanted just the word "cat"?
var test_string_one = "cats cat caterpillar";
var regex_one = /\bcat\b/gi;
if we surround the text with the \b metacharacter, it'll make sure that it only matches the text if "cat" is its own word!
something that always scared me (haha, yes) was that the \b and the cat were touching... that sounds strange, but it seemed weird to me. i always read it like bcat? uhhh...
but take a moment to remember that this isn't for your eyes, this is for a machine to understand, and the parser will read the regular expression one character at a time. so don't be afraid of how strange the regular expression looks! it all looks comprehensible to our robot overlords...
another metacharacter example:
var sometext = " this has a lot of whitespace ";
var regex = /\s/g;
var newtext = sometext.replace(regex, "");
that string has a lot of blank whitespace. kinda ugly. how about we just kill all the whitespace! the regex, you'll notice, just has a single metacharacter, the whitespace one, and it's gonna look for it globally. with the replace() method we find all instances of whitespace and then replace them with nothingness!
kinda weird thing to do, but I haven't taught you quantifiers yet, so that's as basic as it can be. what if we want to replace those long sections of spaces with just a single space?
say we wanted to match not just text or a metacharacter, but a series of characters. let's use the above example again.
quantifiers simply specify how many times to look for the previous character... let me show you!
var sometext = " this has a lot of whitespace ";
var regex = /\s+/g;
var newtext = sometext.replace(regex, " ");
I changed two things: I added a + after the \s metacharacter, and I put a single space as the replacement string. what will this do? it'll find blocks of whitespace at least one character in length and replace them with a single space. CRAZY AWESOME.
as I said, the quantifier acts on whatever token (another word for character or set of characters) came before it. in this case, the \s token came before the plus sign, so the plus sign quantifier acts on that. it'll match one and then however many follow it.
here are the basic quantifiers:
here are some examples!
/hello+/i
will match:
hello
Hello
heLLo
HELLOOOOOOOO
because the + means at least one of the preceding token (which was just the character o), you can have as many as you want and it'll still match
/colou?r/i
will match:
color
colour
because we put a ? before the u, it'll match the string, whether the u is there or not! wow.
/hel{2,3}o/i
will match:
hello
helllo
but will not match:
helo
hellllo
because we asked it to match exactly two or three ls between the e and the o.
so you may be asking, what if I want to use a quantifier on a group of characters? right now all you know is that it works on the preceding token!
that's where groups and brackets come in, because they act as their own as a singular tokens the same as an individual character would.
so for an easy example, let's just show a group:
/l(ol)+/i
will match:
lol
lololololol
LOLOL
magical! so we enclose part of the text in parentheses and it'll act like a single token! so when you use the + quantifier, it's checking for everything within the group to be repeated.
brackets are similar, but a bit more abstract. I'll show you one:
/i feel [a-z]+/i
will match:
i feel good
i feed bad
i feel great
brackets are used to contain a range of possible characters. so in this example, it fits anything between a and z and the + quantifier after it says there can be one or more!
I should tell you now that groups inside parentheses also can act as sub matches in certain situations... for example:
/^i feel ([a-z]+)$/i
notice I denoted the beginning and end of the string with the ^ and $ metacharacters, just to make this airtight. that means that the string must start with i and must end after whatever the captured group is. I grouped the a to z range and its quantifier. when using certain functions, like PHP's preg_match() function or Javascript's match() method, this'll allow you to select not just the whole expression, but those sub-groups.
So if you ran PHP's preg_match() with that regex and gave it the string I feel great, it would capture the whole thing, but it would also capture just the word great. Very useful!
and you can put even more stuff within brackets together. for instance:
/i feel [a-z0-9_!]+/i
that'll match anything between a and z as well as anything between 0 and 9 and also any underscores or exclamation points!
you should remember also that you could shorten what's in the brackets by replacing the need for the a-z and 0-9 ranges with just the \w metacharacter, like so:
/i feel [\w_!]+/i
will match:
i feel great!
i feel fine
i feel __okay__
that does the same thing! remember, most metacharacters are shortcuts. the \w represents anything a-z, A-Z, and 0-9. magical!
within groups you can also use the | pipe character to separate possibilities. so if you want to match one of three colors, you'd do it like this:
/i like (red|green|blue)/i
will match:
i like red
i like blue
will NOT match:
i like yellow
haha, so if you're looking for something within a specific group of possible values, you can do it that way within the regex itself.
how I usually think of regular expressions requires me to think like a computer. it really makes you need to break down language itself into its smallest parts.
here's a common regex:
/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i
Oh jeez look at how complicated it is! What does that do? I'll just tell you: it matches any email address! Let's break it apart...
obviously the first and last characters, ^ and $, signify the beginning and end of the string. And it has the i case-insensitive modifier for the whole thing.
so let's take those out. now let's focus on the first part:
[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}
that's not so bad: it's just a range of possible characters, specifically A-Z and 0-9, and then periods and underscores and whatnot. Notice that the plus sign is in there but it does not act as a quantifier, because it's within brackets. However, if you were searching for a + sign in the text, you'd need to escape it... but we'll get back to that later.
[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}
next we have just the @ symbol, because every email address has that!
[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}
and after the @ an email address always has a domain name! And that domain name can only contain alphanumeric text, a period, or a hyphen. Nothing too special here. But this only covers the beginning of the domain name, so if it was google.com, this part would only cover the google part.
[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}
this may seem a little puzzling. in a regular expression, the period . is a metacharacter which represents any character, so in order to use a period as just a period, we need to escape it by putting a \ before it! okay so now we got the period in the domain name, moving on.
[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}
so what's between two and four characters and can only be letters? com, net, org, edu... the end of the domain name!
here's the full regex again:
/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i
now take your own email address and try to follow along to see how they match. it's magical.
here's the whole thing matched out more obviously:
/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i
<EMAIL_ADDRESS>there are two main challenges to writing good regular expressions:
you have to be as specific as the results you're expecting, yet you have to be broad enough to allow a range of possibilities. once you get the hang of it, though, it's pretty simple.
I highly recommend this online tool to test out your regular expressions. It's flash-based so it has a couple quirks, but it's very thorough, and shows you results as you type.
there's a lot more you can do with regular expressions, but these are the most useful basics. I don't really stray from what I've taught you here very often, and they've gotten me some great results.
and now you can wear this shirt and really nerd yourself out!


Character Name
Class & Level
Background
Player Name
Race
Alignment
Experience Points
Strength
Dexterity
Constitution
Wisdom
Intelligence
Charisma
Inspiration
Proficiency Bonus
Strength
Dexterity
Constitution
Wisdom
Intelligence
Charisma
Saving Throws
Acrobatics
(Dex)
Animal Handling
(Wis)
Arcana
(Int)
Athletics
(Str)
Deception
(Cha)
History
(Int)
Insight
(Wis)
Intimidation
(Cha)
Investigation
(Int)
Medicine
(Wis)
Nature
(Int)
Perception
(Wis)
Performance
(Cha)
Persuasion
(Cha)
Religion
(Int)
Sleight of Hand
(Dex)
Stealth
(Dex)
Survival
(Wis)
Skills
Passive Wisdom (Perception)
Other Proficiencies and Languages
Armor Class
Initiative
Speed
Hit Point Maximum
Current Hit Points
Temporary Hit Points
Total
Hit Dice
Death Saves
Successes
Failures
Attacks & Spellcasting
Name
Atk Bonus
Damage/Type
Equipment
cp
sp
ep
gp
pp
Personality
Ideals
Bonds
Flaws
Features & Traits


If you've upgraded from a version of Hudson earlier than 1.330, you may encounter an error like the one below when attempting to install or upgrade plugins:
Oct 28, 2009 2:14:58 PM hudson.model.UpdateCenter$DownloadJob run INFO: Starting the installation of Mercurial Plugin on behalf of bshows Oct 28, 2009 2:14:58 PM hudson.model.UpdateCenter$DownloadJob run SEVERE: Failed to install Mercurial Plugin java.io.IOException: Installation of plugin from https://hudson.dev.java.net/files/documents/2402/144520/mercurial.hpi is not allowed at hudson.model.UpdateCenter$UpdateCenterConfiguration.preValidate(UpdateCenter.java:583) at hudson.model.UpdateCenter$DownloadJob._run(UpdateCenter.java:846) at hudson.model.UpdateCenter$InstallationJob._run(UpdateCenter.java:951) at hudson.model.UpdateCenter$DownloadJob.run(UpdateCenter.java:832) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619)
This is a result of the data file Hudson gets its information on available plugins, versions, etc, and the plugin and core Hudson downloads themselves, have moved to a new server, and older versions of the file in question, update-center.json, won't work with Hudson 1.330 and later.
To fix this, do the following:
- Stop Hudson.
- Delete $HUDSON_HOME/update-center.json.
- Restart Hudson.
- Go to Manage Hudson->Manage Plugins, and then the Advanced tab - click "Check Now" in the bottom right.
After doing this, you'll have an up-to-date copy of update-center.json, and you'll be able to install or upgrade plugins as before.


Ingredients:
3 tbsps Tata Sampann Organic Toor Dal, ¾ tsp asafoetida, ½ tsp turmeric powder, 2 large tomatoes, finely chopped, 2 tbsps freshly chopped coriander leaves, 1½ tbsps rasam powder,
Salt to taste, 1 tbsp tamarind pulp, 7-8 black peppercorns, 2 tsps cumin seeds, 1 tbsp ghee, ¼ tsp mustard seeds, 8-10 curry leaves, Steamed rice to serve, Fried papad to serve
Method:
1. In a bowl, add Tata Sampann Organic Toor Dal and add sufficient water. Soak it for 20-25 minutes. Boil it with ½ tsp asafoetida and turmeric powder.
2. Meanwhile, in a pan, add tomatoes, chopped coriander, rasam powder, salt and sufficient water. Mix well, cover and cook till the mixture comes to a boil.
3. Add the cooked dal and mix well. Cover and cook till the tomatoes are pulpy and the mixture comes to a boil.
4. Add tamarind pulp and mix well. Lower the heat and allow to reduce slightly.
5. Meanwhile, dry roast black peppercorns in another non-stick. Add cumin seeds and roast till fragrant. Transfer them into a jar and blend to a coarse powder.
6. Add the prepared powder into the rasam, mix well and cook for 2-3 minutes.
7. For the tempering, heat ghee in the same pan, add mustard seeds, remaining asafoetida and curry leaves. Let the seeds splutter and add it to the rasam.
8. Cover and cook for 1 minute. Take it off the heat.
9. Serve hot with rice and fried papad.


Methods
(static) getDateToDays(year, month, day) → {number}
Get the total number of days from year 1, month 1, day 1, of the given date.
Parameters:
| Name | Type | Description |
|---|---|---|
year |
number | The year part of the date. Cannot be zero. |
month |
number | The month part of the date (1 to 12). |
day |
number | The day part of the date. |
Returns:
The total number of days since day 1 year 1 AD.
- Type
- number
(static) getDayOfWeek(year, month, day) → {zbDayOfWeek}
Get the day of the week. Values are as follows
0 = Sunday
1 = Monday
2 = Tuesday
3 = Wednesday
4 = Thursday
5 = Friday
6 = Saturday
Parameters:
| Name | Type | Description |
|---|---|---|
year |
number | The year value of the date. |
month |
number | The month value of the date (1 to 12). |
day |
number | The day value of the date. |
Returns:
The day of the week.
- Type
- zbDayOfWeek
(static) getDayOfYear(year, month, day) → {number}
Get the given date's day of the year.
Parameters:
| Name | Type | Description |
|---|---|---|
year |
number | The year value of the date. |
month |
number | The month value of the date (1 to 12). |
day |
number | The day value of the date. |
Returns:
The day of the year.
- Type
- number
(static) getDaysInMonth(year, month) → {number}
Get the number of days in a month. This can depend on the year. February can have 28 or 29 days if it is a leap year.
Parameters:
| Name | Type | Description |
|---|---|---|
year |
number | The year part to workout the days in a month. |
month |
number | The month to find out the number of days in. |
Returns:
The number of days in the given month.
- Type
- number
(static) getDaysInYear(year) → {number}
Get the number of days in the given year. This can depend on the year. Leap years have 366 days instead of 365.
Parameters:
| Name | Type | Description |
|---|---|---|
year |
number | The year to get the number of days for. |
Returns:
The number of days in the given year.
- Type
- number
(static) getDaysToDate(days) → {object}
Get a date from the total number of days from year 1, month 1, day 1.
Parameters:
| Name | Type | Description |
|---|---|---|
days |
number | The total number of days to convert into a date. |
Returns:
An object with year, month and day parts set to the worked out date.
- Type
- object
(static) getSecondsToTime(seconds) → {object}
Get a time from the total number of seconds.
Parameters:
| Name | Type | Description |
|---|---|---|
seconds |
number | The total number of seconds to convert into a time. |
Returns:
An object with day, hour, minute and second parts set to the worked out time.
- Type
- object
(static) getTimeToSeconds(hour, minute, second) → {number}
Get the total number of seconds for the given time.
Parameters:
| Name | Type | Description |
|---|---|---|
hour |
number | The hour part of the time (0 to 23). |
minute |
number | The minute part of the time (0 to 59). |
second |
number | The second part of the time (0 to 59). |
Returns:
The total number of seconds for the time.
- Type
- number
(static) isLeapYear(year) → {boolean}
Is the given year a leap year?
Parameters:
| Name | Type | Description |
|---|---|---|
year |
number | The year to check against. |
Returns:
True if the given year is a leap year, false if it is not a leap year.
- Type
- boolean


opendir
(PHP 4, PHP 5, PHP 7)
opendir — 打开目录句柄
说明
resource opendir ( string $path [, resource $context ] )
打开一个目录句柄，可用于之后的 closedir()，readdir() 和 rewinddir() 调用中。
参数
path
要打开的目录路径
context
context 参数的说明见手册中的 Streams API 一章。
返回值
如果成功则返回目录句柄的 resource，失败则返回 FALSE。
如果 path 不是一个合法的目录或者因为权限限制或文件系统错误而不能打开目录，
opendir() 返回 FALSE 并产生一个 E_WARNING 级别的 PHP 错误信息。可以在 opendir()
前面加上“@”符号来抑制错误信息的输出。
更新日志
版本 说明
5.0.0 path 支持 ftp:// URL wrapper
4.3.0 path 可以是任何支持目录列表的 URL，不过在 PHP 4 中只有 file:// URL
wrapper 支持此功能
范例
Example #1 opendir() 例子
以上例程的输出类似于：
filename: . : filetype: dir
filename: .. : filetype: dir
filename: apache : filetype: dir
filename: cgi : filetype: dir
filename: cli : filetype: dir
参见
• is_dir() - 判断给定文件名是否是一个目录
• readdir() - 从目录句柄中读取条目
• dir() - 返回一个 Directory 类实例
User Contributed Notes 53 notes
===============================================================================
Breadth-first-search (BFS) for a file or directory (vs. Depth-first-search)
http://en.wikipedia.org/wiki/Breadth-first_search
$path \n";
}
$root = '../public_html';
$file = 'data.xml';
$callback = 'my_func';
$omit = array( 'include/img', 'include/css', 'scripts' );
//print breadth_first_file_search ( $root, $file );
//print breadth_first_file_search ( $root, $file, $callback );
//print breadth_first_file_search ( $root, $file, NULL, $omit );
print breadth_first_file_search ( $root, $file, $callback, $omit );
function breadth_first_file_search ( $root, $file, $callback = NULL, $omit =
array() ) {
$queue = array( rtrim( $root, '/' ).'/' ); // normalize all paths
foreach ( $omit as &$path ) { // &$path Req. PHP ver 5.x and later
$path = $root.trim( $path, '/' ).'/';
}
while ( $base = array_shift( $queue ) ) {
$file_path = $base.$file;
if ( file_exists( $file_path ) ) { // file found
if ( is_callable( $callback ) ) {
$callback( $file_path ); // callback => CONTINUE
} else {
return $file_path; // return file-path => EXIT
}
}
if ( ( $handle = opendir( $base ) ) ) {
while ( ( $child = readdir( $handle ) ) !== FALSE ) {
if ( is_dir( $base.$child ) && $child != '.' && $child != '..' ) {
$combined_path = $base.$child.'/';
if ( !in_array( $combined_path, $omit ) ) {
array_push( $queue, $combined_path);
}
}
}
closedir( $handle );
} // else unable to open directory => NEXT CHILD
}
return FALSE; // end of tree, file not found
}
?>
===============================================================================
A couple of notes on Matt's posts on Windows Network Drives:
Since the system() command writes the output of the executed shell command
straight to the output buffer, if you wish to hide the return of the mapping
command (i.e. "The command completed succesfully" or an error message) from a
web browser, you need to alter the command that is sent to the shell so that
the output of that command is hidden.
You probably thinking "why not just use exec()?", and it's a reasonable
question, but for some reason it doesn't always work - I guess it's another NT
user permissions issue. If you want to guarantee you app will work with no
messing around on the host system, use the system() command.
In the Windows command shell, you can hide the output of a command by sending
both the output (1) and error (2) messages to "nul" using pipes, in other words
">nul 2>&1" on the end of the command. The username and password order in the
"net use..." command needs switching in Matt's post.
Here (http://networkm.co.uk/static/drive.html) is a function I wrote to
dynamically choose which drive letter to use, based on what is currently mapped
and accessible to PHP.
nul 2>&1");
// Open the directory
$dir = opendir($letter.":/an/example/path")
...
?>
===============================================================================
Here are two versions of the same function to list all files in a directory
tree.
The first one is recursive (calls itself while going through subdirectories) :
The second one is iterative (uses less memory) :
The iterative version should be a little faster most of the time, but the big
difference is in the memory usage.
Here is also a profiling function (works in php5 only) :
-----------------------
Test run for '.$func.'() ...
'; flush();
$time_start = microtime(true);
$list = $func( $trydir);
$time = microtime(true) - $time_start;
echo 'Finished : '.count($list).' files';
$mem2 = memory_get_peak_usage();
printf( '
Max memory for '.$func.'() : %0.2f kbytes
Running time for '.$func.'() : %0.f s
',
($mem2-$mem1)/1024.0, $time);
return $list;
}
?>
===============================================================================
oryan's example is still sub-optimal, even if people using it never ever
substitute a variable for directory.
Just use PHP's glob() function, which will be faster and more efficient anyway
since it doesn't have to launch a shell and run the ls program (that's what the
shell_exec does).
$result = glob("directory/*");
===============================================================================
A simple piece to open a directory and display any files with a given
extension. Great for things like newsletters, score sheets or the like where
you just want to make it easy on the user - they just dump in the file with the
correct extension and it's done. A link is given to the file which opens up in
a new window.
List of available files:
");
while ($file = readdir($dir)) // while loop
{
$parts = explode(".", $file); // pull apart the name and
dissect by period
if (is_array($parts) && count($parts) > 1) { // does the dissected array
have more than one part
$extension = end($parts); // set to we can see last file
extension
if ($extension == "ext" OR $extension == "EXT") // is extension ext
or EXT ?
echo " $file "; /
/ If so, echo it out else do nothing cos it's not what we want
}
}
echo " ";
closedir($dir); // Close the directory after we are done
?>
===============================================================================
Having spent an hour or so trying to get a complete list of files from a
network share on Windows, I've given up (Apache 2.2 Win32, WinXP, PHP5 ->
Windows 2000 R2).
Trying to use a mapped drive letter gives me an error and trying to use the UNC
path works but is dog slow (it takes a couple of minutes to open and readdir()
a directory with a couple of hundred files).
Using this code is fast and instant (you'll have to chop up the output yourself
but so be it!)
$out = `dir $dir /B /S`;
If you don't need recursive subdirectories remove the /S from the command - for
more details run 'dir /?' on Windows.
Hope this helps somebody in a similar fix!
===============================================================================
I tried it as in the post before described, but it still won't work. Maybe
cause i'm using an Apache-Server on Windows 2003 Server.
Now, i found a way that it works and i got access to the share. First of all,
you need to set the run user for Apache to a user that has access to the share
(see in post before).
Then map your drive in the php script before you read the dir:
system('net use K: \\servername\sharename /user:username password /
persistent:no');
$share = opendir('\\\\servername\\sharename');
....
===============================================================================
Hopefully this helps someone else. Returns a list of all the files in the
directory and any subdirectories.
Excludes files/folders that are in the $exempt array. Can modifiy it so files
aren't passed by reference fairly easily.
===============================================================================
Read a Windows SMB Directory ;)
function SMBMap($username, $password, $server, $dir) {
$command = "mount -t smbfs -o username=$username,password=$password //
$server/$dir /mnt/tmp";
echo system($command);
}
function SMBRelease() {
$command = "umount /mnt/tmp";
echo system($command);
}
function GetFiles($dir) {
$files = array();
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
$files[] = $file."{".filetype("$dir/$file")."}";
}
closedir($dh);
}
}
return $files;
}
SMBMap("Daniel", "", "<IP_ADDRESS>", "Kram");
$any = GetFiles("/mnt/tmp");
SMBRelease();
print_r($any);
?>
===============================================================================
An other way to recursively walk a directory and it's content, applying a
callback to each file.
Exemple: Update the last modification time of each file in a folder
===============================================================================
Sometimes the programmer needs to access folder content which has arabic name
but the opendir function will return null resources id
for that we must convert the dirname charset from utf-8 to windows-1256 by the
iconv function just if the preg_match function detect arabic characters and use
" U " additionality to enable multibyte matching
";
}
}
}
?>
===============================================================================
In reponse to Tozeiler. Nice short directory dump. However, that displays the
"." and "..". This removes those. It also makes an ordered list in case I
needed to be on the phone while looking at the page. Easy to call out.
$file ";
$i++;
}
}
closedir($dh);
?>
===============================================================================
There might be a bit of truth to that. If, by chance, the webmaster made a
form saying "type a random directory name here" and used that in the function,
there'd be a problem. So let's eliminate the 'function' part
$files=shell_exec("ls directory");
$result=explode("\n",$files);
'$result' will now be an array of the directory files. You can use variables
in the shell_exec command, but don't use anything that could be user-sent.
===============================================================================
If you want to iterate through a directory, have a look at the SPL
DirectoryIterator:
http://php.net/manual/class.directoryiterator.php
===============================================================================
The easiest way to get a dir listing and sort it is to exec() out to ls (eg:'ls
-t'). But, that is considered "unsafe". My hosting company finally caught me
doing it so here is my fastest solution. (Lucky for me each file is created
with a Unix Timestamp at the end of the name and no other numbers in it.)
Before you go copying someone's bloat kitchen sink function/class, consider
what you have and what you really need.
===============================================================================
when you run Apache as a service on your Windows computer, it chooses to run as
the LocalSystem account by default (usually SYSTEM). The LocalSystem account
has no network privileges whatsoever which, while no doubt a good thing, makes
it impossible to access networked resources (such as a shared drive) in your
Apache service.
First, you have to change the user the Apache service runs as.
Go to your Services panel (Start -> Run -> "services.msc").
Find the Service labeled Apache, right-click, and hit Properties.
Choose the "Log On" tab.
Presumably you'll see that Apache is set up to run as the Local System Account.
You'll want to change this to the second option, "This account", and then fill
in the details of the User account you would like Apache to run under.
Some sites tell you to create a special Apache-based user account just for this
occasion. It's not a bad idea, but then you have to make sure it has all of the
proper permissions that an Apache user would need, such as read/write to to
htdocs and the .conf and .log files, and permissions to log on as a service,
etc etc - as well as the permissions to access the network resource you're
trying to get to in the first place.
In light of that process, I chose to just run it under my own account instead.
Once you get it working, you can go back and create that special account.
Hit "Apply" - it'll pop up a box saying you need to restart Apache to take
effect, but hold off on that for a moment.
This is the tricky part: you have to give the user (the one you're running
Apache as) permissions to act as part of the OS.
Go to the Local Security Policy panel (Start -> Run -> "secpol.msc").
Under the navigation section in the left sidebar, choose Local Policies -> User
Rights Assignments.
In the right-hand frame, double-click the item "Act as part of the operating
system" to open up its properties.
Select "Add User or Group, Enter the appropriate user in the box provided, and
hit "OK."
At this point, you are technically complete - Apache can now do the same things
to the network resource that your user can - read, write, execute, whatever.
However, in my case, I was trying to create an actual readable resource, so I
edited my Apache config file to create an alias to my share.
Open up your Apache configuration file. For most people it's httpd.conf in the
conf subdirectory of your Apache install directory.
Add the following text to your config file (obviously substituting your UNC for
"//servername/sharename" and renaming ALIAS_DIRECTORY to whatever you'd like):
Alias /ALIAS_DIRECTORY "//servername/sharename"
Options Indexes
AllowOverride None
Order allow,deny
Allow from all
";
}else{
echo "$i. $file ";
}
$i++;
}
}
closedir($dh);
?>
===============================================================================
I was trying to access network drives using this opendir function. I read so
many posts saying that it was almost impossible to access a network drive and
finally, I found the answer; there are 2 steps to be followed to access a
network drive with PHP either on the same machine or another machine.
But first of all, here's the error I was getting:
Warning: opendir(\\server\folder1\sub_folder) [function.opendir]: failed to
open dir: No error in C:\wamp\www\PMOT\v0.1\REPORT_MENU\index.php on line 17
Firstly, one must make sure that the folder \\server\folder1\sub_folder can be
accessed by a user, let's say USER_TEST with a password PASS_TEST. By setting
properties to this folder, one can add this given user with the correct
password (USER_TEST with PASS_TEST).
Secondly, the APACHE service must be set-up to take this user into account. If
no user is specified, APACHE uses an anonymous user and this is where the
problem/error message is coming from. One must go in control panel->
administrative tools->services. One will see the list of services and must look
for APACHE with Apache/2.X.X in the description. (For Wampserver, it will be
called wampapache, and so on!) Right click on that and pop up the properties
screen. In the tab LOG ON, there are 2 options: local system account and "this
account" which will be a user specified account. This is where one must specify
the USER_TEST and PASS_TEST.
Following these steps worked perfectly for me but if either the folder
privileges or apache log on user is disabled, then I get the initial
aforementioned error message.
Anyways, I hope this can help out someone!
Cheers!
Marc
===============================================================================
How to find files in a directory, using regular expressions (case-sensitive or
not)
===============================================================================
A simple function to count all the files and/or dirs inside a dir.
With optional extention when counting files.
Index of /
Some text file.txt
files/
num_files.phps
test.php
Syntax error: $dir value empty.';
exit;
}
$num_files = 0;
$num_dirs = 0;
switch($type)
{
case 1: // count only files, not dirs
if ($dir = @opendir($dir))
{
while (($file = readdir($dir)) !== false)
{
if(is_file($file) AND $file != "." AND $file != "..")
{
if (isset($ext) AND !empty($ext))
{
$extension = end(explode(".", $file));
if ($ext == $extension)
{
$num_files++;
}
}
else
{
$num_files++;
}
}
}
closedir($dir);
$total = $num_files;
}
break;
case 2: // count only dirs, not files
if ($dir = @opendir($dir))
{
while (($file = readdir($dir)) !== false)
{
if(is_dir($file) AND $file != "." AND $file != "..")
{
$num_dirs++;
}
}
closedir($dir);
$total = $num_dirs;
}
break;
case 3: // count files PLUS dirs in once variable
if ($dir = @opendir($dir))
{
while (($file = readdir($dir)) !== false)
{
if(is_dir($file) OR is_dir($file))
{
if ($file != "." AND $file != "..")
{
$num_files++;
}
}
}
closedir($dir);
$total = $num_files;
}
break;
case 4: // count files AND dirs separately
if ($dir = @opendir($dir))
{
while (($file = readdir($dir)) !== false)
{
if(is_file($file) AND $file != "." AND $file != "..")
{
$num_files++;
}
if(is_dir($file) AND $file != "." AND $file != "..")
{
$num_dirs++;
}
}
closedir($dir);
$total = $num_files." ".$num_dirs;
}
break;
default:
echo 'Syntax error: $type value empty.';
break;
}
return $total;
}
echo num_files($_SERVER['DOCUMENT_ROOT'], 1, "php"). " file(s) met php
extention ";
echo num_files($_SERVER['DOCUMENT_ROOT'], 1). " file(s) ";
echo num_files($_SERVER['DOCUMENT_ROOT'], 2). " dir(s) ";
echo num_files($_SERVER['DOCUMENT_ROOT'], 3). " file(s) + dir(s) ";
$nummers = explode(" ", num_files($_SERVER['DOCUMENT_ROOT'], 4));
echo reset($nummers) ." file(s) en ". end($nummers) ." dir(s)";
?>
will output:
1 file(s) with php extention
3 file(s)
1 dir(s)
1 file(s) + dir(s)
3 file(s) en 1 dir(s)
===============================================================================
I sometimes find this useful. Hope you will too.
===============================================================================
# simple directory walk with callback function
===============================================================================
Here's a function that will recrusively turn a directory into a hash of
directory hashes and file arrays, automatically ignoring "dot" files.
-1) &&
preg_match('/^\./', $file) == 0) {
if (is_dir("$topdir$file")) {
if(!isset($list[$file])) {
$list[$file] = array();
}
ksort($list);
hashify_directory("$topdir$file/", $list[$file]);
} else {
array_push($list, $file);
}
}
}
closedir($dh);
}
}
}
?>
e.g.
on the directory structure:
./StudentFiles/tutorial_01/case1/file1.html
./StudentFiles/tutorial_01/case1/file2.html
./StudentFiles/tutorial_02/case1/file1.html
./StudentFiles/tutorial_02/case2/file2.html
./StudentFiles/tutorial_03/case1/file2.html
etc...
becomes:
array (
"tutorial_01" => array (
"case1" => array( "file1.html", "file2.html")
),
"tutorial_02" => array (
"case1" => array( "file1.html"),
"case2" => array( "file2.html")
),
"tutorial_03" => array (
"case1" => array( "file2.html")
)
)
)
*/
?>
I'm using it to create a tree view of a directory.
===============================================================================
Hello,
A friend of mine is running a webhost, I think i found a security leak with
this script:
".$label."
label>\n" : "";
$mydir .= "";
}
if ($teller == 0) {
$mydir = "No files!";
} else {
return $mydir;
}
}
echo select_files("C:/winnt/", "", "", "", "60");
?>
Now i can see hist files in his windows dir. Is this a leak? and is it fixable?
I'll report this as bug too!
Tim2005
===============================================================================
"opendir" said:
------------------------------------------------------------------
23-Jan-2006 08:04
I Just wanted a directory list and a clickable link to download the files
------
echo ("
Directory Overzicht:
");
function getFiles($path) {
------------------------------------------------------------------
Here's a more straightforward way to linkify $path/files:
Directory Overzicht:";
$dh = opendir($path);
while (($file = readdir($dh)) !== false) {
echo "$file ";
}
closedir($dh);
?>
===============================================================================
I Just wanted a directory list and a clickable link to download the files
because my plesk server does not give me this function. I edited the script a
little bit.
Many thanks from a script-noob
------
echo ("
Directory Overzicht:
");
function getFiles($path) {
//Function takes a path, and returns a numerically indexed array of
associative arrays containing file information,
//sorted by the file name (case insensitive). If two files are identical
when compared without case, they will sort
//relative to each other in the order presented by readdir()
$files = array();
$fileNames = array();
$i = 0;
if (is_dir($path)) {
if ($dh = opendir($path)) {
while (($file = readdir($dh)) !== false) {
if ($file == "." || $file == "..") continue;
$fullpath = $path . "/" . $file;
$fkey = strtolower($file);
while (array_key_exists($fkey,$fileNames)) $fkey .= " ";
$a = stat($fullpath);
$files[$fkey]['size'] = $a['size'];
if ($a['size'] == 0) $files[$fkey]['sizetext'] = "-";
else if ($a['size'] > 1024) $files[$fkey]['sizetext'] = (ceil($a
['size']/1024*100)/100) . " K";
else if ($a['size'] > 1024*1024) $files[$fkey]['sizetext'] =
(ceil($a['size']/(1024*1024)*100)/100) . " Mb";
else $files[$fkey]['sizetext'] = $a['size'] . " bytes";
$files[$fkey]['name'] = $file;
$files[$fkey]['type'] = filetype($fullpath);
$fileNames[$i++] = $fkey;
}
closedir($dh);
} else die ("Cannot open directory: $path");
} else die ("Path is not a directory: $path");
sort($fileNames,SORT_STRING);
$sortedFiles = array();
$i = 0;
foreach($fileNames as $f) $sortedFiles[$i++] = $files[$f];
return $sortedFiles;
}
$files = getFiles("./");
foreach ($files as $file) print " $file[name] \n";
?>
===============================================================================
In my previous post I ran into a problem with the "global" definition of
$directorylist. If I called the function more than once on the same page it
would combine the file lists. I looked at Lasse Dalegaard's example and used
the following solution.
remove global definition
global $directorylist;
REPLACE
if ((($maxlevel) == "all") or ($maxlevel > $level)) {
filelist($startdir . $file . "/", $searchSubdirs, $directoriesonly,
$maxlevel, $level + 1);
}
?>
WITH
if ((($maxlevel) == "all") or ($maxlevel > $level)) {
$list2 = filelist($startdir . $file . "/", $searchSubdirs,
$directoriesonly, $maxlevel, $level + 1);
if(is_array($list2)) {
$directorylist = array_merge($directorylist, $list2);
}
}
?>
===============================================================================
specify the directory to start from; format: must end in a "/"
$searchSubdirs => True/false; True if you want to search subdirectories
$directoriesonly => True/false; True if you want to only return directories
$maxlevel => "all" or a number; specifes the number of directories down that
you want to search
$level => integer; directory level that the function is currently searching
*/
function filelist ($startdir="./", $searchSubdirs=1, $directoriesonly=0,
$maxlevel="all", $level=1) {
//list the directory/file names that you want to ignore
$ignoredDirectory[] = ".";
$ignoredDirectory[] = "..";
$ignoredDirectory[] = "_vti_cnf";
global $directorylist; //initialize global array
if (is_dir($startdir)) {
if ($dh = opendir($startdir)) {
while (($file = readdir($dh)) !== false) {
if (!(array_search($file,$ignoredDirectory) > -1)) {
if (filetype($startdir . $file) == "dir") {
//build your directory array however you choose;
//add other file details that you want.
$directorylist[$startdir . $file]['level'] = $level;
$directorylist[$startdir . $file]['dir'] = 1;
$directorylist[$startdir . $file]['name'] = $file;
$directorylist[$startdir . $file]['path'] = $startdir;
if ($searchSubdirs) {
if ((($maxlevel) == "all") or ($maxlevel > $level))
{
filelist($startdir . $file . "/", $searchSubdirs
, $directoriesonly, $maxlevel, $level + 1);
}
}
} else {
if (!$directoriesonly) {
//if you want to include files; build your file
array
//however you choose; add other file details that
you want.
$directorylist[$startdir . $file]['level'] = $level;
$directorylist[$startdir . $file]['dir'] = 0;
$directorylist[$startdir . $file]['name'] = $file;
$directorylist[$startdir . $file]['path'] = $startdir;
}}}}
closedir($dh);
}}
return($directorylist);
}
$files = filelist("./",1,1); // call the function
foreach ($files as $list) {//print array
echo "Directory: " . $list['dir'] . " => Level: " . $list['level'] . " =>
Name: " . $list['name'] . " => Path: " . $list['path'] ." ";
}?>
===============================================================================
I wrote a function to recursively delete files from a starting directory. I
had to do this because my server doesn't allow me to delete files that apache
writes because I don't have permissions, so... I let apache do the work.
";
recursive_delete( $dir . $file . "/" );
echo "Removing Directory: $dir$file
";
rmdir( $dir . $file );
}
else
{
echo "Deleting file: $dir$file ";
unlink( $dir . $file );
}
}
}
closedir($dh);
}
}
}
?>
===============================================================================
The example given by oryan at zareste dot com may also be a "simpler faster
way" of creating security holes in your code. The function listed above
prevents risking execution of abitrary shell commands listed after a semicolon
(;) in your directory name.
Example: $directory = '.;rm -rf /';
Result: List this directory, erase contents of filesystem.
===============================================================================
There's a simpler faster way to get a whole directory if you're using PHP 4.
This function uses shell_exec - http://us3.php.net/shell_exec - and assumes
you're using Unix/Linux and have shell access -
function dir($directory){
$files=shell_exec("ls ".$directory);
return explode("\n",$files);
}
This returns an array with all the files.
This way, you can use modifiers like -t, which shows files in order of
modification time ($files=shell_exec("ls -t ".$directory);). Enough tweaking
and you can use it on Windows, though I can't say how since I don't have a
Windows server to try it on
===============================================================================
//this is a function I wrote to sort out the contents of the directory date
wise for display.
$content_array = array();
//set current working directory
$dirname = "C:\temp";
//Load Directory Into Array
$handle=opendir($dirname);
$i=0;
while ($file = readdir($handle))
if ($file != "." && $file != "..")
{
$content_array[$i][0] = $file;
$content_array[$i][1] = date ("Y m d", filemtime($dirname."/".$file));
$i++;
}
//close the directory handle
closedir($handle);
//these lines sort the contents of the directory by the date
foreach($content_array as $res)
$sortAux[] = $res[1];
array_multisort($sortAux, SORT_ASC, $content_array);
===============================================================================
This function sorts files by name as strings, but without regard to case. It
also does some handy string formatting of the file size information.
function getFiles($path) {
//Function takes a path, and returns a numerically indexed array of
associative arrays containing file information,
//sorted by the file name (case insensitive). If two files are identical
when compared without case, they will sort
//relative to each other in the order presented by readdir()
$files = array();
$fileNames = array();
$i = 0;
if (is_dir($path)) {
if ($dh = opendir($path)) {
while (($file = readdir($dh)) !== false) {
if ($file == "." || $file == "..") continue;
$fullpath = $path . "/" . $file;
$fkey = strtolower($file);
while (array_key_exists($fkey,$fileNames)) $fkey .= " ";
$a = stat($fullpath);
$files[$fkey]['size'] = $a['size'];
if ($a['size'] == 0) $files[$fkey]['sizetext'] = "-";
else if ($a['size'] > 1024) $files[$fkey]['sizetext'] = (ceil
($a['size']/1024*100)/100) . " K";
else if ($a['size'] > 1024*1024) $files[$fkey]['sizetext'] =
(ceil($a['size']/(1024*1024)*100)/100) . " Mb";
else $files[$fkey]['sizetext'] = $a['size'] . " bytes";
$files[$fkey]['name'] = $file;
$files[$fkey]['type'] = filetype($fullpath);
$fileNames[$i++] = $fkey;
}
closedir($dh);
} else die ("Cannot open directory: $path");
} else die ("Path is not a directory: $path");
sort($fileNames,SORT_STRING);
$sortedFiles = array();
$i = 0;
foreach($fileNames as $f) $sortedFiles[$i++] = $files[$f];
return $sortedFiles;
}
$files = getFiles("C:");
foreach ($files as $file) print "$file[name] \n";
?>
===============================================================================
I made a function for finding all files in a specified directory and all
subdirectories. It can be quite usefull when searching in alot of files in alot
subdirectories. The function returns an array with the path of all the files
found.
function getFiles($directory) {
// Try to open the directory
if($dir = opendir($directory)) {
// Create an array for all files found
$tmp = Array();
// Add the files
while($file = readdir($dir)) {
// Make sure the file exists
if($file != "." && $file != ".." && $file[0] != '.') {
// If it's a directiry, list all files within it
if(is_dir($directory . "/" . $file)) {
$tmp2 = getFiles($directory . "/" . $file);
if(is_array($tmp2)) {
$tmp = array_merge($tmp, $tmp2);
}
} else {
array_push($tmp, $directory . "/" . $file);
}
}
}
// Finish off the function
closedir($dir);
return $tmp;
}
}
// Example of use
print_r(getFiles('.')); // This will find all files in the current directory
and all subdirectories
?>
===============================================================================
Here is a snippet of the code that I created to search for a file..recursively
open the directories and search for a match..
$file ";
}
}else if(is_dir($directory."/".$file)){
search($target,$directory."/".$file);
}
}
}
closedir($direc);
}
return ;
}
?>
===============================================================================
Here's another version of directory listing, since I had some problems using
the examples below. It will display the content of the current directory,
sorted by directories and files.
You can also search subdirectories by setting $maxDepth > 0. There's a link to
other directories, so you can easily switch to the parent directory or to other
directories in the current directory.
Hope it helps!
0){
sort($listDir);
for($j = 0; $j < count($listDir); $j++){
echo "
";
closedir ($handle);
}
}
?>
===============================================================================
Here's another recursive function that prints out everything from the starting
path to the end. It doesn't have any search function, but just another example.
I wrote it for getting a quick hierarchial view of websites (even through
Dreamweaver will show it to me, it'd be a chore to go through each folder and
expand it).
===============================================================================
I had problems getting it to work because I'm not the best at PHP, but there IS
a way to use opendir to list things in alphabetical order. I'm using it for my
university project. All you have to do is read the filenames into an array,
sort the array and then do what you want with the filenames.... like this....
So that you know what all my variables mean in this - $stats is the folder that
it looks in for the files - for example
?stats=images
would look in the images folder
Obviously you will want to modify it so it fits your needs, but I thought you
guys would want this - especially if your server doesnt have the latest version
of php.
===========================
");
?>
===============================================================================
I ran into a little snag in example 1. opendir() lists files by the last time
the file was accessed. I was trying to print the files numerically in a
directory.
Solution: Use scandir() instead (php5) or store the files in an array and sort
it.
Hope this helps someone.
- Mick
(o> Web / software developer
( ) UNIX Systems Admin
--- ~ www.mickweiss.com ~
===============================================================================
In addition to notes above about IIS & PHP reading network shares, here's one
solution that works better for me.
in the management console I created a folder where my "read_dir" script runs.
click on properties then select the security tab. here you can set the
anonymous account to the standard IUSR_$computername% , BUT.. in this case I
chose another account that I set up for reading my shares. (make sure login
name and password match the credantials you set on the remote machin ;-))
I use this to read a dir and it's contents into a searchable database. and it
works like a charm...
===============================================================================
Thought I could help clarify something with accessing network shares on a
Windows network (2000 in this case), running PHP 4.3.2 under Apache 2.0.44.
However you are logged into the Windows box, your Apache service must be
running under an account which has access to the share. The easiest (and
probably least safe) way for me was to change the user for the Apache service
to the computer administrator (do this in the service properties, under the
"Log On" tab). After restarting Apache, I could access mapped drives by their
assigned drive letter ("z:\\") or regular shares by their UNC path ("\\\\
shareDrive\\shareDir").
===============================================================================
Correction on the previous function. Was missing full path on recursive line.
function file_array($path, $exclude = ".|..", $recursive = true) {
$path = rtrim($path, "/") . "/";
$folder_handle = opendir($path);
$exclude_array = explode("|", $exclude);
$result = array();
while(false !== ($filename = readdir($folder_handle))) {
if(!in_array(strtolower($filename), $exclude_array)) {
if(is_dir($path . $filename . "/")) {
// Need to include full "path" or it's an
infinite loop
if($recursive) $result[] = file_array($path . $filename . "/",
$exclude, true);
} else {
$result[] = $filename;
}
}
}
return $result;
}
?>
===============================================================================
Here is a snippet to create a site map of all html files in a folder:
\n";
foreach ($files as $file) {
$title = Title($file);
echo "
\n";
}
echo "\n";
// Function to get a human readable title from the filename
function Title($filename) {
$title = substr($filename, 0, strlen($filename) - 5);
$title = str_replace('-', ' ', $title);
$title = ucwords($title);
return $title;
}
?>
===============================================================================
An issue that I ran into is that opendir() could care less if you've got server
authentication set on sub directories and so any such authentication is
bypassed completely when accesses in this way. I did solve it for my
application of a pretty file manager, by redirecting to all sub directories
thusly:
$fdir = "./subdirectory_I_want_to_visit/";
if ($fdir != './') { //basically where we are or the parent
//redirect the browser to force authentication check on any subdirectories
header("Location: http://my.domain.com".dirname($_SERVER
["PHP_SELF"]).substr($fdir,2));
exit;
} else {
$dir = opendir($fdir);
}
===============================================================================
Note that the opendir() function will use ISO8859-1 characterset under
windows...
If you have korean, japanese, etc.. filenames, you won't be able to open them.
I still didn't find any solution to workaround that.
===============================================================================
Pointing on the previous post, I'd like to say the following.
You can use opendir on all valid (existant and reachable) folders.
This counts not only for windows but also for linux.
Under linux, you can also read root folders etc.
To avoid access to non-public data, you should check the given parameter for
opendir before executing opendir.
Let's say you have this:
/home/users/mrsmith/
/home/users/mrsmith/info.txt
/home/users/mrsmith/test/photo.jpg
/home/users/mradmin/private.txt
Now you don't want mrsmith to access mradmin's folders/files.
In that case you could/should define the path where the data MUST be inside.
Attention:
Don't check the data with substr though, it's not a secure solution.
Exploit example: /home/users/mrsmith/../mradmin/
Exploit example2: /home/users/mrsmith/../../../../../../../../../../../../../
dev/
I'd do a case sensitive regex match.
So after the first folder there may not be a subfolder named ".." because that
would jump one folder back.
I hope this isn't too offtopic or so but I think it's important to think of
that when creating file systems.
===============================================================================
If you have problems like "failed to open dir: Invalid argument"
when using IIS and trying to access windows/smb network shares, try
//servername/share/directory
instead of
\\servername\share
===============================================================================
If you search for a comfortable way to include javascript code from other
javascript code, here is a useful tool based on opendir():
' . $file . '' . PHP_EOL;
}
private static function includeAll($dir) {
if (($handle = opendir($dir))) {
while ($file = readdir($handle)) {
clearstatcache();
if (is_file($dir . '/' . $file)) {
if (JSIncluder::ext($file) == 'js') {
JSIncluder::includeFile($dir . '/' . $file);
}
} elseif ($file != '..' && $file != '.')
JSIncluder::includeAll($dir . '/' . $file);
}
closedir($handle);
}
}
}
?>
Now, you can just write in your section and then you can include files directly from your
javascript files by typing /*include:path/to/other/script/foo.js*/ anywhere!
For example:
/*include:scripts/lib*/ //it will include the whole lib dir and its
subdirectories
/*include:scripts/helloworld.js*/ //it will include only one file
$(function() {
$(body).html('Hello world!');
});
and in your html code:
The JSIncluder should be safe, because all the work is done server-side and
clients just can't affect anything. They could write /*include:/foo/bar*/ but
nothing will happen, because the code does nothing but automatically generates


I am an Orange County based Software Engineer with years of Business Development, Brand Development, Talent Management, and Product Development experience. My passion for the Software/Web engineering field has driven me to learn to program for both frontend and backend development, while keeping your business strategy and business solutions in mind.
The main fuel to my fire for programming has always been my need to create and innovate. This feeling has been persistent in my life for as long as I can remember. As a child, I was always intrigued by the way things worked. Learning the way things worked gave me an understanding on how to manipulate them. Eventually, I began drawing blueprints for all the different ideas that would cross my mind. Regradless of the industry, I always had an idea for it. This drive led me to start my own business during my first year in college. One venture led to another and by the time I was getting ready to graduate California State University of Fullerton, I was managing and doing the brand development for some of the biggest names in Mixed Martial Arts.
It was the year after I graduated University when I realized that software development was inherently my true calling. My need to envision, and create, paired with the instant gratification and complex problem solving associated with programming was all I needed to jump right in. I began researching how computers worked and how scripts spoke to the computers. I would ask every Computer Science student and graduate I knew as many questions as I could, as often as possible (luckily most of my closest friends are in the field). Eventually in early 2019, I left my job as a Fund Developer for a non-profit, put all my business aside, and joined LearningFuze programming bootcamp. In a mere four months I had put in over 1,500 hours of coding.
When I am not abusing my keyboard during my coding time, you can probably find me at a SoCal beach spending time with my friends, or on a date with my wife. If there is a big MMA fight, I will be watching it after an intense Jiu Jitsu or Muy Thai training session. If none of the above is taking places, there is no doubt I am gaming, watching a show with my wife (I got some good recommendations for you), or reading a book.


Sorry, the page you are looking for is currently unavailable.
If you are the system administrator of this resource then you should check the Pure1 Unplugged system status and logs for details.
Return to the Pure1 Unplugged home page


Go to Tab 1, Page 2
Logout
Favorites Tab
Go Back
Change color
"Change color" should continue working after clicking Logout in the tabbar and cancelling (No in the alert)
UserId: {{userId}}


In certain situations you might want to prevent text on the page from being selectable. Try selecting this text and hit view source to see how it is done.


Bidding Site
Why pay retail prices? Hurry , grab the most exciting offers!!!

Free Sign Up!!!
Sign-up takes less than 30 seconds.
Register!!
Sign in!!


|
gomotion
|
Declarations for motion queue manipulation. More...
#include "gomotion/gotypes.h"
#include "gomotion/gomath.h"
#include "gomotion/gotraj.h"
Go to the source code of this file.
Data Structures | |
| struct | gomotion::go_position |
| Container for a joint position or Cartesian position. Depending upon whether you are doing joint interpolation or world coordinate interpolation (as specified by your call to go_motion_queue_set_type()), fill in joint[] or pose accordingly. More... | |
| struct | gomotion::go_motion_params |
| struct | gomotion::go_motion_linear_params |
| In the following comments, LIN, CIR and ALL refer to linear moves, circular moves and both, respectively. More... | |
| struct | gomotion::go_motion_circular_params |
| struct | gomotion::go_motion_spec |
| struct | gomotion::go_scale_spec |
| struct | gomotion::go_motion_queue |
Namespaces | |
| gomotion | |
Macros | |
| #define | GO_MOTION_JOINT_NUM 8 /** number of joints supported */ |
Enumerations | |
| enum | { gomotion::GO_MOTION_NONE, gomotion::GO_MOTION_JOINT, gomotion::GO_MOTION_UJOINT, gomotion::GO_MOTION_WORLD, gomotion::GO_MOTION_LINEAR, gomotion::GO_MOTION_CIRCULAR } |
Declarations for motion queue manipulation.
| #define GO_MOTION_JOINT_NUM 8 /** number of joints supported */ |


--- layout: post title: Ambiguous Controller Names With Areas date: '2010-01-17T23:08:00.001Z' author: solrevdev tags: modified_time: '2010-01-17T23:08:44.607Z' blogger_id: tag:blogger.com,1999:blog-31446756.post-213406032608173763 blogger_orig_url: http://www.solrevdev.com/2010/01/ambiguous-controller-names-with-areas.html ---


{% if current_language == 'en' %} {% set breadcrumb_items = [{ 'href': '/consumer-tools/retirement/', 'title': 'Planning for Retirement' }]%} {% endif %} {% extends 'layout-full.html' %} {% block title %} {{ _("Planning your Social Security claiming age") }} | {{ _("Consumer Financial Protection Bureau") }} {% endblock %} {% block css %} {{ super() }} {% endblock %} {% block content_main %} {% set YES = _("Yes") %} {% set NO = _("No") %} {% set NOTSURE = _("Not Sure") %} {% set STEP = _("Step") %}
{{ _("The age you claim Social Security affects your lifetime income. We’ll help you think through this decision.") }}
{% if current_language == 'es' %} View page in English {% else %} Ver página en español {% endif %}
{{ _("The calculator bases your benefit estimate on current formulas from the Social Security Administration. Your answers are anonymous. Because we do not access or use your Social Security earnings record, these are rough estimates.") }}
{{ _("Your estimated benefits:") }}
{{ _("Select claiming ages on the graph to see how your estimated benefit changes.") }}
{{ _("Claiming at age") }} {{ _("Age") }} 67 {{ _("is your full benefit claiming age.") }}
{{ _("Compared to claiming at your full benefit claiming age.") }}
{{ _("By age 85, an average lifespan, your total benefits will be") }}
({{ _("in today's dollars") }})
{{ _("Social Security retirement benefits are not designed to be your sole source of retirement income, but waiting even one month will increase your benefits.") }}
{{ _("Remember, claiming age here refers only to your Social Security retirement benefit, and not when you decide to stop working or apply for Medicare.") }}
{{ _("Estimated benefits") }}
{{ _("Claiming age") }}
{{ _("Picture your life in retirement to receive claiming tips.") }}
{% block questions_lifestyle_answer_yes %} Your decision of when to claim your Social Security could affect the benefits your spouse will receive after you die. Surviving spouses can keep either their own benefit or choose to keep their spouse's benefit, whichever is higher. If you are married, and are the higher earner in the household, claiming at your full benefit age will ensure your spouse will receive the higher benefit. Talk to your spouse about your claiming options so you can make this important decision together. Learn more about spousal benefits {% endblock %}
{% block questions_lifestyle_answer_no %} If you claim at your full Social Security benefit age or later, you will avoid a reduction in your monthly benefit. In addition, if you choose to wait to claim past your full benefit age until age 70, you can get an increase for every month that you wait. If you are divorced, your former spouse's claiming decision will not affect your benefit, so it should not affect your decision of when to claim. Learn more about your Social Security benefits after a divorce {% endblock %}
{% block questions_lifestyle_answer_widowed %} You may qualify for a survivor benefit if your deceased spouse qualified for Social Security. You can wait until age 70 to claim your survivor benefit and get the maximum amount possible, or you can claim a reduced survivor benefit as early as age 60. You may also qualify for a retirement benefit based on your own earnings record, but you will only receive one benefit at a time. If you expect your own retirement benefit to be higher than the survivor benefit, you may want to consider claiming the survivor benefit first. That way, you can start receiving some money from Social Security as your own retirement benefit continues to grow. Learn more about Social Security survivor benefits {% endblock %}
{% block questions_sixties_answer_yes_under_50 %} Your benefits are based on your highest 35 years of earnings. Each year of work can add higher earnings to your record by replacing years with low earnings such as those when you were a student, were unemployed, or took time off to care for someone. When you work and wait to claim until age 70, you can increase your monthly benefit by more than 75 percent! {{ svg_icon("help-round") }} Working in your 60s also gives you more time to save on your own for retirement.  Each year of work can add higher earnings to your record by replacing years with low earnings such as those when you were a student, were unemployed, or took time off to care for someone. When you work and wait to claim until age 70, you can increase your monthly benefit by more than 75 percent! {{ svg_icon("help-round") }} Working in your 60s also gives you more time to save on your own for retirement. Review your earnings record on my SocialSecurity . {% endblock %}
{% block questions_sixties_answer_no_under_50 %} You may choose to work fewer hours or stop working in your 60s.  If you can continue working in your 60s, you may add higher earnings to your record, getting you a higher monthly benefit. Remember, your monthly benefit will be significantly higher when you claim at your full benefit age or later. The age at which you decide to stop working doesn't have to be the same as your claiming age. Learn more about working and collecting Social Security benefits . {% endblock %}
{% block questions_sixties_answer_no_over_50 %} You may choose to work fewer hours or stop working in your 60s.  If you can continue working in your 60s, you may add higher earnings to your record, getting you a higher monthly benefit. Remember, your monthly benefit will be significantly higher when you claim at your full benefit age or later. The age at which you decide to stop working doesn't have to be the same as your claiming age. Learn more about working and collecting Social Security benefits . {% endblock %}
{% block questions_sixties_answer_notsure_under_50 %} Working in your 60s may increase your monthly benefit in a few ways. Because your benefits are based on your highest 35 years of earnings, each year of work can add higher earnings to your record by replacing years with low earnings, such as those when you were a student, were unemployed, or took time off. When you work and wait to claim until age 70, you can increase your monthly benefit by more than 75 percent! {{ svg_icon("help-round") }} Working in your 60s also gives you more time to save on your own for retirement. Learn more about working and collecting Social Security benefits . {% endblock %}
{% block questions_sixties_answer_notsure_over_50 %} Working in your 60s may add higher earnings to your record, getting you a higher monthly benefit. Remember, your monthly benefit will be significantly higher when you claim at your full Social Security benefit age or later. If you need to work fewer hours, you could use a portion of your retirement savings such as your 401(k) {{ svg_icon("help-round") }} or Individual Retirement Account (IRA) {{ svg_icon("help-round") }} to supplement your income until full retirement age. However, this may not be an option if it eliminates your savings completely. Learn more about working and collecting Social Security benefits . {% endblock %}
{{ _("Once you reach your full retirement benefits claiming age, you can work and earn as much as you want and your benefits will not be reduced. If you claim before this age and continue to work, your benefits could be temporarily reduced if you earn over a certain limit, but any reductions you receive will be credited back to you once you reach full retirement age.") }}
{{ _("A type of retirement savings account offered by employers to help their employees save for retirement.") }}
{{ _("IRAs are types of retirement savings plans with special tax incentives. In these plans, your savings equal the contributions that you make to the account plus the gains or losses of your investments.") }}
{{ _("If you claim before full retirement age and continue to work, your benefits could be temporarily reduced if you earn over a certain amount. Any reductions you receive will be credited back to you once you reach full retirement age.") }}
{% block questions_expenses_answer_yes_under_50 %} If you're planning an active retirement or carry a mortgage or other debt, retirement may be more expensive than you expect. Some regular expenses like your out-of-pocket health care costs will likely increase as you get older. You can protect your retirement lifestyle by reducing your largest expenses. You can also increase your regular income by claiming at your full Social Security benefit age or later. If you claim earlier, your monthly benefit could be reduced by as much as 30 percent. Create a retirement budget . {% endblock %}
{% block questions_expenses_answer_yes_over_50 %} If you're planning an active retirement or carry a mortgage or other debt, retirement may be more expensive than you expect. Some regular expenses like your out-of-pocket health care costs will likely increase as you get older. You can protect your retirement lifestyle by reducing your largest expenses. You can also increase your regular income by claiming at your full Social Security benefit age or later. If you claim earlier, your monthly benefit could be reduced by as much as 30 percent. Create a retirement budget . {% endblock %}
{% block questions_expenses_answer_no_under_50 %} Future expenses are difficult to predict. Some regular expenses like out-of-pocket health care costs will likely increase as you get older. You can protect your retirement lifestyle by reducing your largest expenses.  You can also increase your regular income by claiming at your full Social Security benefit age or later. If you claim earlier, your monthly benefit could be reduced by as much as 30 percent. Create a retirement budget . {% endblock %}
{% block questions_expenses_answer_no_over_50 %} Future expenses are difficult to predict. Some regular expenses like out-of-pocket health care costs will likely increase as you get older. You can protect your retirement lifestyle by reducing your largest expenses.  You can also increase your regular income by claiming at your full Social Security benefit age or later. If you claim earlier, your monthly benefit could be reduced by as much as 30 percent. Create a retirement budget . {% endblock %}
{% block questions_expenses_answer_notsure_under_50 %} Future expenses are difficult to predict. Some regular expenses like out-of-pocket health care costs will likely increase as you get older. You can protect your retirement lifestyle by reducing your largest expenses.  You can also increase your regular income by claiming at your full Social Security benefit age or later. If you claim earlier, your monthly benefit could be reduced by as much as 30 percent. Create a retirement budget . {% endblock %}
{% block questions_expenses_answer_notsure_over_50 %} Future expenses are difficult to predict. Some regular expenses like out-of-pocket health care costs will likely increase as you get older. You can protect your retirement lifestyle by reducing your largest expenses.  You can also increase your regular income by claiming at your full Social Security benefit age or later. If you claim earlier, your monthly benefit could be reduced by as much as 30 percent. Create a retirement budget . {% endblock %}
{% block questions_income_answer_yes_under_50 %} Social Security won't replace all of your pre-retirement income. On average, Social Security replaces 40 percent of a worker's income. That means your retirement savings, pension {{ svg_icon("help-round") }} , 401(k) {{ svg_icon("help-round") }} , or Individual Retirement Account (IRA) {{ svg_icon("help-round") }} will need to fill the gap. Claiming at your full Social Security benefit age or later (up to age 70) can minimize this gap and maximize your monthly benefit. If you claim before your full retirement age, your monthly benefit could be reduced by as much as 30 percent. Learn more about saving for retirement . {% endblock %}
{% block questions_income_answer_yes_over_50 %} If you can, get the highest monthly Social Security benefit possible by claiming at your full Social Security benefit age or later. If you claim before your full retirement age, your monthly benefit could be permanently reduced by as much as 30 percent. Also, take advantage of catch-up contributions {{ svg_icon("help-round") }} to your 401(k) {{ svg_icon("help-round") }} or Individual Retirement Account (IRA) {{ svg_icon("help-round") }} . Lastly, avoid losing your retirement savings to unnecessary tax penalties. If you withdraw your 401(k) or IRA savings before age 59½, you will likely face an early withdrawal penalty. Learn more about how retirement savings grow . {% endblock %}
{% block questions_income_answer_no_under_50 %} You could save through your employer's 401(k) {{ svg_icon("help-round") }} or an Individual Retirement Account (IRA) {{ svg_icon("help-round") }} to fill the gap. Maximize an employer match if one is offered. Some employers match the money you put in your 401(k) plan which helps to grow your retirement savings. Even if you're unable to save as much as you'd like, your small savings today will grow over time and can become extra income or emergency savings in the future. If you expect Social Security to be your only source of income, you can still make the most out of it by claiming at your full Social Security benefit age or later. If you claim before your full retirement age, your monthly benefit could be reduced by as much as 30 percent. On the other hand, you can get extra increases for every month that you wait to claim past your full benefit age until age 70. Learn more about how retirement savings grow . {% endblock %}
{% block questions_income_answer_no_over_50 %} You could save through your employer's 401(k) {{ svg_icon("help-round") }} or an Individual Retirement Account (IRA) {{ svg_icon("help-round") }} . Make sure to maximize an employer match if one is offered. Some employers match some of the money you put in your 401(k) plan which helps to grow your retirement savings faster. You can also make additional contributions to these accounts called catch-up contributions {{ svg_icon("help-round") }} . If you expect Social Security to be your only source of income, you can still make the most out of it by waiting to claim at your full Social Security benefit age or later. When you claim before your full retirement age, your monthly benefit could be reduced by as much as 30 percent. Learn more about starting an IRA . {% endblock %}
{% block questions_income_answer_notsure_under_50 %} You may be able to save through your employer's 401(k) plan {{ svg_icon("help-round") }} or an Individual Retirement Account (IRA) {{ svg_icon("help-round") }} . Maximize an employer match if one is offered. Some employers match some of the money you put in your 401(k) retirement plan, helping you grow your retirement savings faster. Your decision about when to claim your Social Security benefits is especially important if you cannot or did not save as much as you would like. When you claim at your full Social Security benefit age or later, you avoid a reduction in your monthly benefit. You will also get increases for every month that you wait to claim past your full benefit age until age 70. Learn more about starting an IRA . {% endblock %}
{% block questions_income_answer_notsure_over_50 %} You may be able to save through your employer's retirement plan or an Individual Retirement Account (IRA ). Maximize an employer match if one is offered. This will help you grow your retirement savings faster. You can also make additional contributions to these accounts called catch-up contributions . Your decision about when to claim your Social Security benefits is especially important if you cannot or did not save as much as you would like. When you claim at your full Social Security benefit age or later, you avoid a reduction in your monthly benefit. You will also get increases for every month that you wait to claim past your full benefit age until age 70. Learn more about working and collecting Social Security benefits . {% endblock %}
{{ _("Once you reach your full retirement benefits claiming age, you can work and earn as much as you want and your benefits will not be reduced. If you claim before this age and continue to work, your benefits could be temporarily reduced if you earn over a certain limit, but any reductions you receive will be credited back to you once you reach full retirement age.") }}
{{ _("Your Social Security benefits could be reduced if you receive federal, state, or local government pensions that are based on work where you did not pay Social Security taxes.") }}
{{ _("A type of retirement savings account offered by employers to help their employees save for retirement.") }}
{{ _("IRAs are types of retirement savings plans with special tax incentives. In these plans, your savings equal the contributions that you make to the account plus the gains or losses of your investments.") }}
{{ _("Catch-up contributions are additional contributions that individuals who are age 50 or older can make to their 401(k) or IRA accounts to help them boost their savings as they approach retirement.") }}
{% block questions_longlife_answer_yes %} Because Social Security provides guaranteed income for life, it's especially valuable to you when you reach age 80 and beyond. Claiming benefits at your full Social Security benefit age or later could be a good way to secure your monthly income during your later years. Your benefit increases the longer you wait to claim, up to age 70, and is adjusted annually with the cost of living. If you live into your 80s but claim at age 62 instead of your full retirement age or later, your total lifetime benefits will be lower by thousands of dollars. Calculate your expected longevity . {% endblock %}
{% block questions_longlife_answer_no %} We understand it's difficult to make predictions. You may want to plan for the possibility that you (or your spouse) may spend 20 or more years in retirement. On average, a woman reaching age 65 today will live to age 87, and a man will live to age 84. Waiting to claim as long as you can could still make sense for you if you are married, are the higher earner in the household, and want your surviving spouse to keep the highest monthly benefit after you die. Remember, you can claim at any point between age 62 and 70. Each additional month that you wait to claim gives you a permanent increase in your monthly benefit which becomes more valuable as you age. Calculate your longevity . {% endblock %}
{% block questions_longlife_answer_notsure %} We understand it's difficult to make predictions. You may want to plan for the possibility that you (or your spouse) may spend 20 or more years in retirement. On average, a woman reaching age 65 today will live to age 87, and a man will live to age 84. Claiming benefits at your full Social Security benefit age or later could be a good way to secure your monthly income during your later years. Your monthly benefit increases the longer you wait to claim, up to age 70, and is adjusted annually with the cost of living. If you live into your 80s but claim at age 62 instead of your full retirement age or later, your total lifetime benefits will be lower by thousands of dollars. Calculate your longevity . {% endblock %}
{{ _("(This will not affect your Social Security account or eligibility and it will not begin an application.)") }}
{{ _("This means you will get your maximum possible monthly benefit! Here are a few things to keep in mind in the next few years.") }}
{{ _("This means you will get an increase in your monthly benefits! Here are a few things to keep in mind in the next few years.") }}
{{ _("That means you’ll receive your full benefit with no reductions! Here are a few things to keep in mind in the next few years.") }}
{{ _("If you start collecting at this age you will receive less than your full benefit amount. Here are a few things to keep in mind in the next few years.") }}
{{ _("Was this page helpful in thinking about when to start collecting benefits?") }}
{{ _("Thank you for your feedback!") }}
{{ _("The content on this page provides general consumer information. It is not legal advice or regulatory guidance. The CFPB updates this information periodically. This information may include links or references to third-party resources or content. We do not endorse the third-party or guarantee the accuracy of this third-party information. There may be other resources that also serve your needs.") }}


Explore the Sahara!
The dunes and plains of the Sahara strecth into the distance for an eternity, reaching from the Atlantic Coast to the Red Sea, it covers a quarter of the African continent and is the size of the United States!
What to bring... check your checklist!
A windbreaker or light jacket
Although there is an average temperature of over 40 degrees celcius, this will be needed to survive the cooler nightsA headscarf or desert hats
To block the sun and dust.Hiking Boots
For the day and night treks.Comfortable jeans or trousers
To cover your whole leg to protect from the camel's rough fur.Water bottle
We've got the water, fill up at each camel stop!
Camel rides - The most reliable way to travel
Hold on tight while going over the sand dunes!
When to go to the Sahara Desert
The summer is one to avoid - Between June and September the sun is simply too hot for it to be enjoyable.
Winter is manageable if you werap up warm; however, the best time to visit the Sahara Desert is definitely in spring or autumn.
By October the searing heat of the summer has passed awaybut it's still pleasant after dark. Similar temperaturesare found in spring, but between February and April, sandstorms are common.
Glamp in the desert tents!
Sleep under the stars, enjoy the landscape...
The essential Sahara activity is to stay overnight in a tenter Berber camp. Accommodation ranges from the luxurious to the simple but comfortable to make it feel more authentic. Blankets are provided but you can bring your own sleeping bag. You will be accompanied by traditinal music and dancing.
Not yet tempted? Read Liakat's Review...
'As sunset approached, our group climbed to the top of a sand dune which was situated behind our camp. Everything was perfect. There was virtually no sound, and I began to take the absurdity of just how far out I was, the light was perfect. We settled down for a lovely meal in the evening by the fire. Although it got quite cold by the night, there was ample bedding available, and the warmth from the fire was more than adequate to keep comftorble.' - Liakat after her Sahara holiday


  Click here to learn about me, or scroll down to read my random ramblings.
REALLY WIP


{{ live_challenge.name }}
- Teams: {{ live_challenge.num_teams|intcomma }}
- Successful approaches:
approaches with at least 1 successful submission
{{ live_challenge.stats.num_successful_approaches|intcomma }} - Total submissions processed: {{ live_challenge.stats.num_total_submissions|intcomma }}


Delete Reader Information
result of Delete : {{ msg }} {% for row in result %} Reader Key
Reader Login_Key
Reader Password
Reader Name
Reader Sex
Reader DOE
Reader Address
Reader Phone_no
{% endfor %}
Go back to home page


Modern Rice Cooker - Alibaba.com
153 Products . Modern Rice Cooker, Source Modern Rice Cooker Products at .
http://www.alibaba.com/showroom/modern-rice-cooker.html
Treatment for Herniated or Bulging Discs
Sanyo Rice Cookers & Steamers Support, Manuals & Customer ...
Free Sanyo Rice Cooker and Steamer help, support & customer service. Ask your Home . There was a broken wire because of the constant friction... xumei; Jan .
http://www.fixya.com/support/sanyo/rice_cookers_and_steamers
ECJ_F50S RiceCookerManual.qxd - Sanyo
Sanyo Rice Cooker/Warmer. . pins and wires, into any openings. . lf a replacement battery is needed, contact Sanyo Fisher Service at<PHONE_NUMBER> or visit .
http://us.sanyo.com/dynamic/product/Downloads/ECJ-F50S_OM_English-32692722.pdf
sanyo rice cooker wire Herniated or Bulging Discs
ECJ-S35K Owners Manual English - Sanyo
Jul 2, 2007 . of a Sanyo Rice Cooker and . pins and wires, into any openings. 8. 11. 12. . This rice cooker uses a Lithium Battery that contains Perchlorate .
http://us.sanyo.com/dynamic/product/Downloads/ECJ-S35K_OM_English-43055619.pdf
Free Sanyo Rice Cooker User Manuals | ManualsOnline.com
Products 1 - 27 of 27 . Sanyo Rice Cooker manuals and owner instruction guides. Find free Sanyo Rice Cooker user manuals, product support, and pdf .
http://kitchen.manualsonline.com/manuals/mfg/sanyo/sanyo_rice_cooker_product_list.html
Sanyo APSN505 5 Cup Rice Cooker and Vegetable Steamer
Sanyo APSN505 5 Cup Rice Cooker and Vegetable Steamer Sanyo 5 Cup Rice Cooker and Vegetable Steamer Single Switch Operation Keep Warm .
http://www.sonicelectronix.com/item_48793_Sanyo-APSN505-5-Cup-Rice-Cooker-and-Vegetable-Steamer.html
Official Impairment Listing for Spinal Disorders
Wired: Rice Cookers Reviewed, Asians Everywhere Surprised
Nov 16, 2006 . Wired: Rice Cookers Reviewed, Asians Everywhere Surprised . Tech and Mark McClusky, one of my old mentors at Wired, did a side by side shootout of Rice Cookers. . A Sanyo that doesn't even beep when its done.
http://gizmodo.com/215433/wired-rice-cookers-reviewed-asians-everywhere-surprised
- cooking oil recycling wayne pennsylvania (narrowing of the spine)
Sanyo's 'rice-to-bread' machine is massive Japanese hit (Wired UK)
Dec 1, 2010 . A hot new piece of technology has swept Japan, and is in such high demand that the company had to halt new orders until production lines can .
http://www.wired.co.uk/news/archive/2010-12/01/rice-to-bread-cookerRice cooker repair Problems & Solutions - FixYa
...rice cooker ec-503 power cord sanyo rice cooker ec-503 power cord no . ...rice cooker Hi, You have a bad connection because the wiring has been bent .
http://www.fixya.com/tags/rice_cooker_repair
Amazon.com: Rice Cookers - Sanyo
6 Results . Online shopping for Rice Cookers Sanyo from a great selection of Kitchen & Dining & more at everyday low prices.
http://www.amazon.com/b?ie=UTF8&node=13765311
Sanyo Rice Cooker
22 hours ago . Beware any deal involving Western Union, Moneygram, wire transfer, cashier check, money order, shipping, . Sanyo Rice Cooker - $45 (Cary) .
http://raleigh.craigslist.org/app/3473650101.html
Medical-Vocational Allowance for Herniated Disc
Rice Cookers - How To Information | eHow.com
Rice Cookers how to articles and videos including How to Use Tupperware in a Microwave . cookware, you must use a bit of caution to not cause any damage to the product's wiring. . Using a Sanyo Rice Cooker is a straightforward process.
http://www.ehow.com/rice-cookers/
Panasonic Announces New One-Touch Cooking Rice Cookers with ...
Sep 20, 2012. Logic technology. The new rice cooker models join Panasonic's 2012 lineup of home appliance products and. . Business Wire2012-09-10 .
http://article.wn.com/view/2012/09/20/Panasonic_Announces_New_OneTouch_Cooking_Rice_Cookers_with_M/
Appealing a Denial of Benefits
Personal Loan Calculator Xls, ^ $500 - $3500 ()
Our venerable rice cooker, a hard-working appliance nearly 40 years old, finally had to be retired. The wiring in the plug/connection to the base had gotten faulty. . That's why we immediately bought a replacement, the Sanyo ECJ-N55F/W. It .
http://www.gulfcoastlocalfood.org/2009/09/rip-hitachi-rd-4052/


SpaceX's Starship prototype blows its top during Texas test
by Paul BrinkmannNov. 20 (UPI) -- An early prototype of SpaceX's Starship rocket blew its top during a test Wednesday at the company's construction yard in Boca Chica, Texas.
Images captured by two independent videographers from outside the plant -- LabPadre and SPadre on YouTube -- showed the top of the rocket flying into the air as a cloud of white vapor vented. Vapor and condensation engulfed the plant for several minutes before dissipating.
SpaceX will now move toward flight design for the stainless steel rocket, company founder and CEO Elon Musk said on Twitter soon afterward.
"This had some value as a manufacturing pathfinder, but flight design is quite different," Musk tweeted.
A company statement said there were no injuries, and said the mishap wasn't a serious setback.
"The purpose of today's test was to pressurize systems to the max, so the outcome was not completely unexpected," the statement said. "The decision had already been made to not fly this test article."
At the end of September, Musk hosted an event in front of the same rocket, saying he planned to see it in a test flight.
"This thing is going to take off, fly to 65,000 feet, about 20 kilometers, and come back and land, in about one or two months," he said at the time.
Musk said he hoped to reach Earth orbit with a Starship prototype in about six months, with human passengers by next year. The company has plans to go to the moon and Mars, and to use Starship for planetary commercial flights.
SpaceX is building a second Starship at an industrial park in Cocoa, Fla.


{% if related_objects_tree['component_uuid'] is none %} {% if related_objects_tree['permissions'] and related_objects_tree['permissions'] != 'none' %} {% set object = get_object(related_objects_tree['object_id']) %} {% set object_name = object.name | get_translated_text %} {% else %} {% set object = none %} {% set object_name = '–' %} {% endif %} {% if in_export_data_model %}{% endif %} {{ object_name }} • #{{ related_objects_tree['object_id'] }} {% if object is not none %} {{ import_information_symbol(object) }} {% endif %} {% if related_objects_tree['permissions'] and related_objects_tree['permissions'] != 'none' %} {% if ('referenced_objects' in related_objects_tree and related_objects_tree['referenced_objects']) or ('referencing_objects' in related_objects_tree and related_objects_tree['referencing_objects'])%}


We buy infrastructure!
- engage impactful vortals
- harness cross-media experiences
- harness next-generation eyeballs
- iterate integrated functionalities
- utilize turn-key convergence
- matrix interactive e-business
- reintermediate dynamic technologies
- repurpose killer infrastructures
- seize turn-key markets
- synergize wireless convergence
- drive rich applications
- engage web-enabled ROI
- disintermediate 24/365 supply-chains
- leverage front-end partnerships


--- title: Form Elements (Clay Reorder) section: Components ---
``````
must be declared right after (adjacent sibling of) form-control-inset
.
option
elements.A
select[multiple]
component that lets you reorganizeoption
elements.
Add the class
clay-reorder-footer-end
orclay-reorder-footer-center
onclay-reorder
to align footer content to the right or center, respectively.


Elephants are located next to the advisors.
These pieces move and capture exactly two points diagonally and may
not jump over intervening pieces; the move is described as being like
the character "field". If an elephant cannot move due to a
diagonally adjacent piece, it is known as "blocking the elephant's
eye". Elephants may not cross the river, and
serve as defensive pieces. Because an elephant's movement is
restricted to just seven board positions, it can be easily trapped or
threatened. The two elephants are often used to defend each other. The
Chinese characters for "minister" and "elephant" are homophones in
Mandarin and both have alternative meanings
as "appearance" or "image". However, both are referred to as elephants
in the game.


Display large grid, only render the rows/columns which are visible in the browser viewport, update the grid render when scrolling the browser viewport.
TODO