Вход

Просмотр полной версии : Представляем вам ORMjs


ORMjs
20.06.2016, 06:29
Ссылка на скачку https://www.npmjs.com/package/ormjs

ORMjs это использования стандартных структур языка яваскрипт, таких как классы, для взаимодействия с базой данных. Класс представляет собой аналог коллекции в базе данных, а инстанс класса документ в коллекции. Более подробно вот тут https://ru.wikipedia.org/wiki/ORM

Статические методы класса выполняются для работы с колелкцией, а методы инстансов для работы с самим документом.
Таким образом, мы работаем с базой, без селекторов или специального языка, А работаем как бы с яваскрипт обьектами и их методами. А оно само все сохраняется в базу данных.

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


Перевод документации:

ORMjs это javascript ООП интерфейс для базы данных.
Он использует ArangoDB, но в будущем я добавлю драйверы для других баз (таких как mongodb)

Концепция: Используя ES6 оператор await, геттеры и промисы,
мы можем ассинхронно совершать навигацию по дереву графов документов в базе данных.

Оно рекомендуется с использованием ES6, но вы так же можете писать на ES5

Я думаю что это эпично =) Это крайне крайне крайне крайне крайне элегантное API для работы с базой данных.
А что вы думаете об этом?

Она использует ArangoDB https://www.arangodb.com/2015/10/benchmark-postgresql-mongodb-arangodb/
По ссылке тест производительности с другими базами данных типа Mongo.


API


static:

Model.get(_id) // получает модель по id
Model.add(obj) // создает модель на основе переданного обьекта
Model.remove(model) // удаляет модель
Model.restore(model) // восстанавливает удаленую модель
Model.save(model) // сохраняет изменения модели в базу данных
Model.update(model) // загружает состояние модели из базы данных


instance

Model.prototype.save() // псевдоним для Model.save(this)
Model.prototype.update() // псевдоним для Model.update(this)
Model.prototype.remove() // псевдоним для Model.remove(this)
Model.prototype.restore() // псевдоним для Model.remove(this)


Основы


Определим коллекцию User (именем коллекции станет имя класса)

let Model = require('ormjs')

class User extends Model {

static schema = {
// базовые типы
name: String,
male: Boolean,
age: Number,
birth: Date,
tags: Set, // как массив, только с уникальными элементами
status: ['sleep', 'eat'], // enum (значением поля может быть одно из перечисленных значений)

// структуры
messages: [String], // массив строк
prop1: {prop2: [{tags: [String]}] }, // можно описывать сколь угодно сложные вложенные структуры

// ссылки на сущности из других коллекций (ну или этой же)
bestFriend: User, // ссылка на инстанс User
friends: [User], // ссылка на массив инстансов User

// опции поля
name: String,
name: {$type: String},
name: {$type: String, test: /^\w+$/},
}

}



Example 0:



let Model = require('ormjs')


class User extends Model {

static schema = {
name: String,
age: Number,
}

}


Usage:


(async function () {

// adding user to db
let user = await User.add({
name: 'Ашот',
age: 24,
})

user._id // 'User/434370324723'
user._removed // false
user.name // 'Ашот'
user.age // 24

// change field
user.name = 'Ololo'
console.log(user.name) // 'Ololo' field is changed

// reset changes
await user.update() // load state from db
user.name // 'Ашот'

// saving changes
user.name = 'Ololo' // change field
await user.save() // save changes to db
await user.update() // load state from db
user.name // 'Ololo' because we save

}())


Example 1:


let Model = require('ormjs')


class User extends Model {

static schema = {
name: String,
age: Number,
friends: [User]
}


async addFriend(user) {
let friends = await this.friends
friends.push(user)
await this.save()
}


async removeAllFriends(){
this.friends = []
await this.save()
}

}


Usage:


(async function(){

let user = await User.add({
name: 'Ivan',
age: 24,
friends: []
})

await user.addFriend(user)
await user.addFriend(user)
await user.friends // [user, user] two itself =)

await user.removeAllFriends()
await user.friends // []

await user.friends === await user.friends // true

user.name = 22
await user.save() // ValidationError: Field `name` must be String, but have Number

})()



Example 2:


let Model = require('ormjs')


class Sector extends Model {

static schema = {
size: Number
}

}


class User extends Model {

static schema = {
name: String,
sector: Sector,
}

}


Usage:


(async function () {

let sector = await Sector.add({
size: 236
})

let user = await User.add({
name: 'Ашот',
sector: sector
})

(await user.sector).size // 236


let sector2 = await Sector.add({
size: 1004
})
user.sector = sector2
await user.save()

(await user.sector).size // 1004 because this another sector ^__^


})()


Custom types:

System types is: String, Number, Boolean, Data, Set
Actually we can use custom types:


let Model = require('ormjs')


class Color {

constructor(r, g, b) {
this.r = r
this.g = g
this.b = b
}


// convert to db document
toJSON() {
return {
r: this.r,
g: this.g,
b: this.b
}
}


// restore from db document
static fromJSON(json) {
return new Color(json.r, json.g, json.b)
}

}


class User extends Model {

static schema = {
name: String,
color: Color
}

}


Usage:


(async function () {

let user = await User.add({
name: 'Ашот',
color: new Color(0, 255, 0)
})

user.color instanceof Color //true

}())


Schemas


Number

schema = {
age: Number,
age: {$type: Number},
age: {$type: Number, min:0, max:100}
}



String

schema = {
name: String,
name: {$type: String},
name: {$type: String, min:3, max:20, test:/^\w+$/}
}



Set

schema = {
tags: Set,
tags: {$type: Set},
tags: {$type: Set, set: ['animals', 'porn', 'movie']}
}



Enum (for any type) Field value must be one of from enum array

schema = {
status: ['pending', 'resolve', 'reject']
}



Это часть большого проекта, но я выгрузил её как отдельный модуль NPM, возможно она будет кому-то полезна.
https://github.com/uMaxmaxmaximus/ui-js/tree/master/server/core/orm

Напишите кто нибудь статью на хабре, кто умеет писать на хабре =)

Erolast
20.06.2016, 07:26
Лол, ты же плевался с ES6) Изменил мнение?

