<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>IT 뽀개기</title>
    <link>https://debianizer.tistory.com/</link>
    <description>IT 지식만 다루는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 11 May 2026 03:12:11 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Yo soy</managingEditor>
    <image>
      <title>IT 뽀개기</title>
      <url>https://tistory1.daumcdn.net/tistory/4622855/attach/405219aca6bc4e56a5a3d2863e9ee2f8</url>
      <link>https://debianizer.tistory.com</link>
    </image>
    <item>
      <title>zeal / Dash - Javadoc API 브라우저</title>
      <link>https://debianizer.tistory.com/261</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;.java 8 까지는 javadoc api 를 편하게 조회하기 위해서 여러 장의 HTML 파일로 구성된 API 문서를 CHM 포맷하나로 통합해서 배포하는 것들을 사용해왔다.&lt;br&gt;&lt;br&gt;&lt;a href=&quot;https://javadoc.allimant.org/&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://javadoc.allimant.org/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;Java Documentation in Windows Help format (WinHelp and HTMLHelp)&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;This Web site provides various Java documentation converted to Windows Help format. WinHelp and HtmlHelp systems provides a structured table of contents, a complete index, and a full-text search feature. Don't remember the parameters of StringBuffer.replac&quot; data-og-host=&quot;javadoc.allimant.org&quot; data-og-source-url=&quot;https://javadoc.allimant.org/&quot; data-og-image=&quot;&quot; data-og-url=&quot;https://javadoc.allimant.org/&quot;&gt;&lt;a href=&quot;https://javadoc.allimant.org/&quot; target=&quot;_blank&quot; data-source-url=&quot;https://javadoc.allimant.org/&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('')&quot;&gt; &lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;Java Documentation in Windows Help format (WinHelp and HTMLHelp)&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;This Web site provides various Java documentation converted to Windows Help format. WinHelp and HtmlHelp systems provides a structured table of contents, a complete index, and a full-text search feature. Don't remember the parameters of StringBuffer.replac&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;javadoc.allimant.org&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;&lt;br&gt;그러나 JDK 8 상위 버전의 javadoc 은 더 에상 CHM 으로 묶어서 배포하지 않기 때문에 매번 귀찮지만 구글에서 java BufferedReader api 처럼 키워드로 검색한 결과를 찾아들어가서 스크롤으루내려가며 불편하게 쓰는 중이다.&lt;br&gt;&lt;br&gt;zeal 을 발견하기 전까진 말이다. 예전에 compiled html 로 알려진 CHM 브라우저가 있었다면 이 글을 쓰는 시점인 2025년에는 zeal 이 대세인 것 같다.&lt;br&gt;&lt;br&gt;zeal 은 키워드로 API 문서들을 조회할 수 있게 해주는 브라우저이다&amp;nbsp;&amp;nbsp;Windows 플랫폼에 한정된 CHM 과 다르게 zeal 은 Windows, Linux, Mac 을 모두 지원한다. (리눅스용 chm reader 프로그램이 있었지만 늘 버벅이고 띄우는데만 시스템 자원을 많이 소모하고 조회 중에 조기 종료되어 버리는 등 버그가 많았다. 아무래도 서드파티쪽이다 보니...)&lt;br&gt;&lt;br&gt;시스템에 zeal 바이너리를 설치한 후에 실행하면 javadoc 문서를 추가해줘야 하는데 편리하게도 java 로 검색하면 최신 jdk 버전용 API 문서를 추가할 수 있다. 프로그램 하단 설명대로 라면 Dash 사이트에서 온라인으로 제공하는 문서를 가져와서 보여주는 것 같다. Dash 사이트로 가보면 Mac 용 바이너리가 있는 것으로 봐서 zeal 보다 먼저 제작된 프로그램인가 보다.&lt;br&gt;&lt;br&gt;&lt;a href=&quot;https://zealdocs.org/&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://zealdocs.org/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;Zeal - Offline Documentation Browser&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;&quot; data-og-host=&quot;zealdocs.org&quot; data-og-source-url=&quot;https://zealdocs.org/&quot; data-og-image=&quot;&quot; data-og-url=&quot;https://zealdocs.org/&quot;&gt;&lt;a href=&quot;https://zealdocs.org/&quot; target=&quot;_blank&quot; data-source-url=&quot;https://zealdocs.org/&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('')&quot;&gt; &lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;Zeal - Offline Documentation Browser&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;zealdocs.org&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;a href=&quot;https://kapeli.com/dash&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://kapeli.com/dash&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;Dash for macOS - API Documentation Browser&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;Dash provides instant offline access to 200+ API documentation sets, code snippets, and cheat sheets. Features MCP support for AI integration with Claude and other AI agents.&quot; data-og-host=&quot;kapeli.com&quot; data-og-source-url=&quot;https://kapeli.com/dash&quot; data-og-image=&quot;https://blog.kakaocdn.net/dna/cPdqOc/hyZO42TePK/AAAAAAAAAAAAAAAAAAAAANpk6MD1b2DXEEivrxgmM2evqc7zuCKyfw9inxePGeZV/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1772290799&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=QwRQ9sTR7TV%2FkPvR%2Fl5RpAK6Y%2FI%3D&quot; data-og-url=&quot;https://kapeli.com/dash&quot;&gt;&lt;a href=&quot;https://kapeli.com/dash&quot; target=&quot;_blank&quot; data-source-url=&quot;https://kapeli.com/dash&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://blog.kakaocdn.net/dna/cPdqOc/hyZO42TePK/AAAAAAAAAAAAAAAAAAAAANpk6MD1b2DXEEivrxgmM2evqc7zuCKyfw9inxePGeZV/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1772290799&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=QwRQ9sTR7TV%2FkPvR%2Fl5RpAK6Y%2FI%3D')&quot;&gt; &lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;Dash for macOS - API Documentation Browser&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;Dash provides instant offline access to 200+ API documentation sets, code snippets, and cheat sheets. Features MCP support for AI integration with Claude and other AI agents.&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;kapeli.com&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;</description>
      <category>Java</category>
      <author>Yo soy</author>
      <guid isPermaLink="true">https://debianizer.tistory.com/261</guid>
      <comments>https://debianizer.tistory.com/261#entry261comment</comments>
      <pubDate>Thu, 4 Dec 2025 18:00:29 +0900</pubDate>
    </item>
    <item>
      <title>이클립스 UX 크기 조절하기</title>
      <link>https://debianizer.tistory.com/259</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;당뇨로 인해 생겨버린 백내장과 석 달 이상 치료 중인 포도막염 때문에 프로젝트 기간 동안에 흰색 및 밝은 색으로 이루어진 모니터 바탕화면을 제대로 볼 수가 없었다. 그래서 다크모드, 그중에서도 Spectrum (스펙트럼) 테마로 이클립스를 그나마 보고 있는데 작은 툴바가 잘 안 보여서 갑갑했다. IntelliJ IDEA 에서도 UX 전환이 자유로운데 이클립스는 이런 기능을 편리하게 지원하진 않는다. 그나마 이클립스가 처음 실행될 때 읽어 들이는 eclipse.ini 파일에서 설정할 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;-Dswt.enable.autoScale=true
