text:
CHAPTER 5 대규모 프로젝트 진행

CHAPTER 5 대규모 프로젝트 진행
훌륭한 리더의 자질은 대개 인내심, 용기, 그리고 다른 사람들과 소통하려는 의지에서 나온다. 일반적으로 프로젝트가 어려운 이유는 기술의 경계를 넓혀야 하기 때문이 아니다. 그보다는 모호한 업무 방향, 얼키고설킨 복잡한 인간관계, 예측 불가의 레거시 시스템을 다루기 때문이다.
이럴 때는 이 프로젝트를 견고하게 이끌며 문제를 해결하고 복잡성을 처리할 수 있는 기술 리더가 꼭 필요하다.
5.1 프로젝트 진행 프로세스
프로젝트의 성과물과 마일스톤을 검토하고, 여러분을 포함한 기대치를 설정한다. 목표를 정의하고, 책임과 구조를 추가하며, 역할을 정의하고, 성공을 위해 꼭 필요한 기록을 작성하는 방식으로 프로젝트를 설정한다.
5.2 프로젝트 시작
프로젝트에는 다른 시니어 엔지니어들이 있을 수도 있고, 심지어 더 선임인 엔지니어들도 있을 수 있다. 그렇다면 그들에게 지시를 내려야 하는가, 아니면 그들의 조언을 들어야 하는가?
5.2.1 새로운 프로젝트의 압박감을 극복하는 방법
기존 프로젝트에 새로운 인력으로 투입된다면 투입 전에 고려하고 살펴보아야 할 부분이 상당히 많다. 대규모 프로젝트를 시작할 때 프로젝트에 압도당하는 것은 정상적인 일이다.
이런 불편함조차 실은 일종의 학습이기도 하므로 불편함을 관리하는 것도 배울 수 있는 스킬이다
불편함이나 부담감은 수많은 생각을 불러온다. 실수로 리더의 위치에 올라왔다고 생각하거나, 프로젝트가 너무 어려워서 본인이 감당할 수 없다고 생각할 수도 있다. 또는 다른 사람들에게 실망을 안겨주거나 공개적으로 실패할 것 같은 두려움으로 고통스러울 수도 있다. 이는 심리학적으로 가면 증후군imposter syndrome이라고 부르는 현상이다.
사실 이런 감정은 자원 중에서 최소한 하나가 부족하다는 신호일 수 있다. 예를 들어서 모든 에너지를 소진했거나, 업무 시간이 부족하거나, 또는 스킬이 부족하다고 느끼면 그것이 스트레스와 불안으로 발현되는 것이다. 그러니 보유한 자원을 스스로 잘 살펴서 혹시 부족하지는 않은지 점검해보자.
다른 사람이 이 일을 맡는다면 어떤 느낌이 들지 생각해보는 것도 불안감을 극복하는 좋은 방법이다. 결론은 누가 이 프로젝트를 담당하든 간에 그들도 실은 이 프로젝트를 어려워한다는 것이다.
어려움이 핵심이다. 어려움이 업무의 본질이라는 것을 깨닫고 이를 내면화했을 때 비로소 그 모호함을 다룰 수 있다는 진리를 발견할 수 있다. 복잡하고 어려운 업무가 아니었다면 기업은 여러분을 필요로 하지 않았을 것이다. 업무를 열심히 하다 보면 당연히 실수를 할 수도 있다. 그래도 중요한 것은 누군가는 이 업무를 해야만 한다는 것이다. 열 번이나 실수하더라도 그 실수가 파멸시키지는 못한다. 사실 실수야말로 우리가 무언가를 진정으로 배울 수 있는 훌륭한 교보재다.
다음은 새로운 프로젝트의 부담을 줄이기 위해 수행해볼 수 있는 다섯 가지 방법이다.

나를 위한 문서 만들기
프로젝트 규모와 관계 없이 프로젝트 기간 동안 머릿속에 있는 생각들을 정리해서 이를 기록한 문서를 만든다. 다음에 무엇을 해야 할지 잘 모를 때는 이 문서를 찾아서 과거에 중요하다고 생각했던 것이 무엇인지 살펴보면 된다.
프로젝트 후원자들과 대화하기
누가 이 프로젝트를 후원하는지 알아낸 뒤 그들이 원하는 것을 정확하게 파악하라. 그리고 그들과 함께할 수 있는 시간을 만들자. 먼저 프로젝트를 통해서 달성하고자 하는 목표와 성공이 무엇인지 명확하게 설명할 수 있도록 준비한다. 문서로 정리된 설명일수록 더 명확하다.
프로젝트의 불확실성을 공감하고 이해해줄 사람 찾기
프로젝트가 어렵고 능력 밖의 일처럼 느껴진다면 누구와 이야기를 나눌 것인지 생각해보자.
확신이 서지 않는 부분들을 허심탄회하게 논의할 수 있는 사람을 적어도 한 명은 찾자. 그 사람은 매니저나 멘토 또는 동료일 수 있으며, 2장에서 논의한 동료 스태프 엔지니어도 여기에 해당한다.
프로젝트 초창기에 최대한 배우기
만약 문제가 너무 커서 여전히 직접 해결하기가 어렵다면, 적어도 그 문제를 통제하는 데 도움이 되는 조치를 취하는 것을 목표로 하자. 다른 사람과 대화를 나누어보거나 그림을 그려보거나 문서를 작성해볼 수 있다. 아니면 다른 사람에게 이 문제를 설명해보자. 프로젝트의 초창기는 해당 프로젝트에 관해서 아는 것이 가장 적은 시기이기도 하다.
나만의 장점 활용하기
본인의 장점을 중심으로 전략을 세워 핵심 근육을 사용하라. 예를 들어서 코드가 가장 익숙하다면 코드를 확인하자. 만약 여러분이 인간관계를 먼저 생각하는 경향이 있다면 사람들과 대화해보자. 읽는 것을 선호한다면 서류를 찾아보자. 본인이 가진 장점을 최대로 활용해야 한다.
5.2.2 맥락 쌓기
업무를 다른 관점에서 보고, 프로젝트의 목표를 이해하며, 프로젝트의 제약 조건 및 역사 그리고 프로젝트가 사업 목표와 어떻게 연결되는지에 대해 명확하게 설명하는 위치 인식 지도를 만들 수 있다. 그리고 건너야 하는 지형과 그곳의 지역 정치를 식별할 수 있고 프로젝트에 참여하는 사람들이 일하는 스타일과 결정이 어떻게 내려질지를 포함하는 지형 지도를 만들 수 있다. 마지막으로어디로 가는지, 그리고 어떤 마일스톤에서 멈출지를 보여주는 보물 지도를 만들 수 있다.
목표 이해
이 프로젝트를 수행하는 목표가 무엇인가? 달성 가능한 모든 사업 목표와 기술 투자 및 미결 과제 부분을 모두 고려해서 왜 이 목표를 설정했는지 알아야 한다. 업무를 해야 하는 이유는 프로젝트 전반에 걸쳐서 동기를 유발하고 앞으로 나아갈 때의 지침이 된다.
주도해야 할 프로젝트가 명확한 목표를 달성하지 못한다면, 그 프로젝트를 수행하는 것 자체가 모두에게 시간 낭비다. 그러니 목표는 일찍 파악할수록 더 좋다.
사용자의 정확한 욕구 파악
가장 내부적인 프로젝트조차도 ‘고객’이 존재한다. 설계한 시스템은 누군가는 반드시 사용한다. 때로 스스로 만든 시스템의 사용자가 될 수도 있다. 그러나 대부분의 사용자는 다른 사람들이다. 사용자가 무엇을 필요로 하는지 이해하지 못하면 올바른 프로덕트를 구축하고 배포할 수 없다.
사용자와 대화하고 그들이 응답하는 내용에 귀를 기울여야 한다. 사용자의 욕구를 정확하게 파악해야 한다.
사용자에게 교체할 소프트웨어의 사용 사례를 직접 보도록 요청해야 한다. 내부 사용자들에게 그들이 원하는 API가 무엇인지 설명하도록 요청하거나, 사용자가 원하는 인터페이스의 스케치를 보여주고 그들이 실제로 API와 어떻게 상호 작용하는지 확인한다. 사용자가 원하는 것을 추측하지 말고, 실제로 묻고 대답을 들어서 정확하게 파악해라.
특히 프로덕트 매니저가 해야 할 일로 치부하면서 여러분이 사용자의 욕구를 직접 파악할 수 있는 길을 무시하지 말자!
성공 측정 기준 설정
새 기능을 만든다면 프로덕트의 요구사항을 정리한 문서PRD, Product requirements document처럼 이미 정해진 성공 측정success metric 방법이 있을 수도 있거나 직접 측정 기준을 제안할 수도 있다. 어느 쪽이 됐든 후원자와 프로젝트의 다른 리더의 동의를 얻어야 한다.
마이크로서비스 전문가 사라 웰스는 쿠버네티스 콘퍼런스인 쿠버콘Kubecon에서 「쿠버네티스로 150개 이상의 마이크로서비스를 마이그레이션하는 과제The Challenges of Migrating 150+ Microservices to Kubernetes」라는 기조연설을 진행했다. 그녀는 이 연설에서 마이그레이션의 성공 여부를 판별하는 두 가지 측정 기준을 제시했다. 첫 번째는 클러스터cluster를 정상적으로 유지하는 데 걸린 시간을 측정하는 것이었고, 두 번째는 이 기능에 대한 불만을 슬랙으로 토로하는 팀원들의 수를 측정하는 것이었다. 두 가지 모두 충분히 객관적으로 측정 가능한 방법이다.
처음 프로젝트를 시작할 때는 성공 측정 기준을 정의하는 데 더욱더 주의를 기울여야 한다. 만약 신뢰성과 사회 자본이 굳건하다면 다른 사람들의 믿음을 바탕으로 프로젝트를 시작하거나 설득력 있는 문서나 영감을 주는 연설을 통해 프로젝트를 후원하도록 설득할 수 있다. 프로젝트가 어떻게 진행되는지 명확하게 파악할 수 있도록 아이디어를 현실적인 관점에서 바라보며 측정 가능한 기준을 설정하자.
후원자, 이해관계자 및 사용자 탐색
프로덕트 요구사항 문서가 있다면 문서에 이 모든 내용이 적혀 있을 수도 있지만, 그렇지 않다면 직접 이 사항들을 명확하게 정의해야 한다. 첫 번째, 사용자 또는 주요 이해관계자가 누구인지, 두 번째, 그들이 원하는 것은 무엇인지, 세 번째, 언제 결과를 보고 싶어 하는지 등이다.
고정 제약 조건 설정
업무를 수행할 때마다 어느 정도는 제약을 받는다. 그렇다면 제약이 무엇인지 명확하게 이해하자. ‘절대로 뒤로 미룰 수 없는 마감일이 있는가?’, ‘프로젝트 진행 예산은 충분한가?’, ‘너무 바빠서 도와줄 시간이 없는 팀이나 사용할 수 없는 시스템 컴포넌트에 의존하고 있지는 않은가?’, ‘같이 일하기 힘든 사람과 함께 일해야 하는가?’ 등이다.
구속하는 제약을 명확하게 이해하는 것은 다른 사람들의 기대치도 정할 수 있도록 도와준다. ‘단순히 기능을 제공하는 상황’과 ‘엔지니어를 충분히 보유하지 않은 상태에서 서로 합의점을 찾지 못한 두 이해관계자와 함께 기능을 제공하는 상황’에는 아주 큰 차이가 있다. 원하는 대로 되지 않는다고 현실에 분개하는 데 시간을 낭비하지 말고, 현실을 정확하게 직시하자.
위험 요소 관리
현실의 프로젝트에서는 종종 문제가 발생하며 규모가 커지면 커질수록 위험도 더 커진다. 이에 잘 대비할 수 있도록 몇 가지 위험 요소를 사전에 예측해보자.
가장 일반적인 위험 요소 중 하나는 헛된 노력에 대한 두려움이다. 이럴 때는 프로젝트를 진행하며 특정 부분을 반복해서 자주 수정할수록 위험성을 줄일 수 있다. 사용자 피드백을 받으며 진행 단계를 자주 수정하지 않으면, 마지막 출시 단계에서 성공이냐, 실패냐의 단 한 가지 가능성밖에 남지 않는다.
프로젝트 이력 파악
완전히 새로운 프로젝트일지라도, 알아야 할 그간의 이력이나 맥락이 있을 수 있다. 해당 프로젝트가 완전히 새로운 아이디어에서 출발한 것이 아니라면, 지난 이력은 대개 모호하고 심지어 알고 싶지 않은 것일 수 있다.
기존의 프로젝트를 처음 접하는 경우라면 무작정 그 프로젝트에 뛰어들지 말고, 먼저 다양한 대화를 나누어보자. 새로운 해결책을 만들기 전에 사용법이나 해결책 또는 정리해야 할 부분을 절반 정도만 먼저 완성해서 확인해보자. 그리고 다른 사람들이 이 프로젝트에 가진 감정이나 기대를 이해하고 그들의 경험으로부터 배우자.
팀 규모 파악
프로젝트의 규모에 따라서 몇 명의 주요 담당자 또는 팀 구성원, 리더, 이해관계자, 사용자 및 주변 역할을 대규모로 채용해야 할 수도 있다.
한 팀만 참여하는 프로젝트의 리더라면 해당 팀의 모든 사람과 정기적으로 대화를 나눌 수 있다. 그러나 규모가 더 큰 프로젝트라서 더 많은 팀이 참여한다면 팀별로 연락 담당자가 필요하다.