И да, async/await - это уже ES7.

ORMjs
20.06.2016, 07:38
Лол, ты же плевался с ES6) Изменил мнение?
Блин :D :D :D :D :D ну че началось то?
Ну было дело, ну ошибался я, и про кофескрипт ошибался, ну я просто думал что вы все врете и хотите мне плохое посоветовать и зла желаете. И сами мучаетесь и хотите меня мучать. На самом деле я по прежнему ненавижу ES синтаксис и у меня в списке TODO 3 технических проэкта на ближайшие 2 года

1) MegaJS (это такой изоморфный фреймворк на базе UIjs (плюс позволит писать и под десктопы и мобилки как React Native))
2) CoffeeScript ES6
3) Аналог THREE с физикой (на Rust компилируемый в asm.js и wasm)

На самом деле эту ORM я написал за неделю, а там писать особо и нечего, потестируйте кто нить. Никогда в подобных ORM не хватало такой вот удобной ссылки на другую коллекцию let frields = await user.frields.

А вообще я поражаюсь как Babel написали стейт машину для ассинхронки. Это верх элеганства. Я бы не додумался, при том каллбак выполняется в том же конетксте следовательно сохраняются общие ппеременные и общий скоуп. Это феноминально.

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

Чтобы больше не пистаь на клиенте api.getUsers() а писать как будто бы у нас база данных прям в браузере есть. Ну как в Meteor

============== Ребят ну активнее активнее, пожалуйста =)
https://monosnap.com/file/h14WZB7XAj5CPjb2tqqtGoAk28FzmI.png

ORMjs
20.06.2016, 17:12
Ну ребята, я даже доку написал, все как вы просили, ну скачайте кто нибудь, протестируйте ну. Ну 0 даунлоадов за сутки ну...
https://pp.vk.me/c633229/v633229110/31b0c/FDDmlsU1nLI.jpg

destus
20.06.2016, 18:53
Будет custom validation и populate как в mongoose? Можно писать на генераторах с подключенной библиотекой co вместо async/await?

cyber
20.06.2016, 19:35
ORMjs, ты серьезно на гитхаб закинул после babel?

ORMjs
20.06.2016, 19:48
и populate как в mongoose?
Тут как бы если ты сделаешь популейт то как он узнает какой глубины граф тебе отдать? Это бессмысленно. Я делаю щас прослойку для клиенд сайда, где можно используя такой же api общаться с базой и лазить по её графу (но с учетом кастомной логики привелегий и разрешений, и доступа к полям и все такое, проверка на юзера и все такое). Так что в популейт не будет необходимости, ровно как и в api.getUsers() и все такое прочее. Вы просто в браузере будете работать с массивоподобными обьектами которые являются срезами с базы данных, делать по ним выборки, изменять их, где у вашего юзера не доступа то будет ошибка и.т.п.

Можно писать на генераторах с подключенной библиотекой co вместо async/await?
Я же так и написал) тут ссылки на другие коллекции возвращают промис и все, то есть можно вообще писать вот так user.friends.then(friendsArr=>) просто оператор async он как бы сахар для этого и ждет выполнения промиса, а если там не промис то просто возвращает это значение.

ты серьезно на гитхаб закинул после babel?
Ну а что не так? Как надо было? Я вообще-то на гитхаб весь проджект свой закинул, а orm это часть бякенда, который лежит в папке server. решил просто отдельный гитхаб не делать для orm

ORMjs
20.06.2016, 19:54
Будет custom validation
Да кстати, мелочь но щас сделаю. Ты и так можешь делать кастомную валидацию перекрыв статический метод validate() но тогда вручную придется пробегаться по полям схемы, а она может быть крайне сложной. По этому я лучше добавлю просто опции полям типа {$type:String, $test: function(){}}

Но вообще предполагается что валидация должна делаться на уровне модели. То есть у неё есть методы типа addUser
removeMessages и они уже валидируют параметры передаваемые в них и как то сейвят состояние. Максимум что должно быть на слое ORM это как бы длинна данных (чтобы память не жрала 10000к строка например) и какие-то вещи связанные с длинной данных в базе данных и типом, а корректность данных, с точки зрения приложения, должна проверяться самими моделями и прогарммистом отдельно. То есть валидация это уже уровень ИСПОЛЬЗОВАНИЯ ORM а не внутри ORM. Но для удобства я щас добавлю функции $test

destus
20.06.2016, 20:03
Я же так и написал) тут ссылки на другие коллекции возвращают промис и все, то есть можно вообще писать вот так user.friends.then(friendsArr=>) просто оператор async он как бы сахар для этого и ждет выполнения промиса, а если там не промис то просто возвращает это значение.

ок, просто для async надо Babel, а если делать проект с поддержкой ES6 браузерами из коробки, то можно всего-лишь подключить co размером ~4kb

ORMjs
20.06.2016, 20:19
Ну а кто вообще пишет на es6 и es7 без Babel? К тому же await это просто сахар на промисы, так что ограничений тут нет =)

(В typescript кстати await например есть)

cyber
20.06.2016, 20:52
Ну а что не так? Как надо было?
например так
/src - тут проект в исходном виде
/dist - после бабел
gulpfile.js|webpack.config.js - для сборки проекта (или другой сборщик)

ORMjs
20.06.2016, 21:50
/src - тут проект в исходном виде
/dist - после бабел
А нет, так код комплишен и node дебаггинг плохо работает у phpstorm. Чтобы скрывать исходники из npm нужно использовать .npmignore я просто забыл ^_^, да и в целом не вижу причин это делать.

НЕ обязательно разделять сорцы и билды на разные папки, если не предполагается делать сборку. Я не делаю сборку я делаю транспиляцию, сохраняя структуру и имена файлов, по этому для меня удобнее держать сорцы с одном месте с "билдом".

> webpack.config.js
вебпак нужен когда ты делаешь пак для веба, то есть обьединяешь разные файлы в один. для бакенда это обьединение файлов не нужно, более того, нужно максимально сорцы оставить, чтобы человек если что мог залезть в код модуля твоего и глянуть что там да как. то есть мне в целом сборку не нужно делать для бакенда. Я сборку делаю для фронтенда, вебпаком. Но на node собирать вебпаком это странно. у меня было и src и build но я понял что такая структура папок крайне неудобна и не подходит для моих проджектов. Это имхо.

