Обертка для итератора


#41
$ grep -Fri 'truncate' .gem/ruby/gems/twitter-6.2.0
.gem/ruby/gems/twitter-6.2.0/CHANGELOG.md:* [Add `Status#source`, `Status#truncated`, `Status#in_reply_to_status_id`, `Status#in_reply_to_user_id`, `Status#favorited`, and `User#protected` methods](https://github.com/sferik/twitter/commit/d02d233000667c74101571f9362532a57715ae4e)
.gem/ruby/gems/twitter-6.2.0/lib/twitter/tweet.rb:                          :truncated

Что касается ченджлога, то это в контексте очень старой версии. Второе вхождение вот здесь, 29 строка. Чего думаешь?

Я пробовал full_text и tweet_mode extended, как советовали на SO; в том виде, как рекомендовано, оно не пашет.


(Kvokka) #42

забудь, что существует changelog в бесплатных проектах
грепай по коду гемы truncate, если что поставь прям ьуда дебаггер и посмотри “в собаке”

интернет тут тебе не поможет, ибо как ты сам понимаешь, всем по%уй :slight_smile:


#43

Здесь чутье тебя подводит, Чингачгук… суть в том, что твиттер перешел на длинные твиты, походу, и вот так теперь должно работать, в v. 6.2.0 гема:


long_tweet = TwitterClient.status(953020927792631809, tweet_mode: 'extended')
fields = long_tweet.to_hash.slice(:full_text, :truncated)

Но если я пробую вот так:


@arr = Set.new
client.search("@#{params[:twitter_acc]}", result_type: "recent", tweet_mode: "extended")
            .take(params[:number_of_tweets].to_i)
            .collect do |tweet|
	@arr << tweet
                .full_text
                .gsub("@#{params[:twitter_acc]}", "")
                .gsub("RT :", "")
                .gsub("RT", "")
                puts tweet.full_text
end

то получаю empty в консоли:

Started GET "/tweet_parser/index?number_of_tweets=10&twitter_acc=SkyNews" for 127.0.0.1 at 2018-01-26 18:51:24 +0300
Processing by TweetParserController#index as HTML
  Parameters: {"number_of_tweets"=>"10", "twitter_acc"=>"SkyNews"}




  Rendering tweet_parser/index.html.erb within layouts/application
  Rendered tweet_parser/index.html.erb within layouts/application (3.0ms)
  Rendered layouts/_navigation.html.erb (4.2ms)
Completed 200 OK in 2161ms (Views: 345.0ms | ActiveRecord: 0.0ms)

, а вот если без tweet_mode: “extended”, то все отрабатывает норм. В коротком усеченном (с многоточиями) варианте.


(Kvokka) #44

так, еще раз.
за тебя косяки в геме никто искать не будет. где искать ты знаешь - повод прочитать все и поправить. заодно будет PR

при этом ты можешь радостно навешивать вариант 1 в качестве “поиска” на данный момент, если тебе плевать на производительность


#45

слушай, ну если грамотно сделать репродьюс и аргументированно показать проблему - не помню случая, чтобы разраб отказался мейнтенить/дебажить свой/не_свой код, на том стоим. Не утверждаю, что в данном случае я хорошо техническим языком описал траблу, но это принцип open source. @kvokka , неужто ты с этим не согласен?

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


(Kvokka) #46

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

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

направить куда копать не сложно, но вот копать надо самому.

и да, разраб той или иной тулзы ее саппортит, ибо она ему нужна самому, либо он просто ее держит как хобби проект, тоесть чтобы при смене работы не делать идиотских задачек.

так что не пойми привратно, но я не отфутболиваю, скорее по-товарищески излагаю, как действовать эффективнее


#47

Да не, ты меня вобще не понял. Я про твой пессимизм в отношении разрабов, типа что кроме тебя самого никто твои проблемы с не твоим гемом расхлебывать не будет. Меня, напротив, много лет натаскивали на то, что прямая твоя (моя т.е) обязанность - отрепортить разрабу проблему в его пакете, на этом типа мир держится. А вот “не отрепортить” - плохо и эгоистично. ))

А с багой - решится, так или иначе… Andy Piper озаботился вроде проблемой, да еще и на гитхабе у sferik-a я наскоро привел вывод консоли… походу сыровата последняя ревизия гема, но зато и не минор. Или починят, или костыль какой найду.


(Kvokka) #48

согласен, понял не верно.
разрабу безусловно нужно сказать, да и заинтересован он. просто такой узкий запрос кроме него и тебя наврятли кто-то будет копать. а в целом это опенсорс, тут все все пофиг )