큰 프로젝트이고 리더가 많다면 다른 모든 리더와 좋은 업무 관계를 구축하고 서로 돕는 것이 중요하다. 권력 다툼에 시간을 낭비하지 말자. 협업해서 업무를 잘 수행하면 공동의 목표를 달성할 가능성이 훨씬 더 커진다.
5.2.3 프로젝트 공식 구조 설정
앞에서 다룬 모든 상황을 고려해서 프로젝트를 실행하는 데 도움이 되는 공식 구조를 설정해볼 수 있다.
다음은 프로젝트 구조를 설정하기 위해서 필요한 몇 가지 업무다.
역할 정의
시니어 수준에 이르면 엔지니어링 역할의 경계가 서로 모호해진다. 예를 들어서 고참 시니어 수준의 엔지니어나 엔지니어링 매니저 및 기술 프로그램 매니저 간의 역할 차이가 명확하게 구분되지 않을 수도 있다. 기본적으로 이들은 모두 소위 ‘방 안의 어른’역할을 맡고, 프로젝트의 위험을 식별하며 진행을 저해할 만한 것들을 제거해서 문제를 해결할 책임이 있다. 즉, 프로그램 매니저는 진행 상황별 격차를 파악하고, 프로젝트 상태에 대해 소통하며, 프로젝트를 저해하는 점을 없애야 한다.
프로젝트 출범 초창기는 각 리더의 직무를 명확하게 설정하기에 가장 좋은 시기다. 그러니 이 시기에 반드시 각 역할을 명확하게 정의하자. 두 사람이 같은 일을 하고 있다는 것을 나중에 스스로 깨닫게 될 때까지 기다리지 말자.
가장 간단한 방법은 리더십 직책을 표로 만들어서 누가 각각 무엇을 맡아야 하는지를 정하는 것이다. [표 5-1]은 작성법 예시다.
Table 5-1. Example table of leadership responsibilities

직책
실제 담당자

Product Manager
Olayemi

Technical Lead
Jaya

Engineering Manager
Kai

Technical Program Manager
Nana

Engineering Team
Adel, Sam, Kravann

Understanding customer needs and providing initial requirements
Product Manager

Providing KPIs for product success
Product Manager

Setting timelines
Technical Program Manager

Setting scope and milestones
Product Manager, Engineering Manager

Recruiting new team members
Engineering Manager

Monitoring and ensuring team health
Engineering Manager

Managing team members’ performance and growth
Engineering Manager

Mentoring and coaching on technical topics
Technical Lead

Designing high-level architecture
Technical Lead (with support from engineering team)

Designing individual components
Technical Lead, Engineering Team

Coding
Engineering Team (with support from Technical Lead)

Testing
Engineering Team (with support from Technical Lead)

Operating, deploying, and monitoring systems
Engineering Team, Technical Lead

Communicating status to stakeholders
Technical Program Manager

Devising A/B experiments
Product Manager

Making final decisions on technical approach
Technical Lead

Making final decisions on user-visible behavior
Product Manager

표를 더 정교하게 구성해보고 싶다면 책임 할당 매트릭스 도구인 RACI를 써보자. RACI는 프로젝트마다 가장 일반적으로 포함되는 네 가지 주요 직책의 약자다.
■ 실무 담당자Responsible
실제로 업무를 담당하는 사람

■ 의사결정권자Accountable
업무 수행 시 최종적으로 업무 완료를 승인하는 승인자.
■ 업무 수행 조언자Consulted
프로젝트 수행과 관련해 견해를 공유하는 사람

■ 결과 통보 대상자Informed
프로젝트 진행 프로세스에 대한 최신 정보를 받는 사람
프로젝트 관리에 관심이 있다면 RACI의 다양한 변형 사항을 더 읽어보면 좋다. 물론 상황에 따라서 너무 과한 방법을 쓸 필요는 없지만, 정말 필요할 때는 당연히 써야 한다.
논란의 여지가 없는 구조를 제공하는 것이 RACI 방법이 지닌 진정한 장점이다. RACI는 사람들이 큰 문제 없이 모든 대화를 시작할 수 있는 방법을 제공해준다.
어떤 식으로 접근하든지 간에 본인의 역할이 무엇이고 누가 무엇을 하고 있는지에 대해 모든 리더가 동의하도록 노력하라.
프로젝트의 리더라면 궁극적으로 프로젝트에 대한 책임이 있다. 이 책임에는 아무도 맡지 않은 역할을 리더가 스스로 나서서 맡거나 최소한 업무가 완료되었는지 확인하는 것까지 포함된다.
인재 채용
하기 싫어하는 종류의 업무를 선호하는 사람들을 찾을 수 있는지 확인해보자. 바로 이것이야말로 최고의 파트너십이다!
프로젝트에 누가 참여하느냐에 따라서 마감일 준수, 업무 완성도, 목표 달성도 면에서 큰 차이가 발생한다. 함께 일하면서 온갖 마찰을 극복하고 일을 해낼 수 있는 사람들, 의지할 수 있는 사람들을 채용하자.
범위 합의
먼저 무엇을 할지부터 결정하자. 그리고 목표 달성을 위한 마일스톤을 세우고 마감 날짜를 결정하자. 각 마일스톤은 ‘어떤 기능이 포함되어 있는가?’, ‘사용자는 이 기능으로 무엇을 할 수 있는가?’ 등 여러 사항을 자세히 설명할 수 있어야 한다.
마일스톤은 어떤 식으로든 사용 가능하거나 데모 체험이 가능하며 사용자와 이해관계자로부터 피드백을 받을 수 있는 기회를 제공해준다. 마일스톤을 잘 구성해놓으면 사용자와 이해관계자들이 먼저 방향이 잘못되었다고 말해줄 수 있기에 잘못된 방향을 빨리 수정할 수 있는 기회가 생긴다.
프로젝트 범위를 최대한 작게 쪼개서 세부적인 마일스톤을 설정하라. 게다가 마일스톤이 있으면 목표를 잘 달성하고 있는지 수시로 점검할 수 있다. 이는 큰 동기 부여가 된다.
프로젝트가 매우 크다면, 업무를 흐름에 따라 분할하고 각각의 마일스톤을 설정해서 여러 업무 흐름workstream으로 구성하는 것이 좋다.
모든 직원이 명확하게 언제, 무엇을 하기로 했는지 동일한 생각을 해야 한다는 점이 중요하다.
업무 소요 시간 측정
『실용주의 프로그래머Pragmatic Programmer』에서 “프로젝트 일정 계획을 제대로 수립하는 유일한 방법은 동일한 프로젝트에 대해 충분한 경험을 쌓는 것이다.”라고 조언한다.
기능을 작은 단위로 배포하면 팀이 어떤 작업을 수행하는 데 얼마나 오래 걸리는지에 대한 경험을 쌓을 수 있으므로 매번 일정을 업데이트할 수 있다. 또한, 업무 소요 시간을 측정하는 것을 연습해서 그 측정이 실제로 맞는지 기록해보는 방법도 추천한다.
업무 소요 시간을 측정할 때는 관련 팀들의 의견도 고려해야 한다.
다른 팀에게 필요한 것을 늦게 말할수록, 그것을 얻을 수 있는 가능성은 크게 줄어든다. 그런데도 만약 다른 팀이 요청을 수락한다면, 그것은 동시에 그들의 현 업무를 방해하고 있다는 것이고 그들의 다른 프로젝트에 대한 업무 소요 시간 측정까지도 방해하는 것이다.
실행 계획 논의
■ 언제, 어디서, 어떻게 만날지에 대한 실행 계획 논의
■ 비공식적인 의사소통 장려하기
SNS에서의 대화, 비공식적인 아이스브레이커icebreaker 미팅, 또는 가능하다면 며칠 동안 모두가 한 자리에 모여서 서로 격려해보는 것이 좋다. 밈meme 스레드와 같은 농담을 서로 주고받는 것도 서로 간의 연결고리를 만들어주는 방법이다.
■ 프로젝트 상태와 업데이트를 공유하는 방법 논의
■ 프로젝트 관련 문서를 문서 홈에 모으기
프로젝트 관련 문서를 작성할 때 기억할 수 있는 URL이나 눈에 띄는 링크를 사용해서 쉽게 찾을 수 있도록 작성하라.
■ 개발 관행 파악하기
기존에 여러 프로젝트를 잘 수행해낸 기업에서 새 프로젝트를 진행하는 경우라면 질문에 대한 표준 답변이 있을 것이다.
킥오프 미팅 진행
킥오프 미팅kickoff meeting은 프로젝트 설정의 일환으로 마지막으로 하게 된다. 이미 중요한 정보를 다 설정했다면 킥오프 미팅이 불필요하다고 느낄 수도 있겠지만, 서로 얼굴을 마주 보며 추진력을 갖고 프로젝트를 시작하는 것은 생각보다 큰 힘이 된다. 특히 킥오프 미팅은 모든 사람이 같은 목표 아래에서 단결하고 팀의 일원으로 명확하게 느끼게 하는 기회를 제공한다.
킥오프 미팅에서 다루어야 할 주제들은 대개 다음과 같다.

참여하는 사람 소개
프로젝트의 목표
현재까지 진행 상황
설정을 완료한 구조
다음에 진행해야 할 안건
관련된 사람이 해야 할 업무
사람들이 질문하고 더 많은 것을 알 수 있는 방법

5.3 프로젝트 진행
프로젝트 리더라면 운전석에 있는 것과 같다. 리더는 모든 사람을 목적지까지 안전하게 데리고 가야 할 책임이 있다.
5.3.1 탐색
프로젝트의 진정한 요구사항을 이해하고 이를 달성하기 위해 취할 수 있는 접근 방식을 평가하려면 연구와 탐색이 어느 정도 필요하다. 목표를 명확하게 설명하기 어려운 설계를 만들거나 설정한 목표가 구현에 대한 설명에 불과하다면, 이 탐색 단계를 충분히 거치지 않았다는 신호다.
프로젝트의 주요 측면은 무엇인가?
팀원들은 프로젝트나 사용 사례에서 중요하지 않은 작은 측면에 집착할 수도 있고, 다른 영역 범위를 생각하고 있을 수도 있다. 이런 상황에서는 같은 것을 설명하는데 다른 용어를 사용하거나 같은 용어라도 다른 의미로 사용할 수 있다. 그러니 프로젝트의 여러 팀이 동의하고 원하는 방향을 간결하게 설명할 수 있는 지점에 최대한 빨리 도달하자.
탐색을 해보면 다른 사람들의 기대치를 발견하고 그들이 하는 일에 대해 명확하게 정의할 수 있다. 비슷해 보이지만 실제로 관련이 없는 일, 또는 전혀 관련이 없어 보이지만 예상치 못한 연관성이 있는 일을 명확하게 구분할 수 있다.
가능한 접근 방법은 무엇인가?
실제로 수행하려는 일을 명확하게 하는 방법을 알아내자. 모두가 동의하는 해결책을 찾을 때까지는 열린 마음을 갖도록 노력하자.
기존의 해결책은 새롭게 상상했던 것과 다른 형태일 수도 있지만, 어떤 면에서는 더 나은 형태일 수도 있다. 유연하게 받아들이는 마음가짐을 갖자. 유사한 프로젝트의 성공 여부와 어떤 부분에서 어려움을 겪었는지 등을 알고, 이러한 프로젝트의 이력으로부터 배워라.
5.3.2 명확성 확보
프로젝트를 시작할 때 가장 중요하게 고려해야 할 부분 중 하나는 하고자 하는 일에 대해 모두에게 정신 모형을 제공하는 것이다. 프로젝트를 주도할 때는 프로젝트를 달성하는 데 도움이 된다면 까다로운 개념을 이해하는 데 시간을 할애해야 한다.
정신 모형 구축
이미 이해하고 있는 다른 것과 연관 지어서 생각해볼 수 있도록 무언가를 제공해주는 정도의 설명이 필요하다.
추상적인 아이디어라 해도 원래 잘 알고 있던 다른 사실과 연결하면 그 아이디어를 설명하거나 흡수하는 것이 쉬워진다.
사람들에게 편리하고 기억에 남는 개념을 사용하거나, 비유를 사용하거나, 다른 사람이 이미 이해하고 있는 것과 관련지어서 설명함으로써 프로젝트가 잘 진행되도록 만들어야 한다. 그렇게 하면 그들만의 정신 모형을 빠르게 구축할 수 있다.
명칭 공유
기업 내부에서는 사용자, 고객 및 계정과 같은 매우 일반적인 단어에도 특정한 의미가 있을 수 있다. 이러한 의미는 재무, 마케팅 또는 엔지니어링 분야의 누군가와 대화하는지에 따라서 달라진다. 소통하고자 하는 사람들에게 특정 단어가 어떤 의미를 갖는지 이해하는 시간을 갖고, 가능하다면 그들의 단어를 사용하자.
도판 사용
복잡성을 줄이려면 도판을 활용하라. 사람들이 시각화하도록 돕는 데 도판보다 더 쉬운 방법은 없다. 만약 무언가가 변경되었을 때 ‘전’과 ‘후’를 나타내는 도판 세트는 글보다 훨씬 더 명확하다.
도판을 사용할 때는 고정관념에 유의하자. 다이어그램에서 원기둥 모양은 대부분 데이터 스토리지로 인식되기 때문에, 다른 의미로 사용하지 않는 것이 좋다.
도판은 그래프 또는 차트의 형태를 취할 수도 있다. [그림 5-2]처럼 목표와 그 목표를 향해 나아가는 선을 보여줄 수 있다면 성공이 어떤 모습일지 쉽게 알 수 있다.

