<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Xeno`s Study</title>
    <link>https://xenostudy.tistory.com/</link>
    <description>캐초보</description>
    <language>ko</language>
    <pubDate>Wed, 6 May 2026 13:47:40 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>. . .</managingEditor>
    <image>
      <title>Xeno`s Study</title>
      <url>https://t1.daumcdn.net/cfile/tistory/016AD83E51CB8ED131</url>
      <link>https://xenostudy.tistory.com</link>
    </image>
    <item>
      <title>파이썬 취미활동을 시작하며..</title>
      <link>https://xenostudy.tistory.com/736</link>
      <description>&lt;div class=&quot;toc&quot;&gt;
&lt;ul&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;파이썬으로 혼자서 이것저것 만들어보면서 개발도 취미로 할수있겠다는 생각이 들었다. 현재는 간단한 python cli 툴 들을 만드는 미천한 실력이지만, 이것저것 만들면서 기록했던것들을 정리해볼까한다.&lt;/p&gt;
&lt;p&gt;무언가를 만들면서 정리를 해야 머릿속에 좀더 오래남고, 언젠가는 좀더 실력을 키울수있지 않을까 해서이다.&lt;/p&gt;
&lt;p&gt;취미로 코딩을 한다는게 참 부끄러운 일이기도하다. 잘 알지도 못하는놈이 그 짧은 지식으로 뭘 안다고 설치는 꼴이니 말이다. 하지만, 그냥 스터디 노트용으로 정리한다고 생각하고 진행해볼까한다.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;div class=&quot;tag&quot;&gt;[#](https://xenostudy.tistory.com/tag/PYTHON_취미개발)&lt;/div&gt;

&lt;p&gt;위의 태그로 모든 내용들을 정리할것이다.&lt;/p&gt;
&lt;p&gt;누군가에게 아주 티끌정도의 도움이 되길바라며.. 그리고 나의 실력도 성장하길 바라며...&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;본 포스팅은 obsidian 으로 작성하였으며, &lt;a href=&quot;https://github.com/kksworks/tistory-posting-cli&quot;&gt;tistory-posting-cli&lt;/a&gt; 를 이용해 발행되었습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>토이프로젝트/파이썬 취미활동</category>
      <category>Python</category>
      <category>PYTHON_취미개발</category>
      <author>. . .</author>
      <guid isPermaLink="true">https://xenostudy.tistory.com/736</guid>
      <comments>https://xenostudy.tistory.com/736#entry736comment</comments>
      <pubDate>Thu, 29 Dec 2022 14:20:13 +0900</pubDate>
    </item>
    <item>
      <title>개발환경 - vscode 에서 python pylint mypy formatter 기본설정하기 (설정예제)</title>
      <link>https://xenostudy.tistory.com/734</link>
      <description>&lt;p&gt;vscode 에서의 python 환경 pylint mypy 등을 정리한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;파이썬을 취미로 개발하기 앞서, 코드를 깔끔하게 작성하고싶어 자료조사한것을 정리&lt;/li&gt;
&lt;li&gt;실제 현업에서는 어떻게 적용하고 사용하는지는 모르겠다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;toc&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#1-pylint&quot;&gt;1 pylint 설정&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#11-pylint&quot;&gt;1.1 pylint 설치&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#12-vscode-pylint&quot;&gt;1.2 vscode pylint 플러그인 설치&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#13-pylint&quot;&gt;1.3 pylint 기본설정&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#14-pylint-import-path&quot;&gt;1.4 pylint import path 설정&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#15-pylint-rule-skip&quot;&gt;1.5 pylint rule skip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#16&quot;&gt;1.6 미동작관련&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-black&quot;&gt;2 black 포멧팅 설정&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#21-black&quot;&gt;2.1 black 설치&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#22-vscode-pylint&quot;&gt;2.2 vscode pylint 플러그인 설치&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#23-black-settingsjson&quot;&gt;2.3 black 동작시키기 (settings.json 설정)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-mypy&quot;&gt;3 mypy 설정&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#31-mypy&quot;&gt;3.1 mypy 설치&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#32-vscode-pylint&quot;&gt;3.2 vscode pylint 플러그인 설치&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#33-mypy-settingsjson&quot;&gt;3.3 mypy 설정 (settings.json 설정)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4&quot;&gt;4 결론&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#41-settingsjson&quot;&gt;4.1 settings.json 예제&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#42&quot;&gt;4.2 코드에러 검출 예제&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#43-python-&quot;&gt;4.3 각종 python 기능에 대한 사용 자원 이슈 - 라즈베리파이는 원할한 동작불가&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#44&quot;&gt;4.4 파이썬 취미개발자로서...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id=&quot;1-pylint&quot;&gt;1 pylint 설정&lt;/h2&gt;
&lt;p&gt;아무래도 import path 라 던가 각 워크스페이스마다의 요구사항이 조금씩 다를것이므로... 전역으로 설정하지 말고, 각 work space 마다 설정 하는것이 맞는것같다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.vsocde/settings.json&lt;/code&gt; 를 생성(파일이 있다면 추가) 한다.&lt;/p&gt;
&lt;h3 id=&quot;11-pylint&quot;&gt;1.1 pylint 설치&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;pip3 install pylint&lt;/code&gt; 를 통해서 pylint 패키지를 설치하자.&lt;/p&gt;
&lt;h3 id=&quot;12-vscode-pylint&quot;&gt;1.2 vscode pylint 플러그인 설치&lt;/h3&gt;
&lt;p&gt;vscode 의 pylint 플러그인을 설치한다.&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EfyT9/btrUyg9NWPk/Q8VvUaz5wz6ZrpPHVUCYq0/img.png&quot; /&gt;&lt;figcaption&gt;pylint 플러그인 설치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id=&quot;13-pylint&quot;&gt;1.3 pylint 기본설정&lt;/h3&gt;
&lt;p&gt;pylint 엔진은 여러가지가 존재하나, 인터넷에 많이 나와있는 자료들이, pylint 기반의 내용이 많이 나와있어 아무래도 구글의 도음을 많이 받을 수 있었다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.vsocde/settings.json&lt;/code&gt; 에서 다음의 내용을 enable 시킨다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
    &amp;quot;python.linting.pylintEnabled&amp;quot;: true,
    &amp;quot;python.linting.enabled&amp;quot;: true,
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;.vsocde/settings.json&lt;/code&gt; 를 수정한 후에는 vscode 를 재실행하자.&lt;/p&gt;
&lt;h3 id=&quot;14-pylint-import-path&quot;&gt;1.4 pylint import path 설정&lt;/h3&gt;
&lt;p&gt;vscode 의 pylint 기본설정은 import path 에러가 발생한다.&lt;/p&gt;
&lt;p&gt;scipt 정적검증이다보니, 스크립트내에서의 import sys path 에 대해서는 인지를 하지 못한다. 때문에, pylint 에서 sys path 에 대해서 설정을 따로 해줘야, 문제가 발생하지 않는다.&lt;/p&gt;
&lt;p&gt;작업하려는 영역에 &lt;code&gt;.vscode/settings.json&lt;/code&gt; 파일을 추가하여 다음의 내용을 추가한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
    &amp;quot;python.linting.pylintArgs&amp;quot;: [
        &amp;quot;--init-hook&amp;quot;,
        &amp;quot;import sys; sys.path.append(\&amp;quot;YOUR_PATH\&amp;quot;);&amp;quot;,
    ],
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;python lint 가 실행될때 &lt;code&gt;--init-hook&lt;/code&gt; 옵션을 통해서 &lt;code&gt;sys path&lt;/code&gt; 를 추가한다. (코드에서 의도한 sys path 영역에 대해서 위와같이 설정해준다.)&lt;/li&gt;
&lt;li&gt;해당 syntax 를 제대로 적지 않으면, 아예 pylint 가 실행되지 않으니 python 문법에 맞게 잘 설정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;15-pylint-rule-skip&quot;&gt;1.5 pylint rule skip&lt;/h3&gt;
&lt;p&gt;필요없는(?) 룰들로 인해 너무 많이 에러가 발생하는경우가 있다.&lt;/p&gt;
&lt;p&gt;vscode 에서 다음과같은 에러가 발생했다고 하면...&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLb06q/btrUIe3qXyE/q4okfINPqlhH7XzJGelBXk/img.png&quot; /&gt;&lt;figcaption&gt;too long error&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;에러의 상세내용에.. &lt;code&gt;pylint(C0301:line-too-long)&lt;/code&gt; 과 같이 상세 이유(코드)가 나오게 된다. (100단어는 너무 짧다고 생각하여 끄고싶다.)&lt;/p&gt;
&lt;p&gt;해당 만약 해당 내용에 대해서는 pylint 에서 검사를 건너뛰게 하고싶으면, &lt;code&gt;.vscode/settings.json&lt;/code&gt; 파일에서 &lt;code&gt;python.linting.pylintArgs&lt;/code&gt; 부분에 &lt;code&gt;--disable&lt;/code&gt; 옵션을 사용하면된다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
    &amp;quot;python.linting.pylintArgs&amp;quot;: [
        &amp;quot;--init-hook&amp;quot;,
        &amp;quot;import sys; sys.path.append(\&amp;quot;YOUR_PATH\&amp;quot;);&amp;quot;,
        &amp;quot;--diable&amp;quot;,
        &amp;quot;C0301&amp;quot;
    ],
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;background:#d3f8b6&quot;&gt;주의할점은 기존 옵션들이 이어져야 한다는점이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;python.linting.pylintArgs&lt;/code&gt; 가 여러개 있으면안된다. 한개의 키 부분에 계속 옵션을 추가해 나간다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;16&quot;&gt;1.6 미동작관련&lt;/h3&gt;
&lt;p&gt;만약, pylint 가 동작이 되지 않을경우 다음의 순서대로 해보자.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;.vscode/settings.json&lt;/code&gt; 이 제대로 구성되어있는지 확인해본다. (해당 파일에서 json 형식이 맞지 않거나, 설정키들이 잘못되면 아예 pylint 플러그인이 실행되지 않는다.)&lt;/li&gt;
&lt;li&gt;package 들이 정상 설치되어있는지 확인한다. (pylint 패키지가 설치 되어있는지 확인해본다.)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ctrl + shift + p&lt;/code&gt; 를 눌러서 vscode 의 pylint 관련 커맨드들에서... &lt;code&gt;pylint 실행&lt;/code&gt;, &lt;code&gt;pylint 서버재시작&lt;/code&gt; 명령어들을 통해서 직접 실행 혹은 재시작한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;figure&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzYFex/btrUExbzRtH/UhTioEYwd4x0BYwRVA4fYK/img.png&quot; /&gt;&lt;figcaption&gt;pylint setting 에서 적당한거 골라서 시작, 재시작등을 만져보자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&quot;2-black&quot;&gt;2 black 포멧팅 설정&lt;/h2&gt;
&lt;p&gt;포멧팅엔진도 여러개가 있다. 검색을 해보니 black 포멧터를 많이 쓰는것같다.&lt;/p&gt;
&lt;p&gt;아무래도 import path 라 던가 각 워크스페이스마다의 요구사항이 조금씩 다를것이므로... 전역으로 설정하지 말고, 각 work space 마다 설정 하는것이 맞는것같다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.vsocde/settings.json&lt;/code&gt; 를 생성(파일이 있다면 추가) 한다.&lt;/p&gt;
&lt;h3 id=&quot;21-black&quot;&gt;2.1 black 설치&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;pip3 install black&lt;/code&gt; 를 통해서 black 패키지를 설치하자.&lt;/p&gt;
&lt;h3 id=&quot;22-vscode-pylint&quot;&gt;2.2 vscode pylint 플러그인 설치&lt;/h3&gt;
&lt;p&gt;vscode 의 pylint 플러그인을 설치한다. (pylint 플러그인 안에 포메팅 관련 기능도 포함되어있다.)&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EfyT9/btrUyg9NWPk/Q8VvUaz5wz6ZrpPHVUCYq0/img.png&quot; /&gt;&lt;figcaption&gt;pylint 플러그인 설치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id=&quot;23-black-settingsjson&quot;&gt;2.3 black 동작시키기 (settings.json 설정)&lt;/h3&gt;
&lt;p&gt;작업하려는 영역에 &lt;code&gt;.vscode/settings.json&lt;/code&gt; 파일을 추가하여 다음의 내용을 추가한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;    &amp;quot;editor.formatOnSave&amp;quot;: true,
    &amp;quot;python.formatting.provider&amp;quot;: &amp;quot;black&amp;quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&quot;python.formatting.provider&quot;: &quot;black&quot;,&lt;/code&gt; 파이썬 포메터는 black으로 설정&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;editor.formatOnSave&quot;: true&lt;/code&gt; 옵션을 통해서 저장을 할경우 알아서 이런저런 포메팅을 수정해준다. (코드가 깔끔해진다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-mypy&quot;&gt;3 mypy 설정&lt;/h2&gt;
&lt;p&gt;코드를 안정적으로 동작시키기 위해서 mypy 도 설정한다.&lt;/p&gt;
&lt;p&gt;아무래도 import path 라 던가 각 워크스페이스마다의 요구사항이 조금씩 다를것이므로... 전역으로 설정하지 말고, 각 work space 마다 설정 하는것이 맞는것같다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.vsocde/settings.json&lt;/code&gt; 를 생성(파일이 있다면 추가) 한다.&lt;/p&gt;
&lt;h3 id=&quot;31-mypy&quot;&gt;3.1 mypy 설치&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;pip3 install mypy&lt;/code&gt; 를 통해서 mypy 패키지를 설치하자.&lt;/p&gt;
&lt;h3 id=&quot;32-vscode-pylint&quot;&gt;3.2 vscode pylint 플러그인 설치&lt;/h3&gt;
&lt;p&gt;vscode 의 pylint 플러그인을 설치한다. (pylint 플러그인 안에 mypy 관련 기능도 포함되어있다.)&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EfyT9/btrUyg9NWPk/Q8VvUaz5wz6ZrpPHVUCYq0/img.png&quot; /&gt;&lt;figcaption&gt;pylint 플러그인 설치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id=&quot;33-mypy-settingsjson&quot;&gt;3.3 mypy 설정 (settings.json 설정)&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.vscode/settings.json&lt;/code&gt; 파일에 다음의 내용을 추가한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
    &amp;quot;python.linting.mypyEnabled&amp;quot;: true,
    &amp;quot;python.linting.mypyArgs&amp;quot;: [
        &amp;quot;--follow-imports=silent&amp;quot;,
        &amp;quot;--ignore-missing-imports&amp;quot;,
        &amp;quot;--show-column-numbers&amp;quot;,
        &amp;quot;--no-pretty&amp;quot;,
    ],
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;mypy args 는 기본설정대로 쓰자. &lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;4&quot;&gt;4 결론&lt;/h2&gt;
&lt;h3 id=&quot;41-settingsjson&quot;&gt;4.1 settings.json 예제&lt;/h3&gt;
&lt;p&gt;위에서 설명했던 설정에 대해서 모두 정리하면 다음과 같다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
    &amp;quot;python.linting.pylintArgs&amp;quot;: [
        &amp;quot;--init-hook&amp;quot;,
        &amp;quot;import sys; sys.path.append(\&amp;quot;YOUR_PATH\&amp;quot;);&amp;quot;,
        &amp;quot;--disable&amp;quot;,
        &amp;quot;C0301&amp;quot; // too long line
    ],
    &amp;quot;python.linting.pylintEnabled&amp;quot;: true,
    &amp;quot;python.linting.enabled&amp;quot;: true,
    &amp;quot;editor.formatOnSave&amp;quot;: true,
    &amp;quot;python.formatting.provider&amp;quot;: &amp;quot;black&amp;quot;,
    &amp;quot;python.linting.mypyEnabled&amp;quot;: true,
    &amp;quot;python.linting.mypyArgs&amp;quot;: [
        &amp;quot;--follow-imports=silent&amp;quot;,
        &amp;quot;--ignore-missing-imports&amp;quot;,
        &amp;quot;--show-column-numbers&amp;quot;,
        &amp;quot;--no-pretty&amp;quot;,
    ],
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;기본적으로 위의 설정을 &lt;code&gt;.vcode/settting.json&lt;/code&gt; 에 넣는다면 에디팅 레벨에서 깔끔한 코드를 작성할 수있다.&lt;/p&gt;
&lt;h3 id=&quot;42&quot;&gt;4.2 코드에러 검출 예제&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;#!/bin/python

class abcdEfg:
    def abc(ddd: str = None) -&amp;gt; str:
        print(ddd)

if __name__ == &amp;quot;__main__&amp;quot;:
    ccc = abcdEfg()
    ccc.abc()

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위의 코드의 경우... 기본적으로 다음의 에러가 검출되었다.&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5t2ED/btrUxfpJI4x/nxV5V0ZafW18uHL8I2nElK/img.png&quot; /&gt;&lt;figcaption&gt;pylint mypy argument type error&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4IhzP/btrUAb1aCcF/iG5NVx7k4NE2Jm4qbEllyk/img.png&quot; /&gt;&lt;figcaption&gt;pylint function doc string error&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7TyqU/btrUHROaGeY/dCU3cjojX8Zkj8Jp5rC660/img.png&quot; /&gt;&lt;figcaption&gt;pylint doc string error&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7TyqU/btrUHROaGeY/dCU3cjojX8Zkj8Jp5rC660/img.png&quot; /&gt;&lt;figcaption&gt;pylint class naming error&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;발생된 에러의 경우 흥미로웠다.  vscode에서 pylint / mypy 등의 설정만으로도... 에디팅을 하는 과정에서 기본적인 코드에 대한 최소한의 품질은 유지시킬수 있었다. 특히 변수설정이나, 함수의 네이밍규칙등도 걸러주고, 함수간의 엔터겟수, import 순서등도 다 검출해서 알려주니 오류검출은 떠나서라도 이쁜 코드를 만들 수 있었다.&lt;/p&gt;
&lt;p&gt;위의 플러그인 설정들은 에디팅 과정에서의 에러다보니, error 가 발생하더라도, 일단 동작상에는 문제가 없을 수도 있다. 하지만, python 정적 분석 툴을 돌리기 전에 최소한의 코드 품질을 위해서 에디팅 과정에서의 에러가 없게 하는것이 좋을것같다.&lt;/p&gt;
&lt;h3 id=&quot;43-python-&quot;&gt;4.3 각종 python 기능에 대한 사용 자원 이슈 - 라즈베리파이는 원할한 동작불가&lt;/h3&gt;
&lt;p&gt;vscode 에서 python lint, fomatting 기능은 기본적으로 백그라운드에서 이런저런 동작이 일어난다. linux 의 경우 node, python 스크립트들이 백그라운드에서 계속적으로 코드의 import path, lint 등을 수행한다.&lt;/p&gt;
&lt;p&gt;일반적인 x86 pc의 경우 백그라운드에서 동작되는 해당 기능들이 PC동작에 큰 무리를 주지는 않는다. (7년정도 된 집의 구형 셀러론D 에서도 크게 문제없이 lint 등의 모든 기능들이 동작되었다. )&lt;/p&gt;
&lt;p&gt;하지만 라즈베리 파이의 경우는 좀 달랐다.&lt;/p&gt;
&lt;p&gt;라즈베리파이에서 vscode ssh code server 띄워놓고 위의 플러그인 테스트를 해보니, 라즈베리파이가 터지려고한다. (시스템이 계속 종종 다운된다 ㅠㅠ) 아무래도 위의 기능들이 라즈베리에서 다 돌리기에는 무거운 모양이다. 라즈베리파이 vscode server 환경에서는 위의 모든 기능을 사용하지 못할 수도 있다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PC에서 기본 기능개발을 모두다 개발 하고, 최종 실행 코드만 라즈베리파이로 옮기는 것으로 진행중이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;44&quot;&gt;4.4 파이썬 취미개발자로서...&lt;/h3&gt;
&lt;p&gt;그냥 취미로 개발하다가 정리한내용이다. 실제 현업에서는 어떻게 적용하고 사용하는지는 모르겠다. &lt;/p&gt;
&lt;p&gt;재밌는 파이썬이다.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;본 포스팅은 obsidian 으로 작성하였으며, &lt;a href=&quot;https://github.com/kksworks/tistory-posting-cli&quot;&gt;tistory-posting-cli&lt;/a&gt; 를 이용해 발행되었습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>토이프로젝트/파이썬 취미활동</category>
      <category>Python</category>
      <category>PYTHON_취미개발</category>
      <author>. . .</author>
      <guid isPermaLink="true">https://xenostudy.tistory.com/734</guid>
      <comments>https://xenostudy.tistory.com/734#entry734comment</comments>
      <pubDate>Mon, 26 Dec 2022 16:51:42 +0900</pubDate>
    </item>
    <item>
      <title>옵시디언 obsidian - 사용팁 - 노트 작성을 편하게 하기위한 간단 팁 (트리구조의 노트방법)</title>
      <link>https://xenostudy.tistory.com/733</link>
      <description>&lt;div class=&quot;toc&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#1&quot;&gt;1 글작성에 대한 팁 ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-&quot;&gt;2 글작성 팁 - 기본개념&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#21-moc&quot;&gt;2.1 폴더(디렉토리)형태에서 벗어나자. -&amp;gt; MOC 로 대체&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#211&quot;&gt;2.1.1 구조화된 노트 트리구조 유지하는 방법&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3&quot;&gt;3 노트 예제&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4&quot;&gt;4 장점 단점 결론&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#41&quot;&gt;4.1 장점&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#42&quot;&gt;4.2 단점&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5&quot;&gt;5 결론&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6&quot;&gt;6 옵시디언 세팅 하기&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#61&quot;&gt;6.1 노트 생성위치 설정하기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#62&quot;&gt;6.2 홈버튼 만들기&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#7&quot;&gt;7 마치며&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;obsidian 에 대한 팁과 사용방법에 대한글을 계속 작성합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;관련글 모음 : &lt;div class=&quot;tag&quot;&gt;&lt;a href=&quot;https://xenostudy.tistory.com/tag/obsidian&quot;&gt;#obsidian&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;1&quot;&gt;1 글작성에 대한 팁 ?&lt;/h2&gt;
&lt;p&gt;옵시디언의 글을 간단고 빠르게 사용하기 위한 팁을 작성한다.&lt;/p&gt;
&lt;p&gt;노트를 작성하는 방법론에대해서 거창한 방법들이 많다. 특히 GTD 같은 거창한 방법론들이 많지만 거기에 익숙해지기 전까지 시간도 많이걸리고 개념도 복잡한것이 싫었다. (두번째 뇌 라니, 사람의 시넵스니 뭐라니, 스케쥴, GTD 등등 거창한 개념들을 넣으면서 뭔가 대단한 이론을 만드는 것 마냥 설명하는것이 마음에 안들었다.)&lt;/p&gt;
&lt;p&gt;뭐 그리 대단한 노트를 작성하는것도 아닌데, 거창한 방법론까지 들이미는것이 마음에 안들어 최소한의 간단한 방법으로 노트를 작성하고 관리하는 나만의 방법을 소개한다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;물론 이 글의 방법또한 다른 누군가에겐 거창하고 번거로운 방법일 수도 있겠다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;기본 개념은 에버그린 노트개념에서 착안하였다. &lt;a href=&quot;https://brunch.co.kr/@kys4620/157&quot;&gt;https://brunch.co.kr/@kys4620/157&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;2-&quot;&gt;2 글작성 팁 - 기본개념&lt;/h2&gt;
&lt;p&gt;뭐 기본적인 개념이라고 하기도 거창하다 그냥 간단하게 쓰자.&lt;/p&gt;
&lt;h3 id=&quot;21-moc&quot;&gt;2.1 폴더(디렉토리)형태에서 벗어나자. -&amp;gt; MOC 로 대체&lt;/h3&gt;
&lt;p&gt;필자도, 폴더(디렉토리)를 기반으로 노트를 작성을 하였었다. 폴더(디렉토리)로 글을 작성하다보면 항상 드는 고민이 이 있었다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;해당 노트는 어떤 폴더(디렉토리)에 넣어야할까?&lt;/li&gt;
&lt;li&gt;해당 노트를 중복 폴더(디렉토리)에 넣었으면 하는데 어떻게 해야할까?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;글을 작성하기도 전에 생각을 정리하고, 어떤 폴더(디렉토리)에 넣을지 정하는것 자체가 번거로웠다. 위의 고민을 똑같이 하시는 분이 있다면, 폴더(디렉토리)방식의 노트를 벗어던지길 바란다.&lt;/p&gt;
&lt;h4 id=&quot;211&quot;&gt;2.1.1 구조화된 노트 트리구조 유지하는 방법&lt;/h4&gt;
&lt;p&gt;대부분 폴더(디렉토리)를 쓰는 이유는 구조(트리)화 노트를 위해서 일것이다. 노트를 구조(트리)화 하는 방법을 폴더(디렉토리)로만 해야한다는 생각만 버리면된다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;그냥 거창할거 없고, 폴더(디렉토리)가 1개의 노트가 된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;예를들어 설명.&lt;/p&gt;
&lt;p&gt;다음과 같은 노트 구조가 있다고 가정하자.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;A 폴더 - B 폴더
          - B-note-1
          - B-note-2
       - C 폴더
          - C-note-1
          - C-note-2
          - C-note-3
D 폴더 - F 폴더
         - F-note-1
         - F-note-2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;기존에 폴더(디렉토리)형태로 카테고리를 사용할 경우, &lt;code&gt;A&lt;/code&gt;, &lt;code&gt;D&lt;/code&gt; 폴더가 각각 있고 그 아래 다시 하위 폴더(디렉토리) &lt;code&gt;B&lt;/code&gt;, &lt;code&gt;C&lt;/code&gt;, &lt;code&gt;F&lt;/code&gt; 를 생성하고 그아래 다시 노트를 작성해야했다.&lt;/p&gt;
&lt;p&gt;이런 폴더(디렉토리)를 그냥 한개의 페이이지로 대체하면된다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;A&lt;/code&gt;, &lt;code&gt;B&lt;/code&gt;, &lt;code&gt;D&lt;/code&gt;, &lt;code&gt;F&lt;/code&gt; 는 폴더(디렉토리)로 만드는게 아니라 일반 노트로 만든다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;A&lt;/code&gt;, &lt;code&gt;B&lt;/code&gt;, &lt;code&gt;D&lt;/code&gt;, &lt;code&gt;F&lt;/code&gt; 내부의 링크에 각각의 노트를 링크해준다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;위의 노트는 다음과 같은 구조로 만들 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;A folder note
B folder note
B-note-1
B-note-2
C folder note
C-note-1
C-note-2
C-note-3
D folder note
F folder note
F-note-1
F-note-2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이전에 폴더만들었던 것을 그냥 1개의 노트로 만들고, 해당 노트에서 각각의 &lt;code&gt;링크&lt;/code&gt; 를 하면된다.&lt;/p&gt;
&lt;p&gt;이것이 전부다.&lt;/p&gt;
&lt;p&gt;뭐 거창한거 없다. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;위와같이 여러 노트들의 연결점이되는걸 Map of Content 라고 불리는것같다. (&lt;a href=&quot;https://forum.obsidian.md/t/how-do-you-decide-whats-a-moc/37539&quot;&gt;https://forum.obsidian.md/t/how-do-you-decide-whats-a-moc/37539&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;3&quot;&gt;3 노트 예제&lt;/h2&gt;
&lt;p&gt;위에서 설명한대로 작성한 노트를 예재로 올려놨다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;링크 : &lt;a href=&quot;https://github.com/kksworks/note-example-v1&quot;&gt;https://github.com/kksworks/note-example-v1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;figure&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O1JGZ/btrRVMaGnd9/nw2wZghnSjXx701H955EBk/img.png&quot; /&gt;&lt;figcaption&gt;노트 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;파일만 보면 평면적인 노트 구조지만 실제 노트의 내용은 링크를 통해 구조화(트리화) 되어있다.&lt;/p&gt;
&lt;p&gt;노트의 첨부파일은 모두 &lt;code&gt;uploads&lt;/code&gt; 라는 폴더를 공통으로 사용한다.&lt;/p&gt;
&lt;h2 id=&quot;4&quot;&gt;4 장점 단점 결론&lt;/h2&gt;
&lt;p&gt;위와같이 노트를 한지 1년정도 지난시점에서 장단점을 정리하면..&lt;/p&gt;
&lt;h3 id=&quot;41&quot;&gt;4.1 장점&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;노트를 어느 카테고리에 넣어야할지 고민하지 않는다.&lt;/li&gt;
&lt;li&gt;노트가 1차원 평면에 있기 때문에, 각 노트를 연결할때 노트가 존재하는 위치를 고민하지 않아도 된다. (파일이름만 알면 어디서든 노트링크)&lt;/li&gt;
&lt;li&gt;위와같은 장점으로 노트 작성 및 링크속도가 엄청 빠르다.&lt;/li&gt;
&lt;li&gt;첨부폴더를 일원화 하여, 중복 파일을 최소화 한다.&lt;/li&gt;
&lt;li&gt;어떤 노트 프로그램이던 .. 심지어 github 에서도.. 똑같은 노트 구조를 유지할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;42&quot;&gt;4.2 단점&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;노트 프로그램이 없다면, 노트 구조파악이 힘들다.&lt;/li&gt;
&lt;li&gt;탐색기에서 노트를 본다면 의미없는 노트의 나열들 일뿐, 직관적이지 않다.&lt;/li&gt;
&lt;li&gt;노트 작성시 무조건, 링크를 해야하는 페이지에서 &lt;code&gt;링크&lt;/code&gt; 를 생성하면서 작성해야한다.&lt;/li&gt;
&lt;li&gt;노트 프로그램의 도움이 없다면, 노트가 불가능하다.&lt;/li&gt;
&lt;li&gt;한개 폴더에 수많은 파일이 있어 보기가 불편하다. (한개 폴더에 수만개의 파일이 있어도 크게문제없다고하니... 그냥 느낌만 불편)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;5&quot;&gt;5 결론&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;어차피 노트 프로그램을 사용하므로 기능을 최대한 사용한다.&lt;/li&gt;
&lt;li&gt;노트간의 링크가 쉬우므로 노트를 거미줄처럼 얽혀 생각을 정리하기가 쉽다.&lt;/li&gt;
&lt;li&gt;노트만들고 작성이 빠르다. &lt;/li&gt;
&lt;li&gt;거창한 개념따위 없이 그냥 빠르게 쉽게 적용&lt;/li&gt;
&lt;li&gt;꼭 사용해보시라.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;6&quot;&gt;6 옵시디언 세팅 하기&lt;/h2&gt;
&lt;p&gt;위와같은 노트 구조를 유지하기 위해서 다음의 설정을 한다.&lt;/p&gt;
&lt;h3 id=&quot;61&quot;&gt;6.1 노트 생성위치 설정하기&lt;/h3&gt;
&lt;p&gt;
&lt;figure&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N9idF/btrRSrL8Old/prbXjkvoWr7OaKYYrjt8fk/img.png&quot; /&gt;&lt;figcaption&gt;노트세팅&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;새노트는 항상 &lt;code&gt;_notes&lt;/code&gt; 에 넣도록한다.&lt;/li&gt;
&lt;li&gt;모든 노트는 1 차원상의 같은 폴더에 있으므로 링크는 모두 &lt;code&gt;상대경로&lt;/code&gt; 로 설정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;위와같이 설정하고 정리하면 &lt;code&gt;파일뷰&lt;/code&gt;로 봐도 다음과 같은 깔끔한 구조로 보인다.&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TWBO4/btrRRCAVSlw/sVzcKvmXCVt77Olv79B5j0/img.png&quot; /&gt;&lt;figcaption&gt;폴더 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id=&quot;62&quot;&gt;6.2 홈버튼 만들기&lt;/h3&gt;
&lt;p&gt;맨처음 README.md 로 바로가기 기능이 필요하다. &lt;/p&gt;
&lt;p&gt;다음의 두개의 플러그인을 이용하여 언제든지 어느 노트에서건 홈페이지(readme)로 이동하게 한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;obsidian homepage plugin&lt;ul&gt;
&lt;li&gt;특정 페이지로 이동 기능제공&lt;/li&gt;
&lt;li&gt;시작시 특정페이지 open 등의 부가기능제공&lt;/li&gt;
&lt;li&gt;링크 : &lt;a href=&quot;https://github.com/mirnovov/obsidian-homepage&quot;&gt;https://github.com/mirnovov/obsidian-homepage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Hotkeys for specific files plugin&lt;ul&gt;
&lt;li&gt;특정 페이지로 이동 기능제공&lt;/li&gt;
&lt;li&gt;단축키로 설정하여 특정 페이지 이동하게 함&lt;/li&gt;
&lt;li&gt;링크 : &lt;a href=&quot;https://github.com/Vinzent03/obsidian-hotkeys-for-specific-files&quot;&gt;https://github.com/Vinzent03/obsidian-hotkeys-for-specific-files&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;위의 두개의 플러그인중 마음에 드는것을 하나 설치한후에.. commander 플러그인을 이용하여 사이드바에 홈버튼을 만든다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;obsidian commander plugin&lt;ul&gt;
&lt;li&gt;특정 사이드바, 오른쪽 버튼등에 원하는 기능추가&lt;/li&gt;
&lt;li&gt;링크 : &lt;a href=&quot;https://github.com/phibr0/obsidian-commander&quot;&gt;https://github.com/phibr0/obsidian-commander&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;commander 에 ribbon 의 매뉴에 &lt;code&gt;add command&lt;/code&gt; 하여 homepage 를 바로가기 추가한다&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHr67m/btrRVMaGnCs/zb5vXhkzTzx5KkKGQUUQz1/img.png&quot; /&gt;&lt;figcaption&gt;바로기가 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpLs1a/btrRVLQmavK/tlo3RzARGxR7mjuMGfabw1/img.png&quot; /&gt;&lt;figcaption&gt;추가완료 - 홈페이지바로가기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이제 언제든지 최상위 readme 페이지로 바로 갈수 있다.&lt;/p&gt;
&lt;h2 id=&quot;7&quot;&gt;7 마치며&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kksworks/note-example-v1&quot;&gt;https://github.com/kksworks/note-example-v1&lt;/a&gt; 의 내용을 다운받아서 옵시디언으로 열어보고, 실제 어떻게 링크되어있는지 확인하기 바란다.&lt;/li&gt;
&lt;li&gt;옵시디언에서 보이는 화면과 github 에서 보이는 화면의 차이를 비교해보자. 즉, 옵시디언이던, 다른 md 툴이건 위의 노트 방법이면 보이는 화면이 다 동일하고 링크도 안깨진다.&lt;/li&gt;
&lt;li&gt;만약 위의 노트방법이면, 노트 싱크서비스를 git 으로 사용하면 미리보기용 웹 서비스도 필요없다. 바로 git 을 사용하면된다.&lt;/li&gt;
&lt;li&gt;거창하지 않지만 간단하다 빠르다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;본 포스팅은 obsidian 으로 작성하였으며, &lt;a href=&quot;https://github.com/kksworks/tistory-posting-cli&quot;&gt;tistory-posting-cli&lt;/a&gt; 를 이용해 발행되었습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SW 개발</category>
      <category>Obsidian</category>
      <category>옵시디언</category>
      <author>. . .</author>
      <guid isPermaLink="true">https://xenostudy.tistory.com/733</guid>
      <comments>https://xenostudy.tistory.com/733#entry733comment</comments>
      <pubDate>Wed, 23 Nov 2022 10:46:42 +0900</pubDate>
    </item>
    <item>
      <title>uboot fit image configuration 에러 처리</title>
      <link>https://xenostudy.tistory.com/732</link>
      <description>&lt;div class=&quot;toc&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#1&quot;&gt;1 이슈사항&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2&quot;&gt;2 디버깅하기&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#21-fit-image&quot;&gt;2.1 fit image 내용살펴보기&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3&quot;&gt;3 문제해결&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;fit image 를 이용하여 부팅중에 에러가 발생하여 내용을 정리한다.&lt;/p&gt;
&lt;h2 id=&quot;1&quot;&gt;1 이슈사항&lt;/h2&gt;
&lt;p&gt;부팅중에 다음과 같은 &lt;code&gt;Could not find configuration node&lt;/code&gt; 에러가 발생하여 부팅이 넘어가지 않는경우가 발생한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;MMC read: dev # 0, block # 32768, count 102400 ... 102400 blocks read: OK
## Loading kernel from FIT Image at a0000000 ...
Could not find configuration node
ERROR: can't get kernel image!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위의 증상은 말그대로 fit image 내의 configure 설정이 안되어 있어 넘어가지 않는것이다.&lt;/p&gt;
&lt;h2 id=&quot;2&quot;&gt;2 디버깅하기&lt;/h2&gt;
&lt;h3 id=&quot;21-fit-image&quot;&gt;2.1 fit image 내용살펴보기&lt;/h3&gt;
&lt;p&gt;해당 에러까지 넘어왔다면 uboot 에서 fit image 를 메모리에 로딩까지는 정상적으로 된 상태이다.&lt;/p&gt;
&lt;p&gt;(로딩된 fit image 의 내용을 살펴볼 수있다.)&lt;/p&gt;
&lt;p&gt;uboot 에 다음의 명령어를 입력한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;iminfo [LOAD_ADDRESS]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;LOAD_ADDRESS : 실제 fit image 가 로딩된 주소&lt;ul&gt;
&lt;li&gt;대부분 로그에서도 확인가능하다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Loading kernel from FIT Image at a0000000 ...&lt;/code&gt; 에서 보면, &lt;code&gt;0xa0000000&lt;/code&gt; 에 로딩이 완료되었다는 뜻.&lt;/li&gt;
&lt;li&gt;아니면 uboot env 쪽을 확인하여 이미지 로딩주소를 확인한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;iminfo 명령어를 수행 하면 다음과 같은 이미지의 실제 내용을 볼 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;## Checking Image at a0000000 ...
   FIT image found
   FIT description: arm64 kernel, ramdisk and FDT blob
    Image 0 (kernel)
     Description:  ARM64 Kernel
     Type:         Kernel Image
     Compression:  gzip compressed
     Data Start:   0xa00000d0
     Data Size:    15185058 Bytes = 14.5 MiB
     Architecture: AArch64
     OS:           Linux
     Load Address: 0x84080000
     Entry Point:  0x84080000
    Image 1 (initrd)
     Description:  initrd for arm64
     Type:         RAMDisk Image
     Compression:  uncompressed
     Data Start:   0xa0e7b620
     Data Size:    21968191 Bytes = 21 MiB
     Architecture: AArch64
     OS:           Linux
     Load Address: 0x00000000
     Entry Point:  0x00000000
    Image 2 (ls1012ardb-dtb)
     Description:  ls1012ardb-dtb
     Type:         Flat Device Tree
     Compression:  uncompressed
     Data Start:   0xa236ec10
     Data Size:    14690 Bytes = 14.3 KiB
     Architecture: AArch64
     Load Address: 0x90000000
    Image 3 (ls1012aqds-dtb)
     Description:  ls1012aqds-dtb
     Type:         Flat Device Tree
     Compression:  uncompressed
     Data Start:   0xa2372614
     Data Size:    16669 Bytes = 16.3 KiB
     Architecture: AArch64
     Load Address: 0x90000000
// 생략...
    Configuration 0 (ls1012ardb)
     Description:  config for ls1012ardb
     Kernel:       kernel
     Init Ramdisk: initrd
     FDT:          ls1012ardb-dtb
    Configuration 1 (ls1012aqds)
     Description:  config for ls1012aqds
     Kernel:       kernel
     Init Ramdisk: initrd
     FDT:          ls1012aqds-dtb
    Configuration 2 (ls1012afrwy)
     Description:  config for ls1012afrwy
     Kernel:       kernel
     Init Ramdisk: initrd
     FDT:          ls1012afrwy-dtb
// 생략...
## Checking hash(es) for FIT Image at a0000000 ...
   Hash(es) for Image 0 (kernel):
   Hash(es) for Image 1 (initrd):
   Hash(es) for Image 2 (ls1012ardb-dtb):
// 생략...
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;확인해야할 사항&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Default Configuration: 'config@1'&lt;/code&gt; 와 같이 default configuration 이 있는지 꼭 확인해보자. &lt;/li&gt;
&lt;li&gt;어떠한 confguration 이 있는지 확인해보자. 위의 예제에서는 &lt;code&gt;ls1012ardb&lt;/code&gt;, &lt;code&gt;ls1012aqds&lt;/code&gt;, &lt;code&gt;ls1012afrwy&lt;/code&gt; .. 등이 configuation 이다. (해당문자열을 bootm 명령어와 함께 주면된다)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3&quot;&gt;3 문제해결&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;MMC read: dev # 0, block # 32768, count 102400 ... 102400 blocks read: OK
## Loading kernel from FIT Image at a0000000 ...
Could not find configuration node
ERROR: can't get kernel image!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위의 에러 문구와 같이, fit image 의 configuration 을 주지 않아 발생한 오류이므로 configure 를 명시하면된다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;지원하는 configuration 은 위에서 설명한것과 같이 &lt;code&gt;iminfo&lt;/code&gt; 명령어를 이용하면된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;지원하는 configuration 을 bootm 명령어에 다음과 같이 주면된다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;bootm $load_addr#&amp;lt;configuration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;위의 예제와 같은경우 ... &lt;code&gt;bootm $load_addr#ls1012aqds&lt;/code&gt; 을 설정하면 &lt;code&gt;ls1012aqds&lt;/code&gt; 설정으로 부팅이된다.&lt;/li&gt;
&lt;li&gt;만약 &lt;code&gt;Default Configuration&lt;/code&gt; 이 있는 경우 &lt;code&gt;bootm $load_addr&lt;/code&gt; 만으로도 부팅이 된다. (아무런 configure 정보를 주지 않으면 default config 로 동작된다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;해당 포스팅은 &lt;a href=&quot;https://github.com/kksworks/tistory-posting-cli&quot;&gt;tistory-posting-cli&lt;/a&gt; 를 이용해 발행되었습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SW 개발</category>
      <category>Linux-admin</category>
      <category>linux-kernel</category>
      <author>. . .</author>
      <guid isPermaLink="true">https://xenostudy.tistory.com/732</guid>
      <comments>https://xenostudy.tistory.com/732#entry732comment</comments>
      <pubDate>Fri, 16 Sep 2022 23:09:06 +0900</pubDate>
    </item>
    <item>
      <title>nxp Layerscape yocto 빌드 및 sd boot</title>
      <link>https://xenostudy.tistory.com/731</link>
      <description>&lt;div class=&quot;toc&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#1-layerscape-yocto-build&quot;&gt;1 layerscape yocto build&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#11-yocto-user-guide&quot;&gt;1.1 yocto user guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#12-repo-clone&quot;&gt;1.2 repo clone&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-yocto-build-image&quot;&gt;2 yocto build image&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#21-sd-card-boot-bootloader-uboot&quot;&gt;2.1 sd card boot - bootloader (uboot)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#22-sd-card-boot-kernel&quot;&gt;2.2 sd card boot - kernel&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#221&quot;&gt;2.2.1 커널 부팅을 위한 수정&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#23-22-sd-card-boot-rootfs&quot;&gt;2.3 2.2 sd card boot - rootfs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3&quot;&gt;3 요약&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#31-uboot&quot;&gt;3.1 uboot 수정포인트&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#32-sd-image&quot;&gt;3.2 sd image 만들기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#33-sd-card-write-booting&quot;&gt;3.3 sd card write &amp;amp; booting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4&quot;&gt;4 잡담..&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;nxp layerscape 빌드 및 sd card boot 관련하여 정리한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;nxp ls1028a 관련해서 빌드 및 sd card boot 삽질했던 내용의 일부를 정리.&lt;/li&gt;
&lt;li&gt;보안과 관련한 사항들, datasheet 내용들은 되도록 적지 않는다.&lt;/li&gt;
&lt;li&gt;인터넷에서 검색이 가능한 내용들로만 작성한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;1-layerscape-yocto-build&quot;&gt;1 layerscape yocto build&lt;/h2&gt;
&lt;p&gt;매뉴얼을 보면 NXP layerscape chip (LS1012A LS1021A LS1028A LS1043A LS1046A LS1088A LS2088A LX2160A MPC8548 P1010 P1020 P2020 P2041 P3041 P4080 P5040 T1024 T1042 T2080 T4240) 계열은 아무래도 동일한 개발 빌드환경을 공유하는것으로 보인다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;layerscape 는 LSDK 를 제공한다. &lt;/li&gt;
&lt;li&gt;LSDK 는 &lt;code&gt;flex-builder&lt;/code&gt; 라는 자체 빌드시스템을 이용한다.&lt;ul&gt;
&lt;li&gt;LSDK 를 통한 flex-builder 빌드는 &lt;code&gt;Layerscape Software Development Kit User Guide&lt;/code&gt; 문서를 참고하면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;내용을 보다보면 flex-builder 로 충분히 개발이 가능하겠지만 필자는 기존부터 사용해오던 yocto 개발이 편하다보니 yocto 로 개발하는발하는 방법을 소개한다.&lt;/p&gt;
&lt;h3 id=&quot;11-yocto-user-guide&quot;&gt;1.1 yocto user guide&lt;/h3&gt;
&lt;p&gt;yocto 용 guide 는 &lt;code&gt;LSDKYOCTOUG&lt;/code&gt; 문서를 따로 구하여 참고한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;22년 9월 현재 해당문서는 보안사항없이 인터넷에서 바로 볼수있다 : &lt;a href=&quot;https://www.nxp.com/docs/en/user-guide/LSDKYOCTOUG.pdf&quot;&gt;https://www.nxp.com/docs/en/user-guide/LSDKYOCTOUG.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;12-repo-clone&quot;&gt;1.2 repo clone&lt;/h3&gt;
&lt;p&gt;각 칩셋마다 지원되는 yocto 버젼이 있으니 해당 버젼에 맞게 yocto version 을 받아 빌드하면 하면된다.&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CYxyW/btrMjPSIu7O/FJYPZ8Ig6rdmHO7TYarh00/img.png&quot; /&gt;&lt;figcaption&gt;지원되는 yocto version&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;repo init -u https://source.codeaurora.org/external/qoriq/qoriq-components/yocto-sdk -b dunfell
repo init -u https://source.codeaurora.org/external/qoriq/qoriq-components/yocto-sdk -b zeus
repo init -u https://source.codeaurora.org/external/qoriq/qoriq-components/yocto-sdk -b warrior
repo init -u https://source.codeaurora.org/external/qoriq/qoriq-components/yocto-sdk -b thud
repo init -u https://source.codeaurora.org/external/qoriq/qoriq-components/yocto-sdk -b sumo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;repo sync 이후에  &lt;code&gt;LSDKYOCTOUG&lt;/code&gt; 문서에 따라서 yocto 빌드를 진행한다.&lt;/p&gt;
&lt;h2 id=&quot;2-yocto-build-image&quot;&gt;2 yocto build image&lt;/h2&gt;
&lt;p&gt;layerscape yocto 에서 빌드된 결과물은 sd boot image 가 없다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;부팅용 이미지가 따로 생성되지 않기때문에, flex-installer 를 통한 sd card 쓰기도 할수없다.&lt;/li&gt;
&lt;li&gt;sd boot image 를 따로 만들어야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;21-sd-card-boot-bootloader-uboot&quot;&gt;2.1 sd card boot - bootloader (uboot)&lt;/h3&gt;
&lt;p&gt;yocto 의 wic 명령어로 sd card 용 부팅이미지를 만들 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;wic 명령어 간략설명 : &lt;a href=&quot;yocto-sd-image-만들기.md&quot;&gt;yocto-sd-image-만들기&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;sd card 부팅을위해서 각 칩셋의 데이터시트를 확인하여 부트로더,커널이미지등이 sdcard 의 어느 부분에 들어가야하는지 확인한다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;QorIQ memory layout&lt;/code&gt; 부분을 살펴보면 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;uploads/39d979ab3c5e314482b28dc4b63023ce.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;위의 표에서 부팅에 필요한부분 만 추려려서 정리해보면 다음과같다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RCW + PBL + BL2 (이하 BL2)&lt;ul&gt;
&lt;li&gt;sdcard block : 0x8  &lt;/li&gt;
&lt;li&gt;build result file : atf/bl2_sd.pbl&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;FIP image + uboot (이하 BL3)&lt;ul&gt;
&lt;li&gt;sdcard block : 0x800 &lt;/li&gt;
&lt;li&gt;build result file : atf/fip_uboot.pbl&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;BL2 / BL3 는 yocto 빌드하면 자동으로 생성해준다.(&lt;code&gt;atf/bl2_sd.pbl&lt;/code&gt;, &lt;code&gt;atf/fip_uboot.pbl&lt;/code&gt;) &lt;/p&gt;
&lt;p&gt;위의 내용대로 부팅가능한 이미지를 만들기위한 wks 는 다음과같다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# bl2 boot setctor = 0x8 
#  -&amp;gt; 0x8 * 512 / 1024 = 4kb
part --source rawcopy --sourceparams=&amp;quot;file=atf/bl2_sd.pbl&amp;quot; --align 4 --no-table

# bl2 boot setctor = 0x800
#  -&amp;gt; 0x800 * 512 / 1024 = 1024kb
part --source rawcopy --sourceparams=&amp;quot;file=atf/fip_uboot.bin&amp;quot; --align 1024 --no-table
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;해당 wks 를 작성후 &lt;code&gt;wic create wks/sd-img.wks -o img.bin -e fsl-image-networking&lt;/code&gt; 명령어를 입력하여 image 를 만든다. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;wic 명령어 간략설명 : &lt;a href=&quot;yocto-sd-image-만들기.md&quot;&gt;yocto-sd-image-만들기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사실 wks 를 이용해 안만들고 dd 로 만들어도 된지만 추후 rootfs 까지 만들어야하기때문에 wks 로 만드는게 편하다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-e fsl-image-networking&lt;/code&gt; 부분은 만드려는 이미지 레시피에 따라서 적절히 수정한다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;참고로, 위의 wks는 다음의 dd 명령어와 같다&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;dd if=atf/bl2_sd.pbl of=test/test.bin bs=512 seek=8
dd if=atf/fip_uboot.bin of=test/test.bin bs=512 seek=2048
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;위에서 생성된 이미지파일을 sdcard 에 밀어넣고 부팅이 되면 부트로더 까지 구동은 성공이다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;참고로, atf 이미지는 따로 래시피로 분리 되어있다. uboot 수정한다고 해도 atf 이미지는 새로 생성되지 않는다. uboot 수정시 atf용 이미지는 &lt;code&gt;bitbake -c do_clean atf &amp;amp;&amp;amp; bitbake atf&lt;/code&gt; 명령어로 새로 빌드해주면된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;22-sd-card-boot-kernel&quot;&gt;2.2 sd card boot - kernel&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;QorIQ memory layout&lt;/code&gt; 부분의 linux kernel block 은 &lt;code&gt;0x8000&lt;/code&gt; 이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;해당 kernel block 부분은 굳이 지키지 않아도된다. 하지만, 기본적으로 제공되는 uboot 소스코드에서 kernel loading address 가 &lt;code&gt;0x8000&lt;/code&gt; 으로 이미 설정되어있기때문에 해당 부분을 지키는게 좋다.&lt;/li&gt;
&lt;li&gt;yocto build 후에 완료된 커널 이미지는 &lt;code&gt;fitImage&lt;/code&gt; 이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;fitImage&lt;/code&gt; 를 &lt;code&gt;0x8000&lt;/code&gt; 번지에 넣는다. 부트로더와 함께 kernel 까지 넣는 wks 파일은 다음과 같다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# bl2 boot setctor = 0x8 
#  -&amp;gt; 0x8 * 512 / 1024 = 4kb
part --source rawcopy --sourceparams=&amp;quot;file=atf/bl2_sd.pbl&amp;quot; --align 4 --no-table

# bl2 boot setctor = 0x800
#  -&amp;gt; 0x800 * 512 / 1024 = 1024kb
part --source rawcopy --sourceparams=&amp;quot;file=atf/fip_uboot.bin&amp;quot; --align 1024 --no-table


# kernel fit image = 0x8000
#  -&amp;gt; 0x8000 * 512 / 1024 = 16384kb
part --source rawcopy --sourceparams=&amp;quot;file=fitImage&amp;quot; --align 16384 --no-table
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;해당 wks 를 작성후 &lt;code&gt;wic create wks/sd-img.wks -o img.bin -e fsl-image-networking&lt;/code&gt; 명령어를 입력하여 image 를 만든다. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;wic 명령어 간략설명 : &lt;a href=&quot;yocto-sd-image-만들기.md&quot;&gt;yocto-sd-image-만들기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사실 wks 를 이용해 안만들고 dd 로 만들어도 된지만 추후 rootfs 까지 만들어야하기때문에 wks 로 만드는게 편하다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-e fsl-image-networking&lt;/code&gt; 부분은 만드려는 이미지 레시피에 따라서 적절히 수정한다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;221&quot;&gt;2.2.1 커널 부팅을 위한 수정&lt;/h4&gt;
&lt;p&gt;커널까지 sd card 에 넣은후 부팅해보면... &lt;code&gt;Could not find configuration node&lt;/code&gt; 에러가 발생하면서 부팅이 되지 않는다.&lt;/p&gt;
&lt;p&gt;부팅이 되지 않는 이유는 커널의 fit image 의 configure 설정과 uboot 에서 bootm 명령어 설정이 맞지 않아서 이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;관련 포스팅 : &lt;a href=&quot;fit-image-configure-err.md&quot;&gt;fit-image-configure-err&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;layerscape yocto build uboot 의 코드는 부팅을 위해서 &lt;code&gt;bootm $load_addr#$board&lt;/code&gt; 와같이 되어있는데.. 생성된 kernel fit image 는 해당 confgiure 가 없다. 참고로 이미 default config 가 설정되어 있으므로 부트로더에서 다음과같이 수정한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;setenv bootm '$load_addr'
savee
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위대로 수정할경우 커널까지 부팅은 될것이다. (rootfs mount 하다가 에러가 발생할것이다.)&lt;/p&gt;
&lt;h3 id=&quot;23-22-sd-card-boot-rootfs&quot;&gt;2.3 2.2 sd card boot - rootfs&lt;/h3&gt;
&lt;p&gt;wks 를 이용하여 다음과 같이 rootfs 까지 포함하여 만들자. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# bl2 boot setctor = 0x8 
#  -&amp;gt; 0x8 * 512 / 1024 = 4kb
part --source rawcopy --sourceparams=&amp;quot;file=atf/bl2_sd.pbl&amp;quot; --align 4 --no-table

# bl2 boot setctor = 0x800
#  -&amp;gt; 0x800 * 512 / 1024 = 1024kb
part --source rawcopy --sourceparams=&amp;quot;file=atf/fip_uboot.bin&amp;quot; --align 1024 --no-table


# kernel fit image = 0x8000
#  -&amp;gt; 0x8000 * 512 / 1024 = 16384kb
part --source rawcopy --sourceparams=&amp;quot;file=fitImage&amp;quot; --align 16384 --no-table

# empty filesystem start 0x20000
#  -&amp;gt; 0x20000 * 512 / 1024 = 65536kb 
# mmcblk0p1
part --fstype=ext4 --align 65536 --fixed-size 32M

# filesystem start = 0x20000 (+ 32M = 32768)
#  -&amp;gt; 0x20000 * 512 / 1024 = 65536kb + 32768 = 98304
# mmcblk0p2
part --source rootfs  --fstype ext4 --align 98304 --fixed-size 3G
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;해당 wks 를 작성후 &lt;code&gt;wic create wks/sd-img.wks -o img.bin -e fsl-image-networking&lt;/code&gt; 명령어를 입력하여 image 를 만든다. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;wic 명령어 간략설명 : &lt;a href=&quot;yocto-sd-image-만들기.md&quot;&gt;yocto-sd-image-만들기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;사실 wks 를 이용해 안만들고 dd 로 만들어도 된지만 추후 rootfs 까지 만들어야하기때문에 wks 로 만드는게 편하다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-e fsl-image-networking&lt;/code&gt; 부분은 만드려는 이미지 레시피에 따라서 적절히 수정한다.)&lt;/li&gt;
&lt;li&gt;user 파티션은 총 2개를 만든다.&lt;ul&gt;
&lt;li&gt;p1 : 32M 의 빈 파티션&lt;/li&gt;
&lt;li&gt;p2 : 실제 rootfs 가 들어갈 파티션 -&amp;gt; bootargs 를 mmcblk0p2 로 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;위와같이 만든 이미지를 sd card 에 밀어넣고 부팅을 시킨다.&lt;/p&gt;
&lt;p&gt;rootfs 인식을 위해서 uboot 에서의 환경변수는 다음과 같이 수정한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;setenv bootargs root=/dev/mmcblk0p2 rw
savee
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이후 부팅하면, rootfs 까지 인식완료된다.&lt;/p&gt;
&lt;h2 id=&quot;3&quot;&gt;3 요약&lt;/h2&gt;
&lt;p&gt;위에서 설명한 내용을 요약정리한다.&lt;/p&gt;
&lt;h3 id=&quot;31-uboot&quot;&gt;3.1 uboot 수정포인트&lt;/h3&gt;
&lt;p&gt;yocto 로 빌드한 커널, rootfs 를 인식시키기위해서는 uboot 에서 다음의 내용을 수정한다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;uboot/include/configs&lt;/code&gt; 폴더내에서 보드의 설정파일에서 다음의 uboot 환경변수를 수정 혹은 추가한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 추가사항
bootargs root=/dev/mmcblk0p2 rw
# 수정사항 : bootm $load_addr$board 부분을 다음으로 수정
bootm $load_addr
# 수정사항 : SD_BOOTCOMMAND 을 run sd_bootcmd; 으로 변경
define SD_BOOTCOMMAND run sd_bootcmd;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;bootm 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;include/configs/ls1028ardb.h&lt;/code&gt; &lt;/p&gt;
&lt;h3 id=&quot;32-sd-image&quot;&gt;3.2 sd image 만들기&lt;/h3&gt;
&lt;p&gt;다음의 wks 작성후 sd card 이미지 만듬&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# bl2 boot setctor = 0x8 
#  -&amp;gt; 0x8 * 512 / 1024 = 4kb
part --source rawcopy --sourceparams=&amp;quot;file=atf/bl2_sd.pbl&amp;quot; --align 4 --no-table

# bl2 boot setctor = 0x800
#  -&amp;gt; 0x800 * 512 / 1024 = 1024kb
part --source rawcopy --sourceparams=&amp;quot;file=atf/fip_uboot.bin&amp;quot; --align 1024 --no-table


# kernel fit image = 0x8000
#  -&amp;gt; 0x8000 * 512 / 1024 = 16384kb
part --source rawcopy --sourceparams=&amp;quot;file=fitImage&amp;quot; --align 16384 --no-table

# empty filesystem start 0x20000
#  -&amp;gt; 0x20000 * 512 / 1024 = 65536kb 
# mmcblk0p1
part --fstype=ext4 --align 65536 --fixed-size 32M

# filesystem start = 0x20000 (+ 32M = 32768)
#  -&amp;gt; 0x20000 * 512 / 1024 = 65536kb + 32768 = 98304
# mmcblk0p2
part --source rootfs  --fstype ext4 --align 98304 --fixed-size 3G
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;wic create wks/sd-img.wks -o img.bin -e fsl-image-networking&lt;/code&gt; &lt;/p&gt;
&lt;h3 id=&quot;33-sd-card-write-booting&quot;&gt;3.3 sd card write &amp;amp; booting&lt;/h3&gt;
&lt;p&gt;만든 sd image를 &lt;a href=&quot;https://www.balena.io/etcher/&quot;&gt;https://www.balena.io/etcher/&lt;/a&gt; 를 통해서 sd card write 후에 부팅...&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;h2 id=&quot;4&quot;&gt;4 잡담..&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;아직 layerscape yocto build 에서 sd card boot 용 이미지가 왜 생성안되는지 잘 모르겠음 ㅠㅠ&lt;/li&gt;
&lt;li&gt;나름 쉽게 풀어쓴다고 썼지만 다른사람에게 도움이 될지는 의문.&lt;/li&gt;
&lt;li&gt;나중에 혹시 비슷한 삽질을 할까봐... 정리차원에서 작성&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;해당 포스팅은 &lt;a href=&quot;https://github.com/kksworks/tistory-posting-cli&quot;&gt;tistory-posting-cli&lt;/a&gt; 를 이용해 발행되었습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SW 개발</category>
      <category>Layerscape</category>
      <category>NXP</category>
      <category>Yocto</category>
      <author>. . .</author>
      <guid isPermaLink="true">https://xenostudy.tistory.com/731</guid>
      <comments>https://xenostudy.tistory.com/731#entry731comment</comments>
      <pubDate>Fri, 16 Sep 2022 15:53:26 +0900</pubDate>
    </item>
    <item>
      <title>yocto 환경에서 sdcard 용 이미지 만들기 (dump image)</title>
      <link>https://xenostudy.tistory.com/730</link>
      <description>&lt;div class=&quot;toc&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#1-dump-image&quot;&gt;1 dump image&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-yocto-wic&quot;&gt;2 yocto 의 wic 명령어&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#21-wic&quot;&gt;2.1 wic 명령어 사용환경&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#22-wic&quot;&gt;2.2 wic 를 이용한 이미지 파일만들기&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#221-wks&quot;&gt;2.2.1 wks 의 예제&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#23-wic&quot;&gt;2.3 wic 실행&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;-tags : #yocto&lt;/p&gt;
&lt;p&gt;특정 보드에서 sdcard 용 dump image 를 만드는 레시피가 제공되지 않아서 강제로 sdcard 용 dump image를 만드는 방법을 정리한다.&lt;/p&gt;
&lt;h2 id=&quot;1-dump-image&quot;&gt;1 dump image&lt;/h2&gt;
&lt;p&gt;일종의 dump 용 이미지를 뜻한다.&lt;/p&gt;
&lt;p&gt;예를들면, sdcard boot 를 지원하는 임베디드 보드에서 boot 가능한 sd card 를 만들어야하는데... 친절한 칩 제조사라면 BSP내에 해당 sdcard boot 용 이미지를 따로 만드는 레시피를 함께 준다. (풀 빌드과정에서 SD card 용 이미지파일을 만들어준다.) 이렇게 생성된 이미지 파일은 &lt;code&gt;dd&lt;/code&gt; 명령어나, &lt;code&gt;balenaEtcher&lt;/code&gt; 같은 툴로 해당 이미지를 그냥 한번에 sd card 에 write 하여 사용한다.&lt;/p&gt;
&lt;p&gt;하지만.. sdcard boot 이미지를 제공하지 않는 BSP 가 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;최악의 경우... 물리 sd카드에 &lt;code&gt;dd&lt;/code&gt;, &lt;code&gt;fdisk&lt;/code&gt;, &lt;code&gt;part&lt;/code&gt; 명령어들로 파티션레이아웃을 잡고, 직접 mount 해서 rootfs 파일들을 잡아야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;매번 sd 카드에 여러가지 명령어를 치면서 부팅용 sd card 를 만드는건 너무 번거롭다. sdcard boot image 를 직접 만들어 사용하는것이 훨씬 간편하다. (결국은 yocto 레시피에 직접 sdcard boot image 를 만드는 레시피를 만들어야하지만... 정식 레시피 만들기전에 검증하기위한 해당 방법이 유용하다. )&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;해당 방법을 쓸경우 gang 장비용 dump 이미지로도 활용 할수있다. 하나의 파일에 파티션테이블, 파일시스템생성, offset 된 raw data 들이 모두 묶여 들어있기 때문&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;2-yocto-wic&quot;&gt;2 yocto 의 wic 명령어&lt;/h2&gt;
&lt;p&gt;yocto 에서는 하나의 이미지를 만드는 wic 라는 커맨드쉘 명령어를 제공해준다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;wic 공식 매뉴얼 : &lt;a href=&quot;https://docs.yoctoproject.org/2.4.2/dev-manual/dev-manual.html#creating-partitioned-images-using-wic&quot;&gt;https://docs.yoctoproject.org/2.4.2/dev-manual/dev-manual.html#creating-partitioned-images-using-wic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;wic 명령어를 간략하게 설명하면 .. sdcard 와 같은 물리 장치에 write 할수있는 dump 파일을 생성해주는 툴이다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;하나의 파일안에 파티션테이블, 파일시스템등을 모두포함하고있다. 특히 block offset 으로 write 가 가능하여 부팅용이미지로도 활용가능.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;21-wic&quot;&gt;2.1 wic 명령어 사용환경&lt;/h3&gt;
&lt;p&gt;yocto 빌드르 위해서 기본적인 환경설정 &lt;code&gt;source ./setup-env -m XXX&lt;/code&gt; 와 같이 대부분 할것이다.&lt;/p&gt;
&lt;p&gt;환경설정을 한후에는 bitbake 명령어를 사용할수있는데, 이때  wic 명령어도 사용할 수있다. (wic 파일은 &lt;code&gt;/sources/poky/scripts/wic&lt;/code&gt; 경로에있다.)&lt;/p&gt;
&lt;p&gt;yocto 환경설정이 끝난후에 &lt;code&gt;wic --help&lt;/code&gt; 를 치면 다음과 같이 옵션등을 확인할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ wic --help

Creates a customized OpenEmbedded image.

Usage:  wic [--version]
        wic help [COMMAND or TOPIC]
        wic COMMAND [ARGS]

    usage 1: Returns the current version of Wic
    usage 2: Returns detailed help for a COMMAND or TOPIC
    usage 3: Executes COMMAND


COMMAND:

    list   -   List available canned images and source plugins
    ls     -   List contents of partitioned image or partition
    rm     -   Remove files or directories from the vfat or ext* partitions
    help   -   Show help for a wic COMMAND or TOPIC
    write  -   Write an image to a device
    cp     -   Copy files and directories to the vfat or ext* partitions
    create -   Create a new OpenEmbedded image


TOPIC:
    overview  - Presents an overall overview of Wic
    plugins   - Presents an overview and API for Wic plugins
    kickstart - Presents a Wic kicstart file reference


&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;22-wic&quot;&gt;2.2 wic 를 이용한 이미지 파일만들기&lt;/h3&gt;
&lt;p&gt;wic 로 이미지를 만들기위해서는 먼저 wks 파일을 명세해야한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;wks 파일은 어떠한 내용으로 이미지를 만들지 설정파일 같은 역할을 한다.&lt;ul&gt;
&lt;li&gt;wks 공식 매뉴얼 : &lt;a href=&quot;https://docs.yoctoproject.org/ref-manual/kickstart.html&quot;&gt;https://docs.yoctoproject.org/ref-manual/kickstart.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;wks 에 대한 대략적인 활용은 mender 코드를 참고한다 : &lt;a href=&quot;https://github.com/mendersoftware/meta-mender/blob/66530eb7290eaad8d837666cde650c2e6b14501b/meta-mender-core/classes/mender-part-images.bbclass&quot;&gt;https://github.com/mendersoftware/meta-mender/blob/66530eb7290eaad8d837666cde650c2e6b14501b/meta-mender-core/classes/mender-part-images.bbclass&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;해당 플랫폼에 맞게 wks 를 작성하자.&lt;/p&gt;
&lt;h4 id=&quot;221-wks&quot;&gt;2.2.1 wks 의 예제&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;boot data - raw data write&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;특정 block 에 파티션없이 raw 데이터를 쓰려면 다음의 예제를 참고한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# bl2 boot setctor = 0x8 
#  -&amp;gt; 0x8 * 512 / 1024 = 4kb
part --source rawcopy --sourceparams=&amp;quot;file=atf/bl2_sd.pbl&amp;quot; --align 4 --no-table

# bl2 boot setctor = 0x800
#  -&amp;gt; 0x800 * 512 / 1024 = 1024kb
part --source rawcopy --sourceparams=&amp;quot;file=atf/fip_uboot.bin&amp;quot; --align 1024 --no-table


# kernel fit image = 0x8000
#  -&amp;gt; 0x8000 * 512 / 1024 = 16384kb
part --source rawcopy --sourceparams=&amp;quot;file=fitImage&amp;quot; --align 16384 --no-table
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;코드설명&lt;ul&gt;
&lt;li&gt;0x8 번째 블럭에 &lt;code&gt;atf/bl2_sd.pbl&lt;/code&gt; 를 write -&amp;gt; 해당 데이터는 파티션으로 안잡고, raw data 로 write&lt;/li&gt;
&lt;li&gt;0x800 번째 블럭에 &lt;code&gt;atf/fip_uboot.bin&lt;/code&gt; 를 write -&amp;gt; 해당 데이터는 파티션으로 안잡고, raw data 로 write&lt;/li&gt;
&lt;li&gt;0x8000 번째 블럭에 &lt;code&gt;fitImage&lt;/code&gt; 를 write -&amp;gt; 해당 데이터는 파티션으로 안잡고, raw data 로 write&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;rootfs - filesystem write&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;특정 block 에 파티션을 만들면서, 데이터 채우기&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# empty filesystem start 0x20000
#  -&amp;gt; 0x20000 * 512 / 1024 = 65536kb
part --fstype=ext4 --align 65536 --fixed-size 32M

# filesystem start = 0x20000 (+ 32M = 32768)
#  -&amp;gt; 0x20000 * 512 / 1024 = 65536kb + 32768 = 98304
part --source rootfs  --fstype ext4 --align 98304 --fixed-size 3G
# part --source rootfs --sourceparams=&amp;quot;file=fsl-image-networking-ls1028ardb.ext4&amp;quot; --fstype ext4 --align 98304 --fixed-size 3G
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;코드설명&lt;ul&gt;
&lt;li&gt;0x20000 번째 블럭에 32M ext4 파티션 만들기&lt;/li&gt;
&lt;li&gt;0x20000 + 32M 위치에 &lt;code&gt;rootfs&lt;/code&gt; 파티션을 3G 사이즈로만들기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;23-wic&quot;&gt;2.3 wic 실행&lt;/h3&gt;
&lt;p&gt;wks 를 적당하게 만들었다면 다음의 명령어로 이미지를 든다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wic create [wks_file_path] -o [output_dir] -e [image_name]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;wks_file_path : wks 파일의 경로를 작성한다.&lt;/li&gt;
&lt;li&gt;output_dir : 이미지 파일이 만들어질 경로&lt;/li&gt;
&lt;li&gt;image_name : image recipes&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bitbake image-name&lt;/code&gt; 에서 image-name 부분을 작성해준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;wic create 명령어는  &lt;code&gt;BOOTIMG_DIR&lt;/code&gt;, &lt;code&gt;KERNEL_DIR&lt;/code&gt;, &lt;code&gt;NATIVE_SYSROOT&lt;/code&gt; 에 대한 정보를 함께넘겨야 한다. 하지만 &lt;code&gt;-e [image_name]&lt;/code&gt; 옵션을 주면 이미 yocto 에 설정 되어있는 환경을 그대로 갖다쓰기때문에 따로 각 경로들을 신경쓰지 않아도 된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;지금 개발하고있는 nxp landscape 에서는 다음과 같이 명령을 입력하였다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wic create wks/sd-img.wks -o img.bin -e fsl-image-networking
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;정상적으로 이미지 파일이 만들어지면 원하는경로에 다음과 같은 파일이 생성된다.&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kEhqM/btrMfMBM5aw/WGc7r56f2w3y7aS7HPlftK/img.png&quot; /&gt;&lt;figcaption&gt;이미지 생성 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;xxx.p0 ~ xxx.pX : 각 파티션에 대한 이미지파일들&lt;/li&gt;
&lt;li&gt;xxx.direct : 하나로 합쳐진 이미지&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;xxx.direct 을 balenaEtcher 툴을 이용하여 sd card 에 구우면 넣으면 된다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;이렇게 wic 를 이용하여 이미지 생성이 성공, 부팅검증이 되면.. 해당 wks 파일을 참고하여 &lt;code&gt;do_image_sdcard&lt;/code&gt; 와 같은 이미지 생성용 레시피를 생성하여 자동으로 이미지를 만들도록한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;본 포스팅은 obsidian 으로 작성하였으며, &lt;a href=&quot;https://github.com/kksworks/tistory-posting-cli&quot;&gt;tistory-posting-cli&lt;/a&gt; 를 이용해 발행되었습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SW 개발</category>
      <category>Yocto</category>
      <author>. . .</author>
      <guid isPermaLink="true">https://xenostudy.tistory.com/730</guid>
      <comments>https://xenostudy.tistory.com/730#entry730comment</comments>
      <pubDate>Fri, 16 Sep 2022 14:04:51 +0900</pubDate>
    </item>
    <item>
      <title>yocto uboot bootloader 의 defconfig 수정 후 재빌드하기</title>
      <link>https://xenostudy.tistory.com/729</link>
      <description>&lt;div class=&quot;toc&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#yocto&quot;&gt;yocto&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#1&quot;&gt;1 증상&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#11&quot;&gt;1.1 해결방법&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id=&quot;yocto&quot;&gt;yocto&lt;/h1&gt;
&lt;p&gt;yocto 에서 uboot 의 defconfig 수정후 재빌드하는 방법 작성&lt;/p&gt;
&lt;h2 id=&quot;1&quot;&gt;1 증상&lt;/h2&gt;
&lt;p&gt;일반적으로 소스코드 / config 등을 수정 후 재 컴파일만 할때는 &lt;code&gt;-C do_compile&lt;/code&gt; 을 하면 된다.&lt;/p&gt;
&lt;p&gt;하지만 yocto bootloader 빌드에서 defconfig 파일을 아무리 수정해도 &lt;code&gt;-C do_compile&lt;/code&gt; 을 해도 적용이 되지 않았다;;&lt;/p&gt;
&lt;h3 id=&quot;11&quot;&gt;1.1 해결방법&lt;/h3&gt;
&lt;p&gt;간단하다. 다음의 명령어로 진행한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;bitbake -C do_configure virtual/bootloader
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;기존에는 &lt;code&gt;do_compile&lt;/code&gt; 로 거의 진행하면 defconfig 파일까지 다 적용되었다.&lt;/li&gt;
&lt;li&gt;그런데 이상하게 특정 yocto version 문제인지 모르겠는데... &lt;code&gt;do_compile&lt;/code&gt; 하더라도 진행이 적용이 되지 않았다.&lt;/li&gt;
&lt;li&gt;uboot 의경우 &lt;code&gt;do_configure&lt;/code&gt; 를 하면 기존의 &lt;code&gt;defconfig&lt;/code&gt; 를 새로 머지해서 &lt;code&gt;.config&lt;/code&gt; 를 하게 되더라..&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;그냥 &lt;code&gt;bitbake -C do_configure virtual/bootloader&lt;/code&gt; 하면 끝난다.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;해당 포스팅은 &lt;a href=&quot;https://github.com/kksworks/tistory-posting-cli&quot;&gt;tistory-posting-cli&lt;/a&gt; 를 이용해 발행되었습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SW 개발</category>
      <category>Linux_Admin</category>
      <category>Yocto</category>
      <author>. . .</author>
      <guid isPermaLink="true">https://xenostudy.tistory.com/729</guid>
      <comments>https://xenostudy.tistory.com/729#entry729comment</comments>
      <pubDate>Fri, 16 Sep 2022 12:10:03 +0900</pubDate>
    </item>
    <item>
      <title>yocto 에서 busybox hwclock 패키지 변경하기</title>
      <link>https://xenostudy.tistory.com/728</link>
      <description>&lt;div class=&quot;toc&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#1-hwclock&quot;&gt;1 hwclock 패키지변경하기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2&quot;&gt;2 증상&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-util-linux&quot;&gt;3 util-linux 패키지&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#31&quot;&gt;3.1 각종 포함되어야할 패키지 명세&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4&quot;&gt;4 패키지 바꾸기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-hwclock-help&quot;&gt;5 hwclock help 명령어&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;-tags : #yocto &lt;/p&gt;
&lt;h2 id=&quot;1-hwclock&quot;&gt;1 hwclock 패키지변경하기&lt;/h2&gt;
&lt;p&gt;busybox 의 hwclock 패키지를 linux-util 의 패키지로 변경한 작업내용을 기록한다.&lt;/p&gt;
&lt;h2 id=&quot;2&quot;&gt;2 증상&lt;/h2&gt;
&lt;p&gt;busybox 내에도 hwclock 이라는 명령어가 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hwclock 명령어는 hw rtc 칩에 시간을 설정, 읽기등의 동작을 하게된다.&lt;/li&gt;
&lt;li&gt;busybox 내의 해당명령어의 help 를 쳐보면 옵션이 거의 없다.&lt;/li&gt;
&lt;li&gt;rtc 를 원하는 시간에 세팅하는 &lt;code&gt;--set&lt;/code&gt; 옵션을 지원하지 않아 원래 리눅스의 패키지로 변경해야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;hwclock --help
BusyBox v1.27.2 (2021-06-02 02:49:02 UTC) multi-call binary.

Usage: hwclock [-r|--show] [-s|--hctosys] [-w|--systohc] [-t|--systz] [-l|--localtime] [-u|--utc] [-f|--rtc FILE]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;3-util-linux&quot;&gt;3 util-linux 패키지&lt;/h2&gt;
&lt;p&gt;우리가 일반적으로 사용하는 명령어들은 거의다 &lt;code&gt;util-linux&lt;/code&gt;  패키지들 이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/sources/poky/meta/recipes-core/util-linux&lt;/code&gt; 경로에 레시피가 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;31&quot;&gt;3.1 각종 포함되어야할 패키지 명세&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;util-linux.inc&lt;/code&gt; 파일의 &lt;code&gt;PACKAGES&lt;/code&gt; 에 포함될 패지가 명시 되어있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;PACKAGES =+ &amp;quot;util-linux-agetty util-linux-fdisk util-linux-cfdisk util-linux-sfdisk \
             util-linux-swaponoff util-linux-losetup util-linux-umount \
             util-linux-mount util-linux-readprofile util-linux-uuidd \
             util-linux-uuidgen util-linux-lscpu util-linux-fsck.cramfs util-linux-fsck \
             util-linux-blkid util-linux-mkfs util-linux-mcookie util-linux-rfkill \
             util-linux-lsblk util-linux-mkfs.cramfs util-linux-fstrim \
             util-linux-partx util-linux-hwclock util-linux-mountpoint \
             util-linux-findfs util-linux-getopt util-linux-sulogin util-linux-prlimit \
             util-linux-ionice util-linux-switch-root&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;해당 부분에서 hwlock 을 포함 하겠다고 명시 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;하지만... 실제 hwclock 명령어는 busybox 의 것을 써야하므로 충돌이 일어난다. 때문에 &lt;code&gt;do_install&lt;/code&gt; 에서 다음과 같이 패키지를 바꾸도록 명시해놓고있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;ALTERNATIVE_util-linux-hwclock = &amp;quot;hwclock&amp;quot;
ALTERNATIVE_LINK_NAME[hwclock] = &amp;quot;${base_sbindir}/hwclock&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;4&quot;&gt;4 패키지 바꾸기&lt;/h2&gt;
&lt;p&gt;패키지를 바꾸는 &lt;code&gt;ALTERNATIVE&lt;/code&gt; 변수를 다음과같이 조정한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;FILESEXTRAPATHS_prepend := &amp;quot;${THISDIR}/${BPN}:&amp;quot;

ALTERNATIVE_util-linux-hwclock = &amp;quot;&amp;quot;
ALTERNATIVE_LINK_NAME[hwclock] = &amp;quot;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;위와 설정하여 &lt;code&gt;hwclock&lt;/code&gt; 를 util-linux 의 것을 그대로 사용하도록 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;busybox 내의 &lt;code&gt;hwclock&lt;/code&gt; 을 다음과같이 삭제&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# hwclock : using util-linux
CONFIG_HWCLOCK=n
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;FILESEXTRAPATHS_prepend := &amp;quot;${THISDIR}/${BPN}:&amp;quot;

# Prevent splitting busybox applets in two binaries (*.suid and *.nosuid)

SRC_URI += &amp;quot; \
    file://ksc-board.cfg \
&amp;quot;

# disable FTPD - as it's provided by inetutils
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;작업 성공&lt;/p&gt;
&lt;h2 id=&quot;5-hwclock-help&quot;&gt;5 hwclock help 명령어&lt;/h2&gt;
&lt;p&gt;hwclock 명령어 테스트 결과&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;root@s32v234evb:~# hwclock --help

Usage:
 hwclock [function] [option...]

Time clocks utility.

Functions:
 -r, --show           display the RTC time
     --get            display drift corrected RTC time
     --set            set the RTC according to --date
 -s, --hctosys        set the system time from the RTC
 -w, --systohc        set the RTC from the system time
     --systz          send timescale configurations to the kernel
 -a, --adjust         adjust the RTC to account for systematic drift
     --predict        predict the drifted RTC time according to --date

Options:
 -u, --utc            the RTC timescale is UTC
 -l, --localtime      the RTC timescale is Local
 -f, --rtc &amp;lt;file&amp;gt;     use an alternate file to /dev/rtc0
     --directisa      use the ISA bus instead of /dev/rtc0 access
     --date &amp;lt;time&amp;gt;    date/time input for --set and --predict
     --update-drift   update the RTC drift factor
     --noadjfile      do not use /etc/adjtime
     --adjfile &amp;lt;file&amp;gt; use an alternate file to /etc/adjtime
     --test           dry run; implies --verbose
 -v, --verbose        display more details

 -h, --help           display this help
 -V, --version        display version

For more details see hwclock(8).
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;본 포스팅은 obsidian 으로 작성하였으며, &lt;a href=&quot;https://github.com/kksworks/tistory-posting-cli&quot;&gt;tistory-posting-cli&lt;/a&gt; 를 이용해 발행되었습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SW 개발</category>
      <category>BusyBox</category>
      <category>embedded-linux</category>
      <category>linux-util</category>
      <category>Yocto</category>
      <author>. . .</author>
      <guid isPermaLink="true">https://xenostudy.tistory.com/728</guid>
      <comments>https://xenostudy.tistory.com/728#entry728comment</comments>
      <pubDate>Fri, 16 Sep 2022 12:03:20 +0900</pubDate>
    </item>
    <item>
      <title>yocto 빌드관련 결과물 제어하기 (하드디스크절약)</title>
      <link>https://xenostudy.tistory.com/727</link>
      <description>&lt;div class=&quot;toc&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#1-rm_work&quot;&gt;1 rm_work 옵션&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#11&quot;&gt;1.1 간략설명&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#12&quot;&gt;1.2 세팅방법&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#13&quot;&gt;1.3 관련 레퍼런스&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;-tags : #yocto &lt;/p&gt;
&lt;p&gt;yocto 에서 빌드과정중에 생성되는 object 나 configure 관련 파일들, 혹은 소스코드 fetch 등을 제어할 수 있다.&lt;/p&gt;
&lt;h2 id=&quot;1-rm_work&quot;&gt;1 rm_work 옵션&lt;/h2&gt;
&lt;h3 id=&quot;11&quot;&gt;1.1 간략설명&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;yocto 를 통해서 빌드하다 보면 각 레시피마다 &lt;code&gt;build&lt;/code&gt; 디렉토리가 생성되며, 소스코드와함께 빌드과정중에 생성되는 파일들을 모두 하드디스크에 저장하게된다.&lt;/li&gt;
&lt;li&gt;물론 개발과정중에는 이러한 과정등을 보는것이 좋다. (코드, configure 추적하기등등)&lt;/li&gt;
&lt;li&gt;하지만 단순 빌드머신등에서는 해당 임시결과물들이 필요없을수있다.&lt;/li&gt;
&lt;li&gt;임시결과물이 필요없을 경우 &lt;code&gt;INHERIT += &quot;rm_work&quot;&lt;/code&gt; 옵션을 통해서, 임시결과물들을 바로바로 삭제하게 하여 하드디스크 절약 및 빌드속도를 올릴 수있다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INHERIT += &quot;rm_work&quot;&lt;/code&gt; 을 세팅하고, 디버깅이 필요한 레시피가 있다면 &lt;code&gt;RM_WORK_EXCLUDE&lt;/code&gt;을 세팅하여 해당 레시피만 임시결과물을 생성하도록한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;12&quot;&gt;1.2 세팅방법&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;set_env&lt;/code&gt; 명령어등을 한 후에 생성되는 &lt;code&gt;build/conf/local.conf&lt;/code&gt; 파일에 다음의 라인을 추가한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;INHERIT += &amp;quot;rm_work&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;set env&lt;/code&gt; 명령어 초기부터 세팅하게 하려면, 관련 보드 레시비의 경로의 &lt;code&gt;class&lt;/code&gt; 폴더에 대부분 전역설정파일이 있을것이다. 해당부분에 추가하면된다.&lt;/p&gt;
&lt;p&gt;또한 동일파일에 &lt;code&gt;RM_WORK_EXCLUDE += your_library&lt;/code&gt; 와 같이 설정하면 &lt;code&gt;your_library&lt;/code&gt; 레시피에 대해서는 임시결과물을 생성하게 할 수있다.&lt;/p&gt;
&lt;h3 id=&quot;13&quot;&gt;1.3 관련 레퍼런스&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;yocto 관련 매뉴얼 : https://docs.yoctoproject.org/1.8/ref-manual/ref-manual.html#ref-classes-rm-work&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;7.107. rm_work.bbclass
rm_work 클래스는 임시 작업 공간 삭제를 지원하므로 빌드 중 하드 드라이브 요구 사항을 완화할 수 있습니다.

OpenEmbedded 빌드 시스템은 빌드 프로세스 중에 상당한 양의 디스크 공간을 사용할 수 있습니다. 이 공간의 일부는 각 레시피에 대한 $\TMPDIR\/work 디렉토리 아래의 작업 파일입니다. 빌드 시스템이 레시피 패키지를 생성하면 해당 레시피의 작업 파일은 더 이상 필요하지 않습니다. 그러나 기본적으로 빌드 시스템은 검사 및 가능한 디버깅 목적으로 이러한 파일을 보존합니다. 빌드가 진행됨에 따라 디스크 공간을 절약하기 위해 이러한 파일을 삭제하려는 경우 빌드 디렉토리에 있는 local.conf 파일에 다음을 추가하여 rm_work를 활성화할 수 있습니다.

    INHERIT += &amp;quot;rm_work&amp;quot;

레시피를 위해 작업 디렉토리에서 소스 코드를 수정하고 빌드하는 경우 rm_work를 활성화하면 소스에 대한 변경 사항이 손실 될 수 있습니다. rm_work에 의해 작업 디렉토리가 삭제되는 것을 막기 위해, RM_WORK_EXCLUDE 변수에 작업 중인 레시피 또는 레시피의 이름을 추가할 수 있으며, 이는 local.conf 파일에도 설정할 수 있습니다. 예를 들어보자.

    RM_WORK_EXCLUDE += &amp;quot;busybox glibc&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;다음과같은 환경을 설정하면... 빌드과정에서 컴파일한 결과물을 지우면서 빌드한다.&lt;/p&gt;
&lt;p&gt;INHERIT += &quot;rm_work&quot;&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;본 포스팅은 obsidian 으로 작성하였으며, &lt;a href=&quot;https://github.com/kksworks/tistory-posting-cli&quot;&gt;tistory-posting-cli&lt;/a&gt; 를 이용해 발행되었습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SW 개발</category>
      <category>Yocto</category>
      <author>. . .</author>
      <guid isPermaLink="true">https://xenostudy.tistory.com/727</guid>
      <comments>https://xenostudy.tistory.com/727#entry727comment</comments>
      <pubDate>Wed, 31 Aug 2022 15:02:32 +0900</pubDate>
    </item>
    <item>
      <title>ADR 수치 및 그래프 직접 그리기</title>
      <link>https://xenostudy.tistory.com/726</link>
      <description>&lt;div class=&quot;toc&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#1-adr&quot;&gt;1 ADR 이란?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2&quot;&gt;2 계산식&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#21-python&quot;&gt;2.1 python 으로 직접 계산&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-adr&quot;&gt;3 ADR 값의 계산결과&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4&quot;&gt;4 잡담&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id=&quot;1-adr&quot;&gt;1 ADR 이란?&lt;/h2&gt;
&lt;p&gt;ADR 은 시장의 온도를 어느정도 반영하는 수치이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;관련 설명 : &lt;a href=&quot;https://news.einfomax.co.kr/news/articleView.html?idxno=4082280&quot;&gt;https://news.einfomax.co.kr/news/articleView.html?idxno=4082280&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이래저래 알아보니, ADR 수치를 제공하는 증권사는 몇군데밖에 안됐다. 인터넷에서 제공하는 그래프도 한군데정도...&lt;/p&gt;
&lt;p&gt;ADR 수치를 자동으로 계산하고 어느정도 나만의 자동화 기준을 세우고싶어 직접 계산하였다.&lt;/p&gt;
&lt;h2 id=&quot;2&quot;&gt;2 계산식&lt;/h2&gt;
&lt;p&gt;구글링해보니, ADR 수치의 계산식은 간단하였다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;일정기간의 상승종목수 / 일정기간의 하락종목수 * 100&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;21-python&quot;&gt;2.1 python 으로 직접 계산&lt;/h3&gt;
&lt;p&gt;다음의 순서대로 직접 계산하였다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;일자별 전종목의 가격, 가격변동폭을 크롤링한다.&lt;/li&gt;
&lt;li&gt;특정일부터 특정일까지의 전종목의 가격정보를 얻는다.&lt;/li&gt;
&lt;li&gt;해당 종목이 코스피/코스닥인지 분류하고 상승종목수, 하락종목수를 구한다.&lt;/li&gt;
&lt;li&gt;ADR공식에 따라 계산한다.&lt;/li&gt;
&lt;li&gt;매일매이일의 ADR값을 계산한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;관련한 코드는 다음과 같다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def _calc_adr(target_date, calc_date) :
    trade_market = {}

    ticker_infos = ticker_api.get_kr_ticker_info()

    for ticker_info in ticker_infos :
        market_name =  ticker_info['additional']['거래소']
        trade_market[ticker_info['stock_id']] = market_name

    # 메모리아끼기위해서 삭제
    ticker_infos = {}

    stockDailyPriceInfos_model_ctx = financeInfo_model.stockDailyPriceInfos()

    target_date_days = 0
    price_chk = { '코스피' : {'up_price':0, 'down_price':0}, '코스닥': {'up_price':0, 'down_price':0}, 'KONEX': {'up_price':0, 'down_price':0}}

    while calc_date &amp;gt; 0 :
        calc_target_date = time_tools.date_calc_days(target_date, target_date_days)
        query_datas = stockDailyPriceInfos_model_ctx.get_one_day_price(calc_target_date)
        target_date_days -= 1

        # 타겟 날짜의 첫째일에... 가격정보가 없는경우는 calc 하지 않는다.
        if target_date_days == -1 and len(query_datas) &amp;lt;= 0 :
            return None

        if len(query_datas) &amp;lt;= 0 :
            continue

        ## too long...
        for one_data in query_datas :
            target_market = trade_market[one_data['stock_id']]
            if one_data['전일대비퍼센트'] &amp;gt; 0 :
                price_chk[target_market]['up_price'] += 1
            elif one_data['전일대비퍼센트'] &amp;lt; 0 :
                price_chk[target_market]['down_price'] += 1

        calc_date -= 1

    # 상승종목수 / 하락종목수 * 100
    adr_info = {}
    adr_info['기준일'] = target_date
    adr_info['kosdaq'] = price_chk['코스닥']['up_price'] / price_chk['코스닥']['down_price'] * 100
    adr_info['kosdaq'] = round(adr_info['kosdaq'],2)
    adr_info['kospi'] = price_chk['코스피']['up_price'] / price_chk['코스피']['down_price'] * 100
    adr_info['kospi'] = round(adr_info['kospi'], 2)

    return adr_info
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;코드는 부분부분만 일부부만 올려놨고, 코드가 되는데로 공개할예정&lt;/li&gt;
&lt;li&gt;매일매일에대한 전종목을 쿼리를 하는것보다는 범위로 쿼리하고, 매 종목에대한 가격확인보다는 numpy 같은걸로 한번에 카운팅하는것이 더 효율적일듯하다.&lt;ul&gt;
&lt;li&gt;1회성 계산이다보니... 일단 생각나는데로 급하게 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-adr&quot;&gt;3 ADR 값의 계산결과&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;특이사항&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;일반적으로 20일 기준으로 사용하는것 같아 20일 기준으로 계산.&lt;/li&gt;
&lt;li&gt;직접 계산한 ADR값은 유진투자증권과 &lt;a href=&quot;http://www.adrinfo.kr/&quot;&gt;http://www.adrinfo.kr/&lt;/a&gt; 에서 제공하고있는 값하고는 달랐다.&lt;/li&gt;
&lt;li&gt;위의 사이트들과의 오차는 대략 1 ~ 4 사이였다. (그정도의 오차는 크게 의미없는 수치라고 생각한다.)&lt;/li&gt;
&lt;li&gt;기존사이트 adr제공 사이트들는 어떻게 계산을 하는지에 대한코드가 공개되지 않은상태 이다보니 기존사이트와 데이터가 완벽하게 동일하지는 않다. &lt;/li&gt;
&lt;li&gt;계산식은 &lt;code&gt;일정기간의 상승종목수 / 일정기간의 하락종목수 * 100&lt;/code&gt; 으로 계산 하였으므로, 기존사이트의 데이터와 수치가 약간 차이나는건 크게 의미를 두지 않아도 될듯.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ADR 계산결과는 다음의 포스팅에서 매일매일 업데이트된다. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://xenostudy.tistory.com/718&quot;&gt;https://xenostudy.tistory.com/718&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;figure&gt;&lt;img src=&quot;https://raw.githubusercontent.com/kksworks/stock_data_asset/master/adr_graph/adr_kospi_daily.png&quot; /&gt;&lt;figcaption&gt;ADR 실시간 그래프&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&quot;4&quot;&gt;4 잡담&lt;/h2&gt;
&lt;p&gt;어제부로, 대략 10년치의 전종목의 가격정보를 크롤링 완료하였다&lt;/p&gt;
&lt;p&gt;
&lt;figure&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RpLNC/btrK2na0x9O/q2n4XeJo8ARTwZMEZbOb60/img.png&quot; /&gt;&lt;figcaption&gt;MONGODB 가격정보 컬렉션정보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;전종목의 약 10년치 가격정보는 대략 600만개정도 되었다.&lt;/li&gt;
&lt;li&gt;mongodb 기준 전종목 가격정보만 약 360M 의 사이즈 정도&lt;/li&gt;
&lt;li&gt;index 를 걸어서 쿼리해보니 라즈베리파이에서도 해당 사이즈의 db 도 문제없이 동작하였다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이제 10년치의 ADR를 계산할 수 있을것같다.&lt;/p&gt;
&lt;p&gt;10년치의 adr을 계산하여 한번 유의미한 데이터가 나오는지 확인예정.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;해당 포스팅은 &lt;a href=&quot;https://github.com/kksworks/tistory-posting-cli&quot;&gt;tistory-posting-cli&lt;/a&gt; 를 이용해 발행되었습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>토이프로젝트/기본주식분석</category>
      <category>Python</category>
      <category>기본주식분석</category>
      <category>주식투자</category>
      <category>토이프로젝트</category>
      <author>. . .</author>
      <guid isPermaLink="true">https://xenostudy.tistory.com/726</guid>
      <comments>https://xenostudy.tistory.com/726#entry726comment</comments>
      <pubDate>Wed, 31 Aug 2022 10:15:50 +0900</pubDate>
    </item>
  </channel>
</rss>