-Dswt.autoScale=200
-Dswt.autoScale.method=nearest&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;small.jpg&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/siJ9O/dJMcai2Locw/9N7pAJUi4556uZ7cHD5k00/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/siJ9O/dJMcai2Locw/9N7pAJUi4556uZ7cHD5k00/img.jpg&quot; data-alt=&quot;적용하기 전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/siJ9O/dJMcai2Locw/9N7pAJUi4556uZ7cHD5k00/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsiJ9O%2FdJMcai2Locw%2F9N7pAJUi4556uZ7cHD5k00%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;384&quot; height=&quot;294&quot; data-filename=&quot;small.jpg&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;적용하기 전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;big.jpg&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RgnjR/dJMcacuKZqA/MIXnKrnl8aEeX3KxoWxDpk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RgnjR/dJMcacuKZqA/MIXnKrnl8aEeX3KxoWxDpk/img.jpg&quot; data-alt=&quot;적용 후 2배로 커짐&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RgnjR/dJMcacuKZqA/MIXnKrnl8aEeX3KxoWxDpk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRgnjR%2FdJMcacuKZqA%2FMIXnKrnl8aEeX3KxoWxDpk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;547&quot; height=&quot;485&quot; data-filename=&quot;big.jpg&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;적용 후 2배로 커짐&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Java/Eclipse 플러그인 개발</category>
      <category>Eclipse</category>
      <category>Eclipse.ini</category>
      <category>IDE</category>
      <category>Java</category>
      <category>이클립스</category>
      <category>이클립스확대</category>
      <category>확대</category>
      <author>Yo soy</author>
      <guid isPermaLink="true">https://debianizer.tistory.com/259</guid>
      <comments>https://debianizer.tistory.com/259#entry259comment</comments>
      <pubDate>Sat, 22 Nov 2025 23:34:37 +0900</pubDate>
    </item>
    <item>
      <title>BufferedReader 로 라인수만큼 읽어내기</title>
      <link>https://debianizer.tistory.com/258</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;interface&amp;nbsp;default&amp;nbsp;Method&amp;nbsp;에서&amp;nbsp;BufferedReader&amp;nbsp;로&amp;nbsp;라인수만큼&amp;nbsp;읽어내기&lt;br&gt;&amp;nbsp;&lt;br&gt;나는 자바 프로젝트에서 interface 를 자주 쓰는 편이다. 웹 프로젝트가 아닌 일반 응용 소프트웨어 개발에서 말이다.&lt;br&gt;&amp;nbsp;&lt;br&gt;자바 1.8 부터 interface 에서 default 예약어를 앞에 붙이면 선언만 가능했던 메소드를 정의할 수 있게 되었다. 즉 텍스트 처리 유틸리티 클래스를 interface 로 정의하는 것이다. 유틸티티 계통은 대부분 class 에서 static 으로 메소드를 정의해서 Util.processStr() 처럼 쓰는데, interface 에 정의하면 클래스 정의할 때만 implements 뒤에 써준 후로는 메소드만 호출해주면 되기 때문에 편리하다. 다만 interface 만이 가진 제약성이 있으므로 주의해서 쓰면 된다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;public interface Util {

	String EMPtY_STR = &quot;&quot;;