Erolast
20.06.2016, 21:51
/src - тут проект в исходном виде
/dist - после бабел
Причем, src пушится на гитхаб, но не пушится в нпм, а dist пушится в нпм, но не пушится в гитхаб.

ORMjs
20.06.2016, 21:54
Причем, src пушится на гитхаб, но не пушится в нпм, а dist пушится в нпм, но не пушится в гитхаб.
Выше прочитай.

Erolast
20.06.2016, 21:55
Когда я писал пост, ты еще не ответил.

ORMjs
20.06.2016, 21:57
Когда я писал пост, ты еще не ответил.
Спасибо кэп). По этому и говорю.

cyber
20.06.2016, 22:21
для сборки проекта (или другой сборщик)
babel -d ./dist ./src -s
вебпак нужен когда ты делаешь пак для веба, т

ORMjs
21.06.2016, 04:38
cyber,
Почему не нужно чтобы были es6 файлы в npm модуле? Чтобы не увеличивать вес модуля. По этому надо добавить их в npm ignore.

1) Почему на гитхабе не должно быть собранных файлов? нипочему
2) Phpstorm не может делать дебаггинг если они в разных папках лежат
3) Phpstorm красиво подсвечивает скомпилированный файл, он прячет его в сорц файл как бы в папку так, что я всегда, в один клик, могу посмотреть во что оно там скомпилировалось, что повышает удобство разработки.

ORMjs
21.06.2016, 07:51
А по поводу ORM че думаете? Игрался кто нибудь?) Разве это не самое удобное ORM что вы видели? (осталось только дать индексы настраивать)

destus
21.06.2016, 08:33
А по поводу ORM че думаете? Игрался кто нибудь?) Разве это не самое удобное ORM что вы видели? (осталось только дать индексы настраивать)

Надо под Mongo релиз :)

fancy
21.06.2016, 13:27
Это часть большого проекта, но я выгрузил её как отдельный модуль NPM, возможно она будет кому-то полезна.
https://github.com/uMaxmaxmaximus/ui-js/tree/master/server/lib/orm

Напишите кто нибудь статью на хабре, кто умеет писать на хабре =)

Ну ребята, я даже доку написал, все как вы просили, ну скачайте кто нибудь, протестируйте ну. Ну 0 даунлоадов за сутки ну...

ORMjs(он же nemo),
каких даунлоадов ты ждешь?

Единственное место где ты опубликовал информацию о своем проекте - этот сайт.
Ты знаешь когда люди загружают модули с npm?
Когда есть серьезный проект и в разделе установки указано как поставить через npm.
В качестве примера HighCharts. У них есть раздел с установкой в документации.

Здесь твой пост прочитали от силы 15 человек, которые работают над своими задачами и как минимум твоя тема в данный момент им не нужна.

У тебя есть twitter с подписчиками?

Твой аккаунт на github с фоткой в трениках, оголенным торсом и ...
не вызывает никакого желание у людей даже посмотреть твой проект.
А ник из разряда неадекватов.

Если ты хочешь чтобы твоей наработкой кто-то пользовался.
1 - (о чем тебе уже лет 9 на этом форуме говорят) стань адекватным человеком. Не веди себя как ребенок в детском саду.
2 - Сделай нормальный twitter, github аккаунты.
3 - Сделай документацию, примеры, сайт(хотя бы github pages)
4 - Россия - это 2% мирового рынка. Успешные проекты ориентированы на глобальный рынок(есть исключения).
Есть разные сайты, разделы по интересам где можно добавить ссылку на проект, например сейчас набирает большую популярность
https://github.com/sindresorhus/awesome
5 - Научись нормально разговаривать, если ты будешь в том же стили писать на иностранных ресурсах - тебя вежливо будут посылать, игнорить и отправлять в бан.

Надеюсь я тебе помог советом.

nerv_
21.06.2016, 14:00
Если ты хочешь чтобы твоей наработкой кто-то пользовался.
1 - (о чем тебе уже лет 9 на этом форуме говорят) стань адекватным человеком. Не веди себя как ребенок в детском саду.
2 - Сделай нормальный twitter, github аккаунты.
3 - Сделай документацию, примеры, сайт(хотя бы github pages)
4 - Россия - это 2% мирового рынка. Успешные проекты ориентированы на глобальный рынок(есть исключения).
Есть разные сайты, разделы по интересам где можно добавить ссылку на проект, например сейчас набирает большую популярность
https://github.com/sindresorhus/awesome
5 - Научись нормально разговаривать, если ты будешь в том же стили писать на иностранных ресурсах - тебя вежливо будут посылать, игнорить и отправлять в бан.
Проще пересадить ему мозг от другого человека обезьяны. Но (!), зачем такие жертвы :D

ORMjs
21.06.2016, 14:40
Надо под Mongo релиз
Да блин, аранго же быстрее)! я же ссылку на тесты дал. К Тому же какая тебе разница если ты все ровно базу трогать не будешь напрямую.

ORMjs(он же nemo),
Я не немо я максимус и я не знаю кто такой немо, видимо какой то аутист который был тут до меня. Видимо мы похожи только НЕОБЫЧНОСТЬЮ, но тебе этого достаточно чтобы путать..


Надеюсь я тебе помог советом.
Да, теперь я знаю как пиарить MegaJS). Дело в том что это просто часть MegaJS, я выложил ЧИСТО для вас, 15 челоевк с форума. и доку тока для вас написал. Потому шо вы до этого бугуртили что вы не телепаты и не знаете названия функций. Ну я подумал "Ну логично" и написал доку.

каких даунлоадов ты ждешь?
Ну я просил вас потестить поиграться, а там 0 скачек было. При том вы все обсуждали либу. Я думаю "ну хоть скачали бы хоть раз". Потом я понял что npm статистика обновляется раз в сутки/

Плюс ко всему я адекватный =) Ты видимо меня с немо путаешь.

