@proelixir

Страница 155 из 1045
Stanislav
22.10.2016
02:25:45
бля тут живые есть

Nick
22.10.2016
02:25:49
Да я давно тут.

Не активничаю просто

Привет, да

Google
Anton
22.10.2016
02:26:28
Ты не в Москве часом?

Nick
22.10.2016
02:26:52
Не. В пердях своих сижу.

Anton
22.10.2016
02:27:15
Эх, я уж надеялся затусить сегодня, лол

Stanislav
22.10.2016
02:28:38
Не. В пердях своих сижу.
а перди это где?

Nick
22.10.2016
02:29:04
В моём случае — Нижний Новгород

Stanislav
22.10.2016
02:29:30
В моём случае — Нижний Новгород
далековато в любом случае)

Nikolay
22.10.2016
03:10:31
Эх, я уж надеялся затусить сегодня, лол
Railsclub попойка затянулась?)

Anton
22.10.2016
03:12:59
А хз

Константин
22.10.2016
04:35:07
Материться можно только Вове, он это делает в тему.

Оп в бане.

Остальным можно материться, но значительно меньше Вовы ?

Taras ?
22.10.2016
10:49:02
что значит ошибка феникса [error] backend port not found: :inotifywait и что делать?

Google
Dmitry ?
22.10.2016
11:03:16
https://github.com/phoenixframework/phoenix/issues/776

Taras ?
22.10.2016
12:16:20
вопрос насчет составного индекса - правильно ли я понимаю, что : create unique_index(:users, [:nickname, :email]) будет следить только за уникальной комбинацией логина и емейла, и будет пропускать отдельно логины и емейлы (возможен отдельный дубляж логинов и емейлов, невозможен дубляж только комбинации логин+емейл) в отличии от create unique_index(:users, [:email]) create unique_index(:users, [:nickname]) ?

pny
22.10.2016
12:20:07
Да

Taras ?
22.10.2016
13:15:52
iex(10)> re = ~r/^([a-zA-Z0-9-_*])+$/ ~r/^([a-zA-Z0-9-_*])+$/ iex(11)> "88*" =~ re true iex(12)> "88\*" =~ re true iex(13)> "88/*" =~ re false почему так? как сделать чтобы на \ тоже было false ?

Serhij
22.10.2016
13:30:38
\ же для отражения строк предназначен

Taras ?
22.10.2016
13:32:08
и как же правильно приготовить регулярку логина?

в чем разница между re = ~r/^([\w-\*])+$/i и re = ~R/^([\w-\*])+$/i ? так же пропускает \

Serhij
22.10.2016
13:38:58
\ в консоли внутри строки служит для экранирования Если ты хочешь чтобы строка содержала обратный слеш, то нужно вот так: "hello\\"

Taras ?
22.10.2016
13:39:56
тоесть регулярка норм работает?

благодарямс)

правильно ли я помню —- если у меня есть таблицы - пользователи, посты, комменты — и в schema "users" я напишу has_many :posts, Blog.Post, on_delete: :delete_all has_many :comments, Blog.Comment, on_delete: :delete_all при удалении пользователя - удалятся все его посты и все его комменты ? (в миграции references и belongs_to в схемах постов и комментов - в наличии)

defiat
22.10.2016
19:46:39
CP2020.pdf

Taras ?
22.10.2016
22:04:59
в каких случаях появляется ошибка == Compilation error on file web/views/post_view.ex == ** (TokenMissingError) web/templates/post/comments.html.eex:13: missing terminator: end (for "do" starting at line 12) (eex) lib/eex/compiler.ex:34: EEx.Compiler.generate_buffer/4 (phoenix) lib/phoenix/template.ex:378: Phoenix.Template.compile/2 (phoenix) lib/phoenix/template.ex:186: Phoenix.Template."-MACRO-__before_compile__/2-fun-0-"/3 (elixir) lib/enum.ex:1623: Enum."-reduce/3-lists^foldl/2-0-"/3 (phoenix) expanding macro: Phoenix.Template.__before_compile__/1 web/views/post_view.ex:1: Blog.PostView (module) (elixir) lib/kernel/parallel_compiler.ex:117: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1 если с end-ами все хорошо?