&amp;nbsp;&amp;nbsp; 	String NL_STR = &quot;\n&quot;;

	default String readByRowCount(String contentStr, int lineCnt) {

		if (contentStr == null || contentStr.trim().length() == 0) {
			return EMPTY_STR;
		}

		int cnt = 0;
		StringBuilder builder = new StringBuilder();
		BufferedReader reader = new BufferedReader(new StringReader(contentStr));

		while (reader.ready()) {
			++cnt;
			if (lineCnt == 0 || cnt &amp;lt;= lineCnt) {
				System.out.println(&quot;cnt= &quot; + cnt);	
				builder.append(reader.readLine()).append(NL_STR);
			}
		}

		reader.close();
	}
}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;이렇게 작성하고 실행해보았다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;public class Test imeplements Util {
	public static main(String[] args) {
		new Test();
	}
	public Test() {
		String wantedStr = readByRowCount(&quot;ABC.xml&quot;, 5);// &amp;lt;-- 이렇게 호출
	}
}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;원하던 결과가 아니었다.&lt;br&gt;cnt= 1&lt;br&gt;cnt= 2&lt;br&gt;cnt= 3&lt;br&gt;cnt= 4&lt;br&gt;cnt= 5&lt;br&gt;(여기까지만 출력되길 바랬는데... 아니 이게 무슨 일이지??!!!)&lt;br&gt;cnt= -2147483648&lt;br&gt;cnt= -2147483647&lt;br&gt;cnt= -2147483646&lt;br&gt;cnt= -2147483645&lt;br&gt;.&lt;br&gt;.&lt;br&gt;.&lt;br&gt;&amp;nbsp;&lt;br&gt;원하지 않는 음수가 계속 출력되는 것이었다. 5까지만 나오고 끝나야 되는데, 본래 기능은 텍스트 파일에서 한 줄씩 읽어서 총 5줄만 뽑아내는 것이었는데, 배포해서 잘 쓰고 있던 프로그램에서 유틸리티하나 건드렸다가 이런 버그가 발생하다니!! 이걸 고치다가 야근시간만 더 늘어날 것 같고, 안되겠다. 지피티에게 물어봐야지!! 후덜덜....&lt;br&gt;&amp;nbsp;&lt;br&gt;[++number returns smaller than zero in java interface default method what's wrong] 으로 급히 검색한 결과 답변은 :&lt;br&gt;Integer.MAX_VALUE 를 넘어가면 말그대로 overflow 가 발생해서 반대값인 음수(-2147483648)가 나온다... 이건 내가 의도한바가 아니었고, 두 번째 답변은 interface 에서 default 메소드는 멤버 변수를 가질 수 없다..... 여기서 아차!! 내가 잠시 간과하고 있었던 것이었다. interface 는 final 기능이 자동적용되어서 값을 연속으로 할당할 수 있는(즉, 변하는 인수) 변수를 가질 수 없고 상수만 가능한데 자주 쓰던 카운트 개념을 급히 넣어서 만드려고 했던 것이다.&lt;br&gt;&amp;nbsp;&lt;br&gt;이걸 해결하는 방법 중의 하나는 외부에 이 기능을 수행하는 유틸 class 를 만들어서 호출하는 것인데, 이 기능 한 개 때문에 비효울적이 될 수 없어서 apache common 라이브러리 메소드를 찾았더니 IOUtils 를 활용하는 방법과 더불어 이런 서드 파티 유틸리티를 활용하지 않고도 해결하는 방법으로 BufferedReader 에서 자체적으로 제공하는 메소드가 나왔다. 본 게시글에서 설명하려던 바로 그 방법이다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;public interface Util {

	String EMPTY_STR = &quot;&quot;;
&amp;nbsp;&amp;nbsp; 	String NL_STR = &quot;\n&quot;;

	default String readByRowCount(String contentStr, int lineCnt) {

		if (contentStr == null || contentStr.trim().length() == 0) {
			return EMPTY_STR;
		}

		int cnt = 0;
		StringBuilder builder = new StringBuilder();
		BufferedReader reader = new BufferedReader(new StringReader(contentStr));

		// 이렇게 고쳤다. 자바 1.8부터 스트림 api 가 추가 되어서 아래와 같이 사용가능하다.
		List&amp;lt;String&amp;gt; gotLines = reader.lines().limit(lineCnt).collect(Collectors.toList());
		if (gotLines != null &amp;amp;&amp;amp; gotLines.size() &amp;gt; 0) {
			for (String str : gotLines()) {
				builder.append(str).append(NL_STR);
			}
		}
		reader.close();
		return builder.toString();
	}
}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;BufferedReader.lines() 가 \n 으로 끊어낸 각 라인을 Stream&amp;lt;String&amp;gt; 형태로 가져온다.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot;&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;본 소스코드에서 놓친 점이 있다. 소스 코드 간소화를 위해 for-each 문을 쓰다가 카운팅을 하려고 for 문 밖에 int 형 변수를 선언했다가 낭패를 봤다. &lt;br&gt;사실&lt;br&gt;for (int i=0; i &amp;lt; ...) {&lt;br&gt;}&lt;br&gt;처럼 for 문에서 자체적으로 지원하는 내부 변수는 interface 의 final 제약을 받지 않는다. 소스 코드를 훨씬 더 간결하게 작성할 수 있었지만 당시에 두뇌회전이 안되서 멀리 돌아서 간 것이다.&lt;/p&gt;</description>
      <category>Java</category>
      <category>BufferedReader</category>
      <category>BufferedReader.lines().limit()</category>
      <category>collectors</category>
      <category>Java</category>
      <category>limit</category>
      <category>list</category>
      <author>Yo soy</author>
      <guid isPermaLink="true">https://debianizer.tistory.com/258</guid>
      <comments>https://debianizer.tistory.com/258#entry258comment</comments>
      <pubDate>Tue, 18 Nov 2025 08:01:46 +0900</pubDate>
    </item>
    <item>
      <title>득템! 노브랜드 광마우스</title>
      <link>https://debianizer.tistory.com/256</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;노브랜드라서 그냥 저렴한 품질일 거라고 생각했는데 의외로 매끄러워서 놀람.&lt;br&gt;움직임도 부드럽고, 내가 다이소에서 구매한 유선 마우스보다도 나은 것 같다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccwhIU/dJMb9N2Gkk7/ot4jB5pSs1fQsWElV8h5MK/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccwhIU/dJMb9N2Gkk7/ot4jB5pSs1fQsWElV8h5MK/tfile.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccwhIU/dJMb9N2Gkk7/ot4jB5pSs1fQsWElV8h5MK/tfile.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccwhIU%2FdJMb9N2Gkk7%2Fot4jB5pSs1fQsWElV8h5MK%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3000&quot; height=&quot;4000&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2151y/dJMb9MQeNNY/eaxqOcjK2mKCK7N0fR9Mok/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2151y/dJMb9MQeNNY/eaxqOcjK2mKCK7N0fR9Mok/tfile.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2151y/dJMb9MQeNNY/eaxqOcjK2mKCK7N0fR9Mok/tfile.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2151y%2FdJMb9MQeNNY%2FeaxqOcjK2mKCK7N0fR9Mok%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3000&quot; height=&quot;4000&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;3000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwC5f8/dJMb9N2Gkk8/vvKzKJxaFswt7gxuXoGo8K/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwC5f8/dJMb9N2Gkk8/vvKzKJxaFswt7gxuXoGo8K/tfile.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwC5f8/dJMb9N2Gkk8/vvKzKJxaFswt7gxuXoGo8K/tfile.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwC5f8%2FdJMb9N2Gkk8%2FvvKzKJxaFswt7gxuXoGo8K%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;3000&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dul1hy/dJMb9MQeNNZ/ZElJ3mlq8fFAgvP2Av9QWK/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dul1hy/dJMb9MQeNNZ/ZElJ3mlq8fFAgvP2Av9QWK/tfile.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dul1hy/dJMb9MQeNNZ/ZElJ3mlq8fFAgvP2Av9QWK/tfile.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdul1hy%2FdJMb9MQeNNZ%2FZElJ3mlq8fFAgvP2Av9QWK%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3000&quot; height=&quot;4000&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;</description>
      <author>Yo soy</author>
      <guid isPermaLink="true">https://debianizer.tistory.com/256</guid>
      <comments>https://debianizer.tistory.com/256#entry256comment</comments>
      <pubDate>Mon, 25 Aug 2025 17:13:52 +0900</pubDate>
    </item>
    <item>
      <title>데비안 방식 커널 컴파일</title>
      <link>https://debianizer.tistory.com/254</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;프리랜서 생활을 하면서 리눅스 및 데비안에 관해 조금이나마 알고 있었던 지식들이 잊혀져 갔다. 언제부터였는지 까마득하다. 오랜만에 커널컴파일을 해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데비안에서 준비한 커널을 다운로드해서 컴파일하는 과정을 기록해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Debian Linux Kernel Handbook v1.0.21 에서 본 방식이다.&lt;/p&gt;
&lt;pre id=&quot;code_1754088143212&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt-get install linux-source-{version}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{version} 부분은 다운로드할 버전을 넣으면 된다. 근데 마냥 다 되는 게 아니고 패키지 저장소에 있는 것만 되기 때문에 현 시점에서 리눅스 커널 최신 버전은 6.16 이지만,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-08-02 07-44-08.png&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;690&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCHf6y/btsPD1PJCoO/I94C2feBaWyktRfeRYYm3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCHf6y/btsPD1PJCoO/I94C2feBaWyktRfeRYYm3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCHf6y/btsPD1PJCoO/I94C2feBaWyktRfeRYYm3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCHf6y%2FbtsPD1PJCoO%2FI94C2feBaWyktRfeRYYm3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1366&quot; height=&quot;690&quot; data-filename=&quot;스크린샷 2025-08-02 07-44-08.png&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;690&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 중인 trixie (testing) 에서 지원하는 linux-source-{version} 패키지 버전은 6.12 뿐이므로 고르고 말고 할 것 없이 그냥 이것을 설치한다.&lt;/p&gt;
&lt;pre id=&quot;code_1754088711639&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aptitude search ~nlinux-source
--
(출력)
p   linux-source                              - Linux kernel source (meta-package)                 
i   linux-source-6.12                         - Linux kernel source for version 6.12 with Debian pa

apt install linux-source-6.12
--
(설명)
리눅스 커널 소스는 전통적으로 /usr/src 밑에 다운로드 된다.

[/usr/src]
ls -l
합계 147584
drwxr-xr-x  2 root root      4096  8월  2일  06:42 linux-config-6.12
-rw-r--r--  1 root root 151115396  7월 16일  16:13 linux-source-6.12.tar.xz

tar xJf linux-source-6.12.tar.xz
--
(설명)
알파벳 대문자 'J' 옵션이 xz 압축해제 기능이다.
참고로 소문자 'j' 옵션은 bzip2 압축해제 기능임.

