суббота, 26 июля 2014 г.

Хорошая статья про то как узнать апи мобильных приложений

http://timrogers.uk/2014/07/12/discovering-private-apis-with-charles-app/?utm_source=hackernewsletter&utm_medium=email&utm_term=fav


среда, 23 июля 2014 г.

Подебажить MySQL запросы

1. Заходим под рутом в mysql shell
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 

четверг, 10 июля 2014 г.

MongoDB Sharding

Мы запускаем шардинг....

Default MongoDB Ports

Default MongoDB Port

The following table lists the default ports used by MongoDB:
Default PortDescription
27017The default port for mongod and mongos instances. You can change this port with port or --port.
27018The default port when running with --shardsvr runtime operation or the shardsvr value for the clusterRolesetting in a configuration file.
27019The default port when running with --configsvr runtime operation or the configsvr value for the clusterRolesetting in a configuration file.
28017The 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 replication

В контексте MongoDB процедура репликации связана с понятие репликасет. Реплика сет это:
- группа нод, в которых одна является праймери, другие - секондари;
- приложение подключается к праймери, все изменения, которые приходят на праймери, дублицируются на секондари ноды;
- когда праймери падает, репликасет решает какая из секондари нод становится новой праймери, и приложение переподключается на нее, таким образом если быть более точным, то приложение подключается к репликесету, а уже репликасет решает к какой ноде полючить соединение;
- когда упавший праймери подымается, он уже становится одним из секондари и вступает в работу с записи всех изменений, который пришли в репликусет без него;
- минимальное количесвто нод в репликесете 3.


среда, 9 июля 2014 г.

Comparison Matrix



Operation descriptionMongoClient ShellNodeJs DriverJava DriverPython 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) {
  ...
});

воскресенье, 6 июля 2014 г.

Разница между load и get

load(Entity.class, idVal) - кинет исключение, если в базе нет такой сущности с указанным айди.
get(Entity.class, idVal) - вернет налл, если в базе нет такой сущности с указанным айди.

четверг, 3 июля 2014 г.

MongoDB Aggregation

С помощью этого функционала мы можем групировать по неким полям наши результаты запросов, при этом проводить некие исчисления над полями одной групы для получения общего результата для группы; преобразовывать; фильтровать; сортировать; обрезать; а также строить пайпланы для обработки уже обработанных результатов.

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 - поиск относительно места расположения, в результате возвращается сначала самое близкое место и в конце самое отдаленное.