cyber
21.06.2016, 15:02
1) Почему на гитхабе не должно быть собранных файлов?
в каком месте я сказал что их не должно быть?
Я сказал что рядом должны лежать исходники до babel
П.с Потому что если бы я открыл либу , а там исходники после babel то я бы закрыл и большне не когда бы не юзал бы эту либу.

fancy
21.06.2016, 15:57
ORMjs,

Напишу тебе банальную вещь, которую студенты редко понимают после вуза.

Проект - это не куча кода!!!
Никого не интересуют мегабайты кода.
Всех интересуют проекты.

Итак, проект - это
0 - Название проекта.
1 - код, занимает от 50% времени
2 - тестирование
3 - документация!!!
4 - API!!!
5 - примеры(не куски кода на форуме)
6 - Support
7 - сайт
8 - приятный дизайн
9 - Раскрутка
10 - Адекватность(нормальная фотка или логотип всех аккаунтов)
11 - Вежливость, в твоем случаем - не использование гопнического сленга.

Можно добавить еще пару десятков пунктов.
Добавлю лишь 2.
12 - Когда тебе говорят про Mongo, это значит следующее.
На рынке используются множества решений и если твой продукт интегрирован с ними, то ты получаешь +200% потенциальных клиентов(нужно тебе это или нет, решай сам)
13 - Про билды в репозиториях.
Если не добавлять билды в .gitignore, то в скором времени при скачивании твоего небольшого проекта в 1 мб, общий размер проекта будет в несколько сотен мб.

P.S.:
Но прежде чем тратить месяцы-года на разработку, надо для себя определиться что ты в действительности хочешь.
1 - Заработать денег
2 - Просто интересно
Думаю в действительности тебе интересен пункт 1.
Тогда первым делом смотри какие есть аналоги, цены, популярность.

Если пункт 2, то приведу тебе пример моего знакомого - 40 лет, 2-ое детей.
5 лет делал в одного мега-крутую штуку. Серверное решение для обработки видео на одной из технологий Adobe.
Потом пришел инвестор с деньгами и сказал что ему надо, и вот уже 7 лет делает неинтересный ему проект но зарабатывает деньги на семью.

Крайне редко получается сделать успешный проект, вероятность от 0.1% до 1%. Но при каждой следующей попытки твои шансы увеличиваются.
Главное чтобы не получилось вот так - 10 лет потерянной жизни на никому не нужный софт!!!

Erolast
21.06.2016, 17:27
Если не добавлять билды в .gitignore, то в скором времени при скачивании твоего небольшого проекта в 1 мб, общий размер проекта будет в несколько сотен мб.

Да вот не надо, гит сжимает комиты.

Да блин, аранго же быстрее)! я же ссылку на тесты дал. К Тому же какая тебе разница если ты все ровно базу трогать не будешь
Не забывай, что любой программист - ленивая жопа. Изучать новый фреймворк - и так выход из зоны комфорта, а если ради него приходится осваивать еще что-то (в твоем случае - новую СУБД), то всякое рвение пропадает напрочь, не успев возникнуть.

fancy
21.06.2016, 17:47
Да вот не надо, гит сжимает комиты.
Я не говорил что не сжимает.
При каждом build-e плюсом от 20-100 кб (сжатых коммитов библиотеки).
После нескольких десятков коммитов...

Гляньте хотя бы репозиторий jquery.
https://github.com/jquery/jquery
Там нет build-ов jquery.

Build-ы библиотеки в репозитории - плохой стиль!

ORMjs
22.06.2016, 05:49
Я сказал что рядом должны лежать исходники до babel
es6 это babel, js это не babel

П.с Потому что если бы я открыл либу , а там исходники после babel то я бы закрыл и большне не когда бы не юзал бы эту либу.
Ну это потому что видимо у тебя не хватило внимательности понять что исходники в формате es6 а билды формате js? и ты бы не использовал либу не из-за разработчика, а по своей невнимательности. Вот тебе яркий пример где ты ОШИБСЯ, а либу бы не использовал чисто по своей вине.

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

10 лет потерянной жизни на никому не нужный софт!!!
90% это я для себя делаю чтобы быстро сайтики клепать. А 10% это чтобы и с другими поделиться, не жадничать такое сокровище. Я серьезно. Ну и слава мне нужна, чтобы все охреневали как я могу =)


Изучать новый фреймворк
4 метода? добавить удалить обновить найти. Я Эту штуку И НАЧАЛ делать чтобы абстрагироваться от убогого API множества баз данных и сделать Api в используя классы и инстансы яваскрипта. чтобы ничего учить и не пришлось

в твоем случае - новую СУБД
Я же сказал что ты не будешь работать с субд, то КАКИМ МАГИЧЕСКИМ ОБРАЗОМ Я сохраняю СОСТОЯНИЯ ОБЬЕКТОВ это уже мое дело) Я захочу одно поставлю захочу потом вообще другую бд буду использовать. Понимаешь? Эта штука И НУЖНА чтобы НЕ РАБОТАТЬ больше с базой данных, ибо нам не база данных нужна а обьекты которые бы не удалялись после завершения программы а после запуска снова имели свое состояние. А как оно будет делаться уже мои проблемы. База данных это прога чтобы инфу хранить. Зачем хранить инфу? Чтобы когда петя добавил камент, он к даше прилетел. НО при том все это не лежало в оперативке. И вот эти обьекты и позволяют реализовать класс Comment который будет откуда то браться и сохранять свое состояние.

Википедия:
Суть задачи состоит в преобразовании таких объектов в форму, в которой они могут быть сохранены в файлах или базах данных, и которые легко могут быть извлечены в последующем, с сохранением свойств объектов и отношений между ними. Эти объекты называют «хранимыми» (англ. persistent).

===
Проще пересадить ему мозг
От того что я нарушаю какие-то мемы, которыми тебя напичкала культура, не означает что я более глупый, скорее наоборот. И я не понимаю к чему такие оскорбления и как они связаны с ORMjs. P.S> http://ru.wikipedia.org/wiki/Ad_hominem