[/usr/src/linux-source-6.12]
cp ../config.amd64_none_amd64.xz .
unxz config.amd64_none_amd64.xz
cp config.amd64_none_amd64 .config
--
(설명)
unxz 로 xz 압축을 해제한다.
'.config' 은 리눅스 커널 소스 옵션이 저장되는 파일이다.
앞서 linux-source-{버전} 패키지를 설치할 때 데비안 커널에 맞춤설정된 파일이 linux-config-6.12/ 밑에 들어 있다.
원하는 파일을 커널 소스 DIR 아래에 '.config' 으로 이름을 변경하면 `make menuconfig` 실행 시 해당 설정을 불러온다.

apt install libncurses-dev
--
(설명)
ncurses 라이브러리는 리눅스 터미널에서 CUI 화면을 그려준다. 커널 옵션을 선택하는 방식은 여러가지가 있는데
리눅스 터미널에서 괘선으로 그려진 네모난 상자 안에서 스페이스 바 또는 알파벳 Y/N/M 으로 기능을 선택하려면
libncurses-dev 패키지가 설치되어 있어야 한다.

make menuconfig
--
(설명)
CUI 방식의 menuconfig 화면을 연다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-08-02 08-17-02.png&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;739&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVhUeb/btsPEwhOqGe/0444yVE9khkrzzJyiUcPV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVhUeb/btsPEwhOqGe/0444yVE9khkrzzJyiUcPV0/img.png&quot; data-alt=&quot;요렇게 생긴 화면이 실행된다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVhUeb/btsPEwhOqGe/0444yVE9khkrzzJyiUcPV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVhUeb%2FbtsPEwhOqGe%2F0444yVE9khkrzzJyiUcPV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1366&quot; height=&quot;739&quot; data-filename=&quot;스크린샷 2025-08-02 08-17-02.png&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;739&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;요렇게 생긴 화면이 실행된다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-08-02 08-20-06.png&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKsgx4/btsPEEz3mXg/S8NURH13uUHvBtBUf1lym0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKsgx4/btsPEEz3mXg/S8NURH13uUHvBtBUf1lym0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKsgx4/btsPEEz3mXg/S8NURH13uUHvBtBUf1lym0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKsgx4%2FbtsPEEz3mXg%2FS8NURH13uUHvBtBUf1lym0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;579&quot; height=&quot;380&quot; data-filename=&quot;스크린샷 2025-08-02 08-20-06.png&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Device Drivers 카테고리로 가서 내 노트북에서 장애가 생기는 무선랜 모듈을 찾아본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-08-02 08-27-14.png&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1LHDz/btsPDteSKZu/lOwMJUKNkGyX5QwFqyVk4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1LHDz/btsPDteSKZu/lOwMJUKNkGyX5QwFqyVk4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1LHDz/btsPDteSKZu/lOwMJUKNkGyX5QwFqyVk4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1LHDz%2FbtsPDteSKZu%2FlOwMJUKNkGyX5QwFqyVk4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;305&quot; data-filename=&quot;스크린샷 2025-08-02 08-27-14.png&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정을 마쳤으면 맨 앞으로 돌아와서 Save 를 선택하고 엔터를 친다. (지금은 예전의 패키가 사라져서 복잡한 메뉴화면을 볼 엄두가 나질 않네...) 최종적으로 Exit 를 통해 빠져 나온다, 선택내역은 '.config' 파일에 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1754091076149&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi .config&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메뉴 꾸러미 보기가 두려워서 .config 파일을 직접 편집하련다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-08-02 08-32-06.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;739&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WxKlE/btsPEC93Gms/YKyHD5g8mGJggA26XEuiR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WxKlE/btsPEC93Gms/YKyHD5g8mGJggA26XEuiR1/img.png&quot; data-alt=&quot;옵션 이름을 알고 있으면 여기서 검색한 후 '=' 뒤에 y / n / m 으로 기능선택을 하면 된다. m 은 메모리에 적재하거나 내릴 수 있는 모듈이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WxKlE/btsPEC93Gms/YKyHD5g8mGJggA26XEuiR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWxKlE%2FbtsPEC93Gms%2FYKyHD5g8mGJggA26XEuiR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;739&quot; data-filename=&quot;스크린샷 2025-08-02 08-32-06.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;739&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;옵션 이름을 알고 있으면 여기서 검색한 후 '=' 뒤에 y / n / m 으로 기능선택을 하면 된다. m 은 메모리에 적재하거나 내릴 수 있는 모듈이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-08-02 08-36-48.png&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wWs4Y/btsPDKU1wlK/OvmwQlhz34yQnJKQ46WKsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wWs4Y/btsPDKU1wlK/OvmwQlhz34yQnJKQ46WKsk/img.png&quot; data-alt=&quot;제대로 선택해는지 알 수 없다. menuconfig 에서는 ? 를 누르면 해당 기능에 대한 설명을 볼 수 있는데 이렇게 파일을 직접 편집할 때는 볼 수 없다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wWs4Y/btsPDKU1wlK/OvmwQlhz34yQnJKQ46WKsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwWs4Y%2FbtsPDKU1wlK%2FOvmwQlhz34yQnJKQ46WKsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;376&quot; height=&quot;425&quot; data-filename=&quot;스크린샷 2025-08-02 08-36-48.png&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;425&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제대로 선택해는지 알 수 없다. menuconfig 에서는 ? 를 누르면 해당 기능에 대한 설명을 볼 수 있는데 이렇게 파일을 직접 편집할 때는 볼 수 없다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-08-02 08-40-07.png&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zaXzR/btsPEKNFKy5/SL52kRZlGVnKPmUpjSDuk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zaXzR/btsPEKNFKy5/SL52kRZlGVnKPmUpjSDuk0/img.png&quot; data-alt=&quot;make bindeb-pkg 로 바이너리 패키지를 빌드한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zaXzR/btsPEKNFKy5/SL52kRZlGVnKPmUpjSDuk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzaXzR%2FbtsPEKNFKy5%2FSL52kRZlGVnKPmUpjSDuk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1145&quot; height=&quot;266&quot; data-filename=&quot;스크린샷 2025-08-02 08-40-07.png&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;make bindeb-pkg 로 바이너리 패키지를 빌드한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 기능이 오류없이 실행되면 더할 나위 없겠지만 일단 컴파일 과정에서 오류만 발생하지 말거라...&lt;/p&gt;</description>
      <category>리눅스 실제 사용 팁</category>
      <author>Yo soy</author>
      <guid isPermaLink="true">https://debianizer.tistory.com/254</guid>
      <comments>https://debianizer.tistory.com/254#entry254comment</comments>
      <pubDate>Sat, 2 Aug 2025 08:07:55 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스] Debian USB, CD 없이 설치하기</title>
      <link>https://debianizer.tistory.com/251</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;구매한지 12년된 노트북에 문제가 생겼다. 엄밀히 따지자면 bookworm 안정판을 쓸 땐 멀쩡했는데 괜히 trixie 테스팅 버전으로 판올림한 이후부터 리눅스 커널에서 RTL8192E (알티엘팔일구투 이~)무선랜 모듈을 로드하지 못하는 게 문제였다.&lt;br&gt;그나마 내게 외장형 무선랜카드가 있었기에 임시방편으로 네트워크 접속을 할 수 있었다. unstable 에서 testing 으로 판내림할 때는 패키지 버전끼리 충돌없이 잘 되었는데 stable release 로 돌아오려니 역시나! 문제가 생겼다. 이를 어쩌겠는가 netinst 이미지를 구워서 오랜만에 시스템 파티션만 밀고 안정판으로 다시 설치해야지... 그런데 맙소사! 이놈의 구형 노트북이 이젠 내 USB 메모리도 인식못했다. 그래서 가장 먼저 찾았던 방법이 goodbye-microsoft.com 에 가서 부트파티션에 설치 이미지를 심어주는 바이너리를 다운로드하는 것이었는데, 사이트도 오래되서 링크가 깨져 있었지만 해당 바이너리는 win32용 exe 바이너리였다. 그 다음에 생각난 것이 balencia Etcher 가 생기기 전에 있었던 unetbootin 으로 부팅파티션을 살짝 건드려서 설치이미지를 깔고 재부팅하는 것이었는데 이것마저 잘못되면 한동안 집에서는 노트북을 쓸 수 없게 될까봐 더 안전한 방법을 찾았다. 이 노트북은 내 리눅스 전용이거든.&lt;br&gt;&lt;br&gt;내가 가장 아끼는 초고속 게이밍 노트북은 현재 근무처에서 쓰고 있어서 노트북을 새로 구매하고 싶은 충동이 일지만 그랬다간 삶이 팍팍해질 것이기에~&lt;br&gt;&lt;br&gt;갑갑한 이 가슴을 부여잡고 늘 쓰던 perplexity.ai 에개 달려가서 물었다.&lt;br&gt;앞서 설명했던 방식을 수동으로 직접 하는 방식이었다. 생각 외로 간단한 방법이었다니!&lt;br&gt;&lt;br&gt;____________________________________&lt;br&gt;ㅈㅈ ㅏ ㅈ ㅏㄴ~~~&lt;br&gt;____________________________________&lt;br&gt;&lt;br&gt;Debian 설치이미지 iso 말고 ftp 안을 돌아 다니다 보면 늘 보던 linux(부팅커널 파일명) 와 initrd.gz (램상주 모듈?) 을 내려 받아서 /boot/debian-installer/amd64 에 복사해놓고 GRUB 메뉴 설정파일에 등록해주는 것이었다. 간단히 말해서 해당 커널로 부팅할 수 있도록 메뉴 항목을 추가해주면 된다.&lt;br&gt;&lt;br&gt;GRUB 메뉴 자동생성기능이 도입되기 전에는 /boot/grub.cfg (아니 예전 이름은 menu.lst 였다) 만 편집해주면 끝났는데, 요즘 시대는 /etc/default/grub 설정에 의해 update-grub 을 실행할 때마다 메뉴내용이 자동 생성되어 기존 파일을 덮어 써버리기 때문에 다른 방법을 찾아야 했다.&lt;br&gt;&lt;br&gt;기억을 더듬어 생각이 가는대로 타자를 쳤더니 아니나 다를까 예전에 grub 메뉴 순서를 조작할 때 쓰던 스크립트가 나타났다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;1962&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XAszx/btsO8C3pM5p/pj7o9r35AEpUpvonh41Hx1/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XAszx/btsO8C3pM5p/pj7o9r35AEpUpvonh41Hx1/tfile.jpg&quot; data-alt=&quot;본론으로 들어가서 저 아래의 40_custom 을 편집하면 된다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XAszx/btsO8C3pM5p/pj7o9r35AEpUpvonh41Hx1/tfile.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXAszx%2FbtsO8C3pM5p%2Fpj7o9r35AEpUpvonh41Hx1%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;1962&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;1962&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;본론으로 들어가서 저 아래의 40_custom 을 편집하면 된다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;1843&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CurBp/btsO9rUlVfx/Yq5u4TgUa0w9WOwY7Vjtk1/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CurBp/btsO9rUlVfx/Yq5u4TgUa0w9WOwY7Vjtk1/tfile.jpg&quot; data-alt=&quot;요렇게 menuentry 문단을 추가해줬다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CurBp/btsO9rUlVfx/Yq5u4TgUa0w9WOwY7Vjtk1/tfile.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCurBp%2FbtsO9rUlVfx%2FYq5u4TgUa0w9WOwY7Vjtk1%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;1843&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;1843&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;요렇게 menuentry 문단을 추가해줬다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;그리고 update-grub 을 실행했다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;3000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjwFZO/btsO8zZX93T/kkBrFCYEqf70ea5Nmcik2k/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjwFZO/btsO8zZX93T/kkBrFCYEqf70ea5Nmcik2k/tfile.jpg&quot; data-alt=&quot;앞서 편집한 40_custom 파일의 내용이 /boot/grub.cfg 에 추가 되었다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjwFZO/btsO8zZX93T/kkBrFCYEqf70ea5Nmcik2k/tfile.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjwFZO%2FbtsO8zZX93T%2FkkBrFCYEqf70ea5Nmcik2k%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;3000&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앞서 편집한 40_custom 파일의 내용이 /boot/grub.cfg 에 추가 되었다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;마지막으로 대망의 재부팅~~~&lt;br&gt;systemd 시대이지만 여전히 init 6 명령으로 reboot 을 실행할 수 있다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2416&quot; data-origin-height=&quot;1995&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTE7lZ/btsO68WBKRx/170kcVGshECc5k3LzgN281/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTE7lZ/btsO68WBKRx/170kcVGshECc5k3LzgN281/tfile.jpg&quot; data-alt=&quot;재부팅하면 요렇게 Debian Installer 메뉴가 추가 된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTE7lZ/btsO68WBKRx/170kcVGshECc5k3LzgN281/tfile.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTE7lZ%2FbtsO68WBKRx%2F170kcVGshECc5k3LzgN281%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2416&quot; height=&quot;1995&quot; data-origin-width=&quot;2416&quot; data-origin-height=&quot;1995&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;재부팅하면 요렇게 Debian Installer 메뉴가 추가 된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2312&quot; data-origin-height=&quot;1328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdaoGf/btsO78hq7Lt/kvWdrijCHJjzr53AyyBVm0/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdaoGf/btsO78hq7Lt/kvWdrijCHJjzr53AyyBVm0/tfile.jpg&quot; data-alt=&quot;Debian Text UI 음, ncurses 라이브러리로 구현된 전체화면 방식 설치화면이다. 로케일 선택 후 두 번째? 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdaoGf/btsO78hq7Lt/kvWdrijCHJjzr53AyyBVm0/tfile.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdaoGf%2FbtsO78hq7Lt%2FkvWdrijCHJjzr53AyyBVm0%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2312&quot; height=&quot;1328&quot; data-origin-width=&quot;2312&quot; data-origin-height=&quot;1328&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Debian Text UI 음, ncurses 라이브러리로 구현된 전체화면 방식 설치화면이다. 로케일 선택 후 두 번째? 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;(끝)&lt;/p&gt;</description>
      <category>리눅스 실제 사용 팁</category>
      <author>Yo soy</author>
      <guid isPermaLink="true">https://debianizer.tistory.com/251</guid>
      <comments>https://debianizer.tistory.com/251#entry251comment</comments>
      <pubDate>Tue, 8 Jul 2025 03:16:27 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스] Debian Downgrading</title>
      <link>https://debianizer.tistory.com/248</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;데비안 리눅스 배포판은 stable (안정판 릴리즈) / testing (테스트 버전) / unstable (불안정, 늘 새로운 버전) 으로 나뉜다. 다양한 방식으로 패키지를 설치할 수 있게 해준 APT 시스템의 원조이면서 패키지 간 의존성 버전을 자동으로 찾아서 해결해주는 등 혁신적이었는데 시스템 안정성을 이유로 한 번 업그레이드한 배포버전을 이전 배포버전으로 되돌리는 방법은 (예전에는 설치된 패키지 정보 파일을 찾아서 일일이 수정해야 하는 등) 많이 복잡했다.&amp;nbsp; 그런데 언제부터인가 비교적 간단하게 바뀐 듯하다. 이 글을 쓰는 시점에서 버전은 stable = bookworm (v12), testing = trixie (v13) 이다.&lt;br&gt;&amp;nbsp;&lt;br&gt;1) 우선 /etc/apt/sources.list 파일에서 현재의 배포버전 문자를&amp;nbsp; 되돌리려는 배포버전으로 바꾼다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;deb http://deb.debian.org/debian/ trixie main non-free-firmware contrib
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;^^^^^^
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(이 부분)&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;2) /etc/apt/preferences.d/downgrade 파일을 만든다. (아래 내용)&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;Package: *
Pin: release a=testing
Pin-Priority: 1001&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;3) 앞서 변경한 파일로부터 패키지 저장소 정보를 갱신한다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;apt update&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;4) 명령어 이름과 맞지 않지만 다음 명령을 실행한다. (원래는 패키지를 판올림하기 위해서 실행하는 명령이다)&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;apt dist-upgrade&lt;/code&gt;&lt;/pre&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caH1gg/btsOWdQjrGI/N08naWUaBS8jDLXZzZQOpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caH1gg/btsOWdQjrGI/N08naWUaBS8jDLXZzZQOpk/img.png&quot; data-alt=&quot;DOWNGRADING: 이라고 뜬다. 계속 진행할 것인지 물으면 y 를 입력하거나 바로 엔터를 치면 된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caH1gg/btsOWdQjrGI/N08naWUaBS8jDLXZzZQOpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaH1gg%2FbtsOWdQjrGI%2FN08naWUaBS8jDLXZzZQOpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1204&quot; height=&quot;596&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;596&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DOWNGRADING: 이라고 뜬다. 계속 진행할 것인지 물으면 y 를 입력하거나 바로 엔터를 치면 된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;5) 패키지 교체과정이 끝나면 /etc/apt/preferences.d 에 생성했던 downgrade 파일을 삭제한다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;rm /etc/apt/preferences.d/downgrade&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;참고한 사이트 : Perplexity.ai (검색어: debian downgrade)&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;debian downgrade&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;System-wide downgrading in Debian is generally not supported or recommended, but it is possible with careful preparation and risk awareness. Always back up...&quot; data-og-host=&quot;www.perplexity.ai&quot; data-og-source-url=&quot;https://www.perplexity.ai/search/debian-downgrade-TBPAr.vMTZyS_28FqPyS6g&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/s4yRw/hyZbo8SXRG/Jri7t3rpAGmcgpQIRXCx5k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dpP8Xd/hyZbBNWWIy/Ipj5JtLCPHHIKgIBTIckrK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot; data-og-url=&quot;https://www.perplexity.ai/search/debian-downgrade-TBPAr.vMTZyS_28FqPyS6g&quot;&gt;&lt;a href=&quot;https://www.perplexity.ai/search/debian-downgrade-TBPAr.vMTZyS_28FqPyS6g&quot; target=&quot;_blank&quot; data-source-url=&quot;https://www.perplexity.ai/search/debian-downgrade-TBPAr.vMTZyS_28FqPyS6g&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/s4yRw/hyZbo8SXRG/Jri7t3rpAGmcgpQIRXCx5k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dpP8Xd/hyZbBNWWIy/Ipj5JtLCPHHIKgIBTIckrK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630')&quot;&gt; &lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;debian downgrade&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;System-wide downgrading in Debian is generally not supported or recommended, but it is possible with careful preparation and risk awareness. Always back up...&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;www.perplexity.ai&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>리눅스 실제 사용 팁</category>
      <category>Debian</category>
      <category>downgrade</category>
      <category>Linux</category>
      <category>다운그레이드</category>
      <category>데비안</category>
      <category>리눅스</category>
      <author>Yo soy</author>
      <guid isPermaLink="true">https://debianizer.tistory.com/248</guid>
      <comments>https://debianizer.tistory.com/248#entry248comment</comments>
      <pubDate>Sat, 28 Jun 2025 08:06:54 +0900</pubDate>
    </item>
    <item>
      <title>[자바 정규식] Tab, 2회 이상 발생된 Space 를 Space 1개로 변환하기</title>
      <link>https://debianizer.tistory.com/247</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;로직 적용 전 :&lt;/p&gt;