но ты лучше ныряй в исходники и будь как взрослый )


#49

При работе с удаленным API, чтоб не выпадать в 500 error, HTTP::ConnectionError (couldn’t read response headers), че думаешь, как оптимально это дело отлавливать?

response.kind_of? Net::HTTPSuccess

, или как-то еще? Вижу, тут кто-то на SO кому-то какие-то гемы советует на этот предмет… do you have any patterns of behavior?


(Kvokka) #50

ну так для этого всякие там airbrake и ставят. ну или аналоги, тысячи их. чтобы просто понимать, где твоя аппа порезалась, а потом там соломку подстелить.

целом все это будет работать по принципу- оберни это говно в блок, и отрабатывай ошибки относительно этого блока, не замечая ничего и пусть все гуано варится там. DRY и все дела


#51

К слову, а я начинаю постигать прелесть оного… во всяком случае некоторых его аспектов. Например, становится понятно, почему экстремалы зачастую обходят API, предпочитая ломиться через web… вот зацени, чтоб не быть голословным:

Вытаскиваем и раскладываем по двум массивам фолловеров и френдов, сравниваем и получаем: 1. массив, содержащий список акков, которые читают наш аккаунт и которые мы пока не читаем, соответственно, их будем фолловить, и 2. массив, содержащий перечень акков, которые мы читаем, но которые не читают нас, их мы будем анфолловить. And go ahead, а импровизированный лог работы, для наглядности, выведем в консоль,таким вот образом.

Итерируем, соответственно, follow и unfollow, наблюдаем и сравниваем, чешем репу, затем лезем в доку API Twitter, и снова чешем репу. Казалось бы, на уровне API разница должна быть невелика:

client.follow("gem")
client.unfollow("gem")

, но ты погляди, как прикольно выходит на практике:

До анфолловинга старине Твиттеру, походу, вообще дела нет, а вот после каждых трех-четырех-пяти зафолловленных (в ответ!) аккаунтов он требует 15-минутный таймаут, во время которого только rescue аппликуху и спасает (пробовал сделать поменьше, пока что не оправдывает себя: т. к. rescue, то получается попросту два таймаута вместо одного :slight_smile: ).

Такая вот фигня.


(Kvokka) #52

ну тут ты малость все в кучу смешал, но позитивчег вынес верный: “все врут”.
по существу - экстрим предполагает использование недокументированных багофич и, порой, наплевательство к тестам. второе, в свою очередь, не обязательно, но отчего-то на тесты всеровно кладется.

про твиттер- а ты не пробовал носки? я имею ввиду socks proxy. я не юзал их под руби, но, еще в прошлой жизни список носков помогал обойти подобное.

конечно, они не стабильны и там тоже есть масса минусов, но, оно поможет мультиаккаунтить. по рогам, конечно, тоже за такое могут надавать, но, тут же “всем насрать” :wink:


#53

Да видишь ли в чем дело. Твиттер хитер. И весьма гибок, зараза. Насколько я врубаюсь в его доку, лимиты в данном случае назначены на app, создаваемую пользователем на стороне твиттера, в разделе “для девелоперов” в смысле. А не на клиенте. Обычный, в общем-то, подход. Т.е. те ключи и токены, посредством которых инициализируется client уже rails-аппликухи:

client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "YOUR_CONSUMER_KEY"
  config.consumer_secret     = "YOUR_CONSUMER_SECRET"
  config.access_token        = "YOUR_ACCESS_TOKEN"
  config.access_token_secret = "YOUR_ACCESS_SECRET"
end

-можно клонировать и спрятать хоть за десятком проксей, роли не сыграет. Можно, конечно, попробовать на стороне твиттера наделать штук 10 twitter-app и потом уже на своем rails-app-клиенте перебирать их ключи, инициализируя то так то эдак в зависимости от возвращаемых ошибок или числа остающихся лимитов в заголовках: x-rate-limit-remaining, x-rate-limit-reset. Тут и прокси, кстати, сгодятся. Но это для себя так можно, делать же пользовательский твиттер-инструментарий на таком принципе, думаю, смысла нет, ты не согласен со мной? Уж больно шатко получается, лучше какой-то “твиттер-бот” соорудить, пусть он себе небыстро пашет, зато плаг энд плэй, “вхерачил и забыл” в вольном переводе с английского.