ORMjs
22.06.2016, 06:30
Build-ы библиотеки в репозитории - плохой стиль!
Кому он вредит и как? Увеличиваетя размер репозитория. И кому это вредит и как? - Никому и никак. Даже THREEjs делают билды в репозитории. Да что там, вообще все делают билды в репозитории.

fancy
22.06.2016, 07:30
Кому он вредит и как? Увеличиваетя размер репозитория. И кому это вредит и как? - Никому и никак. Даже THREEjs делают билды в репозитории. Да что там, вообще все делают билды в репозитории.

mrdoob - особый человек.
Он постарался сделать чтобы Three.js могли использовать даже плохо знакомые с JS.

Постараюсь еще раз объяснить чем это плохо.
Если при простом изменении файла - хранятся строки изменений.
То с минифицированной версией(представляющей из себя по сути одну строку) в качестве изменения храниться одна строка в несколько десятков килобайт.
Если билд делается хотя бы раз в неделю и при среднем размере заархивиронной мин версии библиотеки в 40 кб, получаем за год порядка 1.8 мб. Если же у вас несколько вариаций мин версий то может быть и 10-20 мб за год.

fancy
22.06.2016, 08:02
Ууу совершенно нет, я деляю крутую платформу для себя, а с людьми просто делюсь. Существующие решения ужасны а мое великолепно и как глоток свежего воздуха, и я хочу чтобы и другие люди не мучались больше используя те. старые продукты. То есть чисто альтруизм. =) Деньги я на пиццерие зарабатываю.


90% это я для себя делаю чтобы быстро сайтики клепать. А 10% это чтобы и с другими поделиться, не жадничать такое сокровище. Я серьезно. Ну и слава мне нужна, чтобы все охреневали как я могу =)


Уже несколько лет читаю твои заявления про интересный, современный проект.
Если быть честным, так и не понял что конкретно ты делаешь.
Но по данной теме понял, что решения связанные с базами данных.
Позволь показать тебе реально хороший проект из этой сферы.
https://realm.io/

Я не знаю сколько тебе лет, какое образование.
Скажу как если бы ты был моим студентом.

Ты еще очень много не знаешь, но это не беда. Если хочешь сделать проект - все возможно.
Есть проверенный временем подход - MVP.
Minimum viable product - минимально жизнеспособный продукт.
Большинство молодых разработчиков, хотят сделать что-то большое,
но потратив год-два своей жизни бросают это, потом начинают что-то новое и опять повторяется.
Необходимо понимать, что у тебя есть - ты один, времени мало, инвестиций нет, но есть цель.
Если ты действительно хочешь ее достичь, посчитай сколько тебе надо времени на самую минимальную разработку в часах - не должно быть больше 300 часов. Далее тебе необходимо будет сделать - API, документацию, тесты и множество других моментов о которых ты даже и не думал вначале - это будет еще +100% уже потраченного времени.

И вот, прошло пол-года, у тебя есть MVP твоего проекта. Начинается раскрутка. Находи форумы, разделы, twitter group-ы и т.д. которым это может быть интересно и вперед. Но помни успех не приходит сразу, требуется от 1 года, чтобы проект стал пользоваться популярностью.
И самое главное - прислушивайся к отзывам, негативное отношение к твоему проекту - это недоработки, которые необходимо исправлять, а не спорить. Ты же не споришь в багами к коде, ты их исправляешь!!!

Erolast
22.06.2016, 08:36
Я же сказал что ты не будешь работать с субд, то КАКИМ МАГИЧЕСКИМ ОБРАЗОМ Я сохраняю СОСТОЯНИЯ ОБЬЕКТОВ это уже мое дело)
Да ладно, установит аронго и перенесет в него все мои базы фреймворк тоже автоматически?
Нет уж, любая СУБД - штука комплексная и тяжелая, и какая будет стоять у меня на машине - это как раз-таки моё дело.

ORMjs
22.06.2016, 09:20
Если быть честным, так и не понял что конкретно ты делаешь.
Ну я написал около 6 фреймворков для фронтенда, и каждый раз делал все лучше и лучше, пока не обогнал ангуляр 2. Далее я решил написать к нему бакенд. И обьединить все это в название MegaJS. А по скольку там используется виртуал дом, то значит можно пилить компоненты и под ios и android как ReactNative. Смысл в том чтобы поднять абстракции на высоченный уровень, выше чем в Meteor. Чтобы по простоте была как Вордпресс, но для программистов. Я делаю изоморфную платформу для создания веб приложений. Если говорить обобщенно. Так же там будет маркет компонентов. Типа чатиков и всего такого. Которые подключаются простым тегом <chat></chat>. То есть смесь реакт, полимер, ангуляр 2 и метеор

Я не знаю сколько тебе лет, какое образование
24 года, образование это процесс передачи знаний от старых поколений новым. у меня высшее, несмотря на то что я самоучка. У меня нет диплома об образовании, так как мне не нравится образовательная система, готоващая рабов, и я не пользовался ей с 7 класса. =)

и перенесет в него все мои базы
Нельзя перенести проект на эту платформу, только с нуля начинать. Или ты тоже от ангуляра требуешь чтобы он весь твой код напсианый для реакта переписывал?

fancy
22.06.2016, 10:59
Ну я написал около 6 фреймворков для фронтенда, и каждый раз делал все лучше и лучше, пока не обогнал ангуляр 2. Далее я решил написать к нему бакенд. И обьединить все это в название MegaJS. А по скольку там используется виртуал дом, то значит можно пилить компоненты и под ios и android как ReactNative. Смысл в том чтобы поднять абстракции на высоченный уровень, выше чем в Meteor. Чтобы по простоте была как Вордпресс, но для программистов. Я делаю изоморфную платформу для создания веб приложений. Если говорить обобщенно. Так же там будет маркет компонентов. Типа чатиков и всего такого. Которые подключаются простым тегом <chat></chat>. То есть смесь реакт, полимер, ангуляр 2 и метеор


24 года, образование это процесс передачи знаний от старых поколений новым. у меня высшее, несмотря на то что я самоучка. У меня нет диплома об образовании, так как мне не нравится образовательная система, готоващая рабов, и я не пользовался ей с 7 класса. =)



