http://timrogers.uk/2014/07/12/discovering-private-apis-with-charles-app/?utm_source=hackernewsletter&utm_medium=email&utm_term=fav
суббота, 26 июля 2014 г.
среда, 23 июля 2014 г.
Подебажить MySQL запросы
1. Заходим под рутом в mysql shell
2. Находим где у нас будут писаться логи
3. В другой оболочке идем и например начинаем тейлить этот файл лога.
4. Включаем логирование
6. Не забываем отключить логирование, чтобы не заполнить себе диск.
2. Находим где у нас будут писаться логи
mysql> SHOW VARIABLES LIKE "general_log%";
+------------------+----------------------------+
| Variable_name | Value |
+------------------+----------------------------+
| general_log | OFF |
| general_log_file | /var/run/mysqld/mysqld.log |
+------------------+----------------------------+
3. В другой оболочке идем и например начинаем тейлить этот файл лога.
4. Включаем логирование
mysql> SET GLOBAL general_log = 'ON';
5. Наблюдаем за запросами, находим проблему, решаем.6. Не забываем отключить логирование, чтобы не заполнить себе диск.
mysql> SET GLOBAL general_log = 'OFF';
7. Также будет полезно почистить за собой
rm /var/run/mysqld/mysqld.log
Ярлыки:
Logs monitoring,
MySQL
четверг, 10 июля 2014 г.
Default MongoDB Ports
Default MongoDB Port
The following table lists the default ports used by MongoDB:
| Default Port | Description |
|---|---|
| 27017 | The default port for mongod and mongos instances. You can change this port with port or --port. |
| 27018 | The default port when running with --shardsvr runtime operation or the shardsvr value for the clusterRolesetting in a configuration file. |
| 27019 | The default port when running with --configsvr runtime operation or the configsvr value for the clusterRolesetting in a configuration file. |
| 28017 | The default port for the web status page. The web status page is always accessible at a port number that is 1000 greater than the port determined by port. |
Ярлыки:
MongoDB
MongoDB replication
В контексте MongoDB процедура репликации связана с понятие репликасет. Реплика сет это:
- группа нод, в которых одна является праймери, другие - секондари;
- приложение подключается к праймери, все изменения, которые приходят на праймери, дублицируются на секондари ноды;
- когда праймери падает, репликасет решает какая из секондари нод становится новой праймери, и приложение переподключается на нее, таким образом если быть более точным, то приложение подключается к репликесету, а уже репликасет решает к какой ноде полючить соединение;
- когда упавший праймери подымается, он уже становится одним из секондари и вступает в работу с записи всех изменений, который пришли в репликусет без него;
- минимальное количесвто нод в репликесете 3.
- группа нод, в которых одна является праймери, другие - секондари;
- приложение подключается к праймери, все изменения, которые приходят на праймери, дублицируются на секондари ноды;
- когда праймери падает, репликасет решает какая из секондари нод становится новой праймери, и приложение переподключается на нее, таким образом если быть более точным, то приложение подключается к репликесету, а уже репликасет решает к какой ноде полючить соединение;
- когда упавший праймери подымается, он уже становится одним из секондари и вступает в работу с записи всех изменений, который пришли в репликусет без него;
- минимальное количесвто нод в репликесете 3.
Ярлыки:
MongoDB
среда, 9 июля 2014 г.
Comparison Matrix
| Operation description | MongoClient Shell | NodeJs Driver | Java Driver | Python Driver |
|---|---|---|---|---|
| Подключение к базе | $ mongo dbname $ mongo 192.169.0.5/dbname $ mongo 192.169.0.5:9999/dbname $ mongo >use dbname | var MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://localhost:27017/m101'), function(err, db) {
if(err) throw err;
db
}
| import com.mongodb.DB;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
final MongoClient client = new MongoClient(new MongoClientURI("mongodb://localhost"));
final DB db = mongoClient.getDB("dbname");
| |
| Получение ссылки на коллекцию | >db.collectionName | var MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://localhost:27017/m101'), function(err, db) {
if(err) throw err;
var collection = db.collection('collectionName');
}
| import com.mongodb.DB;
import com.mongodb.DBCollection;
final DBCollection collection = db.getCollection("collectionName");
| |
| Выборка | >db.students.find({
$or: [
{ "resume.projects.3.months": {$lte: 3}},
{currentProjects: {$in: ["Pizza Commerce", "AdvNet"]}}
]
})
| var MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://localhost:27017/m101'), function(err, db) {
if(err) throw err;
/*
следующий подход для варианта, когда есть вероятность,
что полей может быть очень много и нам нужно обеспечить
отпускание потока ноды
*/
db.collection('students').find({
$or: [
{ "resume.projects.3.months": {$lte: 3}},
{currentProjects: {$in: ["Pizza Commerce", "AdvNet"]}}
]
}).each(function(err, doc){
console.log(doc);
});
/*
следующий подход для большинства случаев, где мы
перестраховываемся лимитированием от чрезмерного
количества результатов
*/
db.collection('students').find({
$or: [
{ "resume.projects.3.months": {$lte: 3}},
{currentProjects: {$in: ["Pizza Commerce", "AdvNet"]}}
]
}).sort({name: -1}).limit(5).toArray(function(err, items){
console.log(items);
});
}
| import com.mongodb.BasicDBObject;
import com.mongodb.DBCursor;
import java.util.List;
List<DBobject> posts;
BasicDBObject query = new BasicDBObject("tags", tag);
DBCursor cursor = postsCollection.find(query).sort(new BasicDBObject().append("date", -1)).limit(10);
try {
posts = cursor.toArray();
} finally {
cursor.close();
}
...OR...
/*Можно также поработать с курсором определенное время*/
while (cursor.hasNext()) {
posts.add(cursor.next());
}
| |
| Изменение конкретной записи | >var j = db.students.findOne() >j.name = "Tim" >delete j.surname >db.students.save(j) | |||
| Получение информации о протекании запроса | > db.students.findOne().explain() | var cursor = db.collection('students').findOne({a: 1});
cursor.explain(function(err, explain_output){
if(err) throw err;
console.log(explain_output);
});
| ||
| Явное указание какой именно индекс использовать в запросе | > db.students.findOne({x: 100, y: 200, z: "Some string value"}).hint({x: 1, y:1, z: 1})
| var cursor = db.collection('students').find({a: 1}, {},
{ 'hint': {$natural: 1}}
);
| ||
| Подключение к репликасету | Запустить несколько процессов в данном случае на одном хосте:user@localhost$ mkdir -p /data/rs1 /data/rs2 /data/rs3 user@localhost$ mongod --replSet m101 --logpath "1.log" --dbpath /data/rs1 --port 27017 --oplogSize 64 --fork --smallfiles user@localhost$ mongod --replSet m101 --logpath "2.log" --dbpath /data/rs2 --port 27018 --oplogSize 64 --smallfiles --fork user@localhost$ mongod --replSet m101 --logpath "3.log" --dbpath /data/rs3 --port 27019 --oplogSize 64 --smallfiles --fork Теперь соединить всех в одну репликусет через введение данных в процесс, который будет праймери: $ mongo --port 27018 < echo "config = { _id: "m101", members:[ \
{ _id : 0, host : "localhost:27017", priority:0, slaveDelay:5}, \
{ _id : 1, host : "localhost:27018"},\
{ _id : 2, host : "localhost:27019"} ] \
}; \
rs.initiate(config); \
rs.status(); \
"
Или так:
user@localhost$ mongo --port 27018
> rs.status()
> rs.initiate()
> rs.add("localhost:27017")
> rs.add("localhost:27019")
| var MongoClient = require('mongodb').MongoClient;
MongoClient.connect("mongodb://localhost:30001," +
"localhost:30002," +
"localhost:30003/course", function(err, db) {
...
});
|
Ярлыки:
MongoDB,
MongoDB Java driver,
MongoDB NodeJs driver
воскресенье, 6 июля 2014 г.
Разница между load и get
load(Entity.class, idVal) - кинет исключение, если в базе нет такой сущности с указанным айди.
get(Entity.class, idVal) - вернет налл, если в базе нет такой сущности с указанным айди.
get(Entity.class, idVal) - вернет налл, если в базе нет такой сущности с указанным айди.
Ярлыки:
Hibernate ORM
четверг, 3 июля 2014 г.
MongoDB Aggregation
С помощью этого функционала мы можем групировать по неким полям наши результаты запросов, при этом проводить некие исчисления над полями одной групы для получения общего результата для группы; преобразовывать; фильтровать; сортировать; обрезать; а также строить пайпланы для обработки уже обработанных результатов.
$project - reshape - 1 : 1
$match - filter - n : 1
$group - aggregate - n : 1
$sort - sort - 1 : 1
$skip - skips - n : 1
$limit - limits - n : 1
$unwind - normalize - 1 : n
$out - output - 1 : 1 (направить результат в другую колекции из базы)
$redact - на сколько я понял, какие-то ограничения по пользователю, то есть эта директива позволяет проверять поля на значения и включать их или нет в ответ, а к пользователю приложение привязывает некое значение полей и на основании этих полей происходит фильтрация.
$geoNear - поиск относительно места расположения, в результате возвращается сначала самое близкое место и в конце самое отдаленное.
Aggregation Pipeline
Collection -> $project -> $match -> $group -> $sort -> Result$project - reshape - 1 : 1
$match - filter - n : 1
$group - aggregate - n : 1
$sort - sort - 1 : 1
$skip - skips - n : 1
$limit - limits - n : 1
$unwind - normalize - 1 : n
$out - output - 1 : 1 (направить результат в другую колекции из базы)
$redact - на сколько я понял, какие-то ограничения по пользователю, то есть эта директива позволяет проверять поля на значения и включать их или нет в ответ, а к пользователю приложение привязывает некое значение полей и на основании этих полей происходит фильтрация.
$geoNear - поиск относительно места расположения, в результате возвращается сначала самое близкое место и в конце самое отдаленное.
Ярлыки:
MongoDB
Подписаться на:
Сообщения (Atom)