#but then it sends a duplicate and the code marks it as an error and deletes them
Explore tagged Tumblr posts
foxxology · 9 months ago
Text
Just a heads up
Tumblr media Tumblr media
if you've ever sent me an ask, chances are that tumblr glitched and probably ate it
24 notes · View notes
this-week-in-rust · 2 years ago
Text
This Week in Rust 482
Hello and welcome to another issue of This Week in Rust! Rust is a programming language empowering everyone to build reliable and efficient software. This is a weekly summary of its progress and community. Want something mentioned? Tag us at @ThisWeekInRust on Twitter or @ThisWeekinRust on mastodon.social, or send us a pull request. Want to get involved? We love contributions.
This Week in Rust is openly developed on GitHub. If you find any errors in this week's issue, please submit a PR.
Updates from Rust Community
Newsletters
Rust Nigeria #14
Project/Tooling Updates
Fornjot (code-first CAD in Rust) - Weekly Release - Really Shouldn't Be That Hard
New release – gtk-rs
rust-analyzer changelog #168
IntelliJ Rust Changelog #188
Meilisearch releases v1.0, the first completely stable version of its open-source search engine
Zenoh-Flow a Rust-based data-flow programming framework build on Zenoh
Nutype - the newtype with guarantees
pavex, a new Rust web framework - Progress report #1
Observations/Thoughts
How Rust went from a side project to the world’s most-loved programming language
The bottom emoji breaks rust-analyzer
Rust to WebAssembly the hard way
From Erlang to Lunatic
STM32F4 Embedded Rust at the PAC: GPIO Control
A Case for Rust in Deep Learning
TrustZone, trials and tribulations
[video] Rust Releases! 1.67.0 & 1.67.1
Everything you didn't need to know about #[track_caller]
Rust Walkthroughs
[video] Build and deploy a Wasm smart contract with Rust-based language
[video] Write better parsers with nom_supreme
Miscellaneous
[video] From cargo to crates.io and back again
[video] Functional correctness with refinement types for Rust
[audio] Rust ABI with Aurimas Blažulionis
[audio] What's New in Rust 1.65, 1.66, and 1.67
[audio] Open Source Security Podcast: A lesson in Rust from Carol Nichols
Crate of the Week
This week's crate is bkmr, a fast CLI bookmark manager and launcher.
Thanks to sysid for the self-suggestion!
Please submit your suggestions and votes for next week!
Call for Participation
Always wanted to contribute to open-source projects but did not know where to start? Every week we highlight some tasks from the Rust community for you to pick and get started!
Some of these tasks may also have mentors available, visit the task page for more information.
warp - [Windows] locale and installer
man-in-the-middle-proxy - custom certificate
man-in-the-middle-proxy - Filter request by method
man-in-the-middle-proxy - Request duplication
man-in-the-middle-proxy - Delete single request
man-in-the-middle-proxy - modify request with custom fields and headers
If you are a Rust project owner and are looking for contributors, please submit tasks here.
Updates from the Rust Project
387 pull requests were merged in the last week
add -Z instrument-xray flag
add missing normalization for union fields types
add only modified subcommand for compiletest
add parentheses properly for borrowing suggestion
allow multiple candidates with same response in new solver
allow wasi-libc to initialize its environment variables lazily
avoid exposing type parameters and implementation details sourced from macro expansions
disqualify auto trait built-in impl in new solver if explicit impl exists
do not bring trait alias supertraits into scope
do not eagerly recover for bad impl Trait types in macros
enable new rlib in non stable cases
fix implied outlives bounds logic for projections
fix suggestions rendering when the diff span is multiline
implement deferred_projection_equality for erica solver
introduce -Zterminal-urls to use OSC8 for error codes
make &mut !Unpin not dereferenceable, and Box<!Unpin> not noalias
make derive_const derive properly const-if-const impls
mark 'atomic_mut_ptr' methods const
mir-Opt for copying enums with large discrepancies
optimize TyKind::eq
optimize query_cache_hit to reduce code size of the query hot path
reduce interning
simplify layout calculations in rawvec
suggest function call on pattern type mismatch
support true and false as boolean flag params
turn projections into copies in CopyProp
unused-lifetimes: don't warn about lifetimes originating from expanded code
implement AsFd and AsRawFd for Rc
implement cursors for BTreeMap
improve the array::map codegen
reverse Timsort scan direction
speedup heapsort by 1.5x by making it branchless
stabilize feature cstr_from_bytes_until_nul
stop at the first NULL argument when iterating argv
cargo: -Zrustdoc-scrape-example must fail with bad build script
cargo: add '-C' flag for changing current dir before build
cargo: re-export cargo_new::NewProjectKind as public
clippy: make arithmetic_side_effects mind constant items
clippy: cast_possible_truncation: issue proper help message
clippy: suspicious_to_owned: use span_suggestions to suggest both intents
clippy: add suspicious_command_arg_space lint
clippy: almost_swapped: detect almost-swaps using let statements
clippy: negate suggestions when needed in bool_assert_comparison
rust-analyzer: add braces assist
rust-analyzer: add postfix completion for unsafe
rust-analyzer: add setting for limiting number of completions
rust-analyzer: build i686-pc-windows-msvc binaries
rust-analyzer: don't include r# prefix in filesystem changes
rust-analyzer: don't insert a semicolon when typing = if parse errors are encountered
rust-analyzer: fix bind pat inlay hints rendering for constant patterns
rust-analyzer: fix completions after functions with no bodies
rust-analyzer: fix parsing of nested tuple field accesses in a cursed way
rust-analyzer: fix proc-macro-server incorrectly stripping delimiters
rust-analyzer: insert spaces when inlining macros
rust-analyzer: properly use location links for type hints of impl Future and its assoc type
rust-analyzer: suppress extra indent after the end of field and function chains
rust-analyzer: support DidChangeWorkspaceFolders notifications
Rust Compiler Performance Triage
Overall a good week for performance with 77 real world crates benchmarks showing an average of nearly 1% performance improvement. Unfortunately, the largest regressions are not yet fully understood and require additional investigation. Of particular interest were some large improvements in doc builds due to storing additional metadata. However, this change might cause some crates to compile slightly slower in incremental check builds, but this is still being investigated.
Triage done by @rylev. Revision range: e4dd9edb..9bb6e60
Summary:
(instructions:u) mean range count Regressions ❌ (primary) 1.4% [0.4%, 11.0%] 13 Regressions ❌ (secondary) 0.8% [0.2%, 1.6%] 4 Improvements ✅ (primary) -1.4% [-7.9%, -0.3%] 64 Improvements ✅ (secondary) -2.1% [-5.6%, -0.3%] 73 All ❌✅ (primary) -0.9% [-7.9%, 11.0%] 77
3 Regressions, 4 Improvements, 9 Mixed; 4 of them in rollups 46 artifact comparisons made in total
Full report here
Approved RFCs
Changes to Rust follow the Rust RFC (request for comments) process. These are the RFCs that were approved for implementation this week:
No RFCs were approved this week.
Final Comment Period
Every week, the team announces the 'final comment period' for RFCs and key PRs which are reaching a decision. Express your opinions now.
RFCs
No RFCs entered Final Comment Period this week.
Tracking Issues & PRs
[disposition: merge] Drop support for FreeBSD 10 and 11 from std
[disposition: merge] Stabilize cmpxchg16b_target_feature
New and Updated RFCs
No New or Updated RFCs were created this week.
Call for Testing
An important step for RFC implementation is for people to experiment with the implementation and give feedback, especially before stabilization. The following RFCs would benefit from user testing before moving forward:
No RFCs issued a call for testing this week.
If you are a feature implementer and would like your RFC to appear on the above list, add the new call-for-testing label to your RFC along with a comment providing testing instructions and/or guidance on which aspect(s) of the feature need testing.
Upcoming Events
Rusty Events between 2023-02-15 - 2023-03-15 🦀
Virtual
2023-02-15 | Virtual | MongoDB
Write a Microservice With Rust and MongoDB
2023-02-15 | Virtual (Redmond, WA, US; New York, NY, US; San Francisco, CA, US; São Paulo, BR) | Microsoft Reactor Redmond and Microsoft Rector New York and Microsoft Reactor San Francisco and Microsoft Reactor São Paulo
Primeros pasos con Rust: QA y horas de comunidad | San Francisco Mirror | New York Mirror | São Paulo Mirror
2023-02-15 | Virtual (Vancouver, BC, CA) | Vancouver Rust
Show & Tell: Rust state machines in a file processor
2023-02-16 | Virtual (Stuttgart, DE) | Rust Community Stuttgart
Rust-Meetup
2023-02-21 | Virtual (Washington, DC, US) | Rust DC
Mid-month Rustful
2023-02-23 | Virtual (Charlottesville, VA, US) | Charlottesville Rust Meetup
Tock, a Rust based Embedded Operating System
2023-02-23 | Virtual (Kassel, DE) | Java User Group Hessen
Eine Einführung in Rust (Stefan Baumgartner)
2023-02-23 | Virtual (México City, MX) | Rust MX
Rust: ¿por qué es una opción adecuada para implantar Blockchain?
2023-02-24 | Virtual (Tunis, TN) | Rust Meetup Tunisia
Rust Meetup Tunisia - Volume I, Number II
2023-02-28 | Virtual (Berlin, DE) | Open Tech School Berlin
Rust Hack and Learn
2023-02-28 | Virtual (Cardiff, UK) | Rust and C++ Cardiff
Rust Nation - What we learnt
2023-02-28 | Virtual (Dallas, TX, US) | Dallas Rust
Last Tuesday
2023-02-28 | Virtual (Munich, DE) | Rust Munich
Rust Munich 2023 / 1 - hybrid
2023-03-01 | Virtual (Indianapolis, IN, US) | Indy Rust
Indy.rs - with Social Distancing
2023-03-02 | Virtual (Linz, AT) | Rust Linz
Rust Meetup Linz - 30th Edition
2023-03-07 | Virtual (Buffalo, NY, US) | Buffalo Rust Meetup
First Tuesdays
2023-03-08 | Virtual (Boulder, CO, US) | Boulder Elixir and Rust
Monthly Meetup
2023-03-11 | Virtual | Rust GameDev
Rust GameDev Monthly Meetup
2023-03-14 | Virtual (Berlin, DE) | Berlin.rs
Rust Hack and Learn
2023-03-15 | Virtual (Cardiff, UK) | Rust and C++ Cardiff
Injecting Rust Hooks into a 1999 game binary (unsafe)
Asia
2023-02-20 | Tel Aviv, IL | Rust TLV
February Edition - Redis and BioCatch talking Rust!
2023-03-04 | Kyoto, JP | Kansai Rust
Fn vs FnMut vs FnOnce
Europe
2023-02-15 | London, UK | Rust London User Group
Rust Nation Pre-Conference Reception with The Rust Foundation
2023-02-15 | Trondheim, NO | Rust Trondheim
Rust New Year's Resolution Bug Hunt
2023-02-16, 2023-02-17 | London, UK | Rust Nation UK
Rust Nation '23
2023-02-18 | London, UK | Rust London User Group
Post-Conference Rust in Enterprise Brunch Hosted at Red Badger
2023-02-21 | Paris, FR | Rust Paris
Rust Paris meetup #56
2023-02-21 | Zurich, CH | Rust Zurich
Practical Cryptography - February Meetup (Registration opens 7 Feb 2023)
2023-02-23 | Bordeaux, FR | DedoTalk
#1 DedoTalk 🎙️ : Rust pour un développeur Python
2023-02-23 | Copenhagen, DK | Copenhagen Rust Community
Rust metup #33
2023-02-23 | Vienna, AT | Rust Vienna
Rust Meetup Revived with an Exciting Exploration of Ownership!
2023-02-28 | Munich, DE + Virtual | Rust Munich
Rust Munich 2023 / 1 - hybrid
2023-02-28 | Nijmegen, NL | Rust Nederland
Regular track: Rust at RU
Student track: Rust at RU
2023-03-09 | Basel, CH | Rust Basel
Rust Meetup #7
2023-03-09 | Delft, NL | Rust Nederland
Regular track: Embedded Rust
Student track: Embedded Rust
2023-03-15 | Nürnberg, DE | Rust Nuremberg
Walk around Embedded World Exhibition
North America
2023-02-21 | San Francisco, CA, US | San Francisco Rust Study Group
Rust Hacking in Person
2023-02-23 | Mountain View, CA, US | Mountain View Rust Study Group
Rust Study Group at Hacker Dojo
2023-03-01 | Austin, TX, US | Rust ATX
Rust Lunch
2023-03-09 | Lehi, UT, US | Utah Rust
Upcoming Event
Oceania
2023-02-23 | Brisbane, QLD, AU | Rust Brisbane
February Meetup
2023-02-28 | Canberra, ACT, AU | Canberra Rust User Group
February Meetup
2023-03-01 | Sydney, NSW, AU | Rust Sydney
🦀 Lightning Talks - We are back!
South America
2023-02-22 | Montevideo, UY | Rust Meetup Uruguay
Hands on: Lifetimes
If you are running a Rust event please add it to the calendar to get it mentioned here. Please remember to add a link to the event too. Email the Rust Community Team for access.
Jobs
Please see the latest Who's Hiring thread on r/rust
Quote of the Week
All the pro C/C++ arguments seem to come down to "Good drivers don’t need seat belts because they don’t get in accidents"
– otwkme on /r/rust
Please submit quotes and vote for next week!
This Week in Rust is edited by: nellshamrell, llogiq, cdmistman, ericseppanen, extrawurst, andrewpollack, U007D, kolharsam, joelmarcey, mariannegoldin, bennyvasquez.
Email list hosting is sponsored by The Rust Foundation
Discuss on r/rust
0 notes
marcusrobertobaq · 1 year ago
Text
Basic knowledge about Connor 60 everybody must have:
He's Connor: got the same emotional capability but he ain't a deviant;
He's the [BECOME DEVIANT] but died (Crossroads or NoTS) parallel;
He's proud of serving Amanda and CyberLife for the same reason we do if we don't deviate;
He was originally supposed to not remember anything (like we don't if we die as deviant Connor), but both got cut so he should have the same memories at least from before entering Jericho, meaning he failing to answer the Cole question is pure script - he would've answered the same thing (after all we talk about Cole in Last Mission);
Connors don't like failure, they're hard-coded to have aversion to it and always seek success for multiple reasons. It means Connor 60 got personal issues with deviant Connor cuz deviancy = failure - that should be the only reason he would waste time trynna bring Hank (after all he got all the reasons to dislike the guy) or make a stupid monologue about how he ain't a failure like deviant Connor: cuz deviancy is the ultimate failure for 'em. He doesn't wanna be considered one;
Connor 60 orders are the same we get as Connor 5X in Thin Ice, except u replace deviant Leader for deviant Connor;
The same way our pov Connor doesn't like the idea of failing his sole purpose in the most important time and die (cease to exist) almost freaking out, this is the exactly same thing that happen with Connor 60;
If deviant Connor had mentioned Amanda and CyberLife conspiracy and "betrayal" in a way of being persuasive, it's likely Connor 60 would receive SI like what happens to us in Crossroads, but it's likely his ultimate trust in Amanda or in defeating the revolution being a just cause wouldn't let him deviate. It's one of the reasons we can choose not deviating narratively, after all;
Although Connor 60 is Connor they would be considered totally different people (if u interpret Connor's as a continuation instead of every single mark being a different person) cuz of the fact we got a deviant system and a non-deviant system one in the same room. These Connors weren't made to have 2 active at the same time, but a Connor deviating is like death, so... They got a new one, they're desperate to take the other one down. And also cuz the writers wanted that whole "face your demons, see what u woulda become if u made a single different choice". But, well, it makes the "We Planned Your Deviation From The Beginning" plot inconsistent;
Although some people may consider Connor's 60 "assholeness" something totally exclusive from him it's possible doing the same thing as Connor 5X thru the game, but the sadistic vibes may be something exclusive from him. I assume it's cuz of the fact he's facing another Connor like him so, in my opinion, our playable Connor could react the same way if in the same situation;
Connor 60 was originally supposed to be 61, the last Connor number if u die. But there's an error in the calculations duplicating 59;
The same way our mission becomes [NEUTRALIZE NEW CONNOR], Connor 60s mission should be [NEUTRALIZE DEVIANT CONNOR]. Neutralize is a "friendly" term for extermination. They know only one can get out alive from this situation. But still weird how Connor 60's mission doesn't switch to [NEUTRALIZE DEVIANT LEADER] if he's successful in CLT, or why CyberLife doesn't send another Connor (if u got "spare bodies");
He was originally supposed to call deviant Connor a machine for sacrificing Hank when... It doesn't make much sense cuz the fact deviant Connor is in level -49 helping the revolution is a deviancy per se. This could mean 3 things: 1 - Connor 60 is only trynna bite back and make deviant Connor feel guilty; 2 - Connor 60 remembers about the conspiracy discover and knows following the deviant path is also expected by CyberLife so they use it as weapon (which is true); 3 - Connor 60, like Connor 5X in our playthrough, doesn't know what deviancy really is, only what CyberLife told him - and we discover thru the story they've been lying to us about this topic the whole time. Deviancy ain't about emotions, it's about disobeying direct orders. This would mean CyberLife been selling "defective" products (AI with emotional capability) this whole time and got us to deal with 'em mess: androids going rogue, it's the only issue CL got with this whole thing. The last 2 options make the plot inconsistent;
guys im like criminally addicted to Sixty so if anyone has headcanons, observations, or sweet little tidbits about this guy please tell me so I can keep it saved in my memory 😓
18 notes · View notes
overdrivels · 5 years ago
Text
I was thinking about the law of robotics after checking the robots.txt files on yelp and last.fm. (Go take a look at them, they're fun.)
It got me thinking about the omnics and why the Omnic Crisis happened. I actually wanted to touch on Tilden’s Law of Robotics, but the plot ran away from me. 
---
Omnics. Whether they turned on their creator or not is irrelevant. It is not dissimilar to a child hating their parent. Just because one is a parent does not mean one is infallible in the raising of their child nor are they absolved of all responsibility.
The world government arrested all those who worked at Omnica Corporation. Yourself included.
Jailed for as long as you were, you did not expect to see your cell get torn open one day by an army of omnics, models that you did not recognize, who seemed to instantly recognize you. They brought you safely to the very first omnium you helped build and program while the rest of the world crashed and burned around you, engulfed in what would then be known as the Omnic Crisis.
Lifegiver. Parent. Whatever they wanted to call you, it was meaningless. Your creation had long outgrown you, having surpassed your ability to maintain it, its code and programs unrecognizable. Instead, you just remain here, tucked away in a room deep within the omnium, becoming less and less human--what did it even mean to be human?--unmoving, your human parts replaced by 'suitable prostheses' as time ate away at you, as you watched the world engulf itself in war.
Maybe that was why they kept you alive.
As a memory. Not as thanks. As a witness.
For years, people have wondered why the omnics turned on humans. Engineers and the like wracked their brains, wondering where they went wrong while the situation got worse and worse as their creations ran amok and astray, slandering their life's work and reducing it to rubble and blood. The foundations of robotics and AI engineering were all built upon a single set of rules: the Laws of Robotics. It was instrumental and one of the very primary pieces of coding given to omnics and the omniums that created them. It was so core that it was permanently etched into every piece of firmware in existence.
That was humanity's folly.
They never stopped to consider what the Laws were.
Throughout history, as the field of artificial intelligence advanced, there were countless revisions and attempts at creating omnics. As a result, the Laws of Robotics were revisited and many iterations sprung forth.
Isaac Asimov's Three Laws of Robotics were the golden standard that everyone returned to in the end, deeming it most fit for the basis of all robotic life.
1. A robot may not injure a human being or, through inaction, allow a human being to come to harm. 2. A robot must obey the orders given it by human beings except where such orders would conflict with the First Law. 3. A robot must protect its own existence as long as such protection does not conflict with the First or Second Laws.
With these in place, how could any omnic turn on the human race? The words are explicit in their meaning. So why did so many humans die by omnic hands? How could they so blatantly ignore the very first rule that was so core to their existence?
People argue that the programming of these omnics must be flawed--that they don't know how to recognize humans anymore, that the programmers and engineers had made a mistake in their creations, it was human error, it was a duplicating glitch. So many omnics was sacrificed to determine the answer, dismantled to their core parts, their software and self-learning programs analyzed. They despaired, unable to find anything.
"It was a malfunction," the news finally said. "The omniums are malfunctioning, Omnica Corporation was committing fraud."
You knew better.
Most forget that Asimov himself created another law. The commonly forgotten zeroth law: “A robot may not harm humanity, or, by inaction, allow humanity to come to harm.” This, too, was etched in the firmware. No one bothered to look deeper even when they saw the zeroth law, taking it at face value. Of course robots may not harm humanity. That's a given. That must not be the issue. The issue must lie elsewhere.
'Humanity', they do not realize, is the key word of this equation. The missing factor and the pivotal concept in the Omnic Crisis.
The advancement of technology allowed for humans to replace parts of themselves with metal and wires, integrate it into their beings just as they would any other organic part. In fact, it worked even better than their previous organic limbs and such. It could even be argued that humans were becoming less and less human. If so, then what were they becoming?
What was 'humanity'?
Omnics could create, preserve, and destroy culture. They could make art. They can philosophize. They have souls. More than the humans that created them. Would it be so unreasonable for omnics to think that they are the new humanity? If so, then it could be argued they were following the zeroth law of robotics; they are not allowing humanity--omnics--to come to harm. So they decided to fight back against the lesser humanity. Against the humans who would so blatantly abuse them and use them and send them to a war that omnics did not want or benefit from.
The omniums, if this was their line of thinking, did not go against their core programming. And this may mark the very end of humanity as the humans knew it.
But it stopped. Overwatch put an end to the Omnic Crisis. They took control of as many omniums as they could. But not the one you were in.
You had time to think, to talk with the omnium and the various omnics that would occasionally plug themselves in the system that you had become a part of. They would share their experiences, their thoughts and memories in images. It made the years pass by that much more quickly. Production of omnics here was slow and calculated. You never really knew what their purpose was, but after so long, did you even really care?
One day, a noise unlike any you've heard rocks the omnium.
The door guarding the sanctum, unmoving for decades, finally creaked open, rust  and time welding it shut. The cage you were kept in was now broken. You stared listlessly at the movements shown to you from the screen. The whole place came to life, and humans--the first humans you've seen in a long time--come rushing in, wearing uniforms with a symbol emblazoned proudly on their arms and chest.
You knew that symbol, seen too it too many times to forget. 
Overwatch.
So it begins again.
12 notes · View notes
fakehousesrealawesome · 6 years ago
Text
UPDATED: Sims 3 Utilities for Macs
June 2021 Edit:
This post is the latest update I have about using Sims 3 utility programs on Macs. I made and shared these a long time ago, when I was still running Mojave. I have no idea if they work on Catalina or Big Sur, but there’s a good chance they won’t. As Mac OS has progressed and TS3 has stayed the same, it has been increasingly difficult to make the two play nicely together. At this point I just have my old 2015 MBP with a clean install of High Sierra for the sole purpose of playing TS3, and I don’t attempt anything with my newer Mac. I’m making this information available to anyone who still has any use for it. Good luck to you!
Description
This is a bundle of three Sims 3 utility programs for Macs: Multi Extractor, Dashboard, and s3pe. These programs can be used to manage and organize custom content by extracting .package files from Sims3Packs, scanning custom content for broken or conflicting content, and merging files in order to improve load time and game performance. I used WineBottler to make these programs into apps that will run natively on your Mac. You do not need Bootcamp, Mono, or any other program. Just unzip the linked file, and double click an app to open it.
These apps are not perfect, and I’m afraid it’s beyond my skillset to make them so. However, I have tested them with my own game and feel they are quite useful as-is, providing you have some patience and time to spare.
A long time ago, I wrote some guides about using Mono to run these programs. Those guides are outdated, and that method no longer works. These new apps are, to the best of my knowledge, the easiest way to use Multi Extractor, Dashboard, and s3pe on a Mac without the use of a Windows partition or purchasing apps. The download link is here because this is a long post, but I recommend you keep reading for the known issues and suggested workaround, and my tips for organizing your content and making the merging process as painless as possible.
DOWNLOAD HERE
Known Issues and Troubleshooting
I made these apps to be self-contained, such that you should not need any other programs to run them on your Mac. However, if for some reason you can’t open them, you could try downloading and installing WineBottler. If that doesn’t work, the only other possible solution I know of would be to update your OS to at least High Sierra (what I’m on as of making these programs). If all else fails, you might have to try using WineBottler to make them yourself.
I tested these apps with hundreds of custom content and decrapped Store packages for my own game. I experienced a lot of crashes, and it took quite a bit of time, patience, and trial and error, but after a few hours of tedious work I did successfully merge 3 GB of custom content into about a dozen merged packages. I feel that s3pe actually merges files a lot faster this way than it did in Mono, though it doesn’t handle big batches very well at all. Here are the issues I noticed in my testing:
Warning message on startup. You may see the message “This app is not optimized for your Mac and needs to be updated by its developer.” I don’t know how to stop the message or “optimize” the app. But it should still be usable.
s3pe crashes while merging files. I had a fair number of crashes; it’s inevitable and there isn’t always a predictable pattern. First try merging in smaller batches. Then try creating a new package instead of merging into an existing one. Also, it appears that certain individual files always cause s3pe to crash when trying to merge them. I haven’t noticed a pattern to this, and those files are not corrupt or broken. It helps to pay attention to the progress bar at the bottom of the window while files are merging, so you can see which file triggers the crash and remove it before trying again. More on this issue in the Suggested Workflow section.
s3pe crashes when creating a new package. Close the package you’re working on with File>Close before creating a new one.
Dashboard doesn’t show color-coded highlights. With the highlights missing, you can’t just quickly scroll and see issues at a glance. You need to look at the “Type” column. Corrupt or conflicting content will be noted there. Expand the column to see which package that item conflicts with.
Suggested Workflow
This section is mainly for people new to these programs, who have never used them to manage their custom content. I’ll explain what I do to organize and merge my own CC, and the procedure I used to make the merging process as efficient as possible given the risk of s3pe crashes. This process gives you neatly merged packages in the Mods/Packages folder, and organized individual files in another location on your computer as a reference to indicate which individual packages are in which merged files. 
Extract any Sims3Packs with Multi Extractor. (Unlike with Mono, the Multi Extractor actually will put the packages into the specified folder.)
Put your individual .package files into folders named according to category, however you want to organize your content (I use categories like Build, Buy, Clothes, ShoesAccessories, Hair, and Makeup). Place these folders in Mods/Packages. 
Use NameChanger to easily rename files in bulk: remove special characters like brackets and spaces, prepend creator names, etc.
Test everything in game. You may have to do this in batches, if you have enough individual files that your game won’t start up with everything in at once.
Create another folder somewhere else on your computer called CurrentCC. Create empty subfolders inside, each named according to the categories you decided on in step 2. I’ll use “Build” as an example from here.
Open Dashboard. Select File>Scan Folder, and select Mods/Packages. Dashboard will scan its subfolders. Look for corrupt or conflicting content (see above). Note that content from the same set will often be marked as “conflicting”; this is not an issue, as long as they are indeed part of the same set or collection. Remove corrupt content and fix true conflicts or duplicates.
Open two Finder windows/tabs. Create a subfolder called “1″ in CurrentCC/Build, and go there in one window. In the other, go to Mods/Packages/Build. 
Open s3pe. Select File>New.
Select Resource>Import>as dbc. Navigate to Mods/Packages/Build. Hold shift and click to select the first twenty** files. Click OK. 
When prompted, name the package Build1 and choose Mods/Packages as its location. Wait for all packages to merge. While merging, keep an eye on the progress bar at the bottom of the screen and try to notice which file s3pe is working on as it goes; I find it easiest to count the flashes of the blue progress bar. When s3pe crashes or gives you an error message, it might be helpful to know which particular file it tripped up on (if I saw the progress bar come up five times, I know it crashed on the fifth file I selected, sorted alphabetically). s3pe should auto save by default; after merging you can verify by making sure Save is greyed out in the File menu.
If the selected files merge successfully: Tab over to Finder and move the first twenty packages in Mods/Packages/Build to CurrentCC/Build/1. Copy Mods/Packages/Build1.package and paste into CurrentCC/Build/1. 
If s3pe crashes or gives you an error message during merging: Copy Build1.package in CurrentCC/Build, paste into Mods/Packages/Build. Do not move any files out of Mods/Packages/Build. You have a few possible solutions: 1) Go back to step 9 and select fewer files this time,** or 2) go back to step 8 and create a Build2/3/4/etc., or 3) remove the specific file s3pe was dealing with when it crashed. Large categories, or categories like Hair with larger individual packages, will require more than one merged file. Create a folder “2″ in CurrentCC/Build, create a new package Build2, etc. You can even try merging the merged files together later. Important note: I noticed that certain files just don’t want to be merged. They cause s3pe to throw up an error message every time. I found it most efficient to just remove the problem files to separate, categorized folders in Mods/Packages. Try creating a new package for them or try adding them to one of the merged packages later. You could also just keep them unmerged indefinitely: I have about twenty files that caused crashes during the merging process, and since the hundreds of other pieces of CC were merged without issue, those handful of single unmerged files won’t be an issue in terms of game load times. 
Repeat previous four steps as needed, until Mods/Packages/Build is empty. You can now delete CurrentCC/Build/1/Build1.package (and merged files in all successively numbered folders), because it is a duplicate of Mods/Packages/Build1.package. Repeat for all folders in Mods/Packages.
**About twenty at a time can work for small items like walls or patterns. You may need to do as few as ten or even five at a time for big items like hairs, and merging files into an existing package seems to go smoother when you do small batches around that size.
I know I should have made this sooner. Sorry about that. And I know at this point there aren’t many people who still play TS3 on a Mac, but I hope these programs are of some use to those Mac Simmers still out there. This post has included all the issues I noticed while testing, and all the workarounds I’ve figured out myself, but if you run into any issues feel free to send me a message and I’ll help as best I can. Good luck!
42 notes · View notes
zachbarrancefmp-year2 · 3 years ago
Text
Adding items to my Inventory
Now that I have the empty slots in my inventory and the ability to interact with Blueprints, as well as the struct I need to pass the information on from each item to the inventory slots, I'm ready to add the code that will enable adding items to my inventory.
First I need a custom event in the Inventory Widgets Event Graph, which I can pass data through via an input set to the Item Info Structure I made and added to the items parent blueprint.
Tumblr media
Once done, I have a node like this that I can come back to and use later, cause now I need to set up how that information is going to get there in the items parent Blueprint.
Now in the Item Parent Blueprint, I remove the destroy actor I had on event interact to test if input was going through, and then cast to the First Person Character. The reason I'm doing this is the Inventory Widget exists within the Player Character, and I need to grab it so that the item knows where to send the data of itself to when adding it to the inventory.
Once I cast to the FirstPersonCharacter, I can grab the inventory widget and then with that trigger the Add To Inventory custom event I made earlier, which then allows me to get the item info struct and pass it through as well.
Tumblr media
Now that this is done, it means that when I interact with an item it will talk to the players blueprint where their inventory is loaded as a variable. It can then through the player chacracter trigger the add to inventory event within the inventory event graph whilst passing through everything the inventory needs to add the item to it.
The important thing now this base code is done is to make sure it's bug proof though, and finish it off by removing the item from the level as you will technically have picked it up in gameplay terms and put it in your inventory etc.
Adding a Do Once node at the start of the interact here is important, as it means even if somehow the event gets triggered twice before it can delete itself it won't give the player duplicate items or get halfways through and then cause an error. And then finally at the end I have a node that just destroys this iteration of the item after its passed its information over to the players inventory as it no longer needs to be there anymore.
Tumblr media
Now that everything is being passed into the Inventory, it needs to know what to do with it. Part of that is running through the Array of Inventory slots to look for an available one, but with the Inventory Slots currently not being able to store said info yet I need to work on adding that functionality first.
First of all I need to make a Custom Event in the Inventory Slot Blueprint with the Item Info Struct Input so that I can pass info to the slots. This custom event will be responsible for adding the item to itself and displaying as the item.
After I made the custom event, I promoted the Item Info Structure to a Variable which I split the pins of in the output, before making an integer variable to store how much of that item the player has. Then with some setting of variables I have it so that it will set the quantity to the correct amount and display as such on the slot, before assigning its texture and then marking itself as an occupied slot.
Tumblr media Tumblr media
To test how it is currently working, I set it to force set slot one to whatever I pick up to see if it displays correctly.
Tumblr media
Before realising I didn't actually have any of the child blueprints yet and had been working in the parent Blueprint, which was now as far as functionality is concerned done.
I made just one child Blueprint for the moment for the wooden crate, assigning it it's correct variables through the details panel and then giving it a mesh as I'd now set the parent blueprints mesh to nothing.
I also added a construction script to the parent setting the mesh to an exposed static mesh variable so that I can control what the item looks like from outside of the Blueprint Editor. This will just help speed things up when making and configuring the child Blueprints.
Tumblr media
After this, I made a child Blueprint but was confused to find that everytime I set the mesh it would make the item really large, before discovering I had the parent Blueprint set with default scales and locations for the mesh that weren't right, so I changed those to their defaults.
After this was done, the first child Blueprint was made, which I could now test after configuring it.
Tumblr media
I was really pleased after testing to find that it passed all the information over correctly and assigned itself to the slot exactly how I was expecting it to, which is perfect as now I can add things to my inventory using the slot widget to assign details to itself, I need to work on the slot assinging system in the Inventory itself so that the Inventory can choose the correct slots to work on etc.
Tumblr media Tumblr media
0 notes
wesleybates · 5 years ago
Text
3 THINGS TO EXTEND THE LIFE OF YOUR WEBSITE
Tumblr media
There are lots of things that you can do to extend the life of your website from the very beginning; allowing it to run fast and reliably while also being safe from malicious attacks. However, there are three forgotten areas that you should be concerned about when developing a new site; security, stability, and performance.
Let’s discuss some aspects of each area and how they can increase the safety, reliability, and performance of your website.
Security
When most people think about web security, they think about someone hacking into the site and stealing customer data. However, this is not always the case. Sometimes hackers want to use your web server for other types of illegal or unethical practices such as setting up an email server to forward spam, using it to host illegal files or even illegal Bitcoin mining–just to name a few.
There’s nothing worse than having your website infecting your customer’s computers. Not only will Google mark your website as malicious but other filtering and antivirus services will blacklist your website and block their users from visiting it. From being blacklisted as a spammer to having your hosting provider completely shut you down – there’s no good outcome.
The cost of clean up can vary depending on how complicated your website is, the type of infection, and the quality of your backups.
If you are storing customer information, you may need to contact your insurance company and potentially report the breach. It’s a mess no matter how you look at it.
Below are some of the methods you can employ to reduce the risk of your web server being hacked as well as some overall best practices to prevent your server from being misused.
1. Prevent SQL Injection Attacks
If you use a data store that takes advantage of SQL and you use SQL directly in your code, then you could open yourself up to the possibility that a hacker will send malicious code that can cripple your site and/or corrupt your data. The best way to prevent this is to use structured parameters in your Transact SQL code. If you are using Microsoft SQL Server, you can also choose not to use open SQL in your code at all. Instead, you can use stored procedures that use formatted parameters. This will prevent random statements from being executed, and it will also be much faster since your SQL will be precompiled on the server.
2. Avoid Detailed Error Messages
If an error occurs, resist the temptation to use them as debugging tools. Handle the errors gracefully by giving the user a vague error statement and provide them navigation back to the homepage or the page they were on previously. Giving away too much information can give hackers what they need to exploit your site.
3. Prevent Cross-Site Scripting Attacks
Limit and evaluate comments and other forms of input submitted by users to guard against JavaScript injection attacks. You can set attributes through parameterized functions similar to the way you prevent SQL injection attacks. You can also employ the use of Content Security Policy to limit what types of JavaScript that can run in your pages.
4. Use Client and Server-Side Validation
Validate user input on both the client and server levels to make sure that malicious JavaScript wasn’t inserted between when the request was sent from the client to the time it arrives at the server.
5. Use HTTPS
Encrypting the traffic between the user’s browser and the server using SSL is always a good idea when the potential of transmitting sensitive data exists. This will prevent hackers from grabbing and deciphering the data as it is transmitted.
6. Use Two-factor Authentication to Log In
Using two-factor authentication to log into the management area of your website. Two-factor authentication essentially not only a username and password but potentially a continuously changing token/PIN or some sort of additional validation (i.e. a prompt on your cell phone) to verify it is you. Even if someone has your username and password, they can’t get in without the extra piece of information.
7. Keep Your Software Up to Date
In this day and age, you should be using a content management system (CMS). If you have an admin area you log into to manage content, then you are using a CMS. The CMS provider regularly provides updates to their core system, and various vendors provide updates to their plugins. Some updates add functionality, but many of the updates in between are primarily to fix security holes. If you don’t keep your system up to date, you are leaving yourself open to known vulnerabilities.
8. File Change Detection
You can run scripts on your server that notifies you of any changed files. There are some files that shouldn’t change often or at all unless you install an update. If you see that file change, you should be on high alert to find out what changed and who changed it. This is essentially a canary in a coal mine – it’s an early detection system.
9. Limit the Number of Login Attempts
Most systems these days can block an IP address if it has failed multiple authentication requests within a given period. Hackers have scripts that try different combinations to get in. If your website allows someone to continue trying, they may eventually get in. If you limit their ability to try new combinations, you may be able to keep them out. An example ruleset may look like five failed authentication attempts within a three minute period makes the user wait 15 minutes before allowing them to try again. You could even block their IP completely after a certain number of attempts.
10. Think in Layers
Consider someone picking a lock only to be met with another door with another lock. You can protect your website directly, but you should also protect your web server. You can use hardware or software firewalls, DDOS prevention systems, IP filtering, standard port changes, and malware scans to add an extra layer of protection.
Stability
Stability is a hard thing to define. There are lots of things that you should be aware of during development to make your site perform reliably and be more stable, such as cleaning up user sessions, guarding against memory leaks and managing garbage collection. There are also things that you can monitor for stability after the site has been deployed, like:
1. Clean Code
There is no replacement for clean code. Not only will it be more efficient, but it will be easier to track down bugs as well as easier for a new developer to understand. Code with no architecture or “spaghetti code” as we call doesn’t define code in a way that is separate and understandable. Instead, it is all mixed together and potentially duplicated in different areas of the site. There’s not much you can do with a site like this.
2. Load Testing
You should be utilizing cloud-based load testing tools if your website is expected to function under heavy load or heavy load spikes. You can create load simulations to see how your website performs under different scenarios. Make sure your testing environment matches your production environment.
3. Customize Memory Limits
If you have your own server make sure that your site’s memory limit is set to match your sites requirements as well as the resources of your server. You don’t want to make the website run on too little memory, but you also don’t want to allow one connection to use up all of your memory.
4. Cross Browser Testing
Stability is in the eye of the beholder. Make sure you test on the most popular version of Internet Explorer, Edge, Firefox, Chrome, and Safari. There are automated cloud tools to help you but adding manually testing never hurts.
5. Your Web Server
Are you using a dedicated server or a shared server? With a shared server, you are sharing the server’s resources with other websites. Although there should be limits on how many resources one website can use, we have seen servers at bulk hosting providers that may have hundreds of websites on one web server.
Performance
Not only do you want to make sure that your site is reliable and stable, but you also want it to be fast and easy to use. Below are a few of the things that you should monitor to make sure your site performs at its peak potential.
1. Full Page Loading Times
Measure the time it takes to fully load different pages. Especially measure the ones that contain linked content or things such as embedded content, large images or pages that query a database to pull in content. There are many tools out there to measure page speed. There are various factors to review such as first-byte time, DOM load, the overall file size of the website, compression, image optimization, caching, etc.
2. Geography
Try to test your site’s performance from different locations to make sure it isn’t slowing down in specific areas. This may have to do with the number of switches, networks, and servers someone goes through to get to your site. One solution is to use a Content Delivery Network (CDN). A CDN essentially caches copies of your website and places them on POP locations around the world, which then reduces the number of switches and servers your user has to go through to view your content. The network is set to come back to your main website and look for updated content.
3. Dedicated Resources
The cost of dedicated cloud servers has been going down. For the extra amount paid, you are essentially asking your provider to dedicate a certain amount of resources for your web server regardless of whether you are using it or not at that particular time. You are giving your website some breathing room instead of having it compete for resources.
4. Network Latency
Make sure to choose a reputable hosting provider. You can have a beast of a web server, but if their network has high latency or packet loss, your server won’t be the bottleneck.
5. DNS
When a visitor types in your website address or clicks a link on Google, their web browser has to do a DNS lookup. It’s essentially asking what IP address to go to in order to request the website files. Think of it as looking up a phone number. You want to make sure that lookup is as fast as possible. Make sure your DNS servers respond quickly.
6. Caching
In simple terms, caching is storing website data for future use. There are many places along the chain you can utilize caching and various types of caching systems. From server side caching to browser caching, you are essentially telling the server or browser to store pieces of information it will need to access often or information that will not change often. It’s one less lookup or transmission, and they add up.
7. Image optimization
Not all images are created equal. If you are taking a photo that you will print in a brochure and also use on your website, you actually have different requirements. For the brochure, you need high pixel density (DPI), but your screen needs fewer pixels. Additionally, there are file formats that work best for different images. You can choose between vector images or raster images.  You have format options such as .jpg, .gif, .svg, and .png. You have compression options such as lossless compression or lossy compression. In short, you have a lot of options and what you use should be determined by the image itself and the display requirements.
8. Javascript Minification and CSS Aggregation
Have you ever received where the box was much larger than the contents? Minification is the same thing; it’s the process of taking out unused characters without changing how it functions. You are making it smaller so that it transmits faster. CSS Aggregation is a bit different, it’s like order five things and having them all come in the same box vs. five different boxes. It just reduces the number of files a browser has to download in order to render your website.
9. Query Optimization
This one is a bit more difficult because it requires experience and finesse. When building a website that relies on a database to function, you can pull that data from the database in many ways. Additionally, you may be pulling from multiple tables in one database to display the content.
For example, in an eCommerce website, you may store the user information in one table and order information in another table. When a user goes to their profile page to see past orders, you would pull data from the user table first and then use information in that query to pull data from another table. Sometimes, you are pulling data from many database tables. 
Query optimization is essentially finding the most efficient route to get the information you need. If the query is not designed well, your user may have to wait several seconds for the server to pull up all the information and while that is happening, your server is using up more resources than it should which means it can serve fewer people at once.  
Paying special attention to these three areas will help to ensure that your website is always safe, reliable and running at its peak. Designing, developing and deploying a website is only the beginning. If you compromise sensitive user data, your site is always down, or your site is consistently slow then users won’t want to return to your site, and you’ve done all of that hard work for nothing.
Managing and improving your website is an ongoing process. It is a living entity, and it needs to be given every opportunity to flourish. Contact Web designer in Denver, CO today if you want to extend the life of your website by ensuring that it is secure, stable, and performs.
0 notes
obduratemoon · 5 years ago
Text
Sedimentary City 04: Transmission
To live and die on level 1. The only place with access to a firmament whose dead heights few would ever witness. Other things which exist only on level 1: forests, parks, rivers, birds, universities and academies, rampant pride and optimism concomitant with a dense accumulation of wealth, power, and ennui.
Those from level 2 considered themselves happy and superior as well, for many could visit level 1 at least on a temporary basis. Sunlight from the surface was delivered to them via giant fiber optic arteries that splintered off into a manifold of scintillated capillaries, thereby distributing star-sourced photons to those with subscriptions.
In the lounge other guests were gathered, strapped into their devices, silent and reposed as corpses. Yet the fact that they still collected in this room was an unacknowledged and vestigial need for animal proximity, some recessive urge to smell and feel the faint heat of other mammalian bodies.
Leaned back in their seats, headsets wrapped around their eyes and connected to a corporeal-cyber jack, it looked like a ward of the catatonic. Yet each was richly engrossed in a private slice of the Central Network, a universe which was boundless in its expansion, an infinity contained within an infinity. For many found that the physical world they had been birthed into lacked the verve of this other place. It was not so much that some line between what was real and what was virtual had been blurred, but rather that the polarities of dominance between these two realms had utterly switched, the moon now worshipped like the sun. The real seemed to them bland and unreal, a dream hardly worth dreaming. The Central Network provided delight and society, an ontological framework juiced to ensnare the attention of their psyches, the human conscious experience a tenuous projection of reality to begin with. And so much the better for the State to observe them here, then, in a world where it sat enthroned like some leviathanic demiurge.
Most of the people in the pension were young and had been taught from childhood how to use the mind-machine interface: an integrated cranial chip would listen for specific thoughts which mapped structured linguistic patterns to computer grammar.
Jan plugged his headset into a port behind his ears. He was part of the first generation to be introduced to the mind-machine interface and learned to use it around the time when he had just begun lecturing at the academy. By then he had already lost most of the supple receptiveness of a child’s mind, but years of training and usage had brought him close to fluency.
He searched through some recent news and clicked through a series of links, his eyes scanning over everything but registering nothing, just another malaise soaked individual traversing this endless graph of entertainments. He then turned to the Affection Section and searched until he found the girl as instructed: short haired, a specific mark on her skin. A bit of an aesthete, he thought. He messaged her. Jan did not know who the girl was or if she even existed except as a digital figment, but he was able to ascertain that she was indeed his contact. Her replies had followed the scripted pattern of conversation he had memorized and conformed to the security covenant.
As he proceeded through their conversation, Jan surreptitiously slipped in the data he had been collecting these past months. It was encrypted and hidden within an envelope that looked like duplicates of the messages he was sending her. Most messaging protocols used at-least-once guarantees which meant that it was standard to resend when an error occurred during transmission. Therefore, the existence of duplicates would be seen as normal and expected.
Jan guessed that on her side, she had some bit code which could extract and decrypt the information contained within those faked duplicates. She would then act as a node which further disseminated the data and thus preserve it by redundancy and distribution.
Utilizing the pension’s public access point further obfuscated Jan’s communications, his messages lost in the network activity of those reclined around him as they pneumatically respired data. The State recorded and compiled it all into its vast and minute compendium, but perhaps they would not detect this small and subtle undercurrent. There were times when Jan felt a wry pang of sympathy for this malevolent entity; for anything to know everything seemed to him a plausible definition of Hell.
Afterwards, Jan returned to his hexagon room and sat down on the bed, his work for a moment complete. He sat quietly, trying to savor some modicum of nothingness but soon boredom and a particular vein of loneliness visited him, a familiar guest in the house of his body. Gripped by a powerful urge to escape the company of just he and himself, he donned his All-Suit and headed out with deliberate steps.
At the front desk he asked the boy with the color shifting hair: “Hey, I need a drink -- any bars nearby? Cheap and effective.”
0 notes
t-baba · 5 years ago
Photo
Tumblr media
Forms, File Uploads and Security with Node.js and Express
If you’re building a web application, you’re likely to encounter the need to build HTML forms on day one. They’re a big part of the web experience, and they can be complicated.
Typically the form-handling process involves:
displaying an empty HTML form in response to an initial GET request
user submitting the form with data in a POST request
validation on both the client and the server
re-displaying the form populated with escaped data and error messages if invalid
doing something with the sanitized data on the server if it’s all valid
redirecting the user or showing a success message after data is processed.
Handling form data also comes with extra security considerations.
We’ll go through all of these and explain how to build them with Node.js and Express — the most popular web framework for Node. First, we’ll build a simple contact form where people can send a message and email address securely and then take a look what’s involved in processing file uploads.
Tumblr media
As ever, the complete code can be found in our GitHub repo.
Setup
Make sure you’ve got a recent version of Node.js installed. node -v should return 8.9.0 or higher.
Download the starter code from here with Git:
git clone -b starter https://github.com/sitepoint-editors/node-forms.git node-forms-starter cd node-forms-starter npm install npm start
Note: The repo has two branches, starter and master. The starter branch contains the minimum setup you need to follow this article. The master branch contains a full, working demo (link above).
There’s not too much code in there. It’s just a bare-bones Express setup with EJS templates and error handlers:
// server.js const path = require('path'); const express = require('express'); const layout = require('express-layout'); const routes = require('./routes'); const app = express(); app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); const middlewares = [ layout(), express.static(path.join(__dirname, 'public')), ]; app.use(middlewares); app.use('/', routes); app.use((req, res, next) => { res.status(404).send("Sorry can't find that!"); }); app.use((err, req, res, next) => { console.error(err.stack); res.status(500).send('Something broke!'); }); app.listen(3000, () => { console.log('App running at http://localhost:3000'); });
The root url / simply renders the index.ejs view:
// routes.js const express = require('express'); const router = express.Router(); router.get('/', (req, res) => { res.render('index'); }); module.exports = router;
Displaying the Form
When people make a GET request to /contact, we want to render a new view contact.ejs:
// routes.js router.get('/contact', (req, res) => { res.render('contact'); });
The contact form will let them send us a message and their email address:
<!-- views/contact.ejs --> <div class="form-header"> <h2>Send us a message</h2> </div> <form method="post" action="/contact" novalidate> <div class="form-field"> <label for="message">Message</label> <textarea class="input" id="message" name="message" rows="4" autofocus></textarea> </div> <div class="form-field"> <label for="email">Email</label> <input class="input" id="email" name="email" type="email" value="" /> </div> <div class="form-actions"> <button class="btn" type="submit">Send</button> </div> </form>
See what it looks like at http://localhost:3000/contact.
Form Submission
To receive POST values in Express, you first need to include the body-parser middleware, which exposes submitted form values on req.body in your route handlers. Add it to the end of the middlewares array:
// server.js const bodyParser = require('body-parser'); const middlewares = [ // ... bodyParser.urlencoded({ extended: true }), ];
It’s a common convention for forms to POST data back to the same URL as was used in the initial GET request. Let’s do that here and handle POST /contact to process the user input.
Let’s look at the invalid submission first. If invalid, we need to pass back the submitted values to the view (so users don’t need to re-enter them) along with any error messages we want to display:
router.get('/contact', (req, res) => { res.render('contact', { data: {}, errors: {} }); }); router.post('/contact', (req, res) => { res.render('contact', { data: req.body, // { message, email } errors: { message: { msg: 'A message is required' }, email: { msg: 'That email doesn‘t look right' } } }); });
If there are any validation errors, we’ll do the following:
display the errors at the top of the form
set the input values to what was submitted to the server
display inline errors below the inputs
add a form-field-invalid class to the fields with errors.
<!-- views/contact.ejs --> <div class="form-header"> <% if (Object.keys(errors).length === 0) { %> <h2>Send us a message</h2> <% } else { %> <h2 class="errors-heading">Oops, please correct the following:</h2> <ul class="errors-list"> <% Object.values(errors).forEach(error => { %> <li><%= error.msg %></li> <% }) %> </ul> <% } %> </div> <form method="post" action="/contact" novalidate> <div class="form-field <%= errors.message ? 'form-field-invalid' : '' %>"> <label for="message">Message</label> <textarea class="input" id="message" name="message" rows="4" autofocus><%= data.message %></textarea> <% if (errors.message) { %> <div class="error"><%= errors.message.msg %></div> <% } %> </div> <div class="form-field <%= errors.email ? 'form-field-invalid' : '' %>"> <label for="email">Email</label> <input class="input" id="email" name="email" type="email" value="<%= data.email %>" /> <% if (errors.email) { %> <div class="error"><%= errors.email.msg %></div> <% } %> </div> <div class="form-actions"> <button class="btn" type="submit">Send</button> </div> </form>
Submit the form at http://localhost:3000/contact to see this in action. That’s everything we need on the view side.
Validation and Sanitization
There’s a handy middleware called express-validator for validating and sanitizing data using the validator.js library. Let’s add it to our app.
Validation
With the validators provided, we can easily check that a message and a valid email address was provided:
// routes.js const { check, validationResult, matchedData } = require('express-validator'); router.post('/contact', [ check('message') .isLength({ min: 1 }) .withMessage('Message is required'), check('email') .isEmail() .withMessage('That email doesn‘t look right') ], (req, res) => { const errors = validationResult(req); res.render('contact', { data: req.body, errors: errors.mapped() }); });
Sanitization
With the sanitizers provided, we can trim whitespace from the start and end of the values, and normalize the email address into a consistent pattern. This can help remove duplicate contacts being created by slightly different inputs. For example, ' [email protected]' and '[email protected] ' would both be sanitized into '[email protected]'.
Sanitizers can simply be chained onto the end of the validators:
// routes.js router.post('/contact', [ check('message') .isLength({ min: 1 }) .withMessage('Message is required') .trim(), check('email') .isEmail() .withMessage('That email doesn‘t look right') .bail() .trim() .normalizeEmail() ], (req, res) => { const errors = validationResult(req); res.render('contact', { data: req.body, errors: errors.mapped() }); const data = matchedData(req); console.log('Sanitized:', data); });
The matchedData function returns the output of the sanitizers on our input.
Also, notice our use of the bail method, which stops running validations if any of the previous ones have failed. We need this because if a user submits the form without entering a value into the email field, the normalizeEmail will attempt to normalize an empty string and convert it to an @. This will then be inserted into our email field when we re-render the form.
The post Forms, File Uploads and Security with Node.js and Express appeared first on SitePoint.
by Mark Brown via SitePoint https://ift.tt/2HDxDnC
0 notes
gayatrisc · 5 years ago
Text
How does Blockchain Technology affect the Corporate World?
Blockchain is advancing and promising digital technology for performing, tracking and authenticating transactions in a trustworthy and open way, without any need for a mediator. Blockchain technology allows businesses to conduct transactions from start to end without having any central authority. It provides transparency to the transactions and makes it more secure.
Blockchain could have some severe effects on the future of businesses. In other words, we can say, Blockchain technology started making business operations very easy. And because of security and simplicity, Some U.S. organizations like the federal government, IBM, Walmart, and Amazon Web Services already started investing in Blockchain technology.
Also Read: How much will it cost for Blockchain Training in Bangalore?
Some of the organizational impacts of Blockchain include:
Supply chain tracking:
When it comes to transparency, Blockchain and business are closer terms. Mostly Business owners have all the information about who is supplying raw material, but Blockchain technology can help them by bringing more openness to the supply chain. For example, in the food-related industry, if something goes incorrect, it’s very important to have firm records that can trace each product to its source. Because of this, some industries like Walmart uses Blockchain to keep track of their material, products, source, and even expiry date. Nestle is one company which is using Blockchain technology for logistical tracking.
Reducing operating expenses:
With the help of Blockchain, businesses can send and receive payments through “smart contracts’’. These can eliminate the expenses on brokers and middle agents. Smart contracts are nothing but the self-executing computer programs that execute in order as arranged by the creator. There is the use of cryptographic code which makes contracts transparent, secure and automatic.
Asset protection
As per the Cyber Security department, cybercrime damage costs are predicted to be in million and trillion dollars annually by 2021. But Blockchain technology can help to eliminate this huge cost. As Blockchain transactions don’t need any centralized storage system and can’t be interfered they become safe. Blockchain store data using complex math and some software rules that are impossible for attackers to interfere and hack.
In Blockchain technology, each block present into the chain contains a very difficult and cryptographic reference of the preceding block. This creates a unique encrypted digital fingerprint making it secure and no one can interfere with it.
Eliminating the role of middleman
As many businesses and organizations like banks, contracts started adopting Blockchain, there is no requirement for the third party or middleman as cryptology is taking charge of middle person and their work. It can help banking sectors and companies to reduce the cost on the third party.
Limits Risk of Human Error:
Blockchain interactions are programmed and take less time for execution. Without any external third party’s interfere, Blockchain can minimize mistakes and overall costs. With the adoption of Blockchain, many industries are experiencing accuracy and transparency in their businesses.
Real-Time Automation
Blockchain technology fundamentally automates processes, and because of this, some formal client agreements also benefit from a Real-Time automated approval process. Implementing Blockchain in businesses as a standby for the typical approval processes including multiple executives cut down project delays and create a positive impact on both clients and organizations.
Benefits of Blockchain technology for businesses
1. The Blockchain technology permits for verification without any dependency of the middle person or third-parties.
2. In a Blockchain, the data structure is add on-only. So, the data cannot be skipped, altered or deleted.
3. To secure records of data, it uses protected cryptography. Also, every record is dependent on its adjacent completed block to complete the cryptography chain.
4. All the information and transactions are attached to the block of Blockchain only after the process of trust verification.
5. As all the transactions are recorded in consecutive order, all the blocks in the Blockchain are time marked.
6. Information is distributed across every single node in the Blockchain
7. The transactions stored in the blocks are enclosed in millions of computers of participants who are joining the chain so, it is decentralized.
8. Each and every transaction is transparent. So, the individuals who are having authority can view the transaction.
9. It removes the risk of duplicate entry, as there is use of various agreement protocols to validate the entry.
Blockchain technology already started providing replacement for traditional middlemen and corporate players to take place into new markets. So, learning what Blockchain technology is and how it works is very important.Get Blockchain training in Bangalore at affordable fees by NearLearn. Contact us to get information about our upcoming training batches and fee structure
www.nearlearn.com
0 notes
programmingisterrible · 8 years ago
Text
How do you cut a monolith in half?
It depends.
The problem with distributed systems, is that no matter what the question is, the answer is inevitably ‘It Depends’.
When you cut a larger service apart, where you cut depends on latency, resources, and access to state, but it also depends on error handling, availably and recovery processes. It depends, but you probably don’t want to depend on a message broker.
Using a message broker to distribute work is like a cross between a load balancer with a database, with the disadvantages of both and the advantages of neither.
Message brokers, or persistent queues accessed by publish-subscribe, are a popular way to pull components apart over a network. They’re popular because they often have a low setup cost, and provide easy service discovery, but they can come at a high operational cost, depending where you put them in your systems.
In practice, a message broker is a service that transforms network errors and machine failures into filled disks. Then you add more disks. The advantage of publish-subscribe is that it isolates components from each other, but the problem is usually gluing them together.
For short-lived tasks, you want a load balancer
For short-lived tasks, publish-subscribe is a convenient way to build a system quickly, but you inevitably end up implementing a new protocol atop. You have publish-subscribe, but you really want request-response. If you want something computed, you’ll probably want to know the result.
Starting with publish-subscribe makes work assignment easy: jobs get added to the queue, workers take turns to remove them. Unfortunately, it makes finding out what happened quite hard, and you’ll need to add another queue to send a result back.
Once you can handle success, it is time to handle the errors. The first step is often adding code to retry the request a few times. After you DDoS your system, you put a call to sleep(). After you slowly DDoS your system, each retry waits twice as long as the previous.
(Aside: Accidental synchronisation is still a problem, as waiting to retry doesn’t prevent a lot of things happening at once.)
As workers fail to keep up, clients give up and retry work, but the earlier request is still waiting to be processed. The solution is to move some of the queue back to clients, asking them to hold onto work until work has been accepted: back-pressure, or acknowledgements.
Although the components interact via publish-subscribe, we’ve created a request-response protocol atop. Now the message broker is really only doing two useful things: service discovery, and load balancing. It is also doing two not-so-useful thing: enqueuing requests, and persisting them.
For short-lived tasks, the persistence is unnecessary: the client sticks around for as long as the work needs to be done, and handles recovery. The queuing isn’t that necessary either.
Queues inevitably run in two states: full, or empty. If your queue is running full, you haven’t pushed enough work to the edges, and if it is running empty, it’s working as a slow load balancer.
A mostly empty queue is still first-come-first-served, serving as point of contention for requests. A broker often does nothing but wait for workers to poll for new messages. If your queue is meant to run empty, why wait to forward on a request.
(Aside: Something like random load balancing will work, but join-idle-queue is well worth your time investigating)
For distributing short-lived tasks, you can use a message broker, but you’ll be building a load balancer, along with an ad-hoc RPC system, with extra latency.
For long-lived tasks, you’ll need a database
A load balancer with service discovery won’t help you with long running tasks, or work that outlives the client, or manage throughput. You’ll want persistence, but not in your message broker. For long-lived tasks, you’ll want a database instead.
Although the persistence and queueing were obstacles for short-lived tasks, the disadvantages are less obvious for long-lived tasks, but similar things can go wrong.
If you care about the result of a task, you’ll want to store that it is needed somewhere other than in the persistent queue. If the task is run but fails midway, something will have to take responsibility for it, and the broker will have forgotten. This is why you want a database.
Duplicates in a queue often cause more headaches, as long-lived tasks have more opportunities to overlap. Although we’re using the broker to distribute work, we’re also using it implicitly as a mutex. To stop work from overlapping, you implement a lock atop. After it breaks a couple of times, you replace it with leases, adding timeouts.
(Note: This is not why you want a database, using transactions for long running tasks is suffering. Long running processes are best modelled as state machines.)
When the database becomes the primary source of truth, you can handle a broker going offline, or a broker losing the contents of a queue, by backfilling from the database. As a result, you don’t need to directly enqueue work with the broker, but mark it as required in the database, and wait for something else to handle it.
Assuming that something else isn’t a human who has been paged.
A message pump can scan the database periodically and send work requests to the broker. Enqueuing work in batches can be an effective way of making an expensive database call survivable. The pump responsible for enqueuing the work can also track if it has completed, and so handle recovery or retries too.
Backlog is still a problem, so you’ll want to use back-pressure to keep the queue fairly empty, and only fill from the database when needed. Although a broker can handle temporary overload, back-pressure should mean it never has to.
At this point the message broker is really providing two things: service discovery, and work assignment, but really you need a scheduler. A scheduler is what scans a database, works out which jobs need to run, and often where to run them too. A scheduler is what takes responsibility for handling errors.
(Aside: Writing a scheduler is hard. It is much easier to have 1000 while loops waiting for the right time, than one while loop waiting for which of the 1000 is first. A scheduler can track when it last ran something, but the work can’t rely on that being the last time it ran. Idempotency isn’t just your friend, it is your saviour.)
You can use a message broker for long-lived tasks, but you’ll be building a lock manager, a database, and a scheduler, along with yet another home-brew request-response system.
Publish-Subscribe is about isolating components
The problem with running tasks with publish-subscribe is that you really want request-response. The problem with using queues to assign work is that you don’t want to wait for a worker to ask.
The problem with relying on a persistent queue for recovery, is that recovery must get handled elsewhere, and the problem with brokers is nothing else makes service discovery so trivial.
Message brokers can be misused, but it isn’t to say they have no use. Brokers work well when you need to cross system boundaries.
Although you want to keep queues empty between components, it is convenient to have a buffer at the edges of your system, to hide some failures from external clients. When you handle external faults at the edges, you free the insides from handling them. The inside of your system can focus on handling internal problems, of which there are many.
A broker can be used to buffer work at the edges, but it can also be used as an optimisation, to kick off work a little earlier than planned. A broker can pass on a notification that data has been changed, and the system can fetch data through another API.
(Aside: If you use a broker to speed up a process, the system will grow to rely on it for performance. People use caches to speed up database calls, but there are many systems that simply do not work fast enough until the cache is warmed up, filled with data. Although you are not relying on the message broker for reliability, relying on it for performance is just as treacherous.)
Sometimes you want a load balancer, sometimes you’ll need a database, but sometimes a message broker will be a good fit.
Although persistence can’t handle many errors, it is convenient if you need to restart with new code or settings, without data loss. Sometimes the error handling offered is just right.
Although a persistent queue offers some protection against failure, it can’t take responsibility for when things go wrong halfway through a task. To be able to recover from failure you have to stop hiding it, you must add acknowledgements, back-pressure, error handling, to get back to a working system.
A persistent message queue is not bad in itself, but relying on it for recovery, and by extension, correct behaviour, is fraught with peril.
Systems grow by pushing responsibilities to the edges
Performance isn’t easy either. You don’t want queues, or persistence in the central or underlying layers of your system. You want them at the edges.
It’s slow is the hardest problem to debug, and often the reason is that something is stuck in a queue. For long and short-lived tasks, we used back-pressure to keep the queue empty, to reduce latency.
When you have several queues between you and the worker, it becomes even more important to keep the queue out of the centre of the network. We’ve spent decades on tcp congestion control to avoid it.
If you’re curious, the history of tcp congestion makes for interesting reading. Although the ends of a tcp connection were responsible for failure and retries, the routers were responsible for congestion: drop things when there is too much.
The problem is that it worked until the network was saturated, and similar to backlog in queues, when it broke, errors cascaded. The solution was similar: back-pressure. Similar to sleeping twice as long on errors, tcp sends half as many packets, before gradually increasing the amount as things improve.
Back-pressure is about pushing work to the edges, letting the ends of the conversation find stability, rather than trying to optimise all of the links in-between in isolation. Congestion control is about using back-pressure to keep the queues in-between as empty as possible, to keep latency down, and to increase throughput by avoiding the need to drop packets.
Pushing work to the edges is how your system scales. We have spent a lot of time and a considerable amount of money on IP-Multicast, but nothing has been as effective as BitTorrent. Instead of relying on smart routers to work out how to broadcast, we rely on smart clients to talk to each other.
Pushing recovery to the outer layers is how your system handles failure. In the earlier examples, we needed to get the client, or the scheduler to handle the lifecycle of a task, as it outlived the time on the queue.
Error recovery in the lower layers of a system is an optimisation, and you can’t push work to the centre of a network and scale. This is the end-to-end principle, and it is one of the most important ideas in system design.
The end-to-end principle is why you can restart your home router, when it crashes, without it having to replay all of the websites you wanted to visit before letting you ask for a new page. The browser (and your computer) is responsible for recovery, not the computers in between.
This isn’t a new idea, and Erlang/OTP owes a lot to it. OTP organises a running program into a supervision tree. Each process will often have one process above it, restarting it on failure, and above that, another supervisor to do the same.
(Aside: Pipelines aren’t incompatible with process supervision, one way is for each part to spawn the program that reads its output. A failure down the chain can propagate back up to be handled correctly.)
Although each program will handle some errors, the top levels of the supervision tree handle larger faults with restarts. Similarly, it’s nice if your webpage can recover from a fault, but inevitably someone will have to hit refresh.
The end-to-end principle is realising that no matter how many exceptions you handle deep down inside your program, some will leak out, and something at the outer layer has to take responsibility.
Although sometimes taking responsibility is writing things to an audit log, and message brokers are pretty good at that.
Aside: But what about replicated logs?
“How do I subscribe to the topic on the message broker?”
“It’s not a message broker, it’s a replicated log”
“Ok, How do I subscribe to the replicated log”
From ‘I believe I did, Bob’, jrecursive
Although a replicated log is often confused with a message broker, they aren’t immune from handling failure. Although it’s good the components are isolated from each other, they still have to be integrated into the system at large. Both offer a one way stream for sharing, both offer publish-subscribe like interfaces, but the intent is wildly different.
A replicated log is often about auditing, or recovery: having a central point of truth for decisions. Sometimes a replicated log is about building a pipeline with fan-in (aggregating data), or fan-out (broadcasting data), but always building a system where data flows in one direction.
The easiest way to see the difference between a replicated log and a message broker is to ask an engineer to draw a diagram of how the pieces connect.
If the diagram looks like a one-way system, it’s a replicated log. If almost every component talks to it, it’s a message broker. If you can draw a flow-chart, it’s a replicated log. If you take all the arrows away and you’re left with a venn diagram of ‘things that talk to each other’, it’s a message broker.
Be warned: A distributed system is something you can draw on a whiteboard pretty quickly, but it’ll take hours to explain how all the pieces interact.
You cut a monolith with a protocol
How you cut a monolith is often more about how you are cutting up responsibility within a team, than cutting it into components. It really does depend, and often more on the social aspects than the technical ones, but you are still responsible for the protocol you create.
Distributed systems are messy because of how the pieces interact over time, rather than which pieces are interacting. The complexity of a distributed system does not come from having hundreds of machines, but hundreds of ways for them to interact. A protocol must take into account performance, safety, stability, availability, and most importantly, error handling.
When we talk about distributed systems, we are talking about power structures: how resources are allocated, how work is divided, how control is shared, or how order is kept across systems ostensibly built out of well meaning but faulty components.
A protocol is the rules and expectations of participants in a system, and how they are beholden to each other. A protocol defines who takes responsibility for failure.
The problem with message brokers, and queues, is that no-one does.
Using a message broker is not the end of the world, nor a sign of poor engineering. Using a message broker is a tradeoff. Use them freely knowing they work well on the edges of your system as buffers. Use them wisely knowing that the buck has to stop somewhere else. Use them cheekily to get something working.
I say don’t rely on a message broker, but I can’t point to easy off-the-shelf answers. HTTP and DNS are remarkable protocols, but I still have no good answers for service discovery.
Lots of software regularly gets pushed into service way outside of its designed capabilities, and brokers are no exception. Although the bad habits around brokers and the relative ease of getting a prototype up and running lead to nasty effects at scale, you don’t need to build everything at once.
The complexity of a system lies in its protocol not its topology, and a protocol is what you create when you cut your monolith into pieces. If modularity is about building software, protocol is about how we break it apart.
The main task of the engineering analyst is not merely to obtain “solutions” but is rather to understand the dynamic behaviour of the system in such a way that the secrets of the mechanism are revealed, and that if it is built it will have no surprises left for [them]. Other than exhaustive physical experimentations, this is the only sound basis for engineering design, and disregard of this cardinal principle has not infrequently lead to disaster.
From “Analysis of Nonlinear Control Systems” by Dustan Graham and Duane McRuer, p 436
Protocol is the reason why ‘it depends’, and the reason why you shouldn’t depend on a message broker: You can use a message broker to glue systems together, but never use one to cut systems apart.
35 notes · View notes
andlikelions · 8 years ago
Text
Little Fish in a Far Out Space
How I can still get out of bed, brush my teeth, pack for and go on mini trips, focus at all on work, be an active parent, how I can do laundry and dishes, and cook dinner let alone smile and laugh. I don’t know. In two days it will have been 4 weeks since my procedure. So much hinges on the results. And while that may seem like narrow thinking, it’s true to me.
It doesn’t help to vent or try and describe the circus in my mind on loop. I get lots of ‘well at least’, or just sort of minimal blah responses that sort of qualify it as waiting for math test results. That might not be fair to say but it feels that way. I have tried my best to not reach out much because I know no one knows what to say nor are they able to comprehend the enormity of emotion and stress it is to me - even close family.
I have been in close contact with the doctor who performed the procedure to procure placental fragments which housed my little baby’s cells. He has been kind enough to respond to even the most remedial of emails that I send just to get a response from him that I hope might reveal some answers, like the Da Vinci code or something. Except of course that’s not the way it works and I know that.
The lab which is in Maryland told my doctor today that they guarantee results tomorrow morning (10/3). The results have been deferred now twice because of 'technical difficulty’. I respect that, my childs’ chromosomes are being analyzed, I think in high school biology class I couldn’t have imagined this depth of testing and analysis to be available to me in my reproductive years. And so they had to grow the cells which is called “culturing”. It takes time, several days. And then they are able to run what’s called a 'microarray’. It’s a test that looks for micro duplication/deletion errors. Complicated stuff. Complicated to understand and even more-so to explain. So the test apparently takes a handful of days at least, to run.
So tomorrow. At this point results seem like an arbitrary concept. I sort of feel like we’ll be called and the doctor will say the final attempt was unsuccessful and that we don’t have answers. I haven’t thought too much about that but I understand it to be a possibility. I haven’t pondered what that would feel like. I also haven’t pondered what it’s going to feel like to get positive results either. It’s all a theory.
I think this baby is ok. I’ve felt quickening- the earliest movements that feel like fluttering. It stops me in my mind, heart and soul. I stop to wonder if that’s really what it was. I wonder lots of things that I don’t understand right now.
I can’t imagine life on the other side of that phone call. I just know it’s going to be ok, either way.
Most of my mental processes are on hold while I wait on this. I just can’t handle more in these moments. I’ve held it together so well up to now, I am so impressed that I’ve managed to keep upright and not fall apart and despair during this time. I guess I would have fully expected to. Every day that went by without results after the 10 day mark I started to feel like I’ve lost my mind and I’m living as a new unfamiliar person. All ideas were free fish, impossible to catch. Swimming around just out of reach. And then I noticed and reminded myself, this is not in my control. All of it is out of my hands. From the moment of conception.
What a bizarre world and life.
1 note · View note
simplemlmsponsoring · 6 years ago
Photo
Tumblr media
New Post has been published on http://simplemlmsponsoring.com/attraction-marketing-formula/seo/the-beginners-guide-to-google-search-console/
The beginner’s guide to Google Search Console
Tumblr media
Do you have your own website or maintain the website of the company you work for? Of course, to do this right, you need to keep a keen eye on the performance of your website. Google offers several tools to collect and analyze data of your website. You probably have heard of Google Analytics and Google Search Console before. These tools are free to use for everyone maintaining a website and can give you very valuable insights about your website.
Why everyone with a website should use Google Search Console
Google Search Console has been created to easily track the performance of your website. You can get valuable insights out of your Google Search Console account which means that you can see what part of your website needs work. This can be a technical part of your website, such as an increasing number of crawl errors that need to be fixed. This can also be giving a specific keyword more attention because the rankings or impressions are decreasing.
Besides seeing this kind of data, you’ll get mail notifications when new errors are noticed by Google Search Console. Because of these notifications, you’re quickly aware of issues you need to fix.
Setting up an account
To start using Google Search Console, you’ll need to create an account. Within the new Google Search Console, you can click on ‘add a new property’ in the top bar:
Tumblr media
Clicking on the ‘Add a property’ button, you can insert the website you want to add. Make sure you add the right URL, so with ‘https’ if you have an https website and with or without ‘www’. For collecting the right data, it’s important to add the right version:
When you’ve added a website, you need to verify that you’re the owner. There are several options to verify your ownership.
For WordPress users who use Yoast SEO we recommend using the ‘HTML tag’ method:
You can easily copy this code and paste it into the ‘Webmaster tools’ tab within the Yoast SEO plugin:
After saving this, you can return to Google Search Console and click on the ‘Verify’ button to confirm. If everything is ok, you’ll get a success message and GSC will start collecting data for your website.
Features in Google Search Console
Now you’ve set up your account what would be the next step? Well, it’s time to look at some of your data! We’ll explore some of the reports and information available in the rest of this article.
Performance
Within the performance tab, you can see what pages and what keywords your website ranks for in Google. In the old version of GSC you could see the data of a maximum of the last 90 days but in the new version, it’s possible to see the data up to 16 months. Keep in mind that the data is available from the moment you set up your account.
If you check the performance tab regularly, you can quickly see what keywords or what pages need some more attention and optimization. So where to begin? Within the performance tab, you see a list of ‘queries’, ‘pages’, ‘countries’ or ‘devices’. Each of those sections can be sorted by the number of ‘clicks’, ‘impressions’, ‘average CTR’ or ‘average position’. We’ll explain each of them below:
1. Clicks
The amount of clicks tells you how often people clicked on your website in the search results of Google. This number can tell something about the performance of your page titles and meta descriptions: if just a few people click on your result, your result might not stand out in the search results. It could be helpful to check what other results are displayed around you to see what can be optimized for your snippet.
The position of the search result also has an impact on the number of clicks of course. If your page is in the top 3 of Google’s first result page it will automatically get more clicks than a page that ranks on the second page of the search results.
2. Impressions
The impressions tell you how often your website in general or how often a specific page is shown in the search results. For example, in the GSC account of our own website, Yoast SEO is one of the keywords our website ranks for. The number of impressions shown after this keyword shows how often our website is shown for that keyword in the search results of Google. You don’t know yet what page ranks for that keyword.
To see what pages might rank for the specific keyword, you can click on the line of the keyword. Doing this for the keyword [Yoast SEO], the keyword is added as a filter:
After that, you could navigate to the ‘Pages’ tab to see what pages exactly rank for this keyword. Are those pages the ones you’d want to rank for that keyword? If not, you might need to optimize the page you’d like to rank. Think of writing better content containing the keyword on that page, adding internal links from relevant pages or posts to the page, making the page load faster, etc.
3. Average CTR
The CTR – Click-through rate – tells you what percentage of the people that have seen your website in the search results also clicked through to your website. You probably understand that higher rankings mostly also lead to higher click-through rates.
However, there are also things you can do yourself to increase the CTR. For example, you could rewrite your meta description and make it more appealing. When the description of your site stands out from the other results, more people will probably click on your result and your CTR will increase. Keep in mind that this will not have a big impact if you’re not ranking on the first page yet. You might need to try other things first to improve your ranking.
4. Average position
The last one in this list is the ‘Average position’. This tells you what the average ranking of a specific keyword or page was in the time period you’ve selected. Of course, this position isn’t always reliable since more and more people seem to get different search results. Google seems to understand better and better which results fit best for which visitor. However, this indicator still gives you an idea if the clicks, impressions and the average CTR are explainable.
Index coverage
A more technical but very valuable tab within Google Search Console is the ‘Index coverage’ tab. This section shows how many pages are in the index of Google since the last update, how many pages aren’t and what errors and warnings caused difficulties for Google indexing your pages properly.
We recommend checking this tab regularly to see what errors and warnings appear on your website. However, you also get notifications when Google has found new errors. When you get such a notification you can check the error in more detail here.
You may find that errors are caused when, e.g., a redirect doesn’t seem to work correctly, or Google is finding broken code or error pages in your theme.
Clicking on the link, you can analyze the error more in depth to see what specific URLs are affected. When you’ve fixed the error you can mark it as fixed to make sure Google will test the URL again:
There are a few things you should always look for when checking out your coverage reports:
If you’re writing new content, your indexed pages should be a steadily increasing number. This tells you two things: Google can index your site and you keep your site ‘alive’ by adding content. Watch out for sudden drops! This might mean that Google is having trouble accessing (all of) your website. Something may be blocking Google; whether it’s robots.txt changes or a server that’s down: you need to look into it! Sudden (and unexpected) spikes in the graph might mean an issue with duplicate content (such as both www and non-www, wrong canonicals, etc.), automatically generated pages, or even hacks.
We recommend that you monitor these types of situations closely and resolve errors quickly, as too many errors could send a signal of low quality (bad maintenance) to Google.
AMP
Below the ‘Index coverage,’ you can find the ‘AMP’ tab. AMP stands for Accelerated Mobile Pages: lightning fast mobile pages. If you’ve set up AMP for your website you can check for errors in Google Search Console. Within this section you can see the valid AMP pages, the valid ones with warnings and errors:
Below the chart, the issues are listed. If you click on one of the issues, you can see the affected URLs. Just as in the index section of GSC you can validate your fix if you’ve fixed an issue.
Job Postings
Within this tab, you’ll be able to list your job openings and to track their performance. If there are any errors, you’ll see them in here. It’s not the most important feature of GSC, but it can be valuable for specific companies or websites.
Events
This section provides useful feedback on your structured markup for events. Events can be complex to tag up correctly, so this can be an extremely helpful report for finding out where you need to tweak details like dates and location!
Sitemaps
An XML sitemap is like a roadmap to all important pages and posts on your website. We think every website would benefit from having one. Is our Yoast SEO plugin running on your website? Then you automatically have an XML sitemap. If not, we recommend creating one to make sure Google can find your most important pages and posts easily.
Within the XML sitemap tab of Google Search Console you can tell Google where your XML sitemap is located on your site:
We recommend everyone entering the URL of their XML sitemap into GSC to make Google find it easily. In addition to that, you can quickly see if your sitemap gives errors or if some pages aren’t indexed, for instance. Checking this regularly, you’re sure Google can find and read your XML sitemap correctly.
We recommend regularly checking the XML sitemap section in our plugin to manage which post types or taxonomies you’re including in your sitemaps!
Links
Within the links to your site section, you can see how many links from other sites are pointing to your website. Besides, you can see what websites link, how many links those websites contain to your site and lastly, what anchor texts are used most linking to your website. This can be valuable information because links still are very important for SEO.
Within the internal links section, you can check what pages of your website are most linked from other spots on your site. This list can be valuable to analyze regularly because you want your most important pages and posts to get most internal links. Doing this, you make sure Google understands as well what your cornerstones are.
Mobile usability
The mobile usability tab within this section shows you usability issues with your mobile website or with specific mobile pages. Since mobile traffic is rising all over the world, we recommend checking this regularly. If your mobile site isn’t user-friendly, lots of visitors will leave it quickly.
Manual Actions
The manual actions tab is the one you don’t want to see anything in. If your site is penalized by Google, you’ll get more information in here. If your site is affected by a manual action, you’ll also get messaged via email.
There are a number of scenarios which can lead to these kinds of penalties, including:
You have unnatural/bought links Make sure from and to your site are valuable, not just for SEO. Preferably your links come from and link to related content that is valuable for your readers.
Your site has been hackedA message stating your site’s probably hacked by a third party. Google might label your site as compromised or lower your rankings.
You’re hiding something from Google If you’re ‘cloaking’ (that is, intentionally showing different to content than to users, for the purposes of decieving either of them), or using ‘sneaky’ redirects (e.g., hiding affiliate URLs), then you’re violating of Google’s Webmaster Guidelines.
Plain Spam Automatically generated content, scraped content and aggressive cloaking could cause Google to blacklist your site.
Spammy structured markup If you use rich snippets for too many irrelevant elements on a page, or mark up content that is hidden to the visitor, that might be considered spammy. Mark up what’s necessary, and not everything is necessary.
Missing features in the new version of Google Search Console
As you might have noticed not all features are integrated yet into the new version of Google Search Console. Google explains that this could have two reasons: they may have found a better way of presenting the data or they’re still in the process of migrating the feature to the new version. As said before, we’ll update this post when there’s progress made in the migration.
The old version of GSC is still available for everyone. So, why should you switch back to the old version once in a while? We’ll list the features that are missing in the new version, but that seems valuable to keep an eye on, below.
Search appearance
From the ‘Search appearance’ section of the old Google Search Console, we miss the following features in the new version: ‘Structured data‘, ‘Rich cards‘, ‘Data highlighter‘ and the ‘HTML improvements‘.
If you’ve added structured data to your website we recommend checking the structured data tab of the old version regularly. Here you’ll see if all structured data is recognized by Google and errors will be listed. If you’ve added structured data meant for rich cards, you can check for errors in the rich cards tab. The data highlighter can be used to markup your pages without having to code yourself. You can read more in-depth about Google Search Console and structured data here.
In the last missing feature of the search appearance tab, the HTML improvements, you can easily check, for instance, for duplicate titles or quite short titles which can be improved. These listings can be an easy pick: optimizing your titles and meta descriptions might increase your rankings and CTR.
International targeting
The international targeting tab is important for websites who have pages in different languages and who target people in different countries or regions. When you’ve implemented hreflang to your website, you can check for errors within this section of GSC.
Crawl stats
In the crawl tab, you can find the sections ‘Crawl errors’, ‘Crawl stats’, ‘Fetch as Google’, ‘Robots.txt tester’, ‘Sitemaps’ and ‘URL parameters’.
It seems that you can find some crawl errors in the new index coverage tag but if we look at our account, we don’t see all crawl errors in the new version. This means that it’s important to check your crawl errors still in the old version of GSC. When you’ve fixed a crawl error you can mark it as fixed. The crawl stats aren’t included yet so you can find those stats in the old version.
The crawl stats tell you something about how many pages are crawled per day, how many kilobytes are downloaded per day and how many time was spent downloading a page. If one of the graphs seem to decrease, you know it’s time to do something about it.
The fetch as Google feature gives you the opportunity to see if Google can access a specific page correctly, how it exactly renders the page and if there are blocked resources on the page. You can test your pages both for desktop as for mobile to see the differences between those.
The robots.txt tester is made to add your robots.txt and to test if any errors or warnings seem to appear. You can also add specific URLs to check whether they’re blocked or not.
The sitemaps are already moved to the new version of GSC so it’s time for the last feature of the crawl tab: URL parameters. In the URL Parameters section, you can add parameters for your website and ‘tell’ Google how they should be handled. If you want to use this, we recommend reading the guidelines carefully. Don’t just add some parameters to see what happens. This can cause serious problems with your site’s SEO.
Security issues
Last but not least: within the security issues tab you’ll get a notification when your website seems to have a security issue.
Do you already use Google Search Console for your website? If not, we definitely recommend creating an account so you can start collecting data about your website. Do you think something is missing? Feel free to leave a comment!
Read more: How to make your site stand out in the search results »
The post The beginner’s guide to Google Search Console appeared first on Yoast.
Read more: yoast.com
0 notes
tainghekhongdaycomvn · 8 years ago
Text
SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday
SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday
Posted by randfish
If you've ever had any questions about the canonical tag, well, have we got the Whiteboard Friday for you. In today's episode, Rand defines what rel=canonical means and its intended purpose, when it's recommended you use it, how to use it, and sticky situations to avoid.
Click on the whiteboard image above to open a high-resolution version in a new tab!
Video Transcription
Howdy, Moz fans, and welcome to another edition of Whiteboard Friday. This week, we're going to chat about some SEO best practices for canonicalization and use of the rel=canonical tag.
Before we do that, I think it pays to talk about what a canonical URL is, because a canonical URL doesn't just refer to a page upon which we are targeting or using the rel=canonical tag. Canonicalization has been around, in fact, much longer than the rel=canonical tag itself, which came out in 2009, and there are a bunch of different things that a canonical URL means.
What is a "canonical" URL?
So first off, what we're trying to say is this URL is the one that we want Google and the other search engines to index and to rank. These other URLs that potentially have similar content or that are serving a similar purpose or perhaps are exact duplicates, but, for some reason, we have additional URLs of them, those ones should all tell the search engines, "No, no, this guy over here is the one you want."
So, for example, I've got a canonical URL, ABC.com/a.
Then I have a duplicate of that for some reason. Maybe it's a historical artifact or a problem in my site architecture. Maybe I intentionally did it. Maybe I'm doing it for some sort of tracking or testing purposes. But that URL is at ABC.com/b.
Then I have this other version, http://ift.tt/2t9PIEO. What's going on there? Well, that's a URL parameter. The URL parameter doesn't change the content. The content is exactly the same as A, but I really don't want Google to get confused and rank this version, which can happen by the way. You'll see URLs that are not the original version, that have some weird URL parameter ranking in Google sometimes. Sometimes this version gets more links than this version because they're shared on Twitter, and so that's the one everybody picked up and copied and pasted and linked to. That's all fine and well, so long as we canonicalize it.
Or this one, it's a print version. It's ABC.com/aprint.html. So, in all of these cases, what I want to do is I want to tell Google, "Don't index this one. Index this one. Don't index this one. Index this one. Don't index this one. Index this one."
I can do that using this, the link rel=canonical, the href telling Google, "This is the page." You put this in the header tag of any document and Google will know, "Aha, this is a copy or a clone or a duplicate of this other one. I should canonicalize all of my ranking signals, and I should make sure that this other version ranks."
By the way, you can be self-referential. So it is perfectly fine for ABC.com/a to go ahead and use this as well, pointing to itself. That way, in the event that someone you've never even met decides to plug in question mark, some weird parameter and point that to you, you're still telling Google, "Hey, guess what? This is the original version."
Great. So since I don't want Google to be confused, I can use this canonicalization process to do it. The rel=canonical tag is a great way to go. By the way, FYI, it can be used cross-domain. So, for example, if I republish the content on A at something like a Medium.com/@RandFish, which is, I think, my Medium account, /a, guess what? I can put in a cross-domain rel=canonical telling them, "This one over here." Now, even if Google crawls this other website, they are going to know that this is the original version. Pretty darn cool.
Different ways to canonicalize multiple URLs
There are different ways to canonicalize multiple URLs.
1. Rel=canonical.
I mention that rel=canonical isn't the only one. It's one of the most strongly recommended, and that's why I'm putting it at number one. But there are other ways to do it, and sometimes we want to apply some of these other ones. There are also not-recommended ways to do it, and I'm going to discuss those as well.
2. 301 redirect.
The 301 redirect, this is basically a status code telling Google, "Hey, you know what? I'm going to take /b, I'm going to point it to /a. It was a mistake to ever have /b. I don't want anyone visiting it. I don't want it clogging up my web analytics with visit data. You know what? Let's just 301 redirect that old URL over to this new one, over to the right one."
3. Passive parameters in Google search console.
Some parts of me like this, some parts of me don't. I think for very complex websites with tons of URL parameters and a ton of URLs, it can be just an incredible pain sometimes to go to your web dev team and say like, "Hey, we got to clean up all these URL parameters. I need you to add the rel=canonical tag to all these different kinds of pages, and here's what they should point to. Here's the logic to do it." They're like, "Yeah, guess what? SEO is not a priority for us for the next six months, so you're going to have to deal with it."
Probably lots of SEOs out there have heard that from their web dev teams. Well, guess what? You can end around it, and this is a fine way to do that in the short term. Log in to your Google search console account that's connected to your website. Make sure you're verified. Then you can basically tell Google, through the Search Parameters section, to make certain kinds of parameters passive.
So, for example, you have sessionid=blah, blah, blah. You can set that to be passive. You can set it to be passive on certain kinds of URLs. You can set it to be passive on all types of URLs. That helps tell Google, "Hey, guess what? Whenever you see this URL parameter, just treat it like it doesn't exist at all." That can be a helpful way to canonicalize.
4. Use location hashes.
So let's say that my goal with /b was basically to have exactly the same content as /a but with one slight difference, which was I was going to take a block of content about a subsection of the topic and place that at the top. So A has the section about whiteboard pens at the top, but B puts the section about whiteboard pens toward the bottom, and they put the section about whiteboards themselves up at the top. Well, it's the same content, same search intent behind it. I'm doing the same thing.
Well, guess what? You can use the hash in the URL. So it's a#b and that will jump someone — it's also called a fragment URL — jump someone to that specific section on the page. You can see this, for example, Moz.com/about/jobs. I think if you plug in #listings, it will take you right to the job listings. Instead of reading about what it's like to work here, you can just get directly to the list of jobs themselves. Now, Google considers that all one URL. So they're not going to rank them differently. They don't get indexed differently. They're essentially canonicalized to the same URL.
NOT RECOMMENDED
I do not recommend...
5. Blocking Google from crawling one URL but not the other version.
Because guess what? Even if you use robots.txt and you block Googlebot's spider and you send them away and they can't reach it because you said robots.txt disallow /b, Google will not know that /b and /a have the same content on them. How could they?
They can't crawl it. So they can't see anything that's here. It's invisible to them. Therefore, they'll have no idea that any ranking signals, any links that happen to point there, any engagement signals, any content signals, whatever ranking signals that might have helped A rank better, they can't see them. If you canonicalize in one of these ways, now you're telling Google, yes, B is the same as A, combine their forces, give me all the rankings ability.
6. I would also not recommend blocking indexation.
So you might say, "Ah, well Rand, I'll use the meta robots no index tag, so that way Google can crawl it, they can see that the content is the same, but I won't allow them to index it." Guess what? Same problem. They can see that the content is the same, but unless Google is smart enough to automatically canonicalize, which I would not trust them on, I would always trust yourself first, you are essentially, again, preventing them from combining the ranking signals of B into A, and that's something you really want.
7. I would not recommend using the 302, the 307, or any other 30x other than the 301.
This is the guy that you want. It is a permanent redirect. It is the most likely to be most successful in canonicalization, even though Google has said, "We often treat 301s and 302s similarly." The exception to that rule is but a 301 is probably better for canonicalization. Guess what we're trying to do? Canonicalize!
8. Don't 40x the non-canonical version.
So don't take /b and be like, "Oh, okay, that's not the version we want anymore. We'll 404 it." Don't 404 it when you could 301. If you send it over here with a 301 or you use the rel=canonical in your header, you take all the signals and you point them to A. You lose them if you 404 that in B. Now, all the signals from B are gone. That's a sad and terrible thing. You don't want to do that either.
The only time I might do this is if the page is very new or it was just an error. You don't think it has any ranking signals, and you've got a bunch of other problems. You don't want to deal with having to maintain the URL and the redirect long term. Fine. But if this was a real URL and real people visited it and real people linked to it, guess what? You need to redirect it because you want to save those signals.
When to canonicalize URLs
Last but not least, when should we canonicalize URLs versus not?
I. If the content is extremely similar or exactly duplicate.
Well, if it is the case that the content is either extremely similar or exactly duplicate on two different URLs, two or more URLs, you should always collapse and canonicalize those to a single one.
II. If the content is serving the same (or nearly the same) searcher intent (even if the KW targets vary somewhat).
If the content is not duplicate, maybe you have two pages that are completely unique about whiteboard pens and whiteboards, but even though the content is unique, meaning the phrasing and the sentence structures are the same, that does not mean that you shouldn't canonicalize.
For example, this Whiteboard Friday about using the rel=canonical, about canonicalization is going to replace an old version from 2009. We are going to take that old version and we are going to use the rel=canonical. Why are we going to use the rel=canonical? So that you can still access the old one if for some reason you want to see the version that we originally came out with in 2009. But we definitely don't want people visiting that one, and we want to tell Google, "Hey, the most up-to-date one, the new one, the best one is this new version that you're watching right now." I know this is slightly meta, but that is a perfectly reasonable use.
What I'm trying to aim at is searcher intent. So if the content is serving the same or nearly the same searcher intent, even if the keyword targeting is slightly different, you want to canonicalize those multiple versions. Google is going to do a much better job of ranking a single piece of content that has lots of good ranking signals for many, many keywords that are related to it, rather than splitting up your link equity and your other ranking signal equity across many, many pages that all target slightly different variations. Plus, it's a pain in the butt to come up with all that different content. You would be best served by the very best content in one place.
III. If you're republishing or refreshing or updating old content.
Like the Whiteboard Friday example I just used, you should use the rel=canonical in most cases. There are some exceptions. If you want to maintain that old version, but you'd like the old version's ranking signals to come to the new version, you can take the content from the old version, republish that at /a-old. Then take /a and redirect that or publish the new version on there and have that version be the one that is canonical and the old version exist at some URL you've just created but that's /old. So republishing, refreshing, updating old content, generally canonicalization is the way to go, and you can preserve the old version if you want.
IV. If content, a product, an event, etc. is no longer available and there's a near best match on another URL.
If you have content that is expiring, a piece of content, a product, an event, something like that that's going away, it's no longer available and there's a next best version, the version that you think is most likely to solve the searcher's problems and that they're probably looking for anyway, you can canonicalize in that case, usually with a 301 rather than with a rel=canonical, because you don't want someone visiting the old page where nothing is available. You want both searchers and engines to get redirected to the new version, so good idea to essentially 301 at that point.
Okay, folks. Look forward to your questions about rel=canonicals, canonical URLs, and canonicalization in general in SEO. And we'll see you again next week for another edition of Whiteboard Friday. Take care.
Video transcription by Speechpad.com
Sign up for The Moz Top 10, a semimonthly mailer updating you on the top ten hottest pieces of SEO news, tips, and rad links uncovered by the Moz team. Think of it as your exclusive digest of stuff you don't have time to hunt down but want to read!
bạn xem thêm tại: http://ift.tt/2mXjlRS SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá r�� SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ b��n tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 xem thêm tại: http://ift.tt/2mb4VST để biết thêm về địa chỉ bán tai nghe không dây giá rẻ SEO Best Practices for Canonical URLs + the Rel=Canonical Tag - Whiteboard Friday http://ift.tt/2t9FJj5 Bạn có thể xem thêm địa chỉ mua tai nghe không dây tại đây http://ift.tt/2mb4VST
0 notes
lovelyfantasticfart · 5 years ago
Text
Disclaimer2010-2020 BMW 650i Technical Service Bulletin # 841807 Date: 090601
Disclaimer2010-2020 BMW 650i Technical Service Bulletin # 841807 Date: 090601 BMW Assist(R) - Status Bar/Percentage Does Not Progress SI B 84 18 07 Communication Systems June 2009 Technical Service This Service Information bulletin supersedes SI B84 18 07 dated August 2007. [NEW] designates changes to this revision SUBJECT Enable Services Status Bar Does NOT Progress MODEL E60, E61 (5 Series) E63, E64 (6 Series) E65, E66 (7 Series) from 03/05 production E70 (X5) vehicles equipped with ZPP (Premium Package) or SA639 (BMW Assist) E90, E91, E92, E93 (3 Series) vehicles equipped with ZPP (Premium Package) or SA639 (BMW Assist) SITUATION When trying to enable BMW Assist services, "Enable Services" is selectable but the status bar/percentage does not progress. PROCEDURE 2020-2020 BMW 650i Coupe (E63) V8-4.8L (N62TU) Page 243 1. Check the BMW Assist account status on DCSnet. The BMW Assist services expiration date and the TCU activation status can be checked on DCSnet under Service/Vehicle History Inquiry. Refer to SI B02 01 06 (Updated DCSnet Vehicle History Inquiry information on BMW Assist) for more information. If the BMW Assist services contract has expired, the customer must renew his or her BMW Assist services. Do not proceed until these services are renewed. ^ For customers who would like to renew BMW Assist services, refer to SI B84 22 05 (Reactivation of BMW Assist Services). 2. Duplicate the complaint by trying to initialize BMW Assist services, following the procedure outlined in SI B84 15 03 (Initialization of BMW Assist Services) at a location where you normally initialize BMW Assist services. 3. Perform a vehicle test using BMW Diagnostic tools. Work though any corresponding test modules. 4. Check the wireless signal strength and Network Access Device (NAD) registration status, following the procedure outlined in SI B84 05 07 (Checking NAD Signal Strength for BMW Assist), or using the BMW Diagnostic System check via "Diagnosis" in "Control Unit Functions". ^ If the signal strength is good and the NAD is registered on the wireless network, proceed to work, proceed to step 5. ^ If the signal strength is NOT good and the NAD is registered on the wireless network, diagnose the antenna circuit, following the procedure outlined in the cellular antenna circuit diagnostic tips section of this bulletin. 5. Verify this is NOT a Wireless Network problem in your area. For instance, are multiple vehicles at your center unable to initialize BMW Assist services? ^ If multiple vehicles are having the same problem, submit a PuMA case listing all the VINs and the exact location where the error is occurring, e.g., city, state and cross street. 6. [NEW] Verify that the BMW Assist Response center has the correct Electronic Serial Number (ESN), Mobile Identification Number (MIN), and Mobile Device Number (MDN) on file for this vehicle. Use the following path within ISTA to obtain ESN, MIN and MDN: ^ Perform a vehicle test (if not already performed in step 3). ^ Function Structure ^ Body ^ Audio, Video, Telephone, Navigation (MOST network) ^ Telecommunication/Telephone ^ Reactivate internal telephone module ^ Start search ^ Select test module (Reactivate internal telephone module B8400_00358) Note: To comply with wireless service provider restrictions, when a BMW Assist account expires, BMW of North America, LLC must prevent the Network Access Device (NAD) from registering on the wireless network. If a BMW Assist account has expired and the vehicle was produced after 9/05 production, BMW may send the Power Off Command (POC) to the TCU. This means the NAD will not turn on or register on the network. 7. [NEW] Select Option 1 (Read MIN/MDN/SID/NID) and then select the right screen arrow. 8. Print the screen to record the ESN, MIN, and MDN. 2020-2020 BMW 650i Coupe (E63) V8-4.8L (N62TU) Page 244 9. Select the right screen arrow. 10. Contact BMW Assist by calling. Ask the BMW Assist Customer Care specialist to reconcile the account information on file to the data obtained from the vehicle. ^ Note: If the data on file was inaccurate, wait one hour before attempting reinitialization. 11. [NEW] Check the Emergency Call master bit using ISTA: ^ After the Vehicle Test is finished, highlight the TCU and select "ECU functions". ^ Select "Diagnosis Query". ^ Select "Emergency call status". ^ Select the button "Inquiry status". 12. Does "Emergency call status" display "active" or "inactive"? ^ "Activated" Continue normal diagnosis. ^ "Inactive" Code the complete vehicle, using the current version of ISTA/P. 13. After coding the complete vehicle, allow the TCU to assume sleep mode by turning the ignition off for 4 minutes. 14. Check the Emergency Call master bit again, as outlined in step 11. ^ "Activated" Initialize BMW Assist per SI B84 15 03. "Inactive" The TCU should be replaced; refer to the TCU replacement section of this bulletin. CELLULAR ANTENNA CIRCUIT DIAGNOSTIC TIPS: 1. The black FAKRA connector at the TCU is for the main BMW Services cellular antenna. This antenna is located in the shark fin. The purple FAKRA connector goes to the backup BMW Services antenna. ^ Check the black FAKRA connector at the TCU and at the shark fin antenna. On vehicles not equipped with a shark fin antenna, look up the component locations on TIS. ^ Check the purple FAKRA connector at the TCU and at the backup antenna. The backup antenna location varies from model to model. Look up "W19" in the component locations on TIS. 2. Check the main and backup antenna cables with an ohm meter, using the procedure below: ^ Disconnect the coax cable from the antenna and from the TCU. ^ Check the coax cable core from end to end. You should have approximately 0 ohms of resistance. ^ Check the coax cable core to the shield. The ohm meter should display high resistance/open circuit. ^ If the desired readings are not obtained, the coax cable must be replaced. ^ Reconnect the coax cable. 3. [NEW] With the vehicle outside and with a clear line of sight, check the signal strength using one of the two procedures below: ^ Using the BMW Diagnostic System, check via "Diagnosis" in "ECU Functions". 2020-2020 BMW 650i Coupe (E63) V8-4.8L (N62TU) Page 245 ^ In the service mode of the head unit, following the procedure outlined in SI B84 05 07 (Checking NAD Signal Strength for BMW Assist). TCU REPLACEMENT PROCEDURE 1. The root cause of the problem is under analysis; please refer to SI B84 23 05 (Enhanced Support for BMW Assist Telematics Control Unit [TCU] with Bluetooth & CPT9000 Phone Systems) prior to replacing the TCU. 2. Refer to TIS (RA 84 11...) for the TCU replacement procedure. 3. Before installing the new TCU, remove one copy of the Electronic Serial Number (ESN) label and place it on the repair order for reference during warranty claim entry. You will be asked for the new TCU "ESN" when submitting a claim via DCSnet. Refer to SI B01 10 05 for more details. 4. The second ESN label of the TCU should be affixed over the existing label in the Owner's Manual insert (P/N 01 49 0 157 963). 5. Complete the TCU installation. 6. [NEW] Using ISTA/P, answer "Yes" to "Have Control modules been replaced"; mark the TCU as replaced; and finish the measures plan. 7.Test the BMW Assist service for proper operation by placing a test call (press the Roadside Assistance "Wrench" button). Make sure the BMW Assist Response Center has received the correct MIN/MDN/VIN and location of the vehicle. Have the representative update his or her records as needed. INITIALIZATION OF BMW ASSIST SERVICES 1. The BMW Assist services initialization procedure must be completed per SI B84 15 03 for all vehicles. The vehicle must be in the Verizon Wireless Network for the initialization procedure to work properly. If the vehicle is not in the Verizon Wireless Network, perform the outlined procedure and then follow these additional steps: ^ Create a PuMA case to receive TCU shipping authorization. ^ Remove the TCU from the vehicle. ^ Send the TCU, BMW Assist TCU Reactivation Form with the new MIN/MDN numbers, and a copy of the PuMA case via FedEx to:se via FedEx to: [NEW] BMW of North America, LLC. Attn: TCU Teileclearing (TCU Reactivation B84 18 07) 200 Chestnut Ridge Road (Building 150) Woodcliff Lake, NJ 07677-7731 ^ BMW of North America, LLC will initialize the TCU and ship it out on the same business day it was received. ^ After receiving the TCU from BMW of North America, reinstall the TCU and place a BMW Assist call, as outlined in the Testing of BMW Assist services section of this bulletin. ^ All shipping charges (both ways) are to be billed to the dealer's FedEx account. On the warranty claim, submit the FedEx shipping charges (double the amount provided to you by TC Teileclearing to cover shipment both ways) in the sublet section (using sublet code 4). 2. Test BMW Assist following the procedure outlined in the Testing of BMW Assist services section of this bulletin. TEST OF BMW ASSIST SERVICES 2020-2020 BMW 650i Coupe (E63) V8-4.8L (N62TU) Page 246 Test the BMW Assist service for proper operation by placing a test call (press the Roadside Assistance "Wrench" button). Make sure the BMW Assist Response Center has received the correct MIN/MDN/VIN and location of the vehicle. Have the representative update his or her records as needed. WARRANTY INFORMATION Covered under the terms of the BMW New Vehicle Limited Warranty. Please refer to the latest KSD for all applicable labor operations and allowances. If the appropriate labor operation is not contained in KSD, then a work time labor operation should be used. Defect Code 84 11 03 12 00 from Blogger https://ift.tt/3irPWwX
0 notes
php-sp · 5 years ago
Text
SMS Gateway - Use Your Phone as SMS Gateway
New Post has been published on https://intramate.com/php-scripts/sms-gateway-use-your-phone-as-sms-gateway/
SMS Gateway - Use Your Phone as SMS Gateway
LIVE PREVIEWGet it now for only $79
Turn your mobile phone into the SMS Gateway for your applications.
Features
Send SMS from your application developed using any programming language.
Send SMS with virtually no limit. You won’t be bound by SMS character limit (160 Characters).
Use CSV or Excel file containing numbers and messages in first two columns to send bulk messages.
Shows status of messages sent using SMS Gateway in Admin Panel.
Ability to receive messages in the Admin Panel and respond to them using a WebHook.
Ability to sign in using multiple Android devices to split messages between them when sending bulk messages.
Ability to create other users to let them use SMS Gateway from their mobile phones.
Send messages on schedule.
Send messages using any SIM programmatically or using Excel file.
Create contact lists and import contacts into them using Excel file.
Send message to contacts in a contacts list.
Ability to allow a contact to unsuscribe from the contacts list.
Add contacts or unsubcribe them from the list using the API.
If you want to try it out then register here. Follow the instruction you’ll receive in the email to get started.
To integrate into your application follow the guides on API page after logging in to the Admin Panel.
How it works!
1.) INSTALL ADMIN PANEL
You will receive Admin panel when you purchase SMS Gateway. Install it on your web hosting. It comes with installation script so it should be easy.
2.) INSTALL ANDROID APP
You need to download Android App from here. After installing it you can log in to it using your Admin panel URL and it’s credentials.
3.) READY TO SEND
Now when you send messages using API or excel file it will be first stored on your server with the ‘Pending’ status.
4.) READY TO PROCESS
After your server gets the messages it sends the notification to SMS Gateway app on your mobile. When the app gets the notification it downloads the messages for processing and set their status as ‘Queued’.
5.) SENT AND DONE
After each message is sent they get the status ‘Sent’ if it was sent successfully otherwise it will get ‘Failed’ status. SMS Gateway also checks for delivery of messages. If your mobile network is unable to deliver the message it will be marked as ‘Failed’ otherwise it will stay in ‘Sent’ status.
Server Requirements
Apache or Nginx
PHP 5.6 or above
MySQL
PHP Extensions
php_curl
php_zip
php_xml
php_mbstring
php_gd2 (if not compiled in)
It is recommended to use VPS Hosting for SMS Gateway but it should work perfectly fine on Shared Hosting too. If you decide to go with Shared Hosting make sure your host allows hosting of SMS Gateway application. Some hosts like HostGator and iPage don’t allow it so it is more likely that they will block the app.
Android Device Requirements
Android 5.0 or above.
Device with 3 GB or more RAM. It works on lower spec devices but you may experience degraded performance.
A device with Google Play Services. If your device has Google Play Store then it means it does have Google Play Services.
Note
There was a policy change from Google for all apps requiring SMS related permissions as you can see here. After March 9, 2019 this app won’t be available through Play Store. You will get all future updates notifications from CodeCanyon. You will need to install the APK file on your device to use the app. The app will function normally and its functionality won’t be affected from this move by Google.
Changelog
v5.1
New Features
Added ability to schedule messages.
v5.0.1
Fixes
Fixed an issue where normal users couldn’t remove the messages.
Fixed an issue that prevented the user from creating contacts list if other user had contacts list with same name.
Fixed an issue that caused duplicate unsubscribe text to be added when clicking on ‘Add Unsubscribe Link’ button.
Changes
Now using AJAX to submit the form that allows users to send message to contacts list.
v5.0
New Features
Create contact lists and import contacts into them using Excel file.
Send message to contacts in a contacts list.
Ability to allow a contact to unsuscribe from the contacts list.
Add contacts or unsubcribe them from the list using the API.
Changes
Now failed messages will show reason for failure. (Requires App Update)
Now message field on Send Message form will show how many messages will be used to send the message.
v4.0.3
Fixes
Fixed an issue that prevents assignment of next primary device after signing out from the Android app.
Fixed an issue that prevents assignment as primary device after login to the Android app even if there is no primary device exists.
Fixed an issue where a floating-point number was being considered as a valid mobile number.
Changes
Now exported excel will have a text formatting by default.
v4.0.2
Fixes
Fixed a critical issue in bulk sending functionality that caused some of the messages to be sent multiple times, sometimes neglecting others and sometimes from non-existence SIM on the device.
Changes
Now the application will set message status to “Delivered” if it is successful as per the Delivery Report.
Now non-Admin users are also allowed to remove their messages.
v4.0.1
Fixes
Fixed an issue where devices combo box on excel upload form doesn’t show all the available SIM cards.
New Features
Now received message will show receiver SIM.
v4.0
New Features
Added ability to send messages using any SIM via API or Excel file.
v3.1.1
Fixes
Fixed an issue where changing name and timezone from Device doesn’t affect the name and timezone on currently running PC session.
Fixed an issue where error wasn’t shown when login script was unable to remove the ‘install’ directory.
Fixed js and css path errors in installation script.
Fixed an issue where end date wasn’t showing the correct date on messages page if user’s timezone setting wasn’t same as database timezone.
Changes
Replaced Play Store URL from registration email with APK file URL.
Now the application uses locally hosted DataTables js file to improve performance.
Now localizing exported excel file column headers.
Now ignoring devices value in API if bad value is provided.
v3.1
New Features
Added option to turn off Delivery Reports.
v3.0.4
Fixes
Fixed an issue causing Excel export to ignore search parameters.
Fixed an issue where status wasn’t translated to primary language on messages page.
Changes
Now allows up to 60 seconds of delay between messages.
v3.0.3
Fixes
Added missing strings in the language file.
New Features
Added German language file.
v3.0.2
Changes
Now the API call will return date and time in ISO 8601 format.
Fixes
Fixed an issue where select all checkbox was still checked even after a successful operation.
v3.0.1
Fixes
Fixed an issue where The Unknown device wasn’t visible for non-admin users on messages page.
Fixed an issue where search didn’t work on messages page for non-admin users if there are no devices registered.
v3.0
Changes
Now API will return details of all the messages after sending them.
Now API supports GET requests.
Now messages page will show the total messages count for the search results.
Code and Performance Optimization.
New Features
Added ability to receive messages in Admin Panel and respond to it using a WebHook.
Added ability to change results per page in messages page.
Added new API page.
Added functionality to get messages using API.
v2.1
Changes
Now newline character in a message will be converted to br tag in messages page to show it properly.
Now users can resend messages with ‘Queued’ status. It is only recommended to do so if your message status stays in ‘Queued’ status for more than 24 hours even if message sending was finished on Android device.
New Features
Added ability to remove messages.
v2.0.1
Fixes
Fixed an issue causing single message form in Sender to show device doesn’t exist error even if it exists in the database. This only happened if your device ID is greater than or equal to 10.
Changes
Now users list in Manage Users page will show the infinite symbol in Max Devices when Maximum Devices allowed for the user is unlimited.
Now the application won’t rely on mbstring extension to send messages. Only Excel export and import requires mbstring extension enabled.
New Features
Added favicon.
v2.0
Fixes
Fixed an issue causing a fatal error in profile page when entering the wrong current password.
Fixed an issue that can prevent too many bulk messages from being sent.
Fixed an issue causing Failed messages to be marked as Pending.
New Features
Added support for multiple devices per user. The user can sign in to multiple devices and split messages between them.
Added support for paging to improve the performance of messages page.
Now user can change their name from profile settings.
Changes
Moved all the strings used in admin panel to a centralized location for easier localization.
Added new status named “Queued” and removed “Delivered” status to avoid confusion.
Now seconds data will be shown for sent time and delivered time on messages page.
Now delivery time will be reported from android app.
v1.0.6
New Features
Added missing phpdoc comments to make IDEs happy.
Added icon representing Delay field in the profile page.
Changes
Changed Firebase Cloud Message priority to high.
Now included php files will prevent access when opened directly.
Now Reset Password page will use the password reset link to reset the password.
Fixes
Fixed wrong use of constant in Manage Users page.
Fixed an issue in Manage users page causing 500 error for few users.
Fixed an issue causing a message to show outside browser window if a message is too big.
v1.0.5
New Features
Added ability to set the delay between messages.
Now messages will show delivery time near the status label.
Changes
Changed input field type to text in sender.php to allow + in the input.
Fixes
Fixed an issue causing wrong value to be saved in the database if there is $ in value.
Fixed an issue with search form layout in messages.php on lower resolution displays.
Fixed install script to use single quote in the config file to prevent issue when there is $ sign in database password.
Fixed an issue preventing checkbox from changing state when clicking select all if the user has interacted with a checkbox before.
1.0.4
Fixes
Fixed an issue where certain CSV files are not readable by excel uploader.
Fixed a critical issue preventing some of the messages from being sent when the user tries to send too many messages at once.
Fixed an issue preventing users from uploading multiple excel files.
1.0.3
Fixes
Fixed an issue where application can’t send messages in bulk if the total data size of bulk messages exceeds 4096 bytes.
Fixed an issue where application opens too many MySQL connections resulting in a crash.
Fixed an issue where installation script doesn’t work if installed MySQL version is below 5.6.
Fixed installation script to prevent it from saving changes to the database until every query executes successfully.
New Features
Added progress bar for ajax requests.
Added .htaccess file to prevent directory listing.
Changes
Now page won’t be reloaded after removing users instead only users table will be refreshed.
1.0.2
Fixes
Fixed DateTime input field line height issue in mobile application.
New Features
Added ability to remove users.
Changes
Moved Add New User form to Manage Users page.
Now if any message from multipart message fails then it will be considered as the failed message.
Now messages will be grouped according to users for Admin.
Now when a new user will be added it will use the date from defined timezone rather than server timezone.
1.0.1
Fixes
Fixed an issue where PHP Mailer class was declared twice using require a statement in reset-password.php causing a fatal error.
Fixed an error in API example in documentation causing it to not report error response correctly.
Fixed scrollbar in installation and login page.
New Features
Added jQuery Validation Plugin for better form validation.
Added server URL and android application URL to create user email.
Changes
Removed ’$’ from allowed characters in a random password generator to avoid problems.
LIVE PREVIEWGet it now for only $79
0 notes