5.3.3 설계
의견 일치를 확인하는 가장 효율적인 방법은 기록하는 것이다.
설계 문서의 필요성
많은 사람이 공동의 이해 없이 함께 무언가를 성취하도록 하기는 매우 어렵다. 서면 계획 없이는 이해를 공유하고 있다는 확신을 갖기가 어렵기 때문이다.
설계 검토를 요청하는 것은 단순히 아키텍처 또는 일련의 단계의 실현 가능성에 관해 묻는 것만 의미하지는 않는다. 올바른 문제에 제대로 접근해서 해결하고 있는지와 다른 팀과 기존 시스템에 대한 가정이 올바른지에 대한 동의도 포함한다.
서면 설계는 가장 저렴한 업무 수행 방식이다.
RFC 템플릿의 중요성
아무리 훌륭한 아키텍트라고 해도, 복잡한 시스템이나 프로세스 또는 변화를 설계하려면 기억해야 할 것이 아주 많다. 그리고 인간은 모든 것에 주의를 기울이는 데는 능숙하지 않다.
좋은 RFC 템플릿은 결정 사항을 생각하는 데 도움이 되고, 잊어버릴 수도 있는 주제를 확실하게 다시 상기시켜 준다.
**RFC 템플릿 필수 포함 사항사항 **
좋은 RFC 템플릿을 위해서 최소한 표 제목으로 포함되어야 하는 항목들이다.
■ 맥락
RFC 문서에는 제목, 작성자 이름 및 날짜 중에서 하나 이상은 있어야 한다. 그리고 문서의 상태까지 포함해야 한다. RFC를 빠르고 쉽게 찾을 수 있도록 해주는 표준 제목 형식보다 정보의 이용 가능 여부가 더 중요하다.
■ 목표
목표 부분은 왜 이것을 하고 있는지 설명해야 한다. 즉, 어떤 문제를 해결하려고 하는지, 또는 어떤 기회를 이용하려고 하는지 보여주어야 한다. RFC는 검토자가 올바른 문제를 해결하고 있다고 생각하는지 알 수 있도록 충분한 정보를 제공해야 한다.
또한, 목표에는 구현 세부 정보가 포함되지 않아야 한다. 실제로 어떤 문제를 누구를 위해 해결하려고 하는지 모른다면, 이것이 정말로 올바른 접근법인지 평가할 수 없다.
구체적인 구현은 목표에 부합해야 하지만, 그것이 목표가 되어서는 안 된다. 설계 결정은 설계 부분에 맡겨라.
■ 설계
설계 부분에서는 목표를 달성하려는 실제 방법을 설명해야 한다. 문서를 읽는 검토자가 해결책이 잘 작동할 수 있는지를 평가할 수 있도록 충분한 정보를 포함해야 한다. 잠재적인 사용자나 프로덕트 매니저를 위한 글을 쓰는 경우라면 사용자에게 제공하려는 기능과 인터페이스를 명확히 설명해야 한다. 시스템이나 컴포넌트에 의존하는 경우라면 그것들을 어떻게 사용할지 설명해서 검토자들이 그들의 능력을 부족하다고 오해하지 않도록 하는 것이 좋다.
RFC에서 중요한 것은 마지막까지 읽고 난 검토자들이 문서에서 무엇을 하려고 하는지 이해하도록 하고, 그것의 효과를 말할 수 있어야 한다는 것이다.

모호한 것보다는 차라리 잘못된 것이 낫다
세부사항이 모호한 것보다는 차라리 틀리거나 논쟁을 벌이는 것이 시간을 더 잘 활용하는 것이다. 만약 틀렸다면 사람들이 그 사실을 말해줄 것이다. 그러면 적어도 무언가를 배울 것이고 필요하다면 계획을 바꿀 수도 있다. 만약 논란의 여지가 있는 아이디어를 시도하고 있다면 동료들이 그 접근법에 반대할 것인지, 아닌지를 일찍 알 수도 있다. 이처럼 설계에 대해 논쟁이 일어나거나 의견이 일치하지 않는 것은 프로세스를 변경해야 한다는 것을 의미하는 것이 아니라 궁극적으로는 여러분이 몰랐던 정보를 제공해주는 것이다.

■ 보안/개인 정보/준수
다음과 같은 질문들을 체크해보자. 문서에서 보호해야 할 가치가 있는 항목은 무엇이며, 누구로부터 보호해야 하는가? 여러분이 작성한 계획은 어떤 방식으로 사용자 데이터에 접속하거나 이를 수집하는가? 그 계획은 외부에 새로운 접속점을 제공하는가? 사용하는 키 또는 암호는 어떻게 저장하는가? 내부나 외부의 위협으로부터 시스템을 보호하고 있는가? 아니면 둘 다 보호하고 있는가?
■ 대안으로 고려할 만한 사항/선행 기술
‘대안 고려사항’ 부분은 실제로 문제를 해결하기 위해서 존재하는 부분이다. 이 부분은 해결책에만 매달리고 있지 않다는 사실을 다른 사람에게도 보여준다. 다른 대안을 고려하지 않아서 이 부분을 생략한다면 이는 문제에 관해서 충분히 생각하지 않았다는 신호다.
만약 그럴듯해 보이는 선택지가 이미 기업 내부에 존재하는데 그것을 사용하지 않았다면, RFC 작성자는 그 시스템을 소유한 사람들에게 새로운 설계 문서를 보내서 그들이 여러 방식으로 새롭게 생각해볼 기회를 주어야 한다.
다음의 항목들은 비교적 작은 규모의 RFC에도 반드시 포함되어야 한다고 생각하는 소제목들이다. 이 제목들을 사용하면 적어도 여러 항목을 정직하게 고려했다는 것을 보여줄 것이다.

배경
절충점
위험 요소
의존성
운영

기술적인 함정 유형
설계 문서에서 자주 볼 수 있는 몇 가지 함정이 있다. 다음과 같은 함정에 빠지지 않도록 먼저 관련 사항을 검토해보자.
■ 완전히 새로운 문제라고 생각하는 함정
다른 사람에게 배울 기회를 놓치지 말자. 또한, 기존 해결책을 재사용하는 것도 항상 염두에 두자.
■ 쉬운 문제라고 섣불리 단정 짓는 함정
대부분의 소프트웨어 엔지니어는 다른 도메인들도 그들의 도메인만큼 풍부하고 복합적인 프로세스로 이루어졌다는 점을 생각하지 않는 편이다.
왜 이전의 팀들이 여기에 수천 시간이나 투자했는지 이해가 안 될 수도 있다. 이 문제가 사소한 것처럼 보인다면 여러분은 이 문제를 제대로 이해하지 못한 것이다.
■ 미래를 내다보지 않고 현재에만 집중하는 함정
현재 상태에 맞춰서 올바르게 설계했다고 가정해도 이 해결책이 과연 3년 후에도 여전히 효과가 있을까? 기술적인 부분을 고려할 때는 현재를 넘어서 미래까지 생각해야 한다.
■ 머나먼 미래에 집착해서 설계하는 함정
만약 현재 사용하는 것보다 몇 배 더 큰 규모의 기술을 설계한다면, 그렇게 크게 설계해야 할 진정한 이유가 무엇인지도 고려해보자.
단순히 “우리는 나중에 이것이 필요할지도 모른다.”라는 말은 필요성을 정당화할 수 없다.
■ 모든 사용자를 고려하지 못하는 함정
사용자가 워크플로우workflow 또는 동작을 변경하는 것과 같은 해결책의 모든 부분은 매우 어렵다. 그러니 이 부분 또한 설계의 일부로 포함해야 한다.
■ 어려운 부분은 나중에 해결하려는 함정
프로젝트의 어려운 부분을 무시하거나 나중에 해결하려는 것은 실은 그 복잡성을 다른 사람에게 떠넘기는 것과도 같다.
■ 큰 문제를 더 어렵게 만들어서 작은 문제를 해결하는 함정
최소한 설계 단계에서 이 문제를 언급해야 한다. 더 큰 문제를 쉽게 할 방법을 찾기 전에 먼저 더 작은 문제부터 해결할 방법을 생각해보자.
■ 재설계할 필요가 없는데도 재설계하는 함정
다시 설계할 것을 결정하기까지는 여러 면에서 심사숙고하는 프로세스를 거쳐야 한다. 그래도 프로젝트를 잘 살펴보았을 때 ‘처음부터 다시 하기’가 최고의 해결책이라면, 솔직하게 이를 인정하자.
■ 시스템의 운영 및 관리를 어렵게 만드는 함정
팀에 새롭게 합류하는 사람들은 시스템을 훨씬 더 이해하기 어려워할 것이다. 그러니 다른 사람들이 쉽게 추론할 수 있도록 무언가를 만들어야 한다. 이때는 시스템을 관찰하고 디버깅할 수 있도록 하는 것을 목표로 한다. 모든 프로세스를 가능한 한 단순하게 하고 문서화하라.
■ 사소한 결정을 가장 많이 논의하는 함정
바이크쉐딩bikeshedding은 사소한 문제에 시간을 쓰는 걸 뜻하는 말로 원자력 발전소의 계획을 평가하는 대신에 대부분의 시간을 직원 자전거 보관소에 어떤 재료를 사용할 것인지와 같은 쉬운 주제를 논의하는 데 쓰는 것과 같은 비유를 들 수 있다.
이해하기 어렵거나 합의점을 찾기 어려운 결정에는 전혀 관여하지 않으면서 사소한 결정에는 많은 시간을 보낼 때가 있다.
5.3.4 코딩
대부분의 소프트웨어 프로젝트는 새로운 수많은 코드를 작성하거나 기존 코드를 변경하는 업무를 포함한다.
프로젝트 진행 시 코드 작성 문제
프로젝트의 리더의 코드 업무 기여 여부는 프로젝트의 규모, 팀의 규모, 여러분의 선호도에 따라서 달라진다. 수많은 프로젝트 리더가 코드를 많이 리뷰하지만, 직접 작성하지는 않는다.
“만약 일주일에 하루 정도 코딩을 작성했을 때 일할 의욕이 샘솟는다면, 그렇게 하라. 그러면 다른 일도 더 잘할 것이다.”
그러나 더 어렵고 중요한 것들을 희생하면서까지 코드를 작성하는 데 기여하지는 말아라. 더 크고 어려운 설계 관련 결정이나 조직에 중요한 일을 회피하고 여러분이 할 줄 아는 일만 맡는 간식 먹기와 같은 행위다.
롤모델 지양 및 병목 현상 지양
가장 크고 중요한 문제들을 떠맡게 된다면, 코딩 작업에 도달하는 데만 해도 다른 사람들보다 더 오랜 시간이 걸릴 것이다. 이는 다른 사람들의 업무 진행을 막고 병목 현상을 일으킬 수 있다. 만약 코딩을 해야 한다면 여유 시간이 있거나 업무상 꼭 필요한 때에만 수행하자.
작성한 코드를 다른 사람들을 돕는 지렛대로 생각하자.
팀의 역량을 강화할 수 있는 해결책을 목표로 하되, 그 해결책을 타인으로부터 양도받지는 말자.
모든 중요한 변화를 스스로 해결하기보다는 다른 사람들과 세부사항을 논의하거나 변화에 대응하기 위해 프로그래밍을 할 때 짝을 지어서 다른 사람들이 성장할 수 있도록 돕자. 짝을 짓는 것(페어링)은 지식을 공유하고 다른 사람의 스킬 역량을 발전시키도록 돕는다.
코드 및 변경 사항을 리뷰하는 중이라면 의견을 전달하는 방식에도 신경 쓰자. 비록 여러분이 스태프 엔지니어지만, 주니어 엔지니어들과 친하고 기탄없이 의견을 나누는 사이라고 생각할지라도 여러분이 그들의 업무에 관해서 언급하는 것은 주니어 엔지니어들에게는 위협적일 수 있다.
누군가가 적당히 해낸 업무를 보면 여러분이 더 잘할 수 있을 것 같더라도 괜히 관여해서 그들의 업무를 지배하지 않는 편이 더 낫다.
스태프 플러스 엔지니어는 팀에 대한 기대치를 설정하는 등 암묵적인 방식으로 본보기를 보일 수 있다. 그러므로 좋은 결과를 내는 것이 중요하다. 테스트 표준을 충족하거나 초과하는 수준의 결과를 선보이고, 유용한 설명과 문서를 추가하며, 신중하게 지름길을 선택하자.
5.3.5 의사소통
5.3.6 안내
5.4 마치며

