ããããèãï¼ ä¿ºãæåã³ã¼ãã«ã¤ãã¦æãã¦ããã Advent Calendar ç¹å¥ç·¨
é·ããæ´æ°ã®æ¢ã¾ã£ã¦ããããããã俺æåã³ã¼ããã·ãªã¼ãºã§ããã
ãã®ãã³ãJava Advent Calendarã®ä¸ç°ã¨ãã¦å¾©æ´»ããã¾ããï¼
Java Advent Calendarã£ã¦ï¼
æ¬ã¨ã³ããªã¼ã¯Java Advent Calendarã®5æ¥ç®ã§ãã
Java Advent Calendarã«ã¤ãã¦ã¯ã以ä¸ã®ãµã¤ããã覧ãã ããã
http://atnd.org/events/22434
åã®4æ¥ç®ã¯ @akirakoyasu ããã®ãSDKã§èº«è¿ã«ãªãAmazon Web Serviceã
http://www.akirakoyasu.net/2011/12/04/easily-use-aws-through-sdk/
S3ãSimpleDBãSESã®ä½¿ãæ¹ããµã³ãã«ã³ã¼ãã¤ãã§ç´¹ä»ãã¦ãã¾ãã
次ã®6æ¥ç®ã¯ @shuji_w6e ããã®ãJUnit ã®ã»ã«ã¤ã
http://d.hatena.ne.jp/shuji_w6e/20111205/1323098690
åãäºåæ¡ä»¶ï¼åæºåï¼ã®ãã¹ãã±ã¼ã¹ãå
é¨ã¯ã©ã¹ã¨ãã¦ã¾ã¨ããæ¹æ³ãç®ã¦ãã³ã§ããã
ã§ã¯ãæåã³ã¼ãã®è©±ã«å
¥ãã¾ãããã
ä»åã¯ç¹å¥ç·¨ã¨ãã¦ãJavaã®éçºæ¡ä»¶ã§ç¹ã«é »çºããåé¡ã
é¥ããããåé¡ã«ã¤ãã¦ãã©ã¼ã«ã¹ãã¦ããéããã¾ãã
åé¡ï¼ï¼éçºä¸ã¯åé¡ãªãã£ãã®ã«ãæ¬çªç°å¢ã§ã¯æ¥ã«æååããèµ·ããããã«ãªãã¾ããï¼
æ°äººãããéçºä¸ã¯åé¡ãªãã£ãã®ã«ãæ¬çªç°å¢ã§æ¥ã«ãã¡ã¤ã«ãæååãããã¨é£çµ¡ããã£ããã§ãï¼ã
å 輩社å¡ãçµå試é¨ã®ç°å¢ã§ã¯ãã©ãã ã£ãã®ï¼ã
æ°äººããããã£ã¨ããã¡ã¤ã«åºåã¯è©¦ãã¦ã¾ããã»ã»ã»ã
å 輩社å¡ããªãã§ï¼ã
æ°äººããï¼ã ã£ã¦å 輩ãããã£ã¦è¨ããªãã£ããããªãã§ããã»ã»ã»ï¼
å 輩社å¡ãããä½ãè¨ã£ãï¼ã
ãããªãæ°ã¾ããé°å²æ°ããå§ã¾ã£ãããããã俺æåã³ã¼ããã§ããï¼ãã¤ããï¼
ãã®åé¡ãèµ·ããåå ã¯ãåä¸å
«ä¹ãããã©ã«ãã¨ã³ã³ã¼ãã£ã³ã°ã®éãã«ãããã®ã§ãããã
éçºç°å¢ã¯Windowsãå©ç¨ããçµå試é¨ãæ¬çªç°å¢ã§ã¯Linuxãå©ç¨ããã¨ããã®ã¯
ããããçµã¿åããã ã¨æãã¾ãï¼æè¿ã¯éçºç°å¢ã«Macãå¢ãå§ãã¾ãããï¼
ãã¡ã¤ã«ãæååã®ããã©ã«ãã¨ã³ã³ã¼ãã£ã³ã°ã¨ãã¦ã
Windowsç°å¢ã§ã¯ãWindows-31jããå©ç¨ããã
Linuxç°å¢ã§ã¯ãUTF-8ãããeuc-jpããå©ç¨ãããããã
çµæçã«ãéçºç°å¢ã¨çµå試é¨ç°å¢ã§çæããããã¡ã¤ã«ã®ã¨ã³ã³ã¼ãã
å¤ãã£ã¦ãã¾ãã¨ããç¾è±¡ãçºçãããã®ã§ãã
ãã®ãããç¹ã«ãµã¼ããµã¤ãJavaã®éçºã«ããã¦ã¯ã
ãããã©ã«ãã¨ã³ã³ã¼ãã£ã³ã°ã使ããªãããã¨ãã«ã¼ã«ã¥ããã»ããå®å
¨ã§ãã
ããã©ã«ãã¨ã³ã³ã¼ãã£ã³ã°ãå©ç¨ããã¯ã©ã¹ãã¡ã½ããã¨ãã¦ã¯
以ä¸ã®ãã®ãããã使ããã¦ãã¾ãã
- new String()
- String#getBytes()
- FileReader
- FileWriter
- new InputStreamReader()
- new OutputStreamWriter()
ãã®ãã¡ã
FileReaderã¨FileWriterã¯ä½¿ããã«ãFileInputStreamã¨InputStreamReaderã§ä»£ç¨ããã
ãã以å¤ã®ã¡ã½ãããã³ã³ã¹ãã©ã¯ã¿ã§ã¯ãå¿
ãã¨ã³ã³ã¼ãã£ã³ã°ãcharsetãæå®ããããã«ããã°ã
éçºç°å¢ã¨çµå試é¨ãæ¬çªç°å¢ã§ãçµæãç°ãªãã¨ãããã¨ããªããªãã§ãããã
ã¡ãªã¿ã«ç§ã¯ãCheckstyleã®æ£è¦è¡¨ç¾ãã§ãã¯æ©è½ã使ã£ã¦
ã¨ã³ã³ã¼ãã£ã³ã°ã®æå®æ¼ããæ¤åºãã¦ãã¾ãã
åé¡ï¼ï¼ãªããããããã§ãã ãæååããã¾ãï¼
æ°äººããããªãããç¹å®ã®æåã ããåãã¦ãã¾ã£ã¦ã解決ããªããã§ããã»ã»ã»ã
å 輩社å¡ãç¹å®ã®æåã£ã¦ï¼ã
æ°äººããããã§ãã§ãã
å 輩社å¡ããããå ¨è§ãã«ããã
æ°äººãããããä½ããåç¥ãªãã§ããï¼ã
å 輩社å¡ããããããåãããã
ãã³ã°ã»ãªãã»æååãã¨è¨ãã°ããã®ããã«ãï¼ãã§ãï¼ã§ãããã
ãããã¨ã〜ã
\uFF5Eã¨ã\u301C
Windowsã§ã¯ã綺éºãªãã§ããã¨ãæ±ããã§ããã¨å¼ã¹ã°ä½ã¨ãªãä¼ããã¾ããã
Macã ã¨åãå½¢ã«è¦ããã®ã§ãããçºè¦ãå°é£ã§ããã
ãã¦ã
Javaã§ã¯ï¼å³å¯ã«è¨ãã°ãJava1.4.1以éã§ã¯ï¼
ãWindows-31jãã¨ãShift_JISãã¯å°ãã ãç°ãªã£ãç¯å²ã®æåãæ±ã£ã¦ããã
ç¹ã«è¨å·ã®æ±ããç°ãªã£ã¦ãã¾ãã
åé¡ã®ãã§ãã«ã¤ãã¦è¨ãã¨ã
Windowsã§æ®éã«å
¥åã§ãããããï¼\uFF5Eï¼ã¯ãWindows-31jãã®æåã§ããã
Macã§æ®éã«å
¥åã§ããã〜ãï¼\u301Cï¼ã¯ãShift_JISãã®ç¯å²ã«ããæåãªã®ã§ãã
ãåé¡ï¼ãã®æå¾ã«ç¤ºããã¯ã©ã¹ãã¡ã½ããã®å¼æ°ã«ãShift_JISããæå®ãã¦ãã
Windowsã§ããå
¥åããæ¹ã®ãããï¼\uFF5Eï¼ãæ±ããã¨ãã§ããã
ãã ã®ã?ããåè§ã¯ã¨ã¹ãã§ã³ã«æååããã¦ãã¾ãã®ã§ãã
対çã¨ãã¦ã¯ã
ã·ã¹ãã å
¨ä½ã¨ãã¦ãã¨ã³ã³ã¼ãã£ã³ã°ãUTF-8ã«çµ±ä¸ããã®ããªã¹ã¹ã¡ã§ãã
ãã ãã©ããã¦ãæ¡ä»¶é½åã§Shift_JISãé¸ã°ãªããã°ãããªãå ´åã¯ã
åºæ¬çã«ã¯ãWindowsãåªéããã¾ãããã
Javaã®ã½ã¼ã¹ã³ã¼ããJSPãã¡ã¤ã«ãªã©ãæ¤ç´¢ãã¦
ãShift-JISãã¨ãªã£ã¦ããç®æããWindows-31jãã«ç½®æãã¦ããã°ã
ãã£ã¨ããã§åé¡ã¯è§£æ±ºããã§ãããã
ããããã ãIEãWindows-31jã¨ããæååãèªèã§ããªããã¨ããåé¡ããããã
HTMLã®METAã¿ã°ã«æå®ããcharsetã ãã¯ããShift_JISãã®ã¾ã¾ã«ãã¦ããã¦ãã ããã
ãã®ä»¶ã«ã¤ãã¦ã¯ãIE Windows-31jãã§æ¤ç´¢ãã¦ãã ãããã
åé¡ï¼ï¼Windows-31jã®æåã ã許容ããããããgetBytes("Windows-31j")ã§ãã§ãã¯ãã¾ããï¼
æ°äººãããWindows-31jã®æåã ã許容ããããã§ãããã©ãããã°ããã§ããï¼ã
å 輩社å¡ãgetBytesãã¦ããã¤ãå¤ãWindows-31jã®ç¯å²ã«ä¸è´ãããã©ããå¤å®ããã°è¯ãããããªãï¼ã
æ°äººããããã£ã¦ã¿ã¾ãã
ã»ã»ã»
æ°äººããããªããæå¾ éãã«åããªããã§ããã»ã»ã»ã
ç§èªèº«ãããã¤ãã®æ¡ä»¶ã§
ãWindows-31jã§æ±ããç¯å²å
ã®æååã ãã許容ããããã¨ãã
ä»æ§ãè¦æããããã¨ãããã¾ãã
ãã®è¦ä»¶ã¯ãJIS第åæ°´æºã®æ¼¢åããããµãã²ã¼ããã¢ããªã©ã®
æ©ç¨®ã«ãã£ã¦ã¯å¯¾å¿ãã¦ããªãæåã®å
¥åãé²ããã¨ãç®çãªã®ã§ãã
ï¼ ä¸æ¹ã§ ① ã ㍼ ã®ãããªWindowsåºææåã«ã¤ãã¦ã¯ã
ï¼ ã¤ãããã®Macãã±ã¼ã¿ã¤ã§ãè¦ããããåé¡ãªããã¨ããå¤æã§ãã
ãã¦ããã®è¦ä»¶èªä½ã®æ¯éã¯ãã¦ããã
ãã®ãã§ãã¯å¦çã®ããã«ä»¥ä¸ã®ãããªã³ã¼ãã使ããããã¨ãããã¾ãã
private boolean isWindows31j(String str) { byte[] bytes = str.getBytes(); for (byte b : bytes) { if (isWindows31byte(b) == false) { // Windows31jã®æåã³ã¼ãç¯å²ãã®ãã§ã㯠return false; } } return true; } // å®éã¯ä¸ä½ãã¤ãã¨ä¸ä½ãã¤ãã®ãã§ãã¯ãããã®ã§ãããå°ãéãã³ã¼ãã«ãªãã
æ®å¿µãªããããã®æåãã§ãã¯å¦çã§ã¯ã
決ãã¦é¤å¤æåãæ¤åºãããã¨ãã§ããã常ã«trueãè¿ãç¶ãã¾ãã
ãªããï¼
Windows-31jã§æ±ããªãæåãstrã«å
¥ã£ã¦ããå ´åã
getBytesããæç¹ã§ããã®æå㯠"?" ã示ã 0x3F ã«å¤æããã¦ãã¾ãã®ã§ãã
ãã¨ãã°ãåé¡ï¼ãã§è©±é¡ã«ãããMacç¨ã®ã〜ãï¼\u301Cï¼ãã
getBytesããæç¹ã§ "?" ã¨ãããã ã®åè§ã¯ã¨ã¹ãã§ã³ãã¼ã¯ã«ãªãã
isWindows31byteã¡ã½ããã®ä¸ã§Windows-31jã®æåã¨èå¥ããã¦ãã¾ãã
ãããã¯Windows-31jã®æåã ãã¨èª¤å¤å®ããã¦ãã¾ãã®ã§ãã
ã§ã¯ãã©ããã§ãã¯ããã®ãè¯ãã®ãï¼
ç§ã¯ä»¥ä¸ã®å¦çã§ãã§ãã¯ãããã¨ããªã¹ã¹ã¡ãã¦ãã¾ãã
byte[] bytes = str.getBytes(encoding); return str.equals(new String(bytes, encoding));
詳細ã«ã¤ãã¦ã¯ãéå»ã®ã¨ã³ããªãåç
§ãã¦ãã ããã
http://d.hatena.ne.jp/cero-t/20100204/1265302329
ãã©ã¼ããããããªãã¼ã·ã§ã³ããéã«ã¯ã
ãå¤æãã¦ãããã«éå¤æããæååããå
ã®æååã¨ä¸è´ãããã©ããã
ã¨ãããã§ãã¯ããã®ãçéã ã¨ãç§ã¯èãã¦ãã¾ãã
åé¡ï¼ï¼ããããã®è¨ãéããã§ãã¯ããã®ã«ãJIS第åæ°´æºã®æåãéã£ã¡ãã£ããã§ããã©ï¼
æ°äººããããªãããããé¨å±ã¨ãããblogãè¦ã¦æåãã§ãã¯ã®ã³ã¼ããæ¸ãããã§ããã
å 輩社å¡ãèãããã¨ãªããªã
æ°äººããããããå®éã®Webã¢ããªã«çµã¿è¾¼ãã ãã§ããããã£ã±ã第åæ°´æºã®æåãéã£ã¡ãããã§ããã
å 輩社å¡ããã®ãµã¤ãã®èª¬æãééã£ã¦ãããããªãã®ï¼ã
失æ¬ãªï¼
ãã¦ãããWebã¢ããªéçºã«ããã¦ã¯ã
ããä¸ã¤è¿½å ã§æ°ãã¤ããªããã°ãããªãäºãããã¾ãã
ããããæåã®ãæ°å¤æååç
§ãã§ãã
ãã¨ãã°Webãã©ã¦ã¶ã§ãcharsetããeuc-jpãã®HTMLãã¼ã¸ãéãã
å
¥åããã¯ã¹ã«ãeuc-jpãã®ç¯å²å¤ã®æåãå
¥åãã¦submitããå ´åã
Webãã©ã¦ã¶ã¯ããã®æåããæ°å¤æååç
§ãã¨ããå½¢å¼ã«å¤æãããã¨ãããã¾ãã
ãã¨ãã°ã❶ããã❶ãã¨ããæååå¤æãã¦éä¿¡ãã¦ããã®ã§ãã
ã❶ãã¨ããæååã®ãæåãä¸ã¤ã²ã¨ã¤è¦ãã°ã
ãã¡ããWindows-31jã®ç¯å²å
ã§ãããã
ãåé¡ï¼ãã«æ¸ãããã§ãã¯å¦çã§ã¯trueãè¿ãã¦ãã¾ããéã£ã¦ãã¾ãããã§ããã
ãã®åé¡ã¸ã®å¯¾çã¨ãã¦ã¯ãæ°å¤æååç
§ãå«ãï¼å¯è½æ§ã®ããï¼æååã«ã¤ãã¦
ä¸åº¦ãæ°å¤æååç
§ããæåã¸ã®å¤æãè¡ãªãå¿
è¦ãããã¾ãã
ãµã³ãã«ã³ã¼ãã¯é·ããªãã®ã§å²æãã¾ãã
Googleã§ãæ°å¤æååç
§ javaãã§æ¤ç´¢ãã¦ãã ããã
åé¡ï¼ï¼ãµãã²ã¼ããã¢å¯¾çãå¿ è¦ã ã¨ãä¸ã®æ¹ããè¨ããã¾ããã
â»WindowsXPããå©ç¨ã®æ¹ã§ããã®ã𠀋ãã¨ããæååãè¦ããªãå ´åã
ã以éã®ç« ã楽ããããã«ããã®ããããå°å
¥ãããã¨ããªã¹ã¹ã¡ãã¾ãã
http://www.microsoft.com/ja-jp/windows/products/windowsvista/jp_font/jis04/default.aspx
å 輩社å¡ãã客ã«ããµãã²ã¼ããã¢ã®å¯¾çãããã£ã¦è¨ããããã ããã¼ã
æ°äººããããµãã²ã¼ããã¢ã£ã¦ä½ã§ããï¼ã
å 輩社å¡ã1ã¤ã®æåã2æåã§è¡¨ãã¤ããªãã ãã©ããWindows Vistaãããµãã¼ãããã¦ãJava5ã§ã対å¿ãã¦ãã¯ããªãã ãã©ã
æ°äººããããªãã ãé¢åèããããªãã¨ã¯ãåããã¾ããã
2006ã7å¹´é ãã¤ã¾ããWindows Vistaãåºã¦ããé ã«è©±é¡ã«ãªãã
ãã®å¾ã¯èª°ã触ããªããªã£ã¦ãã¾ã£ãç¨èªããµãã²ã¼ããã¢ã
ããµãã²ã¼ããã¢ã¨ã¯ä¸ä½ä½ã ã£ãã®ããã¨ããã¹ã¬ã¨ããç«ã£ã¦ããã§ãããã
ãµãã²ã¼ããã¢ã®è©³ç´°ãªè©±ã¯å²æãã¾ããã
Javaã«ããã¦ã¯ãchar2ã¤ã§ã1ã¤ã®æåã表ç¾ãããæåã ã¨èããã°è¯ãã§ãããã
ãµã³ãã«ã³ã¼ãã§è¦ã¦ã¿ã¾ãããã
String str = "𠀋";
System.out.println(str.length());
System.out.println(str.toCharArray().length);
ãã®ã³ã¼ããå®è¡ããã¨
2
2
ã¨è¡¨ç¤ºãããã®ãããµãã²ã¼ããã¢ãªã®ã§ãã
éçºæ¡ä»¶ã§ããµãã²ã¼ããã¢ã«å¯¾çãã¦ãã ãããã¨è¨ãããå ´åã
å¤ãã®å ´åããç¦æ¢ãã¦ãã ãããã¨ããæå³ã§ããã
ç¦æ¢ããã ããªããCharacter#isXxxSurrogateã¡ã½ããã使ãã¨ç°¡åã§ãã
char[] chars = str.toCharArray(); for (char c : chars) { if (Character.isLowSurrogate(c) || Character.isHighSurrogate(c)) { return true; } } return false;
ãã®ã³ã¼ãã§trueãè¿ãã°ãµãã²ã¼ããã¢ãå«ãã§ããããã¨ã©ã¼ã¨ãã
falseãè¿ãã°åé¡ãªãã¨å¤å®ãã¦ããã°è¯ãã®ã§ãã
åé¡ï¼ï¼ãµãã²ã¼ããã¢ã許容ããã¨ãä¸ã®æ¹ããè¨ããã¾ããã
æ°äººãããã客æ§ããããã£ã±ããµãã²ã¼ããã¢ã許容ãã¦æ¬²ããã¨è¨ããããã§ããã©ã
å 輩社å¡ããã£ãåã¯ç¦æ¢ã£ã¦è¨ã£ã¦ãã®ã«ï¼ã
æ°äººããããããªãã§ããããã¯ã使ã人ãããã ããããWindowsXPã使ã人ãæ¸ã£ã¦ããã¨ãããã¨ã§ã
å 輩社å¡ãã¡ããã¨æ¼ãè¿ãã¦æ¥ãããªã¼ã
æ°äººããï¼ãããªäºè¨ããªããæã¡åããã«ã¡ããã¨åå ãã¦ãã ãããï¼
å 輩社å¡ãããä½ãè¨ã£ãï¼ã
ãã¦ãæå¾ã®åé¡ã¯ããµãã²ã¼ããã¢ã許容ããå ´åã®è©±ã§ãã
ããããããµãã²ã¼ããã¢ã許容ããã¨ã¯ãã©ãããæå³ãªã®ã§ããããï¼
ãåé¡ï¼ãã§ã¯ã𠀋ãã¨ããæåãã2æåãã¨ãã¦æ±ãããã¨èª¬æãã¾ãããã
人éã®ç®ããè¦ãã°ãã©ãè¦ã¦ãã1æåãã§ãã
ãµãã²ã¼ããã¢ã許容ããããã«ã¯ããã®å·®ç°ããªããå¿
è¦ãããã¾ãã
ãã¨ãã°ãæ大100æåãã¾ã§è¨±å®¹ããå
¥åããã¯ã¹ã«ã
ãµãã²ã¼ããã¢ã51æåå
¥åããå ´åã
Javaã¨ãã¦ã¯ã102æåãã¨ãã¦æ±ã£ã¦ãã¾ããæåæ°ãªã¼ãã¼ã¨ãªãã¾ãã
人éã®ç®ã«ã¯ã100æåã«å°éãã¦ããªãã®ã«ã¨ã©ã¼ã«ãªã£ããããã«è¦ããã®ã§ãã
ï¼ å®éã«ã¯ããããªãã¨ããã人ãããªãããããµãã²ã¼ããã¢ã¯ãã¾ãåé¡ã«ãªã£ã¦ããªãã®ã§ãããã
ã¤ã¾ãããµãã²ã¼ããã¢ã許容ãããã¤ã³ãã¯ã
ç¹ã«ãããªãã¼ã·ã§ã³å¦çãé©åã«ãããã¨ãã«ããã¨ãç§ã¯èãã¦ãã¾ãã
è¦ãç®ã®æåæ°ãåå¾ããããã«ã¯ãString#codePointCountã¡ã½ãããå©ç¨ãã¾ãã
String str = "ã𠀋𠀋𠀋ã";
System.out.println(str.length());
System.out.println(str.codePointCount(0, str.length()));
ãã®å¦çãå®è¡ããã¨
8
5
ã¨è¡¨ç¤ºããã¾ãããã®ã5ããè¦ãç®ã¨ä¸è´ãã¾ããã
ããã¾ã§é·ãã®ããªãã¼ã·ã§ã³ãè¡ãªãéã«ã¯
String#lengthã¡ã½ãããå©ç¨ãã¦ããã¨æãã¾ããã
ãµãã²ã¼ããã¢ã«å¯¾å¿ããããã«ã¯
String#codePointCountã¡ã½ãããå©ç¨ãã¦å¤å®ãè¡ãªãå¿
è¦ãããã®ã§ãã
ã¾ãããµãã²ã¼ããã¢ãRDBMSãªã©ã«ä¿åããå ´åã«ã¯
RDBMSå´ã対å¿ãã¦ãããã©ããï¼Unicodeã®4byte対å¿ï¼ãªã©ã
å¨è¾ºã®ããã«ã¦ã§ã¢ããµãã²ã¼ããã¢ã«å¯¾å¿ãã¦ãããã©ããã
å¿
ã確èªãã¹ãã§ããããã
ã¾ã¨ã
- ãã®é£è¼ã¯ããããã俺æåã³ã¼ããã·ãªã¼ãºã£ã¦è¨ããããã
- æå³ãããããã©ã«ãã¨ã³ã³ã¼ãã£ã³ã°ã使ã£ã¦ãã¾ããªãããã«æ°ãã¤ããï¼
- Windows-31jã¨Shift_JISã¯ãå ¨ãå¥ãã®ã ããï¼ ãããããUTF-8ã§ãããªããã£ã¡ã§ï¼
- getBytesãã¦ããæåç¯å²ãã§ãã¯ããã®ã£ã¦ãééã£ã¦ãããï¼
- æ°å¤æååç §ã«æ°ãã¤ããï¼ å·ãæ±ããã¦ãã ããããã®ãåããåã®ãã¨ã ãï¼
- ãµãã²ã¼ããã¢ãªãã¦å±éºãªãã®ãç¦æ¢ã«ãã¦ãã¾ãï¼
- ãµãã²ã¼ããã¢ã«å¯¾å¿ãããªããããªãã¼ã·ã§ã³ã§codePointCountã使ãã®ãèã ï¼
- ãã®é£è¼ã¯ããããã俺æåã³ã¼ããã·ãªã¼ãºã£ã¦è¨ããããã
大äºãªãã¨ã¯ãï¼åè¨ãã¾ããã