Saturday, November 3, 2007

PATH_MAX simply isn't

Many C/C++ programmers at some point may run into a limit known as PATH_MAX. Basically, if you have to keep track of paths to files/directories, how big does your buffer have to be?
Most Operating Systems/File Systems I've seen, limit a filename or any particular path component to 255 bytes or so. But a full path is a different matter.

Many programmers will immediately tell you that if your buffer is PATH_MAX, or PATH_MAX+1 bytes, it's long enough. A good C++ programmer of course would use C++ strings (std::string or similar with a particular API) to avoid any buffer length issues. But even when having dynamic strings in your program taking care of the nitty gritty issue of how long your buffers need to be, they only solve half the problem.

Even a C++ programmer may at some point want to call the getcwd() or realpath() (fullpath() on Windows) functions, which take a pointer to a writable buffer, and not a C++ string, and according to the standard, they don't do their own allocation. Even ones that do their own allocation very often just allocate PATH_MAX bytes.

getcwd() is a function to return what the current working directory is. realpath() can take a relative or absolute path to any filename, containing .. or levels of /././. or extra slashes, and symlinks and the like, and return a full absolute path without any extra garbage. These functions have a flaw though.

The flaw is that PATH_MAX simply isn't. Each system can define PATH_MAX to whatever size it likes. On my Linux system, I see it's 4096, on my OpenBSD system, I see it's 1024, on Windows, it's 260.

Now performing a test on my Linux system, I noticed that it limits a path component to 255 characters on ext3, but it doesn't stop me from making as many nested ones as I like. I successfully created a path 6000 characters long. Linux does absolutely nothing to stop me from creating such a large path, nor from mounting one large path on another. Running getcwd() in such a large path, even with a huge buffer, fails, since it doesn't work with anything past PATH_MAX.

Even a commercial OS like Mac OS X defines it as 1024, but tests show you can create a path several thousand characters long. Interestingly enough, OSX's getcwd() will properly identify a path which is larger than its PATH_MAX if you pass it a large enough buffer with enough room to hold all the data. This is possible, because the prototype for getcwd() is:
char *getcwd(char *buf, size_t size);


So a smart getcwd() can work if there's enough room. But unfortunately, there is no way to determine how much space you actually need, so you can't allocate it in advance. You'd have to keep allocating larger and larger buffers hoping one of them will finally work, which is quite retarded.

Since a path can be longer than PATH_MAX, the define is useless, writing code based off of it is wrong, and the functions that require it are broken.

An exception to this is Windows. It doesn't allow any paths to be created larger than 260 characters. If the path was created on a partition from a different OS, Windows won't allow anything to access it. It sounds strange that such a small limit was chosen, considering that FAT has no such limit imposed, and NTFS allows paths to be 32768 characters long. I can easily imagine someone with a sizable audio collection having a 300+ character path like so:
"C:\Documents and Settings\Jonathan Ezekiel Cornflour\My Documents\My Music\My Personal Rips\2007\Technological\Operating System Symphony Orchestra\The GNOME Musical Men\I Married Her For Her File System\You Don't Appreciate Marriage Until You've Noticed Tax Pro's Wizard For Married Couples.Track 01.MP5"


Before we forget, here's the prototype for realpath:
char *realpath(const char *file_name, char *resolved_name);


Now looking at that prototype, you should immediately say to yourself, but where's the size value for resolved_name? We don't want a buffer overflow! Which is why OSs will implement it based on the PATH_MAX define.
The resolved_name argument must refer to a buffer capable of storing at least PATH_MAX characters.

Which basically means, it can never work on a large path, and no clever OS can implement around it, unless it actually checks how much RAM is allocated on that pointer using an OS specific method - if available.

For these reasons, I've decided to implement getcwd() and realpath() myself. We'll discuss the exact specifics of realpath() next time, for now however, we will focus on how one can make their own getcwd().

The idea is to walk up the tree from the working directory, till we reach the root, along the way noting which path component we just went across.
Every modern OS has a stat() function which can take a path component and return information about it, such as when it was created, which device it is located on, and the like. All these OSs except for Windows return the fields st_dev and st_ino which together can uniquely identify any file or directory. If those two fields match the data retrieved in some other way on the same system, you can be sure they're the same file/directory.
To start, we'd determine the unique ID for . and /, once we have those, we can construct our loop. At each step, when the current doesn't equal the root, we can change directory to .., then scan the directory (using opendir()+readdir()+closedir()) for a component with the same ID. Once a matching ID is found, we can denote that as the correct name for the current level, and move up one.

Code demonstrating this in C++ is as follows:


bool getcwd(std::string& path)
{
typedef std::pair<dev_t, ino_t> file_id;

bool success = false;
int start_fd = open(".", O_RDONLY); //Keep track of start directory, so can jump back to it later
if (start_fd != -1)
{
struct stat sb;
if (!fstat(start_fd, &sb))
{
file_id current_id(sb.st_dev, sb.st_ino);
if (!stat("/", &sb)) //Get info for root directory, so we can determine when we hit it
{
std::vector<std::string> path_components;
file_id root_id(sb.st_dev, sb.st_ino);

while (current_id != root_id) //If they're equal, we've obtained enough info to build the path
{
bool pushed = false;

if (!chdir("..")) //Keep recursing towards root each iteration
{
DIR *dir = opendir(".");
if (dir)
{
dirent *entry;
while ((entry = readdir(dir))) //We loop through each entry trying to find where we came from
{
if ((strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..") && !lstat(entry->d_name, &sb)))
{
file_id child_id(sb.st_dev, sb.st_ino);
if (child_id == current_id) //We found where we came from, add its name to the list
{
path_components.push_back(entry->d_name);
pushed = true;
break;
}
}
}
closedir(dir);

if (pushed && !stat(".", &sb)) //If we have a reason to contiue, we update the current dir id
{
current_id = file_id(sb.st_dev, sb.st_ino);
}
}//Else, Uh oh, can't read information at this level
}
if (!pushed) { break; } //If we didn't obtain any info this pass, no reason to continue
}

if (current_id == root_id) //Unless they're equal, we failed above
{
//Built the path, will always end with a slash
path = "/";
for (std::vector<std::string>::reverse_iterator i = path_components.rbegin(); i != path_components.rend(); ++i)
{
path += *i+"/";
}
success = true;
}
fchdir(start_fd);
}
}
close(start_fd);
}

return(success);
}


Before we accept that as the defacto method to use in your application, let us discuss the flaws.

As mentioned above, it doesn't work on Windows, but a simple #ifdef for Windows can just make it a wrapper around the built in getcwd() with a local buffer of size PATH_MAX, which is fine for Windows, and pretty much no other OS.

This function uses the name getcwd() which can conflict with the built in C based one which is a problem for certain compilers. The fix is to rename it, or put it in its own namespace.

Next, the built in getcwd() implementations I checked only have a trailing slash on the root directory. I personally like having the slash appended, since I'm usually concatenating a filename onto it, but note that if you're not using it for concatenation, but to pass to functions like access(), stat(), opendir(), chdir(), and the like, an OS may not like doing the call with a trailing slash. I've only noticed that being an issue with DJGPP and a few functions. So if it matters to you, the loop near the end of the function can easily be modified to not have the trailing slash, except in the case that the root directory is the entire path.

This function also changes the directory in the process, so it's not thread safe. But then again, many built in implementations aren't thread safe either. If you use threads, calculate all the paths you need prior to creating the threads. Which is probably a good idea, and keep using path names based off of your absolute directories in your program, instead of changing directories during the main execution elsewhere in the program. Otherwise, you'll have to use a mutex around the call, which is also a valid option.

There could also be the issue that some level of the path isn't readable. Which can happen on UNIX, where to enter a directory, one only needs execute permission, and not read permission. I'm not sure what one can do in that case, except maybe fall back on the built in one hoping it does some magical Kernel call to get around it. If anyone has any advice on this one, please post about it in the comments.

Lastly, this function is written in C++, which is annoying for C users. The std::vector can be replaced with a linked list keeping track of the components, and at the end, allocate the buffer size needed, and return the allocated buffer. This requires the user to free the buffer on the outside, but there really isn't any other safe way of doing this.
Alternatively, instead of a linked list, a buffer which is constantly reallocated can be used while building the path, constantly memmove()'ing the built components over to the higher part of the buffer.

During the course of the rest of the program, all path manipulation should be using safe allocation managing strings such as std::string, or should be based off of the above described auto allocating getcwd() and similar functions, and constantly handling the memory management, growing as needed. Be careful when you need to get any path information from elsewhere, as you can never be sure how large it will be.

I hope developers realize that when not on Windows, using the incorrect define PATH_MAX is just wrong, and fix their applications. Next time, we'll discuss how one can implement their own realpath().

2,290 comments:

  1. Hey, good to see you're finally back from your extended vacation. Bet the kids loved it, I know I always loved Disney World as a kid (hope they didn't make you go on "It's a Small World" too many times, that gets annoying after a while). Anyway, what you said about windows reminds me of a trick I used in high school to hide files on the school's network. I'd basically create a path as long as it would allow, put my games or whatever other forbidden files in there, and move the entire path once more into a new directory. Then when they tried to see what was in there, all they'd get is a recurrence of "New Folder/New Folder/New Folder/"etc. until they couldn't open it. It also wouldn't delete IIRC, and they weren't smart enough to realize to move it one level up, which is, of course, the method by which I would access my files there.

    As for your wife's filesystem, what's she running? ReiserFS V5? Ext7? FAT4096? It's gotta be something cool if you're ripping mp5s.

    The problem with PATH_MAX though, is that it's like a great sports play. You can't just rush into the score zone, you'd get a buffer overflow! But rather than implementing it sanely in a manner that you pass a buffer and a size, they decided to make their own number that has no relation whatsoever to the actual max path length. Sure, you could say something like "no one could possibly need a path longer than X", but we saw how well that worked when Gates Almighty stated that "640K ought to be enough for anybody". You just never know how much of anything will be enough for someone, and therein lies the flaw in many aspects of computing today.

    In closing, stupid people suck.

    ReplyDelete
  2. great topic , great explanation :)

    ReplyDelete
  3. Windows allows approx 32k Unicode chars for the whole concatenated path, so long as:
    1. You call the Unicode ('W') APIs rather than the OEM ('A') ones, eg CreateFileW; AND
    2. You prepend the magic string '\\?\' to your path; AND
    3. Your path is absolute or UNC, rather than relative.

    I know this is wierd and sounds unlikely, but I've personally written a test program to exercise this bizarre feature.

    MS documentation here:
    http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx#maxpath

    For extra kicks, you can also do:
    \\?\UNC\myhostname\mysharename\my\big\long\sequence\of\subdirs

    ReplyDelete
  4. Dan: the problem with PATH_MAX is not stupidity of the designers. It's the history of UNIX. Please don't accuse the designers of stupidity without doing some research first.

    Modern *NIXes support multiple filesystem types simultaneously, each one with its own values for its own limits of various kinds.

    Worse, most modern *NIXes support something like loadable kernel filesystem modules. So now entire types of filesystem can come and go at the whim of the sysadmin.

    Given this, the idea of a single, static max-length number is wrong, regardless of its value. But that does not mean that those who came up with the idea were stupid.

    Back in the day, UNIX had none of these features. In those days, the PATH_MAX concept was:
    a) sufficient for then purposes;
    b) simple for people to code to (compare modern sysconf);
    b. Could be implemented efficiently on a PDP-11.

    These were the times when malloc() performance sucked, so it was to be avoided at almost any cost - including static buffers with no bounds checking.

    In closing, judgemental ignorant people suck, and they make themselves look silly when they spout off on other peoples' blogs.

    ReplyDelete
  5. Impressive one. I will like to share a thing about this that my problem of copying and moving of ling path file solved by suing long path tool. I Suggest everyone to try this.

    ReplyDelete
  6. Not sure about other OS's, but in UNIX System V, PATH_MAX was instituted to protect the (single threaded) kernel from getting hogged by a user who prankishly opened a path of the form ././. [continue for several megabytes...] /./foo.bar, which would make the system freeze for all its users until the kernel had resolved the path. On a machine that was challenged to achieve 1 mips performance, this could be many seconds. So an absolute limit was set and enforced.

    ReplyDelete
  7. Try to use Long Path Tool program

    ReplyDelete
  8. Hello,
    My job involves license compliance at SAP. I have received a request for code posted on the following page "http://insanecoding.blogspot.ca/2007/11/pathmax-simply-isnt.html".

    I was wondering that you grant SAP the right to use/copy/modify/distribute this code. Or, if possible, I request that you grant this code to SAP under the MIT license or another permissive license.

    Thanks
    Weranga

    ReplyDelete
  9. I grant you the license to use this code intelligently if you document in the code where it came from.

    Note, I don't even use this code. The article points out some issues with it, and the follow up articles improve upon it in various ways, and mention other possible improvements (of which I personally all implement but have not posted here). It is highly advisable to not use what you don't understand and fix things as needed for your use cases.

    ReplyDelete
  10. You can try Long Path Tool, it helped me a lot.

    ReplyDelete

  11. The Long path tool is the very best program for error, unlock solution.
    Try it and solved your problem.
    I used the long path tool and I solved my error, unlocks problem solution.

    ReplyDelete
  12. Long Path Tool is useful here

    ReplyDelete
  13. The windows API has MAX_LENGTH of 255 characters only. That's probably the answer to your problem. If you want to solve this you can try GS Richcopy 360. I am currently using this software and it has worked for me and my enterprise to solve all our problems related to file copying. Although its paid but it saves a lot of time and energy and time is money.

    ReplyDelete
  14. This looks absolutely perfect. All these tiny details are made with lot of background knowledge. I like it a lot. 
    angularjs training in chennai
    angularjs2 training in chennai | angularjs4 Training in Chennai
    angularjs5 Training in Chennai

    ReplyDelete
  15. Thank you so much for a well written, easy to understand article on this. It can get really confusing when trying to explain it – but you did a great job. Thank you!
    Click here:
    Microsoft azure training in annanagar
    Click here:
    Microsoft azure training in velarchery

    ReplyDelete
  16. Thanks for your informative article, Your post helped me to understand the future and career prospects & Keep on updating your blog with such awesome article.

    Blueprism training in Chennai

    Blueprism training in Bangalore

    Blueprism training in Pune

    Blueprism online training

    Blueprism training in tambaram

    ReplyDelete
  17. I wanted to thank you for this great read!! I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post.is article.
    angularjs Training in chennai
    angularjs-Training in pune

    angularjs-Training in chennai

    angularjs Training in chennai

    angularjs-Training in tambaram

    angularjs-Training in sholinganallur

    ReplyDelete
  18. Thank you for taking the time and sharing this information with us. It was indeed very helpful and insightful while being straight forward and to the point.
    Web Designing Course in chennai
    Java Training in Chennai
    Web development training in chennai
    website design training
    Best Java Training Institute in Chennai
    Java Training

    ReplyDelete
  19. Hey, Wow all the posts are very informative for the people who visit this site. Good work! We also have a Website. Please feel free to visit our site. Thank you for sharing.
    Well written article. Thank You Sharing with Us angular 7 training in velachery

    ReplyDelete
  20. Nice post. I learned some new information. Thanks for sharing.

    chocolatesanddreams
    Technology

    ReplyDelete
  21. Great!it is really nice blog information.after a long time i have grow through such kind of ideas.thanks for share your thoughts with us.
    Angular 6 training in Bangalore
    Angular JS Training courses near me
    Best AngularJS Training Institute in Anna nagar
    AngularJS Training in T nagar

    ReplyDelete
  22. This is a nice post in an interesting line of content.Thanks for sharing this article, great way of bring this topic to discussion.
    python course in pune
    python course in chennai
    python course in Bangalore

    ReplyDelete
  23. Well written post with clear and precise details. Your article is worth reading. Keep posting more articles like this. Great job. Regards.
    Microsoft Dynamics CRM Training in Chennai | Microsoft Dynamics CRM Training Courses | Microsoft Dynamics Training | Microsoft CRM Training

    ReplyDelete
  24. Good informative post with explanation. Really I found some information here to get next level of technology. keep posting...

    Thanks
    TekSlate
    (https://goo.gl/g2sydT)

    ReplyDelete
  25. This is most informative and also this post most user friendly and super navigation to all posts... Thank you so much for giving this information to me.. 

    Online DevOps Certification Course - Gangboard
    Best Devops Training institute in Chennai

    ReplyDelete
  26. Just stumbled across your blog and was instantly amazed with all the useful information that is on it. Great post, just what i was looking for and i am looking forward to reading your other posts soon!
    angularjs-Training in sholinganallur

    angularjs-Training in velachery

    angularjs-Training in pune

    angularjs Training in bangalore

    angularjs Training in bangalore

    angularjs Training in btm

    ReplyDelete
  27. StreamD helps Indian Online Shoppers to choose the BEST LED TV and Cheap products in tech space through our carefully data-backed analysis of products by Industry Experts.

    ReplyDelete
  28. Very nice post here thanks for it .I always like and such a super contents of these post.Excellent and very cool idea and great content of different kinds of the valuable information's.
    Check out :
    Best institutes for machine learning in chennai

    machine learning certification in chennai

    ReplyDelete
  29. This comment has been removed by the author.

    ReplyDelete
  30. Your information's are very much helpful for me to clarify my doubts.
    keep update more information's in future.
    AWS Training in Thirumangalam
    AWS Training in anna nagar
    AWS Training in Vadapalani
    AWS Training in Nungambakkam

    ReplyDelete
  31. This comment has been removed by the author.

    ReplyDelete
  32. This is a terrific article, and that I would really like additional info if you have got any. I’m fascinated with this subject and your post has been one among the simplest I actually have read.
    Java training in Chennai

    Java training in Bangalore

    ReplyDelete
  33. Tremendous article for knowledge RPA Training in Bangalore is highly informative.

    ReplyDelete
  34. This comment has been removed by the author.

    ReplyDelete
  35. This comment has been removed by the author.

    ReplyDelete
  36. Very useful post share to others
    https://www.slajobs.com/advanced-excel-vba-training-in-chennai/

    ReplyDelete
  37. I am really enjoying reading your well-written articles. It looks like you spend a lot of effort and time on your blog. I have bookmarked it and I am looking forward to reading new articles. Keep up the good work.
    Hadoop Training in Chennai
    Big Data Training in Chennai
    German Classes in Chennai
    hadoop training in OMR
    hadoop training in Tambaram
    big data course in chennai
    Hadoop course in chennai

    ReplyDelete
  38. Really great post, I simply unearthed your site and needed to say that I have truly appreciated perusing your blog entries.
    Python Online certification training
    python Training institute in Chennai
    Python training institute in Bangalore

    ReplyDelete
  39. Have you been thinking about the power sources and the tiles whom use blocks I wanted to thank you for this great read!! I definitely enjoyed every little bit of it and I have you bookmarked to check out the new stuff you post
    rpa training in bangalore
    best rpa training in bangalore
    rpa training in pune

    ReplyDelete
  40. I found your blog while searching for the updates, I am happy to be here. Very useful content and also easily understandable providing.. Believe me I did wrote an post about tutorials for beginners with reference of your blog. 
    rpa training in bangalore
    rpa training in pune
    rpa online training
    best rpa training in bangalore

    ReplyDelete
  41. I think this is the best article today about the future technology. Thanks for taking your own time to discuss this topic, I feel happy about that curiosity has increased to learn more about this topic. Artificial Intelligence Training in Bangalore. Keep sharing your information regularly for my future reference.

    ReplyDelete
  42. This comment has been removed by the author.

    ReplyDelete
  43. This comment has been removed by the author.

    ReplyDelete
  44. Ifixit4u.in is a Ranchi based Mobile Repairing Service provider,instrumental in offering all sorts of fix and repair solutions at your doorsteps. We are offering the highest-quality repairing service as per the market standard at affordable retes.

    Best Laptop Repair in Ranchi

    Best Mobile Repair in Ranchi

    Best Laptop and Mobile Repair in Ranchi


    Mobile Repair Center in Ranchi

    Best Laptop Repair Shop in Ranchi

    ReplyDelete
  45. Avukat ve hukuk danışmanı
    Çankaya Avukat hukuk danışmanı
    Hukuk danışmanı
    Hukuk Bürosu
    Boşanma Avukatı
    İcra Avukatı
    Ücretsiz Avukat
    Baro Avukat
    Adliye Avukat
    Hukuk Danışmanlık Bürosu
    Bugün, 2,5 yılı aşan mesleki tecrübem ile çalıştırdığım hukuk büromuzda uzmanlık alanlarım içerisinde yer alan konu ve davalarda bireysel ve kurumsal bazda danışmanlık ve avukatlık hizmeti vermekteyim.
    Ankara Avukat

    ReplyDelete
  46. The foundation of Weborbit Solutions was mainly through an initiative taken by a group of enthusiast. The Premier Business Service provider is mainly catering to the IT and the branding sector. Hence Weborbit is having the basic concept to lead you digitally.

    Best Web Design Company in kolkata


    Best Web Development Company in kolkata



    Best Android App Development Company in kolkata



    Best Website Development and Design Company in kolkata


    Best Website Development Low Cost in Kolkata

    ReplyDelete
  47. This comment has been removed by the author.

    ReplyDelete
  48. https://www.cutehindi.com/2019/02/best-names-for-pubg.html

    ReplyDelete
  49. https://www.veilleuse.shop/produit/veilleuse-coranique-munawara/
    La veilleuse coranique bluetooth avec sa télécommande pour offrir.
    Cadeau ramadam idéal
    La veilleuse coranique personnalisée pas cher
    Veilleuse coranique personnalisée
    Veilleuse coranique personnalisée

    Découvrez La veilleuse coranique Munawara
    Video de la Veilleuse coranique munawara
    Veilleuse coranique munawara


    Je travailles sur un projet de fabrication de cornes de gazelle personnalisée
    cornes de gazelle expressives
    cornes de gazelle délicieuses
    Merci de laisser ce lien c'est sympa...

    Le casque vapeur hair steamer permet de lutter contre la sécheresse, la chute des cheveux et leur mauvaise santé , dans le confort de votre domicile. Le hair steamer est un casque vapeur qui apporte une dose d'hydratation pour les cheveux crépus.
    Hair steamer vapohair
    Lee hair steamer casque vapeur est recommendé par fes femmes aux cheveux crépus
    Casque vapeur
    La casque vapeur hair steamer apporte beaucoup de bienfait au cheveux crépus de type afro Hair.
    hair steamer Casque vapeur hydratation cheveux crépus
    hair steamer
    Le hair steamer casque vapeur fournit une cure intense contre les chutes et pour favoriser la repousse.
    Le hair steamer est un casque à vapeur sûr, une utilisation et un entretien facile

    ReplyDelete
  50. This comment has been removed by the author.

    ReplyDelete
  51. Ifixit4u.in is a Ranchi based Mobile Repairing Service provider,instrumental in offering all sorts of fix and repair solutions at your doorsteps. We are offering the highest-quality repairing service as per the market standard at affordable retes.

    Best Laptop Repair in Ranchi

    Best Mobile and Laptop Repair Shop in Ranchi

    Best Laptop Repair Shop in Ranchi


    Best Laptop Repair and Service in Ranchi

    Best Mobile Repair Shop in Ranchi

    ReplyDelete
  52. Nice post!Everything about the future(học toán cho trẻ mẫu giáo) is uncertain, but one thing is certain: God has set tomorrow for all of us(toán mẫu giáo 5 tuổi). We must now trust him and in this regard, you must be(cách dạy bé học số) very patient.

    ReplyDelete
  53. great article you have published and very helpful for us thank you
    Whatsapp Group Links List

    ReplyDelete
  54. Nice Article… I love to read your articles because your writing style is too good, its is very very helpful for all of us and I never get bored while reading your article because, they are becomes a more and more interesting from the starting lines until the end.

    Check out : big data training in chennai
    big data course in chennai
    big data hadoop training in chennai
    big data certification in chennai

    ReplyDelete
  55. This comment has been removed by the author.

    ReplyDelete
  56. Thanks for provide great informatic and looking beautiful blog.

    Ludo King Whatsapp Group links
    - if you are looking for joining some Ludo Game Whatsapp Groups the WpGroups is here to solve your problem, Today we are sharing best Ludo King Whatsapp Group Links to join.

    ReplyDelete
  57. Thanks for provide great informatic and looking beautiful blog, really nice required information & the things i never imagined and i would request, wright more blog and blog post like that for us. Thanks you once agian
    Marriage registration ghaziabad
    Marriage registration in ghaziabad
    Marriage certificate in ghaziabad
    Marriage certificate ghaziabad
    Marriage certificate online

    ReplyDelete
  58. Time is free but it's priceless(khóa học toán tư duy) . You cannot own it, but you can use it(cách dạy bé học số) . You can use it, but you can't keep it(toán tư duy logic là gì). Once you lose it, you will not be able to get it back.

    ReplyDelete
  59. Woah this blog is wonderful i like studying your posts. Keep up the great work! You understand, lots of persons are hunting around for this info, you could help them greatly.
    Microsoft Azure online training
    Selenium online training
    Java online training
    Python online training
    uipath online training

    ReplyDelete
  60. Thanks for provide great informatic and looking beautiful blog, really nice required information & the things i never imagined and i would request, wright more blog and blog post like that for us. Thanks you once agian name change , online name change, change of name, name change in delhi, name change delhi name change form

    ReplyDelete
  61. Thanks for provide great informatic and looking beautiful blog, really nice required information & the things i never imagined and i would request, wright more blog and blog post like that for us. Thanks you once agian name change , online name change, change of name, name change in delhi, name change delhi name change form

    ReplyDelete
  62. Thanks for sharing valuable information. Your blogs were helpful to Azure learners. I request to update the blog through step-by-step. Also, find the Azure news at
    Such an ideal piece of blog. It’s quite interesting to read content like this. I appreciate your blog Data Science training in Bangalore

    ReplyDelete
  63. This is the exact information I am been searching for, Thanks for sharing the required info with the clear update and required points. To appreciate this I like to share some useful information regarding Microsoft Azure which is the latest and newest,

    Regards,

    Whatsapp Group Links List

    ReplyDelete
  64. Outstanding blog thanks for sharing such wonderful blog with us ,after long time came across such knowlegeble blog. keep sharing such informative blog with us.

    Check out : big data hadoop training in chennai
    big data training in chennai chennai tamilnadu
    spark training in chennai

    ReplyDelete
  65. Very nice post here thanks for it .I always like and such a super contents of these post.Excellent and very cool idea and great content of different kinds of the valuable information's.

    Check out : hadoop training in chennai cost
    hadoop certification training in chennai
    big data hadoop course in chennai with placement
    big data certification in chennai

    ReplyDelete
  66. Really very happy to say, your post is very interesting to read. You’re doing a great job.Keep it up
    check out:

    big data course fees in chennai
    hadoop training in chennai cost
    bigdata and hadoop training in chennai

    ReplyDelete
  67. The framework takes an opinionated approach to configuration, freeing developers from the need to define boilerplate configuration. In that, Boot aims to be a front-runner in the ever-expanding rapid application development space.

    spring boot rest example

    ReplyDelete
  68. I have read your blog its very attractive and impressive. I like it your blog.
    Data Science course in Bangalore | Best Power BI course in marathahalli

    ReplyDelete
  69. Outstanding blog thanks for sharing such wonderful blog with us ,after long time came across such knowlegeble blog. keep sharing such informative blog with us.

    Check out : hadoop training in Chennai
    big data training in chennai
    big data hadoop training in chennai
    big data training and placement in chennai

    ReplyDelete
  70. Very nice post here thanks for it .I always like and such a super contents of these post.Excellent and very cool idea and great content of different kinds of the valuable information's.

    Check out : hadoop training in Chennai
    big data training in chennai
    big data hadoop training in chennai
    big data training and placement in chennai

    ReplyDelete
  71. Excellent blog I visit this blog its really informative. By reading your blog, i get inspired and this provides useful information.
    big data training in chennai chennai tamil nadu
    big data training in velachery
    big data hadoop training in velachery

    ReplyDelete
  72. Thanks on you marvelous posting! I certainly enjoyed reading it, you are a great author.I will remember to bookmark your blog and will come back very

    Devops Training in Bangalore

    Are You Tried with Career Life..? Want to do something challenging in life.? Then Join Devops Training in Bangalore

    ReplyDelete
  73. I like your blog, I read this blog please update more content on hacking, Nice post
    Excellent Blog, I appreciate your hard work, it is useful

    Tableau online Training

    Android app development Course

    Data Science online Course

    Visual studio training

    iOS online courses

    ReplyDelete
  74. superb post, thank you for providing a post like this, I am searching a post as
    like as for my business
    wedding planners in bhopal
    event planners in bhopal

    ReplyDelete
  75. This is extremely nice data for these blog!! and really sensible work. it's terribly fascinating to find out from to easy understood. thanks for giving information. Please let us know and a lot of information get post to link,
    Best Angularjs Training Institute In Bangalore | Angularjs Training In Bangalore

    ReplyDelete
  76. This comment has been removed by the author.

    ReplyDelete
  77. Very nice post here thanks for it .I always like and such a super contents of these post.Excellent and very cool idea and great content of different kinds of the valuable information's.

    Check out : big data training in velachery
    big data analytics training and placement
    big data training in chennai chennai tamilnadu
    big data workshop in chennai

    ReplyDelete
  78. Great efforts put it to find the list of articles which is very useful to know, Definitely will share the same to other forums.

    Check out : big data training in velachery
    big data analytics training and placement
    big data training in chennai chennai tamilnadu
    big data workshop in chennai

    ReplyDelete
  79. Thanks for your informative article, Your post helped me to know the future and career prospects updating your blog with such amazing article.
    Angularjs training in Bangalore
    Angularjs training institute in Bangalore
    Angularjs training course in Bangalore

    ReplyDelete
  80. Great Content, Learned few interesting topics and improved myself.
    ExcelR Solutions

    ReplyDelete
  81. I am really happy to read your blog. your blog is very good and informative for me.
    Your blog contain lots of information. It's such a nice post. I found your blog through my friend if you want to know about more property related information please check out here. With the experience of over 3 decades, Agrawal Construction Company is the biggest and the best builders in bhopal and the trust holder of over 10000 families. Agrawal Construction Company Bhopal is serving society, building trust & quality with a commitment to cutting-edge design and technology. Agrawal Construction Company's vision is to 'building trust & quality' which extends to developing residential, commercial and township projects in all the directions of the beautiful City of Lakes Bhopal and hence it is among the top builders in Bhopal. Currently, it has four residential such as Sagar Pearl, Sagar Green Hills, Sagar Landmark and Sagar Eden Garden.

    ReplyDelete
  82. I feel very glad to read your great blog. Thanks for sharing with us. Please keep sharing more post.
    AWS Online Training
    AWS Training in Hyderabad
    Amazon Web Services Online Training

    ReplyDelete
  83. On this website you can join unlimited groups . click and get unlimited whatsapp group links

    ReplyDelete
  84. Wow, Impressive! Your blog is very informative. However, it is a pretty hard task but your post and experience serve and teach me a lot of ideas. Thanks for the tips… Best regards.
    AWS Online Training
    AWS Training in Hyderabad
    Amazon Web Services Online Training

    ReplyDelete
  85. many peoples want to join random whatsapp groups . as per your demand we are ready to serve you whatsapp group links . On this website you can join unlimited groups . click and get unlimited whatsapp group links

    if you want girls mobile numbers then this website is best for you . you can visit on this website and get their information and you also can meet with thrm and go for a date . click here to use our website --- online dating website

    ReplyDelete
  86. if you want girls mobile numbers then this website is best for you . you can visit on this website and get their information and you also can meet with thrm and go for a date . click here to use our website --- online dating website

    ReplyDelete
  87. And indeed, I’m just always astounded concerning the remarkable things served by you. Some four facts on this page are undeniably the most effective I’ve had.
    safety course in chennai
    nebosh course in chennai

    ReplyDelete
  88. Really nice post. Provided a helpful information. I hope that you will post more updates like this

    AWS Online Training

    AWS Certification

    AWS Training

    ReplyDelete
  89. Really useful information. hot whatsapp groups Thank you so much for sharing.It will help everyone.Keep Post

    ReplyDelete
  90. Nice work and I read your post, My friend recommended this blog and he was totally right keep up the good work, really, it left me so much impressed with this article, I hope you will have more great articles to share with readers, thank you the post.Thank you for this great article i read your post you really work well i learn a lot form your post keep it up. i follow your blog for learning something new.
    status about friendship
    खतरनाक शायरी 2019
    mahakal status in hindi
    cute love status in hindi

    ReplyDelete
  91. Really useful information. Thank you so much for sharing. It will help everyone. Keep Post.

    heart symptoms

    ReplyDelete
  92. You must not worries, if you're facing trouble using your software you're going to be just a call away to your solution. Reach us at QuickBooks Support Phone Number USA Support contact number at and experience our efficient tech support team of several your software related issues. If you should be aa QuickBooks enterprise user, you'll be able to reach us out immediately at our QuickBooks Support contact number .

    ReplyDelete
  93. Our QuickBooks Support telephone number channel- We comprehend the complexity and need using this accounting software QuickBooks 247 Customer Support
    USA
    in day to day life. You can’t look out for just about time for this to obtain a fix of each single QB error.

    ReplyDelete
  94. You may land up in problems as early with Installation issues or as late with upgrade errors. Software issues like improper functioning of features can also arise.QuickBooks Payroll Support Number

    ReplyDelete
  95. The QuickBooks Online Payroll makes your payday easy and accurate. It will help in personalizing your payroll. The application understands that every employee differs from the others aided by the unique paychecks. Therefore, it can help the payroll manager to accomplish the flexible payments and deduction with ease QuickBooks Payroll Tech Support Number It quickly adjusts the salaried and hourly wages as well as takes care of healthcare, time off, retirement, and more.

    ReplyDelete
  96. Thanku very much for providing a knowledge based article Job NMK

    ReplyDelete
  97. You can easily proceed with the previously discussed steps carefully to eradicate this login issue. However, it's the wisest choice to call at QuickBooks Customer Support Number of QuickBooks to obtain in touch with certainly one of our technical experts at QuickBooks Online customer care channel for a fast resolution of every issues in QBO.

    ReplyDelete
  98. Payroll updates: These QuickBooks Enterprise Support Contact Phone Number updates have the newest and accurate updates and calculations for state and federal tax tables, payroll tax forms and e-files.

    ReplyDelete
  99. I am really happy to say it’s an interesting post to read . I learn new information from your article , you are doing a great job . Keep it up
    Health, Beauty & Fashion

    ReplyDelete
  100. Nice Article…
    Really appreciate your work
    Bike Status

    ReplyDelete
  101. http://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html

    ReplyDelete
  102. Wooow.. Nice post, Thank your for sharing useful Information.
    We are Frontline Relocation Packers and Movers Vadodara is Trusted and Most verified movers and packers service provider in All over India. We have 25K+ Happy Customers all over india.
    Packers and Movers in Vadodara,
    Movers and Packers in Vadodara,
    Packers and Movers in Bharuch,
    Transportation Service In Vadodara,
    Packers and Movers in Ankleshwar,
    Packers and Movers in Gotri,
    Packers and Movers in Alkapuri,
    Packers and Movers in Karelibaug,
    Packers and Movers in Manjalpur,
    Get Free Quote
    Thank You.

    ReplyDelete
  103. Make sure your Internet Exploreris readied to become your default browser by opening the net Options menu selecting the Programs Under Default internet browser click about the Make Default button.
    VISIT : https://www.247supportphonenumber.com/how-to-fix-quickbooks-error-15270/

    ReplyDelete
  104. The employer needs to allocate. But, carrying this out manually will need enough time. Aim for QuickBooks Desktop Payroll Support Phone Number. This really is an excellent software.

    ReplyDelete
  105. So they are some general factors behind the occurrence of error QuickBooks 15223. if you're also facing this dilemma in your body, you should use the next steps to resolve it
    visit : https://www.247supportphonenumber.com/quickbooks-error-15223/

    ReplyDelete
  106. QuickBooks has played a very important role in redefining the way you look at things now. QuickBooks Support Phone Number

    ReplyDelete
  107. I learn a lot of thing from this site which gave me a lot of coding difficulties answers..
    check this out about dogs and What Kind of Dog is Scooby Doo

    if you want to know more about the dogs so than visit my website
    https://www.dogbreedschart.com/

    ReplyDelete