5.3.4 코딩
내가 더 잘할 수 있다는 판단이 있어도 주니어 개발자의 업무에 관여해서 지배하지 말라는 얘기는 매우 좋은 조언이라고 생각한다. 스스로 생각하고 성장할 수 있게 도와주는게 좋다고 본다.

5.3.5 의사 소통
외부 의사소통에서 일정의 문제점이 발생한다는 건 분명 관리자의 잘못이 크다고 본다.
그리고 책에 언급한 것처럼 모든 게 조금만 노력하면 다 잘될 거라는 유혹은 정말 뿌리쳐야 한다. 보통 그렇게 해서 야근을 하고 주말에도 해결하려고 시간을 쓴다고 해도 결국 협업은 필요하고 문제는 드러나고 공유된다.

repo: jongfeel/BookReview


text:
Add reservation-based methods

Add computeIfAbsent, computeIfPresent, compute
I have a suspicion that ReservationNode could also be used to implement an Entry-API like the one on std::collections::HashMap, so that may be worth looking into.

I've been thinking about the entry API considerably over the last few days, thinking through the outstanding problems with the API proposed. To reiterate the issues outstanding as I see them, they are:

Locks are taken out on the entire bin (not just for the single BinEntry) and held by the Entry until the Entry is dropped
Misuse of the entry API can cause a deadlock on the current thread

IMO more sophisticated deadlocks scenarios which could be contrived which span coordination across multiple threads should not be considered in any solution and simply documented that they can occur. Due to the Entry requiring a hold on a Guard to work, it will automatically be !Send and !Sync so a user would need to go out of their way to deadlock in this situation.
I have not been able to think of a solution to the first problem. I think if there was a straight forward way to only allow the single BinEntry to be locked and still allow for inserts and removals, the Java ConcurrentHashMap would already be using it.
In terms of the misuse of the entry API, I don't think its possible to prevent via the type system but it could detect the misuse at runtime and panic using a reentrantlock.
Given these outstanding problems, I'm thinking it may be better to avoid the entry API, at least for now, and build APIs similar to those on the Java API:
impl HashMap {
    pub fn insert_if_absent<'g>(&'g self, key: K, value: V, guard: &'g Guard) -> Option<&'g V> {
        todo!()
    }
    pub fn compute_if_absent<'g, F: FnOnce() -> V>(&'g self, key: K, value: F, guard: &'g Guard) -> &'g V {
        todo!()
    }
    pub fn default_if_absent<'g>(&'g self, key: K, guard: &'g Guard) -> &'g V where V: Default {
        todo!()
    }
}

At least the insert_if_absent has a benefit for existing anyway irrespective of the entry API as it can allow for lock-free insertion under the happy path which the entry API cannot achieve.

@jhinch Sorry it took me so long to get back to this -- yes, I agree with you, we should probably stick with the Java API for now. I think deadlocks are just as likely (people will end up doing something blocking in the compute_if_absent method), but it's maybe slightly less likely.
One alternative is to implement an internal entry-based API, and then for the time being just expose the Java-like versions. I think that should be about the same complexity.

No worries. Thanks for your response! Sounds like a plan then. I might take a look over the next few days. If no one hears from me over the next week, I likely haven't had the time and people should feel free to go ahead and pick this up.

source: gharchive/issue

authors: jhinch jonhoo

repo: jonhoo/flurry

license_type: permissive

license_source: github-api


text:
undefined local variable or method `notification_target' for User

Hi,
I followed the instructions in the readme to add notification-handler to my project. Gem installed correctly, ran the rake command and the db:migration and all well.
But when I add notification_target to my User model, I get the following error when trying to start the development server:
 $ rails s
=> Booting Puma
=> Rails 5.2.3 application starting in development
=> Run `rails server -h` for more startup options
Exiting
Traceback (most recent call last):
        75: from bin/rails:4:in `<main>'
        74: from bin/rails:4:in `require'
        73: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/commands.rb:18:in `<top (required)>'
        72: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/command.rb:46:in `invoke'
        71: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/command/base.rb:65:in `perform'
        70: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/thor-0.20.3/lib/thor.rb:387:in `dispatch'
        69: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/thor-0.20.3/lib/thor/invocation.rb:126:in `invoke_command'
        68: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/thor-0.20.3/lib/thor/command.rb:27:in `run'
        67: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/commands/server/server_command.rb:142:in `perform'
        66: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/commands/server/server_command.rb:142:in `tap'
        65: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/commands/server/server_command.rb:147:in `block in perform'
        64: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/commands/server/server_command.rb:51:in `start'
        63: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/commands/server/server_command.rb:89:in `log_to_stdout'
        62: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/rack-2.2.2/lib/rack/server.rb:422:in `wrapped_app'
        61: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/commands/server/server_command.rb:27:in `app'
        60: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/rack-2.2.2/lib/rack/server.rb:249:in `app'
        59: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/rack-2.2.2/lib/rack/server.rb:349:in `build_app_and_options_from_config'
        58: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/rack-2.2.2/lib/rack/builder.rb:66:in `parse_file'
        57: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/rack-2.2.2/lib/rack/builder.rb:105:in `load_file'
        56: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/rack-2.2.2/lib/rack/builder.rb:116:in `new_from_string'
        55: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/rack-2.2.2/lib/rack/builder.rb:116:in `eval'
        54: from config.ru:3:in `block in <main>'
        53: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:291:in `require'
        52: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:257:in `load_dependency'
        51: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:291:in `block in require'
        50: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:291:in `require'
        49: from /home/horacix/git/escroler_webadmin/config/environment.rb:5:in `<top (required)>'
        48: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/application.rb:361:in `initialize!'
        47: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/initializable.rb:60:in `run_initializers'
        46: from /usr/share/rvm/rubies/ruby-2.6.5/lib/ruby/2.6.0/tsort.rb:205:in `tsort_each'
        45: from /usr/share/rvm/rubies/ruby-2.6.5/lib/ruby/2.6.0/tsort.rb:226:in `tsort_each'
        44: from /usr/share/rvm/rubies/ruby-2.6.5/lib/ruby/2.6.0/tsort.rb:347:in `each_strongly_connected_component'
        43: from /usr/share/rvm/rubies/ruby-2.6.5/lib/ruby/2.6.0/tsort.rb:347:in `call'
        42: from /usr/share/rvm/rubies/ruby-2.6.5/lib/ruby/2.6.0/tsort.rb:347:in `each'
        41: from /usr/share/rvm/rubies/ruby-2.6.5/lib/ruby/2.6.0/tsort.rb:349:in `block in each_strongly_connected_component'
        40: from /usr/share/rvm/rubies/ruby-2.6.5/lib/ruby/2.6.0/tsort.rb:415:in `each_strongly_connected_component_from'
        39: from /usr/share/rvm/rubies/ruby-2.6.5/lib/ruby/2.6.0/tsort.rb:415:in `call'
        38: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/initializable.rb:50:in `tsort_each_child'
        37: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/initializable.rb:50:in `each'
        36: from /usr/share/rvm/rubies/ruby-2.6.5/lib/ruby/2.6.0/tsort.rb:421:in `block in each_strongly_connected_component_from'
        35: from /usr/share/rvm/rubies/ruby-2.6.5/lib/ruby/2.6.0/tsort.rb:431:in `each_strongly_connected_component_from'
        34: from /usr/share/rvm/rubies/ruby-2.6.5/lib/ruby/2.6.0/tsort.rb:422:in `block (2 levels) in each_strongly_connected_component_from'
        33: from /usr/share/rvm/rubies/ruby-2.6.5/lib/ruby/2.6.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component'
        32: from /usr/share/rvm/rubies/ruby-2.6.5/lib/ruby/2.6.0/tsort.rb:228:in `block in tsort_each'
        31: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/initializable.rb:61:in `block in run_initializers'
        30: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/initializable.rb:32:in `run'
        29: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/initializable.rb:32:in `instance_exec'
        28: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/engine.rb:613:in `block in <class:Engine>'
        27: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/engine.rb:613:in `each'
        26: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/engine.rb:614:in `block (2 levels) in <class:Engine>'
        25: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/engine.rb:656:in `load_config_initializer'
        24: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/notifications.rb:170:in `instrument'
        23: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/railties-5.2.3/lib/rails/engine.rb:657:in `block in load_config_initializer'
        22: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:285:in `load'
        21: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:257:in `load_dependency'
        20: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:285:in `block in load'
        19: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:285:in `load'
        18: from /home/horacix/git/escroler_webadmin/config/initializers/rails_admin.rb:12:in `<top (required)>'
        17: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/rails_admin-2.0.0/lib/rails_admin.rb:31:in `config'
        16: from /home/horacix/git/escroler_webadmin/config/initializers/rails_admin.rb:36:in `block in <top (required)>'
        15: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:195:in `const_missing'
        14: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:510:in `load_missing_constant'
        13: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:356:in `require_or_load'
        12: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:37:in `load_interlock'
        11: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies/interlock.rb:13:in `loading'
        10: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/concurrency/share_lock.rb:151:in `exclusive'
         9: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies/interlock.rb:14:in `block in loading'
         8: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:37:in `block in load_interlock'
         7: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:373:in `block in require_or_load'
         6: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:475:in `load_file'
         5: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:661:in `new_constants_in'
         4: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:476:in `block in load_file'
         3: from /home/horacix/.rvm/gems/ruby-2.6.5/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:476:in `load'
         2: from /home/horacix/git/escroler_webadmin/app/models/user.rb:1:in `<top (required)>'
         1: from /home/horacix/git/escroler_webadmin/app/models/user.rb:2:in `<class:User>'
/home/horacix/.rvm/gems/ruby-2.6.5/gems/activerecord-5.2.3/lib/active_record/dynamic_matchers.rb:22:in `method_missing': undefined local variable or method `notification_target' for User (call 'User.connection' to establish a connection):Class (NameError)