Dmitry
22.10.2016
22:05:46
В шаблоне точно все хорошо с эндами?

Taras ?
22.10.2016
22:06:10
точно, два часа уже сижу

Dmitry
22.10.2016
22:06:37
Стопудово косяк где то

Taras ?
22.10.2016
22:06:50
переписал - вынес весь html с for внутрь <%= ... %> в {:safe, "..."} —- тогда скомпилилось

Dmitry
22.10.2016
22:07:25
Может в каком нибудь ИФе равно пропустил

Или процент где нибудь забыл

Это ж шаблоны

Google
Taras ?
23.10.2016
00:14:10
я так и не понял почему там ошибка появилась и почему пропала)

теперь новая фигня — пытаюсь сделать поиск "lower(...)" query = from u in "users", where: fragment("LOWER(?)", u.nickname) == type(^nickname, u.nickname), select: fragment("*") query |> first([]) |> repo.one вроде все как пишет в https://hexdocs.pm/ecto/Ecto.Query.API.html#fragment/1 но получаю == Compilation error on file web/models/session.ex == ** (CompileError) web/models/session.ex:20: cannot use ^nickname outside of match clauses (stdlib) lists.erl:1354: :lists.mapfoldl/3 (stdlib) lists.erl:1354: :lists.mapfoldl/3 (stdlib) lists.erl:1355: :lists.mapfoldl/3 (stdlib) lists.erl:1354: :lists.mapfoldl/3 (stdlib) lists.erl:1355: :lists.mapfoldl/3 (stdlib) lists.erl:1354: :lists.mapfoldl/3 ЧЯДНТ ?? ((((((

Ecto.Adapters.SQL.query тоже падает со странной ошибкой(( iex(2)> Ecto.Adapters.SQL.query(Blog.Repo, "SELECT u0.\"id\", u0.\"nickname\", u0.\"email\", u0.\"crypted_password\", u0.\"type\", u0.\"inserted_at\", u0.\"updated_at\" FROM \"users\" AS u0 WHERE (LOWER(u0.\"nickname\") = '$1') LIMIT 1", ["some_nick"]) [debug] QUERY ERROR db=4.6ms queue=0.2ms SELECT u0."id", u0."nickname", u0."email", u0."crypted_password", u0."type", u0."inserted_at", u0."updated_at" FROM "users" AS u0 WHERE (LOWER(u0."nickname") = '$1') LIMIT 1 ["some_nick"] ** (ArgumentError) parameters must be of length 0 for query %Postgrex.Query{columns: ["id", "nickname", "email", "crypted_password", "type", "inserted_at", "updated_at"], copy_data: false, decoders: [#Function<.... при этом при запросе напрямую к постгресу - работает как же все-таки в фениксе сделать запрос с LOWER поиском по базе?

вот так query = from u in "users", where: fragment("LOWER(u0.\"nickname\") = ?", ^nickname), select: fragment("u0.\"id\", u0.\"nickname\", u0.\"email\", u0.\"crypted_password\", u0.\"type\", u0.\"inserted_at\", u0.\"updated_at\"") rez = repo.all(query) с какого-то чуда —- возвращает только значение первого столбца — тоесть только id что поделать с этим можно?

ок, пойду на гитхаб мучать аффторов =\

ура, сам создатель hex-а подсказал))

Ecto.Adapters.SQL.query(repo, "SELECT u0.\"id\", u0.\"nickname\", u0.\"email\", u0.\"crypted_password\", u0.\"type\", u0.\"inserted_at\", u0.\"updated_at\" FROM \"users\" AS u0 WHERE (LOWER(u0.\"nickname\") = $1) LIMIT 1", [nickname]) типу так) ура)