&lt;pre id=&quot;code_1747141277951&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Test {
	public static void main(String[] args) {
		new Test();
	}

	Test() {
		String letra = &quot;&quot;&quot;
			즐거운	곳에서는 날 오라 하여도
			내 쉴 			곳은 작은 집 내 집 뿐이리
			내 나라 내 기쁨 길이           쉴 곳도
			꽃 피고 새 우는 집 내 집 뿐이리
			오 사랑 나의            집
			즐거운 나의 벗 집 내 집 뿐           이리&quot;&quot;&quot;;

		System.out.println(letra);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-13 22-09-00.png&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWsRh0/btsNVLAVkHS/RrDbzomzaOfUaIBCR0vVHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWsRh0/btsNVLAVkHS/RrDbzomzaOfUaIBCR0vVHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWsRh0/btsNVLAVkHS/RrDbzomzaOfUaIBCR0vVHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWsRh0%2FbtsNVLAVkHS%2FRrDbzomzaOfUaIBCR0vVHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1192&quot; height=&quot;167&quot; data-filename=&quot;스크린샷 2025-05-13 22-09-00.png&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로직 적용 후 :&lt;/p&gt;
&lt;pre id=&quot;code_1747142265670&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Test {
	public static void main(String[] args) {
		new Test();
	}

	Test() {
		String letra = &quot;&quot;&quot;
			즐거운	곳에서는 날 오라 하여도
			내 쉴 			곳은 작은 집 내 집 뿐이리
			내 나라 내 기쁨 길이           쉴 곳도
			꽃 피고 새 우는 집 내 집 뿐이리
			오 사랑 나의            집
			즐거운 나의 벗 집 내 집 뿐           이리&quot;&quot;&quot;;

		String output = letra.replaceAll(&quot;\t&quot;, &quot; &quot;).replaceAll(&quot; {2,}&quot;, &quot; &quot;);
		System.out.println(output);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설명:&lt;/p&gt;
&lt;pre id=&quot;code_1747143750349&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 {발생횟수,} : 발생횟수 뒤에 &quot;,&quot; 를 붙여서 ~이상 조건으로 만들어 준다.

-----------

 &quot;변환할 문자열&quot;.replaceAll(정규식 문자열, &quot; &quot;);
 정규식 문자열을 &quot;\t| {2,}&quot; 으로 할 경우, [\t(탭)] 또는 [&quot; &quot; 2회 발생]이 아니며
 \t(탭 문자)도 2회 이상 발생한 조건으로 해석되기 때문에 \t(탭 문자)가 한 개만 있는 경우는 무시된다.
 
 따라서 
 &quot;변환할 문자열&quot;.replaceAll(&quot;\t&quot;, &quot; &quot;); 으로 \t(탭 문자)를 모두 &quot; &quot; 로 변환한 후에
 .replaceAll(&quot; {2,}&quot;, &quot; &quot;); 읋 다시 적용해서 최종적으로 &quot; &quot; 하나로 줄인다.
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-13 22-23-07.png&quot; data-origin-width=&quot;1189&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE4bJ7/btsNWqiqiiz/5LLKwIB0wlh1xZWf0kCOPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE4bJ7/btsNWqiqiiz/5LLKwIB0wlh1xZWf0kCOPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE4bJ7/btsNWqiqiiz/5LLKwIB0wlh1xZWf0kCOPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE4bJ7%2FbtsNWqiqiiz%2F5LLKwIB0wlh1xZWf0kCOPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1189&quot; height=&quot;164&quot; data-filename=&quot;스크린샷 2025-05-13 22-23-07.png&quot; data-origin-width=&quot;1189&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Java/소스 쪼가리</category>
      <category>Java</category>
      <category>regex</category>
      <category>공백제거</category>
      <category>스페이스</category>
      <category>자바</category>
      <category>정규식</category>
      <category>탭</category>
      <author>Yo soy</author>
      <guid isPermaLink="true">https://debianizer.tistory.com/247</guid>
      <comments>https://debianizer.tistory.com/247#entry247comment</comments>
      <pubDate>Tue, 13 May 2025 18:57:27 +0900</pubDate>
    </item>
    <item>
      <title>[그놈 쉘 확장] Text Scale</title>
      <link>https://debianizer.tistory.com/246</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 노안이 와서 15인치 노트북 화면도 안보이고 큰일이다. 멀쩡히 잘 쓰던 17인치 노트북을 아버지께 드린 후에 그것보다 3년 더 오래된 삼성노트북에서 그놈을 쓰려니 갑갑한 게 한 두 가지가 아니었다. ASUS 노트북에서 편히 쓰던 터치패드가 삼성 구형 노트북에서는 버튼이 따로 있어서 탭 두 번으로 되던 더블클릭을 따로 눌러야 하고... 아휴... 왜 이렇게 불편하게 만들었냐?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더구나 윈도10 에는 제어판 &amp;gt; 디스플레이 설정에서 백분율로&amp;nbsp; 글자 크기를 변경할 수 있는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스는 ... , 잠시 고민 끝에 찾아본 바, 그놈 쉘 확장기능이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1746895264514&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Text Scaler - 그놈 쉘 확장&quot; data-og-description=&quot;Simple extension to easily define arbitrary values for the text scaling factor 확장 홈페이지 https://github.com/mariospr/text-scaler-gnome-shell-extension 다운로드 쉘 버전&amp;hellip; 확장 버전&amp;hellip; 여러분의 의견 안타깝게도, 댓글을 달&quot; data-og-host=&quot;extensions.gnome.org&quot; data-og-source-url=&quot;https://extensions.gnome.org/extension/1018/text-scaler/&quot; data-og-url=&quot;https://extensions.gnome.org/extension/1018/text-scaler/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://extensions.gnome.org/extension/1018/text-scaler/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://extensions.gnome.org/extension/1018/text-scaler/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Text Scaler - 그놈 쉘 확장&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Simple extension to easily define arbitrary values for the text scaling factor 확장 홈페이지 https://github.com/mariospr/text-scaler-gnome-shell-extension 다운로드 쉘 버전&amp;hellip; 확장 버전&amp;hellip; 여러분의 의견 안타깝게도, 댓글을 달&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;extensions.gnome.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데비안12 (bookworm) 에서는 그놈 쉘 확장 관리자에서 검색 후 설치할 수 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.7054%;&quot;&gt;프로그램&lt;/td&gt;
&lt;td style=&quot;width: 22.1705%;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 46.124%;&quot;&gt;기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.7054%;&quot;&gt;(데비안 패키지)&lt;br /&gt;&lt;br /&gt;gnome-shell-extension-manager&lt;/td&gt;
&lt;td style=&quot;width: 22.1705%;&quot;&gt;그놈 쉘 확장 관리자&lt;/td&gt;
&lt;td style=&quot;width: 46.124%;&quot;&gt;이 안에서 쉘 확장 모듈을 검색하거나&lt;br /&gt;다운로드해서 곧바로 설치할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.7054%;&quot;&gt;Text Scaler&lt;/td&gt;
&lt;td style=&quot;width: 22.1705%;&quot;&gt;그놈 쉘 글자크기 조절 모듈&lt;/td&gt;
&lt;td style=&quot;width: 46.124%;&quot;&gt;웹사이트 : &lt;a href=&quot;https://extensions.gnome.org/extension/1018/text-scaler/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://extensions.gnome.org/extension/1018/text-scaler/&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.093%;&quot;&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-11 02-20-56.png&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GQwoJ/btsNRRIdint/wekdiylCaRCQBqW9D5kD8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GQwoJ/btsNRRIdint/wekdiylCaRCQBqW9D5kD8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GQwoJ/btsNRRIdint/wekdiylCaRCQBqW9D5kD8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGQwoJ%2FbtsNRRIdint%2FwekdiylCaRCQBqW9D5kD8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;298&quot; height=&quot;533&quot; data-filename=&quot;스크린샷 2025-05-11 02-20-56.png&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 62.907%;&quot;&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-11 02-21-10.png&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJwdHv/btsNROxXX0H/WCUPf2UcWie8fCjiLoEVek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJwdHv/btsNROxXX0H/WCUPf2UcWie8fCjiLoEVek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJwdHv/btsNROxXX0H/WCUPf2UcWie8fCjiLoEVek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJwdHv%2FbtsNROxXX0H%2FWCUPf2UcWie8fCjiLoEVek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;754&quot; height=&quot;768&quot; data-filename=&quot;스크린샷 2025-05-11 02-21-10.png&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>리눅스 실제 사용 팁/그놈</category>
      <category>GNOME</category>
      <category>Linux</category>
      <category>text scaler</category>
      <category>그놈</category>
      <category>글자크기</category>
      <category>노안</category>
      <category>데스크탑</category>
      <category>리눅스</category>
      <author>Yo soy</author>
      <guid isPermaLink="true">https://debianizer.tistory.com/246</guid>
      <comments>https://debianizer.tistory.com/246#entry246comment</comments>
      <pubDate>Sun, 11 May 2025 01:40:08 +0900</pubDate>
    </item>
    <item>
      <title>String 한 줄 주석에서 항목값 걸러내기</title>
      <link>https://debianizer.tistory.com/245</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;java 에서 /** 로 대표되는 javadoc 주석(예1)에서 특정 항목을 뽑아낼때 쓸 수 있는 로직이다.&lt;/p&gt;
&lt;pre id=&quot;code_1746072386343&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;예1)

/***************************************************************************
 * 제목 : 애국가
 * 작사 : (미상)
 * 작곡 : 안익태
 * 가사 : 동해물과 백두산이 ...
 * 반복부 : 무궁화 삼천리 화려강산 대한사람 대한으로 길이 보전하세
 ***************************************************************************/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 여러 줄의 String 을 유지할 수만 있어도 /**, * 를 모두 없애고 String 의 split(&quot;\n&quot;) 으로 한 줄씩 걸러낸 후에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항목명 별로 걸러낼 수 있다. 하지만 JDT 의 &lt;a href=&quot;https://help.eclipse.org/latest/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/package-summary.html&quot;&gt;org.eclipse.jdt.core.dom&lt;/a&gt;.Comment 객체를 toString() 으로 주석 문자열을 String 으로 받으면&lt;/p&gt;
&lt;pre id=&quot;code_1746072436389&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/** 제목 : 애국가 작사 : (미상) 작곡 : 안익태 가사 : 동해물과 백두산이 ... 반복부 : 무궁화 삼천리 ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처럼 개행문자 없이 한 줄로 나온다. (예1) 처럼 제목 / 작사 / 작곡 / 가사 / 반복부 로 항목순서가 일정하다는 전제 하에 항목값을 뽑으려면 다음을 준비한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object[] keys = { ... }; // 배열에 항목명을 나열한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;항목명이 변경될 수 있는 상황을 고려해서 Object 배열로 처리하였다.&lt;/li&gt;
&lt;li&gt;Object 를 쓰면 소스코드가 간결해진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keys 갯수만큼 values 를 받을 수 있게 String 배열을 준비한다. ( new String[keys.length] )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 유의할 점 :&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;항목명(key) 순서는 반드시 지켜야 됨. 주석에서 항목명이 누락될 경우 더 이상 진행되지 않음!&lt;/li&gt;
&lt;li&gt;항목명을 여러번 loop 으로 검사하는 로직이 아니기 때문.&lt;/li&gt;
&lt;li&gt;주석에서 항목명이 발견되면 해당 항목명의 index 로 주석 문자열에서 제거하고 trim 한 후,&lt;/li&gt;
&lt;li&gt;구분자인 : 가 주석문자열 맨앞에 있을 경우 이것을 제거하고, 다음 번 항목명의 index 를 찾아서&lt;/li&gt;
&lt;li&gt;기존 항목값을 추려내는 방식임.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1746069635397&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;
public class Test {

    public static void main(String[] args) {
        Object[] keys = {new Object[]{&quot;제목&quot;, &quot;타이틀&quot;}, &quot;작사&quot;, &quot;작곡&quot;, &quot;가사&quot;, new Object[]{&quot;후렴구&quot;, &quot;반복부&quot;}};
        String[] values = new String[keys.length];

        String Text = &quot;제목 : 애국가 작사 : (미상) 작곡 : 안익태 가사 : 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세 반복부 : 무궁화 삼천리 화려강산 대한사람 대한으로 길이 보전하세&quot;;

        
        int nextStIdx = 0;
        int nextKyIdx = -1;
        
        boolean avoidEscapeChar = true;
        
        for (int j = 0; j &amp;lt; keys.length; j++) {
            
            String key = &quot;&quot;;
            String nxKey;
            
            int searchIdx = -1;
            boolean found = false;
            
            if (keys[j] instanceof Object[]) {
                Object[] multi = (Object[]) keys[j];
                for (int m = 0; m &amp;lt; multi.length; m++) {
                    key = (String) multi[m];
                    searchIdx = Text.indexOf(key);
                    found = searchIdx &amp;gt; -1;
                    
                    if (found) {
                        break;
                    }
                }
            } else {
                key = (String) keys[j];
                searchIdx = Text.indexOf(key);
                found = searchIdx &amp;gt; -1;
            }
            
            if (found) {
                nextStIdx = searchIdx + key.length();
                Text = Text.substring(nextStIdx).trim();
                
                if (Text.startsWith(&quot;:&quot;)) {

                    if (j &amp;gt; keys.length-1 || j == keys.length-1) {// 마지막 요소
                        nxKey = &quot;&quot;;
                        String tmp = Text.substring(1).trim();
                        values[j] = tmp.contains(&quot;\n&quot;)? tmp.split(&quot;\n&quot;)[0].trim() : Text.substring(1).trim();
                        
                        if (avoidEscapeChar) {
                            int ccIdx = values[j].indexOf(&quot;@&quot;);
                            values[j] = ccIdx &amp;gt; -1? values[j].substring(0, ccIdx) : values[j];
                        }
                        
                    } else {
                        if (keys[j+1] instanceof Object[]) {
                            Object[] nxMul = (Object[]) keys[j+1];
                            
                            for (int m = 0; m &amp;lt; nxMul.length; m++) {
                                nxKey = (String) nxMul[m];
                                nextKyIdx = Text.indexOf(nxKey);

                                if (nextKyIdx != -1) {
                                    values[j] = Text.substring(1, nextKyIdx).trim();
                                    break;
                                }
                            }
                            
                        } else {
                            nxKey = (String)keys[j+1];
                            nextKyIdx = Text.indexOf(nxKey);
                            if (nextKyIdx != -1) {
                                values[j] = Text.substring(1, nextKyIdx).trim();
                            }
                        }
                    }
                    if (values[j] == null || values[j].trim().length() == 0) {
                        values[j] = &quot;&quot;;
                    }
                }
            }
        }

        for (int k = 0; k &amp;lt; values.length; k++) {
            if (values[k] != null) {
                System.out.println(&quot;values[&quot; + k + &quot;] = &quot; + values[k]);
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로직 실행결과 :&lt;/p&gt;
&lt;pre id=&quot;code_1746070546603&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;values[0] = 애국가
values[1] = (미상)
values[2] = 안익태
values[3] = 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세
values[4] = 무궁화 삼천리 화려강산 대한사람 대한으로 길이 보전하세&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Java/소스 쪼가리</category>
      <category>Filtering</category>
      <category>Java</category>
      <category>Split</category>
      <category>string</category>
      <category>걸러내기</category>
      <author>Yo soy</author>
      <guid isPermaLink="true">https://debianizer.tistory.com/245</guid>
      <comments>https://debianizer.tistory.com/245#entry245comment</comments>
      <pubDate>Thu, 1 May 2025 12:36:26 +0900</pubDate>
    </item>
  </channel>
</rss>