Повторюсь, Твиттер гибок, и довольно быстро меняется. В этой гибкости, вероятно, и следует искать причину закрытия проекта Твидиум, да не прогневается на меня Л.Б.Кофман за субъективное это мнение… вероятнее всего, ломились они через веб, в обход API, так как “не в обход API” завидная скорость работы Твидиума невозможна, как видим из результатов тестов. Ну и результат налицо: инженерам-то Твиттера ровно вкайф день за днем свою игрушку from ruby to java или еще на что другое переписывать, они за это деньги получают, оно и збс. Где уж нашим людям, которые в булошную на такси не ездют, угнаться.


(Kvokka) #54

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

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


#55

не, не пойдет.

Ибо не стремлюсь я ни в большую, ни в меньшую часть конторок, во всяком случае, конторок российских. Обрыдло. Опыт показывает, что и знания, и опыт, хотя и востребованы, разумеется, но где-то реально на десятом-двадцатом месте они востребованы, по приоритету. А на первом месте что? - вот я раскрываю, почти не глядя, кондовую вакансию на хедхантере, и вижу, в числе требований к соискателю, жирным шрифтом: полная лояльность к руководству. Ну, по крайней мере, хоть честно говорят, и то хорошо: подобные поползновения я сразу нах, не любитель быстрого офисного секса, спонтанно срываюсь в нем на жесткое доминирование и БДСМ. :face_with_symbols_over_mouth:

Насчет же пачки дино - не уверен, что такое здесь возможно… follow и unfollow - это ведь уже заключительная часть мерлезонского балета, подготовка к которому, т.е. получение френдов/фолловеров, тож немало времени занимает. Можно было бы поизвращаться, конечно, но вот это стопудофф уже сексуальные извращения будут, для откровенных маниаков.

Хотя кое-кто из “руководителей разработки” на предприятиях, наподобие одного моего недавнего знакомого, долго чесавшего репу в попытках осмыслить архисложный термин “визуализация JSON” - могли бы поставить такую задачу своим несчастным подчиненным, как два пальца. P.S. Нереально о@уиваю от уровня технической подготовленности руководителей IT-отделов на российских предприятиях, это что-то за гранью… помню еще одного такого, вирусы не умел вычистить на своем виндообразном ПК.


(Kvokka) #56

зачем ты о грусном? в рашке жизни нет, работы и подавно.
ты пишешь про жополиздство- так это естественно. маленький “насяльника” может нанять плебея, что кланяется и что нет, в любом случае плебей==дебил. все что поразумней свалят. уровень зарплат на столько низок в раше, что работают там только те, кто не способен работать во вне. или в процессе сваливания.

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


(Kvokka) #57

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

но тут это вроде как pet project, а в таком ключе можно все )


#58

Интересно было бы понять, насколько в реале масштабируема подобная победительная идея. Типа использовать халявные ресурсы не по прямому их назначению… вроде бы кто-то умудрялся в гмыле аж db веб-сайта хранить, то-то збс. А уж файловый сервак из гмыла сделать, дык это сам бог велел, помнишь эту примочку? Хотя в самый первый раз, пожалуй, у Дэна Симмонса про такое прочитал, в Гиперионе, там коварный кибермозг в наносекундах обитать приспособился. А здесь, на heroku, целых 30 сек, пока H12 вернется, вообще крутяк. Впору сервис облачных вычислений клепать, свой собственный, на пачке беспризорных динозавров heroku.


(Kvokka) #59

тут речь и идет о не прямом назначении. пример подобного использования просто даст возможность быстро наняться в контору, где будет оплата на много более того, что дадут халявные дино. парадокс этого времени в том, что сейчас выгоднее “играть мускулами”, чем применять их

а в реальном мире же будет так: если будет способ реально жестко эксплуатировать дино, его прикроют. так что это не более чем pet project

про юзание почтового ящика как хранилища: так он по сути таковым и является. опять же, перец показал, что он молодец и поднял свой $ в час.


#60

Ладно. Вернемся к насущному, если ты не против. Ибо надо потихоньку pet-project в бета-тестирование выводить, а потом и в продакшн, по весне, думаю… тесты мои вроде нормалек идут. Да, так вот в чем вопрос. В альтернативе выбора, излишне широкой… в плане разграничения прав пользователей на ресурсы - что посоветуешь? Пробую cancancan, и мне нравится… но, может, что поновее и поинновационнее взять? Есть еще аналогичный по этой теме гем от российского программиста, с графическим интерфейсом оно даже, не упомню щас название… и еще сотня других решений такого рода. Думаю как раз, на чем оптимально остановиться… “погубят тебя слишком широкие возможности”, как говорил Айболит.