Где можно увидеть твои наработки?
В поисковиках на запрос "MegaJS" - ничего нет.
Как люди могут узнать что ты хороший специалист, что у тебя проект лучше чем Angular 2?
Им необходимо найти твой проект на github без описания и документации https://github.com/uMaxmaxmaximus/ui-js/ и копать исходники?

Насколько я понял, тебя звать Иван Вольнов.
Ваня, разреши попросить тебя еще раз - смени аватарку у github аккаунта, ну или хотя бы удали.

Почему у тебя коммиты на русском языке?
Ты только для пользователей стран СНГ делаешь свой проект?

P.S.:
Опять про твой ник - uMaxmaxmaximus.
Ты фанат фильма Гладиатор?
Это здорово, но людям это зачем знать?
Придумай ник с меньшим количеством символов, например - umax.

Тебе нужно работать с речью.
Многие IT спецы погруженные в работу говорят на коде.
Но ты живешь в сообществе и если ты хочешь что-то донести до людей, то надо выражаться на понятном, приличном языке без сленга.
Ты же не хочешь, чтобы тебя все называли Гоп-Инженер или тому подобное.

ORMjs
22.06.2016, 11:10
мени аватарку у github аккаунта, ну или хотя бы удали.
Это бренд, иван это неймфаг с имиджборд и его по аватарке узнают. Она популярна и бренд. Придумай ник с меньшим количеством символов, например - umax.
Я пока не начал делать публичный репозиторий. Я исполдьзую гитхаб ТОЛЬКо для себя и ТОЛЬКО как защита чтобы комп когда сгарит проэкт не пропал.

У меня есть и стайл и иконка фреймворка, и я уже аккаунт зарегал MegaJsTeam и все такое прочее =)

Я фреймворк начну этот писать осенью. Пока же я занимаюсь бизнесом. И просто вам кусочек кода выложил. Вдруг пригодится.

Гоп-Инженер
Гопники они разговаривают "Ты проще разговаривай, терпила" а я разговараю "хах, ну ты лалка" это сленг с борд. Гопники тут не при чем, разные субкультуры. Более того, я не использую манеру общения из субкультур в айти.


Почему у тебя коммиты на русском языке?
Потому что коммиты я пишу лишь потому, что пустую строку оставлять нельзя. Я не опсиываю коммиты и они слушал для меня лишь сейвпойнтами. Я веду разработку один и не делаю форков. ПО этому не использую 99% гита. =)

Когда я начну делать проджект Mega публичным тогда я все сделаю как положено. ТО что ты говоришь это очевидно, но спасибо все ровно)

cyber
22.06.2016, 11:28
Это бренд, иван это неймфаг с имиджборд и его по аватарке узнают. Она популярна и бренд.
*faceplam*

nerv_
22.06.2016, 11:28
Гопники они разговаривают "Ты проще разговаривай, терпила" а я разговараю "хах, ну ты лалка" это сленг с борд. Гопники тут не при чем, разные субкультуры. Более того, я не использую манеру общения из субкультур в айти.

мы все уже >2 лет наблюдаем, как ты ее не исползуешь


fancy, ты пишешь правильные вещи, я с удовольствием их прочитал. Только донести их до ORMjs вряд ли получится (и надо ли оно тебе?). Почему я так думаю? Потому, что чукча писатель, а не читатель :)

fancy
22.06.2016, 11:30
Это бренд, иван это неймфаг с имиджборд и его по аватарке узнают. Она популярна и бренд.
Я пока не начал делать публичный репозиторий. Я исполдьзую гитхаб ТОЛЬКо для себя и ТОЛЬКО как защита чтобы комп когда сгарит проэкт не пропал.

У меня есть и стайл и иконка фреймворка, и я уже аккаунт зарегал MegaJsTeam и все такое прочее =)

Я фреймворк начну этот писать осенью. Пока же я занимаюсь бизнесом. И просто вам кусочек кода выложил. Вдруг пригодится.


Гопники они разговаривают "Ты проще разговаривай, терпила" а я разговараю "хах, ну ты лалка" это сленг с борд. Гопники тут не при чем, разные субкультуры. Более того, я не использую манеру общения из субкультур в айти.


Потому что коммиты я пишу лишь потому, что пустую строку оставлять нельзя. Я не опсиываю коммиты и они слушал для меня лишь сейвпойнтами. Я веду разработку один и не делаю форков. ПО этому не использую 99% гита. =)

Когда я начну делать проджект Mega публичным тогда я все сделаю как положено. ТО что ты говоришь это очевидно, но спасибо все ровно)

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

P.S.:
Я тебе скажу прямым текстом, раз ты не понимаешь.
Нам в фирму нужны люди, но я НИКОГДА не возьму такого как ты, потому что я не смогу с тобой работать и я не хочу постоянно объяснять начальству почему у нас ГОП-Инженер, из-за которого мы теряем клиентов.
Надеюсь я достаточно доходчиво объяснил почему тебе надо меняться.

Не ждет тебя никакой мега проект и успех, ты просто сопьешься к 35 годам потому что у тебя ничего не будет получаться из-за твоего отношения к людям и жизни.

yazonnile
22.06.2016, 12:31
Так Максимаксимус уже уходил пару раз с форума.
Всех посылал и уходил. Потом банили его за весьма грубые оскорбления.
Снова вернулся?
Альтруизм из ушей прет, делиться своим поносом с людьми? :)

ORMjs
22.06.2016, 17:48
мы все уже >2 лет наблюдаем, как ты ее не исползуешь
уже год не использую


Нам в фирму нужны люди
У меня своя фирма и свои проджекты, включая веб рулетки и агргатор пиццерий с конструктором пицц =) и куча всего еще. спасибо, ни когда не работал ни на кого и не собираюсь. но спасибо за попытку. без иронии

у нас ГОП-Инженер, из-за которого мы теряем клиентов.
Инженер вообще не должен общаться с клиентами, этим должен заниматься отдел продаж. По крайней мере когда я основал веб студию Абиллана, у нас было так.

Надеюсь я достаточно доходчиво объяснил почему тебе надо меняться.
Что конкретно мне надо поменять?