Add `require 'notification-handler' to the top of your file or mention the gem in your Gemfile.

I had the same issue: the User model is being loaded in the initializers. The require statement did not work. I had to include the concern  instead.
include NotificationHandler::Target

I had the same issue: the User model is being loaded in the initializers. The require statement did not work. I had to include the concern  instead.
include NotificationHandler::Target

authors: bluciam horacix jonhue

repo: jonhue/notifications-rails

license: MIT


text:
Release: v3.0.0

[ ] Create the Markdown changelog
[ ] Create the Fastlane changelogs (one per ABI)
[ ] Add the Markdown changelog into the application
[ ] Increment the version number
[ ] Increment the version code
[ ] Create a blank changelog for the next development version
[ ] Build the Play Store version
[ ] Create the Git tag
[ ] Generate the F-Droid metadata
[ ] Publish the Play Store version
[ ] Publish the to the Fritter F-Droid repository
[ ] Publish changelog on fritter.cc

Remember to merge and unlock Weblate translations.

authors: Aga-C jonjomckay

repo: jonjomckay/fritter


text:
Cursor exits view when using buffer-extreme commands

Using the buffer extreme commands can place the cursor out of view. Instead, the view should be automatically scrolled after to show the cursor.

Fixed with 31a119a1b38820433bc7760744769588fc0ec32e.

repo: jonpalmisc/sicily


text:
results not consistent with README.md

OS: Ubuntu 16.04
requirements.txt:
torch==0.4.0 numpy==1.14.3 scipy==1.0.1 opencv-python==3.4.0.14 python_speech_features==0.6 tensorflow==1.4 pyscenedetect==0.3.4
Results:
AV offset: 	4  Min dist: 	6.742 Confidence: 	10.447
Numbers are off, please advise

It appears that I didn't update the README when I updated the model. This has been fixed now.

authors: joonson useafterfree


text:
Error - covfee-installjs

Hello!
I would like to use covfee to annotate human behaviour. However, when I try to install Javascript dependencies by running the command covfee-installjs, I get the following error: bash: covfee-installjs: command not found. Do you know how can I fix it?
Thank you in advance!

Hello, I assume you are  running the dev install instructions here? https://josedvq.github.io/covfee/docs/development
If so, could you try following the new instructions? I've replaced "covfee install-js" with "yarn install". You might need to hard-refresh the page to see the new instructions. If there are other issues, please let me know.

Yes, that worked!
Need to update the docs?
It probably should be covfee installjs instead of covfee installjs.
Not sure what is better yarn install or covfee installjs.

Also not sure about the right order of all these commands:
build      Builds the covfee bundle into the project folder
installjs
make
mkuser     Creates an admin in the database.
open       Opens covfee (admin panel) in a browser window
start      Starts covfee in local mode by default.
webpack    Launches a webpack instance for use in dev mode
And whether it is necessary or not to execute them.
The development docs also mention covfee-dev schema and covee-dev build I believe. I will set it up on a new VM and try to collect all necessary commands.

authors: josedvq sorenwacker strukovas

repo: josedvq/covfee


text:
feat: update readme

Abrir esse PR apenas para lembrar você de subir uma atualização do plugin no pub.dev
Atualizar Plugin no Pub.dev-

Thanks - will upload a new version to pub.dev as soon as #68 is merged.

source: gharchive/pull-request

authors: jhonathanqz joseph-grabinger


text:
run workflows on pull_request event

This is to make sure that new PRs don't break the CI once they are merged (at least we'll see that jobs fail before merging).
That is probably a good idea also to ensure that workflows don't intruduce build problems.
Created because of #333 which looked ok with the workflows that did run, but once merged it broke ;-)

Did you need any feedback on this before merging? I don’t know much about it. So if you feel good, go for it

Thanks @MatteoGheza
I somehow forgot to merge this ;-)

authors: hrueger josephdadams

repo: josephdadams/TallyArbiter


text:
Expose skipped message

The Junit schema allows results to present a message as a child of a skipped element. It would be useful to be able to access that through go-junit. An example is below:
<testsuites>
    <testsuite tests="1" failures="0" time="" name="demo">
        <testcase classname="demo.case" name="test">
            <skipped message="reason"></skipped>
        </testcase>
    </testsuite>
</testsuites>

The source for this is line 335 of http://svn.apache.org/repos/asf/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLJUnitResultFormatter.java

👋🏻 Hello @paddatrapper!
So sorry I didn't see this issue, great find by the way. I went and created #41 to implement this, so please take a look and let me know if it works for your use-case!
Is there an example of such a test XML file available on the internet that I can link to? I always like to link to its origin if possible.
Also, do you have any more information on what exact piece of tooling you were using to generate such an XML? I included your test case in my PR as ant.xml, but this isn't a very descriptive name 😁
Thank you again!

I'll give it a test, thanks! A brief glance at the PR now looks like it would work for us.
Any of the test-result from https://github.com/flanksource/karina/actions/workflows/kind.yml should include the skipped message. For example https://github.com/flanksource/karina/suites/2111872017/artifacts/42987817
It is a tool called Karina, though the actual XML generation happens commons (struct). go-junit is used as the library to process test results after CI/unit tests are run.

@paddatrapper #41 has been merged, so please update on your end. Thank you again for the issue! 😁
I also appreciate the details you gave above. I went and grabbed one of the xml files from go-junit-report that contains a skipped message, and used that as a test case.
Cheers!

authors: joshdk paddatrapper

repo: joshdk/go-junit


text:
Webpack sqlcigher for difference system on macos

5.3.0  version change：Don't fallback to building from source。
On macos M1 i want to webpack  package for arm64 or darwin or linux  or window，But when I use 5.3.1， webpack electron，it cannot fallback to build source,  only download darwin  x64.   I want to known darwin x64 can be used for  installaton package on  difference system？ Or i should rebuild sqlcigher  for difference system?

You don't need to rebuild anything, but you do need to download the correct pre-built binaries.
You can that by running a command like this in node_modules/@journeyapps/sqlcipher:
npm run install -- --target_arch=arm64 --target_platform=win32

You don't need to rebuild anything, but you do need to download the correct pre-built binaries.
You can that by running a command like this in node_modules/@journeyapps/sqlcipher:
npm run install -- --target_arch=arm64 --target_platform=win32

I want to webpack package for arm64 on linux ，But when I use 5.3.1， webpack electron，it cannot build source。 can you provide this package？

repo: journeyapps/node-sqlcipher


text:
utils: improve vector macros

Make uc_vector_push() and uc_vector_grow() return pointers to the first added vector element

Refactor uc_vector_push() to be able to take struct initialization literals as macro argument

Make uc_vector_last() NULL safe

As a side effect, the size of libucode.so decreases by about 2KB on x86.

As a side effect, the size of libucode.so decreases by about 2KB on x86.

As basically the same functionality is implemented, I suppose this is caused by the optimizer choosing not to inline the function uc_vector_grow_() when called more than once in the same compilation unit?
About the unsuccessful check, where am I looking at? Scan-build says there are 8 errors found, but I see no errors. I do see warnings though. Are these promoted to errors by scan-build?
If that is the case, is it right that these potential errors have always been there, and are only now recognized by the compiler due to the code change?

authors: IdWV jow-

repo: jow-/ucode

license: ISC


text:
PhpLdapAdmin : connect to openldap with LDAPS and custom certificates

Hi,
I'm trying to set up PhpLdapAdmin to connect to the openldap server through its ldaps port. I use custom certificates on openldap (certificates signed by my CA). Since it seems PLA cannot be configured to use ldaps port in values.yaml, I had to modify the following :
PhpLdapAdmin values.yaml :
---
env:
  PHPLDAPADMIN_HTTPS: "false"
  PHPLDAPADMIN_TRUST_PROXY_SSL: "true"
  PHPLDAPADMIN_LDAP_CLIENT_TLS_CA_CRT_FILENAME: ca.crt
  PHPLDAPADMIN_LDAP_CLIENT_TLS_CRT_FILENAME: tls.crt
  PHPLDAPADMIN_LDAP_CLIENT_TLS_KEY_FILENAME: tls.key
  PHPLDAPADMIN_LDAP_CLIENT_TLS_REQCERT: "never"
replicaCount: 1
image:
  repository: osixia/phpldapadmin
  tag: 0.9.0
  pullPolicy: IfNotPresent
  pullSecrets: []
initContainers:
  - name: copy-ro-certs
    image: busybox
    command: ['sh', '-c', 'cp /tmp-certs/* /container/service/ldap-client/assets/certs/;']
    volumeMounts:
      - name: ldap-certs
        mountPath: /tmp-certs
      - name: pla-certs
        mountPath: /container/service/ldap-client/assets/certs
volumeMounts:
  - mountPath: /container/service/ldap-client/assets/certs
    name: pla-certs
volumes:
  - name: ldap-certs
    secret:
      secretName: openldap-tls-secrets
  - name: pla-certs
    emptyDir: {}
service:
  type: ClusterIP
  port: 80
  annotations: {}
ingress:
  enabled: false
  annotations: {}
  path: /
  tls: []
readinessProbe:
  httpGet:
    path: /
    port: http
livenessProbe:
   httpGet:
     path: /
     port: http
resources: {}
nodeSelector: {}
tolerations: []
affinity: {}

The idea here is to copy the ca certificates to trust the ldaps certificate. openldap-tls-secrets is composed of ca.crt, tls.key and tls.crt.
configmap.yaml :
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ template "phpldapadmin.fullname" . }}
  labels:
    app: {{ template "phpldapadmin.name" . }}
    chart: {{ template "phpldapadmin.chart" . }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
{{- if .Values.extraLabels }}
{{ toYaml .Values.extraLabels | indent 4 }}
{{- end }}
data:
{{ toYaml .Values.env | indent 2 }}
  PHPLDAPADMIN_LDAP_HOSTS: "#PYTHON2BASH:[{ '{{ template "global.server" . }}'  : [{'server': [{'tls': True},{'port':{{ .Values.global.sslLdapPort }}}]},{'login': [{'bind_id': '{{ template "global.bindDN" . }}'  }]}]}]"

Here I changed the port to use sslLdapPort.
On PLA, when trying to connect with the admin user, I get :

On the openldap pods, I get the error :
6697df2d.05320dbb 0x7fddc33326c0 conn=2167 fd=22 ACCEPT from IP=172.16.24.203:44910 (IP=0.0.0.0:1636)
6697df2d.05341d73 0x7fddc2b316c0 TLS: can't accept: error:0A00010B:SSL routines::wrong version number.
6697df2d.0535aec1 0x7fddc2b316c0 conn=2167 fd=22 closed (TLS negotiation failure)

The LDAPS port is working, I can ldapsearch locally from the pods as well as outside the cluster using the openldap service ( while trusting my custom certificates). Seems to me it is a trust issue. Am I missing something ?

Looks like an ssl version mismatch.
This is currently not supported , I ran across issues when I created the chart regarding ldaps and PLA .
Feel free to investigate and propose a PR 🙂

Ok Thank you !

authors: RorFis jp-gouin

repo: jp-gouin/helm-openldap


text:
Deprecation Warning

Issue description
I get a deprecation warning when running hugo server to develop a page locally.
Theme version
v2.9.0
Hugo version
hugo v0.134.2+extended openbsd/amd64 BuildDate=unknown
Which browser rendering engines are you seeing the problem on?
No response
URL to sample repository or website
No response
Hugo output or build error messages
WARN  deprecated: .Site.IsMultiLingual was deprecated in Hugo v0.124.0 and will be removed in a future release. Use hugo.IsMultilingual instead.

Fixed in #921

authors: jpanther larihuttunen

repo: jpanther/congo


text:
WIP: Wait 10 seconds for video to be there instead of 1

@famewolf See if this fixes your problem.

I implemented that patch and have it running...so far so good.

It made it to page 182 out of 201 before it started skipping sweeps and those could have been the flash ones mentioned.  It was pretty obvious when it was happening on page 1 vs page 182.   I'll run it a couple more days and see how it does.

Closing this PR as I bumped up the video wait time to 5 seconds in latest release. Hopefully that is long enough.

authors: famewolf jpchip

repo: jpchip/giveaway-grabber


text:
Couldn't pass ProxyPingEvent to minimotd-velocity

[14:25:24 ERROR]: Couldn't pass ProxyPingEvent to minimotd-velocity
java.lang.NoClassDefFoundError: net/kyori/adventure/text/minimessage/MiniMessage
at xyz.jpenilla.minimotd.lib.platform_velocity.xyz.jpenilla.minimotd.common.MiniMOTD.parse(MiniMOTD.java:113) ~[?:?]
at xyz.jpenilla.minimotd.lib.platform_velocity.xyz.jpenilla.minimotd.common.MiniMOTD.createMOTD(MiniMOTD.java:95) ~[?:?]
at xyz.jpenilla.minimotd.velocity.PingListener.handle(PingListener.java:56) ~[?:?]
at xyz.jpenilla.minimotd.velocity.PingListener.lambda$onProxyPingEvent$0(PingListener.java:49) ~[?:?]
at com.velocitypowered.api.event.EventTask$1.execute(EventTask.java:66) ~[server.jar:3.1.1]
at com.velocitypowered.proxy.event.VelocityEventManager$ContinuationTask.execute(VelocityEventManager.java:546) ~[server.jar:3.1.1]
at com.velocitypowered.proxy.event.VelocityEventManager.fire(VelocityEventManager.java:605) ~[server.jar:3.1.1]
at com.velocitypowered.proxy.event.VelocityEventManager.lambda$fire$5(VelocityEventManager.java:479) ~[server.jar:3.1.1]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) ~[?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) ~[?:?]
at java.lang.Thread.run(Thread.java:831) [?:?]

Duplicate #100

repo: jpenilla/MiniMOTD


text:
Feature/map function

pin追加機能
route追加機能
@ir77
@SakuragiYoshimasa

license: mit

license_source: bigquery


text:
🛑 Control Infotech is down

In ac8779b, Control Infotech (https://control-infotech.com) was down:

HTTP code: 0
Response time: 0 ms

Resolved: Control Infotech is back up in e2cf627 after 12 minutes.


text:
Transitive NuGet packages not considered for Maven dependency resolution

It would appear that transitive NuGet packages are not considered when ensuring POM dependencies are met.
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net7.0-android</TargetFramework>
    <SupportedOSPlatformVersion>21</SupportedOSPlatformVersion>
    <RootNamespace>emoji_picker</RootNamespace>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Xamarin.AndroidX.Emoji2" Version="1.4.0.2" />
    <PackageReference Include="XamPrototype.Android.MavenBinding.Tasks" Version="0.0.11" />
  </ItemGroup>
  <ItemGroup>
  <AndroidMavenLibrary Include="androidx.emoji2:emoji2-emojipicker" Version="1.4.0" Repository="Google" />
</ItemGroup>
</Project>

On second thought, maybe this is the desired behavior.
These libraries are direct dependencies of the Java package, they probably need to be direct dependencies of the NuGet package.
For example, my packages needs AndroidX.Core 1.9.0 and one of my other dependencies provides it, and I build and publish my package.  A future update to the "other dependency" no longer needs AndroidX.Core so it removes the dependency.  Trying to use my library with that updated dependency will cause AndroidX.Core to be missing from the NuGet dependency graph.


text:
Error on Cron Expression

I'm trying to use river 1.5.1 with cron expression:
"schedule" : "0 0 12,19 * * ?", //i need to run every 12:00 and 19:00 from all days , all months
but i got this error:
java.lang.IllegalArgumentException: invalid cron expression format: Unexpected end of expression.
at org.xbib.elasticsearch.plugin.jdbc.cron.CronExpression.buildExpression(CronExpression.java:302)

I also encountered this problem. My expression is : "schedule":"0 1,5 0-23 ? * *".
ps:
elasticsearch1.5.2  elasticsearch-river-jdbc-1.5.0.5
redhat 6+ and CentOS7

authors: fabioebner github-arong

repo: jprante/elasticsearch-jdbc


text:
Minimum Supported Rust Version (MSRV)

https://github.com/rust-lang/api-guidelines/discussions/231

cargo-msrv

repo: jpreprocess/jpreprocess


text:
react-native里组件，模拟器可以正常云心，ios真机不行！

My environment:

rn版本0.57.6
aurora-imui-react-native版本0.14.0
xcode11运行模拟器正常，但是报警告
Module RCTAuroaIMModule require main queue setup since it overrides init but doesn't implement requiresMainQueueSetup.
In a future release React Native will default to initializing all native modules on a background thread unless explicitly opted-out of.
xcode11运行真机报线程错误

Thread 1: signal SIGABRT

repo: jpush/aurora-imui


text:
开发者建议

希望能及时维护这个项目，因为该项目依赖了其他人的表情库，但是其他人的表情库已经更新、升级了，但是该项目还没有及时更新相应的依赖库版本，有些已经废弃的类依然存在，导致项目很多报错的地方

说的对

是的

之前问过，说demo会在2019年5月中旬做一次更新

之前问过，说demo会在2019年5月中旬做一次更新

我酸了，五月初我用2.2.0作为基础，改了一大堆gradle版本，然后5月中下旬2.3.0出来了，看到修复了一大堆问题，难受了呀。

你参考这个，玩聊天，基于极光IM的即时通讯app，功能完善，供大家参考https://github.com/979451341/WanIm

说的对

你参考这个，玩聊天，基于极光IM的即时通讯app，功能完善，供大家参考https://github.com/979451341/WanIm

repo: jpush/jchat-android


text:
In the week view, events are completely covered by other schedules and are not visible.

Check that this is really a bug

[X] I confirm

Reproduction link
https://jquense.github.io/react-big-calendar/examples/index.html?path=/docs/examples--example-2
Bug description

I have attached a screenshot of the reproduction I made on the demo page.
As you can see in the image, I have created 1 to 6 events on the demo page library.
The 5th event is scheduled from 12 to 2 PM, but it is completely invisible due to being covered by the 4th and 6th events.
Additionally, the 2nd event is scheduled from 10 AM to 12 PM, but the part from 11 AM to 12 PM is not visible as it is covered by the 4th event.
Expected Behavior
the 5th event should be visible and the 2nd event should display its full time range. To make it easier for you to understand, I've attached a screenshot of a similar schedule created in Google Calendar.

Actual Behavior
No response
react-big-calendar version
1.5.2
React version
17.0.2
Platform/Target and Browser Versions
macOS Chrome 109.0.5414.87
Validations

[X] Read the docs.
[X] Check that there isn't already an issue that request the same feature to avoid creating a duplicate.
[X] Make sure this is a react-big-calendar issue and not an implementation issue

Would you like to open a PR for this bug?

[ ] I'm willing to open a PR

I do not see a reproduction link that shows the issue. Please fork the sample Codesandbox to fully recreate the issue for review.

@handjunyoung It appears that you have recently resolved this in your forked repo. Would you submit a PR with your fix?

@handjunyoungПохоже, вы недавно разрешили это в своем разветвленном репо. Не могли бы вы отправить PR с вашим исправлением?

join the question

@cutterbl  @ArtemMayorov
Okay!
I'll write a PR and post it.

authors: ArtemMayorov cutterbl handjunyoung nobelparking

repo: jquense/react-big-calendar


text:
Add Generate test case

Refs #1004.

Note, I made generate-testcase an npm script, but it could just as easily be required in and called directly by unit-tests.
  var generateTestCase require('utils/generate-testcase');

After thinking about it, I'll open this PR after the browser tests land. It'll be easier to see what makes sense after utils/evaluate-test is available.

repo: jquery/esprima


text:
Docs: fix the type of SwitchCase's test

Fix #1909

Codecov Report

Merging #1913 into master will not change coverage.
The diff coverage is n/a.

@@          Coverage Diff           @@
##           master   #1913   +/-   ##
======================================
  Coverage     100%    100%
======================================
  Files           1       1
  Lines        4056    4056
  Branches      717     717
======================================
  Hits         4056    4056

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update c833018...f997dee. Read the comment docs.

authors: ariya codecov-io


text:
Add QUnit subsuite runner

See https://github.com/jquery/jquery-ui/commit/02903259e1f6afee1b13d6431900610c70fb03b1#diff-1
Code a bundle with QUnit as an addon: https://github.com/jquery/jquery-ui/blob/master/tests/unit/testsuites.js

Tests that overwrite callbacks fail when run inside a sub-suite if I remember correctly. I've been quite busy between work and other random commitments I'll try to take a look at composite stuff at some point.

Need to fix the callbacks. Once that is done, try to replace the custom code in UI and Mobile (tests/unit/runner.js)

I've started a new branch for the refactor from the old style logging callbacks to the new addon system callbacks. https://github.com/wwalser/qunit/tree/compositeFixes
So far I have two of the callbacks refactored and many of the previously failing tests are passing.

Nice! Thanks for the update.

authors: jzaefferer wwalser

repo: jquery/qunit


text:
Promote plugins a little more

QUnit has a few really nice/plugins but I think we should promote it more and encourage more people to build/use them.
On the homepage there's totally no emphasize on the fact that qunit plugins/themes exist, while I do consider it an important feature of qunit. Any thoughts are welcome?

I'm also talking about themes. I always hated QUnit because it was ugly, and just explored that it has themes. Why didn't anybody told me yet :p

On the homepage there's totally no emphasize on the fact that qunit plugins/themes exist

Well, there's a link in the Learn More section. Did you have anything specific in mind? Perhaps someone from @jquery/content has some ideas.

Yes, I had a look at the site and found the theming by searching "theme". We could add a theming menu item on the api docs like we have for jQuery UI and Mobile and/or a Themes tab on the homepage...
However, I'm not sure whether we actually can as all the themes are in private repos. Would that be problem?

There is a "Plugins" page (since 2014), and it's currently linked from main navigation atop every page, as well as from the "Learn More" paragraph on the home page.

The new site also mentions "Extendible" on the home page. Which seems like all-in-all would be enough to close this issue.

Perhaps a few final notes before we close it:

[ ] Make sure "Plugins" guide (on the new site) is linked from the "Extensible" blurb on the home page.
[ ] Consider linking "Plugins" form the main nav (inside of inside "Guides").
[ ] Close this issue once the site is live on the main domain :)

authors: Krinkle agcolom paulilli scottgonzalez


text:
added Batch extension method

Hi,
I created a simple batch metod, to create buckets of a given size over a collection.
thanks!

Nice! That's a seriously bad ass extension method!
I'll try to get this reviewed over the weekend but I want to thank you up front for adding this.

Looks good. Thank you for your contribution.

me pleasure, Thanks!

authors: jreina rudygt

repo: jreina/ShittyLINQ


text:
Fixed OID type tests and removed conditional tests

cast_type was removed from the Column class in ActiveRecord in favor of retrieving types from the model itself
-- https://github.com/rails/rails/commit/155b1b7fe3a1d231fb98a6fb04a21f6eb190b98f
-- https://github.com/rails/rails/commit/158c7eb1d61a28452e0aafd1e05314352eea2749

accessor was removed from the Column class in ActiveRecord
-- https://github.com/rails/rails/commit/2eb547a4d9cfb4ed1c92397921402048162f5fc8
-- https://github.com/rails/rails/commit/b93b39eff6829ee05ffec1cc8c505f69cbb53fdc#diff-2524057922ad16b58e6b18b2f35b5de2

the ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::OID::Integer class was removed and now uses ActiveRecord::Type::Integer

I removed the conditionals checking for JRUBY_VERSION as well. Let me know if we need to keep those. I was under the impression that Rails 5 wouldn't run on any JRuby versions that wouldn't have that defined but wasn't sure if there was some other reason for the check.

@rdubya yeah this will be 9k and above only and the plan we want to pursure is not supporting all versions of all things but make new numbered releases to coincide with rails releases.  I am hoping Ruby is stable enough where JRuby specific versions will no longer be a concern (although never say never).
For now assume JRuby 9k+.  This means pretty much all version checks can go away (I am really hoping Ruby 2.4 adds no wrinkles).

authors: enebo rdubya

repo: jruby/activerecord-jdbc-adapter


text:
Add GrandparentTitle and ParentTitle to Webhook Metadata

The plex webhook payload Metadata includes grandparentTitle and parentTitle fields for artist/series and album/season titles, respectively.

Thanks, I appreciate it!

authors: DJCrock jrudio

repo: jrudio/go-plex-client


text:
Sending RDNs in Reverse Order for IssuerAndSerial

From Kevin Wallis:
The following code yields error logs from OpenXPKI
KeyPair jscepKeyPair = createRandomKeyPair();
X509Certificate jscepCertificate = createOwnCertificate(jscepKeyPair, client);
...
X500Principal crlIssuer = new X500Principal("CN=CA ONE,OU=Test CA,DC=OpenXPKI,DC=ORG");
BigInteger crlSerialNumber = BigInteger.valueOf(511);
X509CRL crl = client.getRevocationList(jscepCertificate, jscepKeyPair.getPrivate(), crlIssuer, crlSerialNumber);

Error log:
openxpki.application.ERROR:31458 [OpenXPKI::Service::SCEP::Command::PKIOperation (/usr/lib/x86_64-linux-gnu/perl5/5.20/OpenXPKI/Service/SCEP/Command/PKIOperation.pm:255); scep-server-1()@2dec] SCEP getcrl - no issuer found for serial 511 and issuer DC=ORG,DC=OpenXPKI,OU=Test CA,CN=CA ONE
Note the difference in order of the issuer (DC first vs DC last).  This issue will be used to determine if this is a jscep issue, or and issue with OpenXPKI.

getRevocationList calls new X500Name(issuer.getName()).  X500Name is encoded by BouncyCastle, so this is really out of our control at this point.
There are optional arguments to both X500Principle.getName() and the X500Name constructor.  The test case should be whether encoding and decoding the X500Name yields the same representation on the jscep side.

Created new branch for some test cases: https://github.com/jscep/jscep/tree/issue-70

Original message can be seen here: https://lapo.it/asn1js/#308006092A864886F70D010702A0803080020101310F300D06096086480165030402030500308006092A864886F70D010701A080248004820225308006092A864886F70D010703A080308002010031820174308201700201003058305331133011060A0992268993F22C64011916034F524731183016060A0992268993F22C64011916084F70656E58504B493110300E060355040B0C07546573742043413110300E06035504030C07526F6F74204341020102300D06092A864886F70D01010105000482010011A4C1C707CF0F2CA18BA594CC76A9AA5037B74741B9CFEA21EB70DC81461E217748B5F7834F720FDC44B714B2F02CCFB89ABA19920BAD9D24C707CA47906D57945CA1F8B145451C991CD2BA193580B6738CD2FD1EDF42EB92C42B2FC8570C6BFC4DD364C96E0376115D1B11582E8EB1CAD381574139BA78451B810AFE79A11B620A6BD933C40C364C62054038DCF94921B97A3BB74C76B7C64FDD5840A49FB257DBD6E349AD77AD9BDB9D5BEB5EFAD9A28AC5327F68DCAAFE45FA92C9BFC1537CF015708D76A36AFAD4F5BAB8542A1136B93005B084C0A3B4DB470D11588FE766BFB72F6877DC0777EC56D7EB456769EAE690D8F824DEA3B1A57D6BEE2C66C3308006092A864886F70D010701301406082A864886F70D03070408F52D6BE484AAD41FA0800468D4B9D1F9165BEB676C0173F4AFEA7A20BA0E17C5545A3DDD0FE3849A9AC4EE02D0706D36CC11E62340E5630C244D240907B51EE63047A5DA1CBE65F62C70C0EE216F2EC864C8940C3A9A62D6A01270E6E2AF77D0C9F9C82B361533B9E4B02F7286ABB91A0459F80900000000000000000000000000000000A0803082023C308201A5A003020102020101300D06092A864886F70D01010D0500306431133011060A0992268993F22C64011916036F726731183016060A0992268993F22C64011916084F70656E58504B49311F301D060A0992268993F22C640119160F54657374204465706C6F796D656E7431123010060355040313096A736365702E6F7267301E170D3137303531353135303934365A170D3137303531373135303934365A306431133011060A0992268993F22C64011916036F726731183016060A0992268993F22C64011916084F70656E58504B49311F301D060A0992268993F22C640119160F54657374204465706C6F796D656E7431123010060355040313096A736365702E6F726730819F300D06092A864886F70D010101050003818D0030818902818100ACA016705164DF4CEFCA1A8354629FCEB4F762BB42CE0D00AD0B4EA1A9FC1DFD1F6874252A7FAD7972E1616B28067BA155979B64E7A8D7146A0AAB0AAA33DED3841536A4CB8C259046962D2EA43659A0178291F2BCC2728BA664C8F435E852D270753413556E042223E97675BCB9FEF4FDF96D6F72E258FBD8A8D5F381298F5D0203010001300D06092A864886F70D01010D0500038181009A563C985C632B4ABDCEFBFEF0A23AB88280FAF62AC617C309CB2DBEC4B6849C3B116CAD2870B05388A5BA4163B87C5EF8BEB37E82A81D2BF1DEFECB06053AA8AD07440D01A5EC961243555461654BB8A2FBBBD00965D191089A3A3955439EEF794A8AB017A5EA11094FE38046D5C7FCB6E787489CB74B652F3D44D3E0B0DC0F0000318201E8308201E40201013069306431133011060A0992268993F22C64011916036F726731183016060A0992268993F22C64011916084F70656E58504B49311F301D060A0992268993F22C640119160F54657374204465706C6F796D656E7431123010060355040313096A736365702E6F7267020101300D06096086480165030402030500A081D23011060A6086480186F84501090731031301303012060A6086480186F845010902310413023232301806092A864886F70D010903310B06092A864886F70D010701301C06092A864886F70D010905310F170D3137303531363135303934375A3020060A6086480186F84501090531120410E961A2F7A53050099647FE0E50125D7C304F06092A864886F70D010904314204408FB0D309961900A74C86B7853591F40AB41C93787B93318C1280C16BCE7B917CD77F3E8B4D850E415E213566958F9E58717A1314C824F03B132F882D9384FED1300D06092A864886F70D0101010500048180207EED49BB5E26E9CED3A00BABEE2D17BBFC93A4D99E6C2BD238DAF6F3E83CADD636ABEE05C193B6EA8F2644467F4104C979324B6C8CD9543083EE4F09551686CCF24CC6F316A8394DCBD34792866DA6C8A425B91BD3C94BAE1E8147CB5D9660681ED497F48C17351C13AE4692DB5CF89BEB53BD3FBF48E4438B9ACF99B0B664000000000000

getRevocationList calls new X500Name(issuer.getName()). X500Name is encoded by BouncyCastle, so this is really out of our control at this point.

This isn't true that this error is caused by BouncyCastle. X500Principal.getName() returns DN string formated according to RFC2253 which means that all RDNs are formated in reverse order. And that is the case. You can't use this function to construct org.bouncycastle.asn1.x500.X500Name object. So the code in org.jscep.client.Client.getRevocationList():
X500Name name = new X500Name(issuer.getName());
IssuerAndSerialNumber iasn = new IssuerAndSerialNumber(name, serial);

And the code in org.jscep.client.Client.getCertificate():
X500Name name = new X500Name(ca.getSubjectX500Principal().toString());
IssuerAndSerialNumber iasn = new IssuerAndSerialNumber(name, serial);

Is wrong. Instead, you should use org.jscep.util.X500Utils.toX500Name() as in org.jscep.client.Client.poll() function:
IssuerAndSubject ias = new IssuerAndSubject(X500Utils.toX500Name(issuer
.getSubjectX500Principal()), X500Utils.toX500Name(subject));

@netcat-pl are you will to provide a pull request for this?

This is now available in release 2.5.1

authors: netcat-pl seize-the-dave

repo: jscep/jscep


text:
Jquery AutoComplete Hides Back on the modal

If we have a auto complete on the modal. and when we search/type in anything in the text box. The return items get hidden behind the modal.
if i comment the following line in the modalmanager.js and replace that with the following it works fine( may be stacking modal on top of one another will not be working now) which is fine as I don't need that.
/* This works fine
getIndexOfModal: function (modal) {
for (var i = 0; i < this.stack.length; i++) {
if (modal === this.stack[i]) return i;
}
}
/* this does not work */
getIndexOfModal: function (modal) {
var index = 0;
for (var i = 0; i < this.stack.length; i++) {
if (this.stack[i].isShown) {
index++;
}
}
/return index;
}

.ui-autocomplete { z-index:2147483647; }  it is working in bootstrap modal also brother. Thank you very much.

authors: ktheja tajeet

repo: jschr/bootstrap-modal


text:
🛑 Piwigo is down

In 59ef8ba, Piwigo ($SERVER_BASE/piwigo/) was down:

HTTP code: 0
Response time: 0 ms

Resolved: Piwigo is back up in e8e7291.

repo: jscmidt/upptime


text:
🛑 Lychee is down

In 3c9679d, Lychee ($SERVER_BASE/lychee/) was down:

HTTP code: 0
Response time: 0 ms

Resolved: Lychee is back up in a001986 after 548 days, 23 hours, 26 minutes.


text:
🛑 API is down

In 8b88a67, API ($SERVER_BASE/api/) was down:

HTTP code: 0
Response time: 0 ms

Resolved: API is back up in 48251fa after 9 minutes.


text:
🛑 Tandoor is down

In fcaa2d3, Tandoor ($SERVER_BASE/recipes/) was down:

HTTP code: 0
Response time: 0 ms

Resolved: Tandoor is back up in 792f28c after 11 minutes.


text:
🛑 Grafana is down

In 2358a97, Grafana ($SERVER_BASE/grafana/) was down:

HTTP code: 0
Response time: 0 ms

Resolved: Grafana is back up in d4f9ab2 after 10 minutes.


text:
🛑 API is down

In ef4f0ea, API ($SERVER_BASE/api/) was down:

HTTP code: 0
Response time: 0 ms

Resolved: API is back up in 1603a48 after 10 minutes.


text:
🛑 Linus-Wordpress is down

In e0743bb, Linus-Wordpress ($SERVER_BASE/wordpress/) was down:

HTTP code: 0
Response time: 0 ms

Resolved: Linus-Wordpress is back up in 73b573e after 16 minutes.


text:
🛑 API is down

In 5787763, API ($SERVER_BASE/api/) was down:

HTTP code: 0
Response time: 0 ms

Resolved: API is back up in 74b9a11 after 20 minutes.


text:
🛑 Piwigo is down

In 8defaf5, Piwigo ($SERVER_BASE/piwigo/) was down:

HTTP code: 0
Response time: 0 ms

Resolved: Piwigo is back up in cdb9cec after 12 minutes.


text:
Allow non-top-level ES6 import declarations

See #903 for rationale. #944 makes it possible to use Esprima-harmony's tolerant mode which allows such imports to parse, but it does still report them as an error. However, this error is very specific and thus amenable to being specifically ignored.
JSCS ought to ignore this particular "error" since it's a semantic/correctness issue rather than a stylistic issue.

Want to back this issue? Place a bounty on it! We accept bounties via Bountysource.

Allowing import to be everywhere sounds like side-effect of transpiling, otherwise it seems weird for ES6 to forbid it but for transpiler to allow it.
Why is that? Could you provide links to relevant topics?

Well, yes, the transpiler can be permissive like this because the CJS module system (and probably UMD too) don't impose any such constraint, and those are what it uses when transpiling to ES5.

Thanks again!

Thanks! I look forward to re-enabling the next release of JSCS on my ES6 project :smile:

authors: cvrebert markelog mikesherov

repo: jscs-dev/node-jscs


text:
Update mixup between rules in docstring example

requirePaddingNewLinesBeforeExport was mentioned instead of disallowPaddingNewLinesBeforeExport.

Thanks @astorije!

Coverage remained the same at 99.28% when pulling 094b23493f424630462bf0e8f2d42778ed1ce4ca on astorije:patch-2 into d738468b3cc51be303fc66934ddb64bbf0edb8d1 on jscs-dev:master.

authors: astorije coveralls mrjoelkemp


text:
disallowTrailingWhitespace: use CST for fix method

/cc @markelog @hzoo

It seems there is a jshint error?

Friendly ping

It seems we still have couple failures?

Coverage increased (+1.04%) to 97.466% when pulling 265a7b2e517524ac40222b9daf777d46413d7244 on disallow-trailing-whitespace-fix into 5a6fe27cb1c913456475e0ba9bcc772246cd735d on master.

@markelog @hzoo Fixed ;-) somehow.

Coverage increased (+1.04%) to 97.488% when pulling 3e28111260649d85304ab3d08eaba4797c45551d on disallow-trailing-whitespace-fix into c86d078797a17fe8fa15d19051a0f920c7f6514f on master.

Coverage increased (+1.04%) to 97.488% when pulling 8f63819abb4e7695c4938edb923636d7394c9273 on disallow-trailing-whitespace-fix into c86d078797a17fe8fa15d19051a0f920c7f6514f on master.

Coverage increased (+1.04%) to 97.488% when pulling 3a16cf08ac8e0f503dd60790f8b0e58f269780df on disallow-trailing-whitespace-fix into c86d078797a17fe8fa15d19051a0f920c7f6514f on master.

LGTM

authors: coveralls markelog zxqfox


text:
Replace syncVersions by version grouping

This is a follow-up to the following discussion https://github.com/jscutlery/semver/discussions/98.
Given a repo with 3 packages a, b & c, one should be able to sync versions for a & b but still keep independent versioning for c; meaning that changing a would have to bump b as well.
The solution we agreed to is to use the project structure for grouping (using folders).

By creating a "group" project in workspace config, like we already do in sync mode with a root path set to the group folder. This way, Nx cache, and Nx dep graph might work.
This will just run the sync mode with a filter of projects that are in the group path. we also have to be careful about the root changelog.

Example:
{
  "name": "lumberjack",
  "root": "packages/lumberjack",
  "architect": {
    "version": {
      "builder": "@jscutlery/semver:version"
    },
  },
},
{
  "name": "spectacular",
  "root": "packages/spectacular",
  "architect": {
    "version": {
      "builder": "@jscutlery/semver:version"
    },
  },
},
{
  "name": "angular-group",
  "root": "packages/angular",
  "architect": {
    "version": {
      "builder": "@jscutlery/semver:version"
    },
  },
},
{
  "name": "angular-cdk",
  "root": "packages/angular/cdk",
  "architect": {"build": "..."}
},

[ ] If group root is "." then it's a workspace sync versioning so tag is vMAJOR.MINOR.PATCH
[ ] If group root is not "." then it's a group so tag is group-name-MAJOR.MINOR.PATCH
[ ] Throw an error if a package has semver version while it's also in a group.
[ ] Consider adding a tagPrefix/--tag-prefix option in case a grouping folder needs to be renamed--for whatever reason--without breaking the version tags (maybe we should open a distinct issue)

cc. @LayZeeDK, @NachoVazquez, @santoshyadavdev, and @SerkanSipahi.

Challenges with current approach
Considering the following issues:

grouping needs "virtual projects" which make angular.json / workspace.json less readable than it already is 😉... plus, we (with @edbzn) feel that it could lead to conflicts & issues with other tools,
as we rely on nx to run semver on the different projects in independent mode, we have less control to solve issues like this one https://github.com/jscutlery/semver/issues/61.

💡 Idea
A single virtual project named "workspace" with a global configuration should allow more control. In the future, if we need it for some reason, we can even run a semver cli and feed it with a semver.json configuration.
The new configuration could look something like this.
{
  "name": "workspace",
  "root": ".",
  "architect": {
    "version": {
      "builder": "@jscutlery/semver:version",
      "options": {
        "configs": [
          {
            "name": "rx-state",
            "type": "independent",
            // path is optional for independent versioning
            // as we can just pick the projectRoot in workspace.json
            // "path": "packages/rx-state", // we need this for git log & changelog path & root package.json
          },
          {
            "name": "cdk",
            "type": "group",
            "path": "packages/cdk",
            "packages": [
              "packages/cdk/operators",
              "packages/cdk/helpers", // or even a wildcard "packages/cdk/*"
            ]
          }
        ]
      }
    }
  }
}

Drawback
The main drawback is that we can't use nx options like --affected etc... to run semver for independent projects... but that's not really important as semver is idempotent and won't bump if no changes occurred since last bump.

Is this still a planned feature?

authors: tomjamesallen yjaaidi

repo: jscutlery/semver


text:
*[Symbol.iterator] method cant be handled

Input code
/** Class representing a byte. */
class BitByte1 {
	constructor() {}

	/**
	 * @yields {number} Test number.
	 */
	*[Symbol.iterator]() {
		yield 1;
	}
}

JSDoc configuration

{
	"tags": {
		"allowUnknownTags": true,
		"dictionaries": [ "jsdoc" ]
	},
	"source": {
		"include": [ ".", "package.json", "ReadMe.md" ],
		"includePattern": "src.*\\.js$",
		"excludePattern": "(node_modules|docs|test|dist|rollup.config.js)"
	},
	"plugins": [
		"plugins/markdown"
	],
	"opts": {
		"destination": "./docs/",
		"encoding": "utf8",
		"private": true,
		"recurse": true,
		"template": "./node_modules/tui-jsdoc-template"
	}
}

JSDoc debug output

[TSD-JSDoc] index.js:11:1 Failed to find parent of doclet 'BitByte1#Symbol.iterator' using memberof 'BitByte1#Symbol', this is likely due to invalid JSDoc.
Doclet {
  comment: '/**\r\n\t * @yields {number} Test number.\r\n\t */',
  meta: {
    range: [ 151, 189 ],
    filename: 'index.js',
    lineno: 11,
    columnno: 1,
    path: 'D:\\Users\\vorob\\Desktop\\Projects\\BitByte\\src',
    code: {
      id: 'astnode100000599',
      name: 'BitByte1#Symbol.iterator',
      type: 'MethodDefinition',
      paramnames: []
    },
    vars: { '': null }
  },
  yields: [ { type: [Object], description: 'Test number.' } ],
  name: 'iterator',
  longname: 'BitByte1#Symbol.iterator',
  kind: 'function',
  memberof: 'BitByte1#Symbol',
  scope: 'static',
  params: [],
  generator: true,
  ___id: 'T000002R000049',
  ___s: true
}

Expected behavior
No errors occurred and method will be counted as Symbol.iterator aka computable properties BitByte1[Symbol.iterator]
Current behavior

Your environment

Software
Version

JSDoc
3.6.4

Node.js
14.0.0

~npm~
~6.14.4~

yarn
1.22.4

Operating system
Microsoft Windows [Version 10.0.19041.330]

This is a problem for me as well

This also issue also occurs with [Symbol.hasInstance] as in:
class foo
{
  static [Symbol.hasInstance] ( type )
  {
    // do something...
  }
}

There will be no methods listed under the class, in this example. Tried to use @name to force it, but that does not work.

authors: Zekfad backspaces houghtonap

repo: jsdoc/jsdoc


text:
Doesn't work with prototype methods?

I have this
@module MyObj
@desc ...
var MyObj = function(){
  // code
};

/**
@name something
@function
@memberof MyObj
*/
MyObj.prototype.something = function(){
  // more code
};

Only documentation for MyObj is generated. Nothing else. What am I misunderstanding here?

/**
 * @class
 * @name MyClass
 */
function MyClass(){}

/**
 * @method
 * @name MyClass#something
 * @returns {!string}
 */
MyClass.prototype.something = function(){};

Thanks. I think the key to this is to use @name MyClass#something instead of @name something.

Instead of pointing @name for each method you can use the approach described here. The result will be:
MyClass.prototype = /** @lends MyClass# */ {
constructor: MyClass,

/**
 * @returns {!string}
 */
something: function() { return 'x'; }
}

In this case you event do not need @method.
You can replace @lends MyClass# with @lends MyClass.prototype.

authors: Jakobud Netmosfera mrself


text:
🛑 PlayYourPride is down

In 90a2926, PlayYourPride (https://playyourpride.com/) was down:

HTTP code: 0
Response time: 0 ms

Resolved: PlayYourPride is back up in 6b815a8 after 39 minutes.

repo: jshwlkr/upptime


text:
🛑 PlayYourPride is down

In 83a085d, PlayYourPride (https://playyourpride.com/) was down:

HTTP code: 0
Response time: 0 ms

Resolved: PlayYourPride is back up in 02599a8 after 12 minutes.


text:
Empirical correlation for DSI data

Compute empiricial correlation for a DSI dataset.
Dipy provides a DSI data set, taiwan_ntu_dsi, which could be used.
See http://nipy.org/dipy/examples_built/reconst_dsi.html
Resample this onto a multi-shell pattern, with a large number of bvals and the same large number of bvecs for each shell. Use bvecs provided by Hans Knutsson or Dipy's function for spreading out charged particles?

I can't find information about small and big delta for the NTU dataset referenced above. How to compute q-values then?

The provider of the NTU data does not know big and small delta. Anyway, it seems that the NTU is too small to be of real use. Unless we can find DSI data with more samples I'll consider this closed.


text:
PHP library for JSON API + Doctrine

PHP library for implementation JSON API with Doctrine

Thanks!

repo: json-api/json-api


text:
Loop fail with horizontal reverse

I have a question, i trying to use $PlayOrientation=5 (horizontal reverse) but with this config the $loop var is not like a carousel (option1), instead $loop look like rewind (option=2) i need a especial config? or just is not supported?
my config is
        var options2 = {
            $AutoPlay: true,
            $Loop: 1,
            $AutoPlaySteps: 1,
            $AutoPlayInterval: 0,
            $PauseOnHover: 4,
            $SlideEasing: $JssorEasing$.$EaseLinear,
            $SlideDuration: 1600,
            $MinDragOffsetToSlide: 20,
            $SlideWidth: 140,
            $SlideSpacing: 50,
            $DisplayPieces: 7,
            $ParkingPosition: 0,
            $UISearchMode: 1,
            $PlayOrientation: 5,
            $DragOrientation: 5
        };

$PlayOrientation works only with value 1 or 2.
Not sure if the value 5 stopped it from working properly.

I have just improved $AutoPlaySteps handling. Please download the latest version.
And then you can set $AutoPlaySteps: -1, $PlayOrientation: 1 and $DragOrientation: 1.

authors: ilebannen jssor

repo: jssor/slider


text:
importing css files, is sass-loader doing it? is it the right thing to do?

I got tripped up for a while because I had these lines in my app.scss
@import url('https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha/css/bootstrap.min.css');

.btn-error {
  @extend .btn;
  cursor: default; // remove finger
  color: red;
}

Everything about the site worked just fine except @extend .btn didn't do a thing.
Bootstrap was displaying properly.
Took me a while to track down the fact that sass ignores importing files that don't have the extension sass or scss.  I only found this problem running my scss through the command line sass program.
So whats happening here is that sass-loader is importing a .css file but sass is ignoring it!  Or is another loader importing it?
Here's the relevant part of my config
      loaders: [
        {
          test: /\.scss$/,
          loader: "style!css!sass"
        },
        {
          test: /\.jsx?$/,
          loaders: [ 'react-hot', 'babel' ],
          exclude: /node_modules/
        },
        {
          test: /\.jsx?$/,
          exclude: /node_modules/,
          loader: 'babel-loader',
          query: {
            stage: 1
          }
        },
        {
          test: /\.css$/,
          loader: "style!css"
        },
        {
          test: /\.woff($|\?)|\.woff2($|\?)|\.ttf($|\?)|\.eot($|\?)|\.svg($|\?)/,
          loader: 'url-loader'
        }
      ]

Sass is not downloading files afaik. So when you import an http url you won't be able to extend classes that are defined in these remote files. These imports will be resolved on runtime inside the browser.

authors: jhnns kswope

repo: jtangelder/sass-loader


text:
PstFromFlopyModel fails when use_pp_zones==False but ibound includes values>1

I was having trouble getting PstFromFlopyModel to run with my model when using only pilot point properties (no grid_props or grid_props). This stopped being an issue when I replaced all non-zero values in my ibound array with ones. I think setup_pilotpoints_grid was only creating pps where ibound==1, and as a result the helper crashed out during calculation of interpolation factors.
The documentation says that if use_pp_zones is False, ibound values greater than zero are treated as a single zone for pilot points, but this doesn't seem to be the case at present.
Code and error:
pp_props = [["upw.{}".format(p),l] for p in ["hk","vka","ss","sy"] for l in range(nlay)]
helper = pyemu.helpers.PstFromFlopyModel(m, new_model_ws, model_exe_name='mfnwt', pp_props=pp_props,remove_existing=True,pp_space=4,use_pp_zones=False,build_prior=True)
~/miniconda3/envs/flopy/lib/python3.7/site-packages/pyemu/utils/helpers.py in init(...)
1717         self.setup_list_pars()
-> 1718         self.setup_array_pars()
~/miniconda3/envs/flopy/lib/python3.7/site-packages/pyemu/utils/helpers.py in setup_array_pars(self)
2483         if self.pp_suffix in mlt_df.suffix.values:
2484             self.log("setting up pilot point process")
-> 2485             self.pp_prep(mlt_df)
~/miniconda3/envs/flopy/lib/python3.7/site-packages/pyemu/utils/helpers.py in pp_prep(self, mlt_df)
-> 2270                     ok_pp.calc_factors_grid(self.m.sr, var_filename=var_file, zone_array=ib_k)
~/miniconda3/envs/flopy/lib/python3.7/site-packages/pyemu/utils/geostats.py in calc_factors_grid(self, spatial_reference, zone_array, minpts_interp, maxpts_interp, search_radius, verbose, var_filename, forgive)
776             if self.interp_data is None or self.interp_data.dropna().shape[0] == 0:
--> 777                 raise Exception("no interpolation took place...something is wrong")
Exception: no interpolation took place...something is wrong

Correct again - I just pushed a fix for this to develop.  Let me know if that doesn't work.

Awesome, thanks.


text:
Integrate CardFlip

I was getting the AccessbilityInfo not found errors (like #16 or #12) as well.
This is due to this library not specifying a react-native version in its dependencies, so it falls back to the react native version specified in react-native-card-flip (sth quite old like 0.49.1).
As react-native-card-flip is not maintained anymore and this library relying quite strongly on this, i moved the relevant part (CardFlip.js) into this code base.
These changes made the library work again for me without the errors and essentially fixes #16 and some of the comments from #12 (not the typescript definitions, but the comments hinting at the accessibilityInfo error)

Seems good to start with.. I appreciate your support

authors: BerniWittmann juandl


text:
Practice

Topic 0. Hice los ejercicios 1, 3 y 4.
Espero que salga bien el pull request...
Cualquier cosa, me avisan

please, create a pull request from otromanuel:practice to otromanuel:master.

Ok, done.

authors: juanpablopizarro otromanuel


text:
feat: Plugin "modernization".

This PR draft aims to "modernize" the plugin by using some features that are in newer versions of Neovim, at the cost of being incompatible with outdated versions. Some things that have been changed:

Utilize more builtin functions (e.g. for error handling)
Document functions
Use Lua LSP to type-constrain certain variables and function parameters
General rewriting

At the moment, the changes also include some modifications that I made to the repo in case you reject this PR (i.e. changes to the license, README, etc.). However, I'm willing to revert those changes in case you want to accept this PR. To avoid compatibility issues with breaking changes, you could also create a branch (i.e. named v1.0.0) and have people pin their updates to that commit, but that's also up to you. Feel free to adopt as many (or as few) of the changes on your own as well.

I just realized that vim.lsp.codelens is a thing.