Yusup
23.10.2016
14:54:29
я тут статейку читаю http://blog.plataformatec.com.br/2015/10/mocks-and-explicit-contracts/

тут Хосе говорит о том, как можно круто моки создавать

и ближе к концу пишет, что можно создать контракт через behaviour

но я не понимаю, в чем смысл создавать контракт, если мы его нигде не заставляем соблюдать

Yusup
23.10.2016
14:56:03
или не упоминаем в @spec

вообще в эликсире можно так?

типа "вот у меня есть аттрибут @twitter_api_impl и у него должен быть бехавиор объявленный в MyApp.Twitter

типа как с интерфейсами в джаве или тайпклассами в хаскеле

Dmitry
23.10.2016
15:44:24
Интерфейс отвечает за функциональность

Так же как и behaviour

От определяет методы а не какие не атрибуты

И если ты вызовешь какой то метод у twitter_api то он упадёт если не соблюдает интерфейс

Google
Yusup
23.10.2016
15:46:53
ну да

просто если мы берем ту же джаву

Admin
ERROR: S client not available

Yusup
23.10.2016
15:47:19
у нас есть интерфейс с некоторым количеством методов

например тут

interface Mailer { void sendMail(options: Object[]); } class MyApp { public void MyApp(mailer: Mailer) { // ... } }

тут MyApp требует mailer который имплементит Mailer

ключевое слово - требует

в примере хосе у нас есть @twitter_api - это атрибут модуля, который может быть либо реальным TwitterApi либо моком

потом хосе говорит "давайте добавим контрактов" и создает бехавиор который реализуется как TwitterApi так и моком

но в отличии от примера с джава кодом, этот бехевиор нигде не требуется

в чем смысл контракта если мы ни коим образом не заставляем его соблюдать

может можно как-то так? @spec twitter_api :: TwitterApi.Behavior @twitter_api Application.get_env(:my_app, :twitter_api)

Dmitry
23.10.2016
15:51:51
Смысл в том, что если ты в своей библиотеке напишешь @behaviour Twitter.API, а потом после обновления библиотеки Twitter этот behaviour поменяется - то у тебя не склмпилируется программа

А то что ты передал мок, который не имплементит что-то - то эрланг это язык с нестрогой типизацией

Да и вообще это ошибка на уровне - передал 2 вместо 3

Никто от такого не застрахован

Хотя не исключено что какие то спеки есть

Но я таких не знаю

В общем от duck typing никуда не уйдёшь

Google
Dmitry
23.10.2016
15:57:42
С другой стороны программа, вылетающая в рантайме от отсутствующего метода - трудно представить как такую ошибки можно сразу не отловить

Yusup
23.10.2016
16:00:11
тогда в чем смысл "контракта" хосе? контракт - это когда есть две стороны, первая говорит "мне нужен любой объект/модуль/функция которая умеет делать так-то" а вторая сторона говорит "у меня есть такая вещь". и с помощью интерфейсов мы можем с определенной точностью знать что контракт соблюдается. у хосе так - он создает behaviour но нигде не требует чтобы он соблюдался. только создает несколько модулей чтобы реализовать его. как ты и сказал, утиная типизация и все такое. оно бы и так взлетело без всякого бехавиора

Yusup
23.10.2016
16:03:04
ок спасибо

я прочел твой комент еще раз и понял твой посыл

но все равно не понимаю, чего добивался хосе

и этот чувак https://medium.com/@lasseebert/mocks-in-elixir-7204f8cc9d0f#.cydkoct8i

есть еще один вопрос про behaviours

можно ли сделать что-то вроде такого?

defmodule Adder do @callback add(integer, integer) :: integer def add2(a) do add(a, 2) end def add3(a) do add(a, 3) end end defmodule Plus do @behaviour HazelClient.Adder def add(a, b) do a + b end end

то есть тут у нас модуль с методом add, у которого отсутствует реализация и реализованные add2 и add3 которые пользуются add

у меня этот код не компилируется, говорит, что не знает функцию "add" у Adder

Страница 155 из 1045