Не ждет тебя никакой мега проект и успех, ты просто сопьешься к 35 годам потому что у тебя ничего не будет получаться из-за твоего отношения к людям и жизни.
У меня все получается что я задумал, я иду к своей целе уже 8-9 лет, и все получается идеально) Я хочу автоматизировать генерацию товаров и услуг и освободить людей от работы и денег. И все идет по плану). И я уже спился. вы просто проэцируете на меня свои цели и систему ценностей "устроица на работу, генерировать товары и услуги, выменивать их у других людей на их товары и услуги, использовать товары и услуги, умиреть" такая жизнь не по мне =) правда. Не понимаю с чего ты взял что у меня какие-то проблемы и что мне нужна помощь в чем то? Я феноминальный чепловек. Гений. У меня идеальный путь. И другие должны ему следовать. Меняться нужно не мне а остальным. Что у меня вполне неплохо получается делать.

своим поносом
Почему поносом? Какие недостатки?

Только донести их до ORMjs вряд ли получится
Вот это верно, это как боговер ученому загоняет "вы увидите свет, дожлны принять" а он ему "о чем речь? какой свет ваще?" а другой священник подбегает "да че ты ему обьясняешь, он отправлен наукой, нет в нем души, не понять ему".

Ну тока тут отличие в том что он очевидности говорит, а боговеры чушь порят.

nerv_, то есть тот факт что я писатель а не читатель, не означает что мои взгляды не могут совпадать с егоными. в данном случае они в 100% совпали. Более того, я все намеренно и осознанно перенимаю у других людей, точнее не все а все хорошее, а все плохое (например табу на секс или на мат или на деление на страны) не перенимаю.

Я вам уже обьяснял что такое мемы и что 99% населения земли просто рабы матрицы, рабы культуры, рабы мемов. Я человек вне системы, вне матрицы. Я хорошие части хороших мемов беру, плохие части плохих мемов не беру. А вы все подряд берете. И когда я не схавал какой то бессмысленный или плохой мем, вы мне говорите "нууу твоя модель поведения отличается она плохая от того что отличается" чел, это у тебя плохая. все мои отличия это ХОРОГИЕ отличия. Например ругаться матом - ХОРОШО. Нет причимн ТАБУИРОВАТЬ МАТ. Мат это слова о сексе а секс у рабов под табу из за венеричесикх заболеваний в прошлом. Это мем такой которым тебя напискала культура и ты просто выполняешь его программу не думая своей головой. Потому что если бы думал, то ты бы определил что этот мем ошибочен. Так же ты бы определил что и мем оскорблений не верен, так как понижение социального статуса через перечисление социальных недостатков, не понижает социальынй статус, если недостатки не настоящие. и.т.п.

ЭТО ВАМ надо учиться у меня потому как я крайне образованный и просветленный человек. А не навязывать сови приметивные, логически не обоснованные и устарелые нормы марали. А вернее не свои а те которые вам матрица в голову вдолбила. Да так вдолбила, что они вам кажутся как будто бы это ВАШИ СВОИ ЛИЧНЫЕ мысли.

Ребят, вы не обижайтесь конечно, но не надо сравнивать себя и меня. У нас разные уровни. Лучше либу оцените что я вам подкинул =)

fancy
22.06.2016, 18:32
У меня своя фирма и свои проджекты, включая веб рулетки и агргатор пиццерий с конструктором пицц =) и куча всего еще.


Хотя бы один покажи.


Инженер вообще не должен общаться с клиентами, этим должен заниматься отдел продаж. По крайней мере когда я основал веб студию Абиллана, у нас было так.


Думаю в stripe о твоем мнении не знают.


У меня все получается что я задумал, я иду к своей целе уже 8-9 лет, и все получается идеально) Я хочу автоматизировать генерацию товаров и услуг и освободить людей от работы и денег. И все идет по плану).

Где? Хотя бы один проект?
Зачем ты сам себя обманываешь.

Прости парень, нашел твой аккаунт в вк.
Мне кажется у тебя шизофрения.
Мне просто тебя жалко.

ORMjs
22.06.2016, 18:36
Хотя бы один покажи.
Не хочу.

Зачем ты сам себя обманываешь.
Я не обманываю сам себя.

Мне кажется у тебя шизофрения.
У меня нет психических отклонений. Скорее наоборот.

Мне просто тебя жалко и думаю тебе никто не поможет.

Мне не нужно помогать и тебе не жалко меня. =)

https://ru.wikipedia.org/wiki/Ad_hominem


Ну так и быть, папку с исходниками старых проэктов которые складываю в папку _ покажу. Там и аналитика для телетрейда за 700к за пол года разработки на двоих. Там и для дистрибьютера уаза сайт. И для Ульянки воды сайт (правда у них щас какого то хрена другой парашный стоит не понятно почему) и куча всего.

https://monosnap.com/file/Gu3a1TmUgF7vKLOhxPMOmqyHnkvTGL.png

Я не знай с чего это ты взял что мн нужна какая-то помощь)))))) и что у меня что-то не получается =) скорей наоборот ребят. И вообще я чувствую ся Доктором Хаусом, которому все почему-то хотят помочь))

ORMjs
22.06.2016, 18:43
Обновил API

https://pp.vk.me/c633229/v633229110/3215b/Gu9w006I5N4.jpg

cyber
22.06.2016, 19:53
ORMjs, смысел делать remove если судя по методу restore он не удаляются полностью?

ORMjs
22.06.2016, 20:47
смысел делать remove если судя по методу restore он не удаляются полностью?
Чтобы во время find он не попадал в выборку. Документы не удаляются полностью чтобы не нарушить целостность базы. Базой напрямую можно управлять через Аранго веб панель, где можно так же скрипты писать для очистки _removed = true документов. Если вдруг такое кому-то в голову может придти. но нормальные люди базу вообще не очищают и не удаляют загруженные файлы на сервер. Когда место кончается они просто докупают новую память. Я имею ввиду серьезные люди которые бизнес ведут в интернете, они ни когда не будут удалять записи с базы данных. ВО первых они могут для статистики понадобиться, во вторых для запросов органов власти, в третьих целостность базы нарушается если удалить их. и.т.п. то есть данный remove это уровня приложения, а remove навсегда это уровень баps данных.

