편지 광장: 부검(LiveView의 믿을 수 없는 복제자)
이 프로그램의 주요 특징은 서버에서 HTML을 보여줌으로써 프로그램이 완전히 Elixir로 작성될 수 있도록 하는 것이다. (비록 모든 용례를 자바스크립트로 바꿀 수 없지만, 웹소켓을 설정하고 DOM을 업데이트하는 데 의존한다.)
어쨌든, 그것은 발표된 이래로, 나는 줄곧 그것을 주목해 왔지만, 진정으로 그것을 시도할 시간이 없었다.나는 마침내 시간을 찾았다. 그것을 배우기 위해서, 나는Boggle 클론을 만들기로 결정했다. Letter Square
나의 계획은:
Boggle 게임 작성
LiveView에 들어가기 전에, 나는 게임 자체를 위해 규칙과 조수를 프로그래밍했다.이것은 단어 목록에서 단어를 찾고 점수를 계산하는 알파벳 격자를 만드는 것을 포함한다.
격자에서 단어 찾기
알고리즘 애호가로서 이것은 나에게 있어서 가장 재미있는 부분 중의 하나이다.내가 실현한 알고리즘의 전체적인 사고방식은 다음과 같다.
그것은 내가 그것을 무료 Gigalixir 실례에 배치할 때까지 잘 작동했다. 이 실례의 메모리는 500MB로 제한되어 있다.5MB 사전을 로드하고 trie로 변환한 결과 메모리가 너무 많이 사용되었습니다.
나는 블록에 따라 사전을 불러오는 우아한 해결 방안을 찾았다.모든 블록에 대해 나는 그것을 비교적 작은 사전으로 간주하고 위의 알고리즘을 사용하여 단어를 찾을 수 있다.그리고 나서 나는 사전 한 권을 다 읽을 때까지 한 단락 한 단락을 반복했다.Retrieval를 사용하면 초기 함수를 업데이트할 필요가 없을 정도로 간단합니다.
defmodule WordSearch do
def list_all(grid, dictionary) when is_list(dictionary) do
# My initial implementation, taking a list of words
end
def list_all(%Grid{} = grid, dict_stream) do
dict_stream
|> Stream.chunk_every(5_000)
|> Stream.map(fn subdictionary ->
list_all(grid, subdictionary)
end)
|> Enum.into([])
|> List.flatten()
|> Enum.sort_by(&String.length/1, :desc)
end
# ...
end
시냇물 메쉬 생성
나의 첫 번째 격자 랜덤 생성의 실현은 매우 간단하다. 모든 자모는 독립적으로 선택한 것이고, 한 자모를 선택할 확률은 언어의 주파수에 달려 있다.
이런 기술을 사용하면 나는 곧 문제를 만났다. 찾으려는 단어의 수량이 보통 매우 적기 때문에 격자가 너무 딱딱하고 재미있지도 않다.많은 격자에 너무 많은 자음이 모음에 연결되지 않았다.
그래서 다른 방법을 시도해 봤어요.나는 자모를 독립적으로 생성하지 않고 격자 안에서 자모를 생성하는 무작위 경로이다.경로의 첫 번째 문자는 완전히 무작위로 선택되지만, 다음 문자의 선택은 경로의 첫 번째 문자에 달려 있다.확률은 사전에서 계산된 쌍자모 그룹 (쌍자모) 의 주파수에 근거한다.이런 기술을 사용하면 사전에서 찾을 수 있는 인접 자모가 격자에서도 함께 있을 수 있다는 것을 확보할 수 있다.
이것은 매우 복잡한 기술이지만, 각 격자의 평균 글자수가 증가함에 따라, 그것은 보답을 받았다. (비록 나는 그것을 측정하지 않았지만.)긴 단어도 빈번해졌다.
단어 목록 찾기
또 하나는 도전이 될 줄은 몰랐지만, 사실은 밤새도록 좋은 단어 목록을 찾아서 사전으로 사용했다.
맞춤법에 사용되는 공식 어휘 목록은 인터넷에서 찾을 수 있지만, 자유롭게 사용할 수 없을 것 같다.다른 목록은 폐기된 웹 페이지와 리콜 프로토콜에서 어디서나 볼 수 있지만, 그것들의 좋고 나쁨은 영원히 명확하지 않고, 종종 이상하거나 짜증나는 형식으로 나타난다. (예: XLS)마지막으로 나는 의 하나를 썼지만, 나는 여전히 그것의 질을 믿지 않는다.
이 GitHub 저장소 Phoenix LiveView&Surface
내가 좋아하는
그 후에 저는 Phoenix LiveView로 인터페이스의 행동을 실현했습니다.트림을 몇 번 하는 것 외에 매우 가볍고 편안함을 느낀다.나는 Elixir만 사용해서 모든 일을 하는 것을 좋아한다. 자바스크립트에 신경 쓸 필요도, API를 구축해서 둘을 연결할 필요도 없다. 이것은 훨씬 복잡할 것이다.마지막으로, 나는 심지어 내가 CSS를 정확하게 사용하려고 더 많은 시간을 쓰지 않았는지 알고 싶다.
나도'바닐라'라이브뷰를 사용하지 않았다. 왜냐하면 나는 라이브러리를 사용했기 때문이다.이것은 LiveView를 둘러싼 포장기로서 새로운 문법을 가져와 체험을 더욱 편안하게 한다.
예를 들어, 다음은 내 구성 요소 중 하나에 대한 코드로 남은 시간을 표시합니다.
Surface
보시다시피 Surface는 템플릿에
~H
기호를 가져왔습니다. 이것은 Vue와 매우 유사한 문법을 사용하고 {{ }}
Elixir 삽입을 사용할 수 있습니다.나는 지금까지 Phoenix의 문법을 좋아하지 않았고, 항상 Vue의 문법을 좋아했기 때문에, 이것은 즉각적으로Surface를 시도하도록 설득했다.Vue와 마찬가지로 주기와 조건은 외부 속성이 아닌 HTML 태그 내부의 특수 속성으로 이루어져 추가 중첩 단계를 방지합니다.
표준 피닉스:
<ul>
<%= for item <- @items do %>
<li>
<%= item.name %>
</li>
<% end %>
</ul>
표면:<ul>
<li :for={{ item <- @items }}>
{{ item.name }}
</li>
</ul>
속성, 내부 데이터, 슬롯 또는 이벤트는 모듈 상단에 정의되어 즉시 볼 수 있습니다.이 구성 요소의 이름은 예시된 Stat
구성 요소와 같이 다른 구성 요소에서 사용할 수 있습니다.이 슬라이드에서는 LiveView 방식보다 간단하고 표현력이 뛰어납니다.<%= live_component @socket, Timer, seconds: @seconds %>
Surface는 나만 할 수 있다.<Timer seconds={{ @seconds }} />
LiveView와 Surface가 모두 젊다는 점을 감안하면, 나는 그들이 공동으로 이룩한 성과에 놀라움을 느꼈고, 나는 그들이 어떻게 발전할지 보고 싶어 죽을 지경이었다.이것보다 더 좋은 것이 있습니까
몇 가지 일이 나로 하여금 약간의 시간을 잃게 했다.
mount
가 있는데 문서에서도 이 점을 언급했다.그러나 나는 이 점을 놓쳤다. 처음에는 곤혹스러웠다.나는 그곳에서 상당히 무거운 행동을 촉발했기 때문에 정말 두 번은 하고 싶지 않다. 단지 두 번째 탈것만 하고 싶다.나는 왜 두 탈것이 반드시 같은 기능을 사용해야 하는지 여전히 모르겠다.좋은 이유 하나. Gigalixir를 사용한 배포
배치에 대해서는 의 무료 옵션을 사용했습니다.앞에서 말한 바와 같이 나는 500MB로 제한되어 있어서 일부분을 매우 곤란하게 한다.그러나 가격으로는 이미 상당히 높다.
이 일에 관해서 나는 거의 할 말이 없다. 단지 그것이 한바탕 미풍이라고 말할 뿐이다.한 시간도 안 되어 내 프로그램이 실행되기 시작했는데 업데이트가 한 발자국도 남지 않았다
git push
.또한 로그와 콘솔에 쉽게 액세스하여 CPU와 메모리 액세스를 모니터링할 수 있습니다.Phoenix Gigalixir 문서를 따랐기 때문에 프로그램에 이름을 붙일 수 있는 문서가 없습니다.따라서 URL에서 사용되는 기본 이름
quirky-barren-canvasback
을 얻었습니다. 다른 선택의 여지가 없이 실례를 삭제하고 새 실례를 만들어서 이름을 변경할 수 있습니다.Gigalixir에 배포 결론
어쨌든, 이것은 아주 좋은 경험이었다. 나는 LiveView와 Surface에 관한 프로젝트를 더 많이 하고 싶었다.내가 무의식중에 발견한 문제는 모두 커다란 장애 요소가 아니다. 그 중 대다수는 이 두 항목이 모두 아직 젊기 때문일 것이다.나는 그들이 갈수록 좋아질 것이라고 조금도 의심하지 않는다. 나는 언젠가 공헌을 할 수 있기를 바란다.
Reference
이 문제에 관하여(편지 광장: 부검(LiveView의 믿을 수 없는 복제자)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/quetzakol/letter-square-post-mortem-1ipl텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)