Не думал что это не общеизвестно =)

Я вот думаю добавить еще поле _removeTime, ну знаешь, чтобы логику ресторам какую-то давать, типа можно восстанавливать только в течении минуты после удаления и.т.п. чтобы вручную это не реализовывал програмист

смысел делать remove
Закрыл сессию, удалил пользователя и.т.п. _removed это логика приложения а не структуры данных.

Erolast
22.06.2016, 20:52
Да блин, ребят, что вы так на максимуса-то понаехали? Человек вернулся на форум с хорошим настроением, извинениями и стремлением стать лучше, ну неужели сложно ему в этом помочь? Зачем к старому-то возвращаться?

ORMjs
22.06.2016, 20:53
Да блин, ребят, что вы так на максимуса-то понаехали? Человек вернулся на форум с хорошим настроением, извинениями и стремлением стать лучше, ну неужели сложно ему в этом помочь? Зачем к старому-то возвращаться?
Вот кстати да, агр какой то непонятный.
Вот кстати как удобно и просто реализовываются сессии пользователей
https://github.com/arangodb/arangodb/issues/1885#issuecomment-227796089
========

Erolast
22.06.2016, 21:35
let key = Math.random() + ''
Тут замечание - использовать мас.рандом в качестве ключа не очень безопасно.
Читал https://habrahabr.ru/company/mailru/blog/274253/? Не то, чтобы это было слишком критично, но для надежности я бы лучше использовал crypto.randomBytes (https://nodejs.org/api/crypto.html#crypto_crypto_randombytes_size_callbac k).

ORMjs
23.06.2016, 04:50
Тут замечание - использовать мас.рандом в качестве ключа не очень безопасно.
Разумеется я использовал абстрактный пример, который даже не сохраняет юзерагент (а это нужно делать, так как защита от воровства кук). Тут целью было показать как просто и логично и В КАК МАЛО КОДА реализуются такие штуки =)

Я использую это:

static createRandomString(length = 64) {
return crypto.randomBytes(length).toString('hex')
}

Erolast
23.06.2016, 06:42
Разумеется я использовал абстрактный пример
А, окей.


Я использую это:
static createRandomString(length = 64) {
return crypto.randomBytes(length).toString('hex')
}

Но тогда еще замечание. Из документации:
The crypto.randomBytes() method will block until there is sufficient entropy. This should normally never take longer than a few milliseconds. The only time when generating the random bytes may conceivably block for a longer period of time is right after boot, when the whole system is still low on entropy.

randomBytes может блокировать программу. Если есть возможность, лучше использовать асинхронный вариант:
static createRandomString(length = 64) {
return new Promise((resolve, reject) => {
crypto.randomBytes(length, (error, buffer) => {
if (error) {
reject(error);
} else {
resolve(buffer.toString('hex'));
}
});
});
}

ORMjs
23.06.2016, 06:56
Если есть возможность, лучше использовать асинхронный вариант:
Не, тогда код станет некрасивый =) ничего страшного, пусть синхронно будет. Плюс там сказано что тока вначале тупить будет а потом норм.

nerv_
23.06.2016, 09:06
Обновил API

https://pp.vk.me/c633229/v633229110/3215b/Gu9w006I5N4.jpg

Что-то оно мне напоминает (http://www.camintejs.com/en/guide#common-api). Ах, ну да, это у тебя идеи украли :)

ORMjs
23.06.2016, 09:25
nerv_,

1) во первых оно ни чем не напоминает
2) во вторых не у меня крали идеи, а Я обычно идеи краду
3) в третьих, НУ ВООБЩЕ не напоминает :no:
4) в четвертых, попробую украсть что нибудь у них
5) украду count, exists и опцию поля {index : true} =)

https://pp.vk.me/c633229/v633229351/38ec2/JcxijDplc_s.jpg

млять я настройки для базы данных забыл задаавть дать))

Во, вот так будет
https://monosnap.com/file/cX6DxcO3cAuaYdlvkCNxKCR7ZIuGd6.png

ORMjs
23.06.2016, 21:43
conenct :lol:

apapacy
16.01.2017, 03:05
1. Хотелось бы побольше опций (пользователь/пыроль/хост/порт/пулл/реконнект...)
2. Хотелось бы иметь доступ к нативныи запросам, т.к. помимо производительности в arangodb главной отличительной фичей является оригинальный JOIN основанный на вложенных операторах FOR doc1 in collection1 FOR doc2 in collection2 FILTER doc2.parentId == doc1._id - при наличии индексов работает эффективно
3. Делать всеядный ОРМ - это еще вопрос. Для монги уже есть iridium, для реляционных sequelize. А вот для arangodb нет ничего и от дистрибьюторов arangojs однозначный был дан ответ что над odm/orm они в обозримом будущем работать не планируют.

Так что в следующем проекте обязательно использую arangodb+ormjs. Только бы п.1 был учтен (больше опиций) а то как-то.

С учетом текущего состояния вопроса mongo>>= arangodb++

ЗЫ. На днях реализовал на монге "JOIN" (постраничный фильтр по наименованию из свзяанной таблицы) при помощи map/reduce - все конечно возможно, но кодить много, при этом между нодой и монгой приходится гонять объекты из фильтрованных идентификаторов что конечно не очень. JOIN из коробки есть также в cоuchbase - весьма тормозной по производительности так как в основе ее CouchDB. А также в rethinkdb - весьма требовательна по ресурсам и валится с разрушением базы при исчерпании ресурсов. А также JOIN в rethinkdb это что-то вроде r.table("employees").eq_join("company_id", r.table("companies")).run(). Никаого сравнения по простоте с arangodb FOR... FOR... не идет.

Так что так держать. И желаю Вам побольше дистрибьюторов.

Safort
17.01.2017, 02:46
Библиотеки, фреймворки, это всё, конечно, хорошо(нет), но Максимус снова отправляется на банановые острова.

Тем, кто забыл причины, я напомню за что: мульты, троллинг, оскорбление пользователей форума.