2013年01月01日

【Linux】全Unicode fonts install に挑戦(CentOS6)

 コンピュータ上の文字は特定の数の並びの単位を文字として扱うことで可能になる。且つ、それを使い情報伝達を行なうには、その相互の統一規格としての文字コードの一致が必要だ。
 当初、その文字コードはベンダー別の規格だけであったが、今日では主に米国規格の7ビットASCII文字を基底として互換をとった個別言語文字別の文字コードの国際規格化を経て、お題の世界中の文字を一意のコードで規格中のUnicodeという文字体系に集約される方向にある。見かけ上Shift_JIS系のWindows日本語版でも内部処理は既にUnicode化されているし、MS社のOfficeアプリデータも随分前からUnicodeとなっている。Linuxの世界でも、かつてはEUC-JPが主流だったが今ではUnicodeから古いEUC-JPアプリへの対応を時々行なうことがある程度である。
 Unicode自体は今でも進化中で地球上の全文字の符号化は未だ完成された訳ではないし、基本的には一意一文字として異体字を別枠としている為、例えば人名等の斉藤さんの斎斉以外の字は異体字として別途標準化されるので、利用環境にその規格対応も必要となる等、利用が進んだ現状でも全てが正しく表示出来る訳ではないが、全ての条件が整うなら規定済の文字であれば世界中の言語を混在したコンテンツの作成も可能になる。
 そんな有望なUnicodeだが、Unicodeの活用にはその字体をUnicode文字符号で整理したfontが必要となる。でも全世界の文字を網羅したUnicode fontは現存せず、必要により言語や文字ブロック別で探し拾うか、fontを自作し導入するしかない。

 さてそこで本稿ではCentOS6が標準パッケージ内のUnicode fontsでは不足する文字に対応するfontを捜し、ブロック別に整理している。当初は気軽に始めたものの実際取組んで試ると結構な労力と時間を費やす仕事であった。最初から判っていればしなかった(笑)。それ故それなりに有用な情報提供となるのではないかと思う。
 尚、ここに揚げたfontは、商用でもFree活用可で且つ個別Blockでのより完全に網羅し、より複数のblocksをカバーしているものを優先し「推奨font」として掲載させて頂いた。また調査で、それと同等程度に網羅していることが判ったfontは中括弧「{}」内に併記している。後日Blockの改訂に推奨fontがついて行けなくなったときや、書体の好みやライセンス上の理由で切替えるときに役立てばと思っている。また推奨はしないが適用可能なものは角括弧「[]」内に記載している。(例えばCode2000の様に有償だが公開Siteが閉鎖され無償利用継続のリスクが曖昧だったり、unifontの様に字体がドット状のもの)
 結果、開始番地欄に※印がないブロックはfontの各字形の質や統一性は別にして全てを網羅することが出来たもので、赤の※印のあるものは全く見つからなかったものや対応していても、ライセンスがはっきりしていないものであり、黄色の※印のあるものはfontとしては字体を収録しているものの、当方の活用する既定fontの設定では他のfontを優先参照してしまい一部表示出来ないものである。これは、OSに組み込まれたfontconfigの動作に依存する様だが対処方法は知らないので当面放置とする(笑)。
Unicode Fonts for Linux(CentOS6) 1/2 [U+0000 - U+FFFF]
開始番地ブロック名(英語)
[日本語訳]
不足数 推奨fonts
[{他の有用なfont}]
U+0000Basic Latin
[基本ラテン文字(≒7bit ASCII)]
(標準){Quivira}
U+0080Latin-1 Supplement
[ラテン1 補助]
(標準){Quivira}
U+0100Latin Extended-A
[ラテン文字 拡張A]
(標準){Quivira}
U+0180Latin Extended-B
[ラテン文字 拡張B]
(標準){Quivira}
U+0250IPA Extensions
[IPA 拡張]
(標準){Quivira}
U+02B0Spacing Modifier Letters
[空白変更文字]
(標準){Quivira}
U+0300Combining Diacritical Marks
[組合せ分音符]
16個Quivira(free to use) 済, {Symbola(In lieu of a licence)}[標準だけでもbitmap-miscfixed-fontsも使うと残り5文字にはなる]
U+0370Greek and Coptic
[ギリシア&コフト文字]
(標準){Quivira, Symbola(未定義位置に独自下駄文字有)}
U+0400Cyrillic
[キリル文字(旧ソ連文化圏)]
(標準){Quivira, Symbola}
U+0500Cyrillic Supplement
[キリル文字 補助]
4個Quivira 済, {Symbola(+8文字:U+528-F)}
U+0530Armenian [アルメニア文字
(アルメニア語:西アジア カスピ海西)]
1個Quivira
U+0590Hebrew
[ヘブライ文字(イスラエル)]
1個Quivira
U+0600Arabic [アラビア文字
(ウルドゥ/ペルシア/パシュート/クルド/シンド/バローチ)]
18個
(5字)
Scheherazade-1.900_alpha.zip(ScheherazadeOT-1.005)(掲載元(最新alpha版):OFL1.1) 済:但し5文字(U+600-3&DD)は当方の環境では共存表示不可{Amiri(GPLv2, OFL1.1)5字残(U+600-4)}
U+0700Syriac
[シリア文字]
77個
(残7字)
Beth Mardutho(East Syriac Adiabene等)(無償利用可と判断(license.txt)/但しnon-free,カンパウエア的Net記述も有)
※7個残(U+70F&2D-F&4D-F)[代案: unifont{Code2000}]
U+0750Arabic Supplement
[アラビア文字 補助]
18個Scheherazade-1.900_alpha.zip(ScheherazadeOT-1.005.ttf)(最新正式版) 済 {Amiri}
U+0780Thaana [ターナ文字
(ディベヒ語:モルディブ共和国 インド洋)]
50個MPH 2B Damase(推定:Public Domain 2005(or GPL/OFL)) 済
U+07C0Nko
[ンコ文字(マンデ系言語:西アフリカ)]
5個(JONA: JA, CHA, FE, RA; SYMBOL OO DENNEN, SYMBOL GBAKURUNEN) Conakry(OFL1.1(zip内のOFL.txt参照)) 済
U+0800Samaritan [サマリア文字
(パレスチナのヨルダン川西岸地区)]*
61個Quivira
U+0840Mandaic
[マンダ文字(マンダ教:イラクの南部)]*
全29個None (Ver.6.0 2010/10)
U+0860[unassigned 64 characters block]
U+08A0Arabic Extended-A
[アラビア文字 拡張A]*
39個Scheherazade-1.900_alpha.zip(ScheherazadeOT-1.005.ttf) 済 {Amiri 残り35字)}
U+0900Devanagari
[デーヴァナーガリー文字(インド諸語)]
11個(標準=Lohit-Devanagari.ttf:最新版は対応済) AnnapurnaSIL-1.100.zip(OFL1.1) 済 {Siddhanta(一部商用不可)}
U+0980Bengali
[ベンガル文字(バングラディッシュ/アッサム)]
1個(標準=Lohit-Bengali.ttf:最新版は「৻」(U+9FB GANDA MARK)も対応済) 済
U+0A00Gurmukhi [グルムキー文字
(インド:シク教徒 パンジャーブ語)]
(標準)
U+0A80Gujarati
[グジャラト文字(インド西部:グジャラート州)]
(標準)(=Lohit-Gujarati.ttf:reservedのU+AE4&5はU+964&5を参照) U+AE4&5は下駄文字に変化
U+0B00Oriya
[オリヤ文字(東インド オリッサ,西ベンガル州)]
6個(標準=Lohit-Oriya.ttf:最新版は完全対応)済
U+0B80Tamil
[タミル文字(南インドタミル・ナドゥ州,スリランカ)]
(標準)
U+0C00Telugu [テルグ文字
(インド南東アーンドラ・プラデーシュ州)]
(標準)
U+0C80Kannada
[カンダナ文字(南インド カルナータカ州)]
(標準)
U+0D00Malayalam
[マラヤラム文字(南インド ケーララ州)]
(標準)smc-rachanaはuninstall推奨:全未定義文字とU+D3A&4Eとreserveの64-5が丸Rマークに
U+0D80Sinhala
[シンハラ文字(南インド東:スリランカ)]
(標準)
U+0E00Thai
[タイ文字(東南アジア:タイ)]
(標準){Quivira}
U+0E80Lao
[ラオ文字(東南アジア:ラオス)]
2個残:U+EDE-F(Khmu語子音)
U+0F00Tibetan
[チベット文字(チベット語・ゾンカ語:ブータン)]
6個(標準=TibMachUni-1.901b(GPLv2)残:U+0F8C-F&D9-A 規格外:U+0F48) DzongkhaFonts(DDC Rinzin.ttf):OFL 済 参考:THL
U+1000Myanmar
[ミャンマー文字(ビルマ:現ミャンマー)]
(標準)
U+10A0Georgian
[グルジア文字(西アジア(黒海西))]
5個Quivira
U+1100Hangul Jamo
[ハングル字母(東アジア:朝鮮半島)]
(標準)
U+1200Ethiopic[エチオピア文字
(ゲエス文字:アムハラ語 東アフリカ)]
2個AbyssinicaSIL-R(AbyssinicaSIL1.200.zip)(OFL1.1) 済
U+1380Ethiopic Supplement
[エチオピア文字 補助]
(標準){AbyssinicaSIL-R(AbyssinicaSIL1.200.zip)}
U+13A0Cherokee [チェロキー文字
(米国内先住民族の1つ)]
(標準){Quivira, MPH 2B Damase}
U+1400Unified Canadian Aboriginal Syllabics
[カナダ先住民統合音節]
219個Quivira
U+1680Ogham
[オガム文字(古アイルランド語)]
(標準){Quivira}
U+16A0Runic
[ルーン文字(2世紀ゲルマン語表記用)]
(標準){Quivira}
U+1700Tagalog
[タガログ文字(バイバイン文字:フィリピン)]
19個Quivira 済(+ U+170D)
U+1720Hanunoo [ハヌノオ文字
(ハヌノ語:フィリピン ミンドロ島南端)]
22個Quivira 済, {MPH 2B Damase}
U+1740Buhid
[ブーヒッド文字(フィリピン ミンドロ島)]
20個Quivira
U+1760Tagbanwa [タグバンワ文字
(フィリピン パラワン島中北部)]
19個Quivira
U+1780Khmer
[クメール文字(カンボジア)]
(標準)
(2字)
(=KhmerOS.ttf) 2字(U+17B4&5)が別Block Geometric Shapes[幾何学模様]のdotcercle(U+25CC)を前置する定義の為、別font設定では下駄文字化
U+1800Mongolian[モンゴル文字
(モンゴル語満州語シベ語Ali-Gali)]
Mongolian Unicode Test Page
156個 Manchu_Font_2005_2.006.zip(ManchuFont2005.ttf) 済(+10文字:U+1878-E&AB-D +次Block40字U+18B0-D7 BSD License, Public Domain) 参考:Standardized Variants
U+18B0Unified Canadian Aboriginal Syllabics
Extended [カナダ先住民統合音節 拡張]*
70個Quivira
U+1900Limbu
[リンブー文字(インド ネパール)]
66個MPH 2B Damase 済{Namdhinggo(OFL1.1)}
U+1950Tai Le[タイ・ル文字
(雲南省 ラオス ミャンマー タイの一部)]
35個MPH 2B Damase
U+1980New Tai Lue [新タイ・ルー文字
(1950年中国製 中国南部
)]
99個Dai Banna SIL Book(DBSILBR.ttf)等 (SIL OFL1.1) 済
U+19E0Khmer Symbols
[クメール文字 記号]
(標準)(=KhmerOS.ttf)
U+1A00Buginese [ブギ文字
(ブギス語:インドネシア スラウェシ島南部)]
30個MPH 2B Damase 済(+ U+1A1C&D) {Lontara.ttf(掲載元:GPLv2)}
U+1A20Tai Tham[タイ・タム(ラーンナー)文字
(タイ北部 12世紀〜)]*
全127個lannaalif-v1-03.ttf(What is the license?:an answer)
Lanna Unicode UI(License記載無)共に未install
U+1AB0[unassigned 80 characters block]
U+1B00Balinese
[バリ文字(バリ語:インドネシア バリ島)]
121個
(残37字)
Balipolos-0.2.ttf(掲載元 GPLv2)
[Aksara Bali(Free)(+7文字 U+1B4C-F&7D-F)(済)]
U+1B80Sundanese
[スンダ文字(スンダ語:インドネシア ジャワ島)]
64個
(残9字)
SundaneseUnicode(GPL) 残9個(U+1BAB-D&BA-F)
参考:Direktori AKSARA SUNDA untuk UNICODE
U+1BC0Batak
[バタク文字(インドネシア スマトラ州高地)]*
56個Nanggar.ttf(掲載元:GPLv2) 済 {Batak-Unicode(非商用(tujuan nirlaba))}
U+1C00Lepcha
[レプチャ文字(印中国境シャキム)]
74個Mingzat(OFL1.1) 済
U+1C50Ol Chiki [サンタル文字
(サンタル語:東印(ジャールカンド州))]
参考:a portal for Santals
全48個[Code2000(it was Shareware 5$. But the site has closed, the domain name of the site are owned by others.), unifont]
U+1C80[unassigned 64 characters block]
U+1CC0Sundanese Supplement
[スンダ文字 補助]*
全8個None (Ver.6.1 2012/01)
U+1CD0Vedic Extensions
[ヴェーダ文字 拡張]*
39個Siddhanta(一部商用不可) 済
U+1D00Phonetic Extensions
[表音文字拡張]
22個Quivira
U+1D80Phonetic Extensions Supplement
[表音文字拡張 補助]
20個Quivira
U+1DC0Combining Diacritical Marks
Supplement [組分音符 補助]
47個U+1DC0-1DC9: + U+1DCA-1DE6 1DFC-1DFFFreeSerif
U+1E00Latin Extended Additional
[ラテン文字 拡張 追加]
(標準) {Quivira}
U+1F00Greek Extended
[ギリシア文字 拡張]
(標準) {Quivira}
U+2000General Punctuation[一般的な句読点]
(実際は西欧以外は非一般的)]
7個(U+2064&6A-Fの7文字はDejaVu系プロポーシャナルfont等数種の対応font指定時のみ表示) {Quivira}
U+2070Superscripts and Subscripts
[上付き・下付き文字]
8個Quivira 済 (+reserved:U+2072&3;未定義:独自下駄文字)
U+20A0Currency Symbols
[通貨記号]
4個Quivira(+ U+20BB) 済
U+20D0Combining Diacritical Marks
for Symbols [記号用組分音符]
(標準) Sixpack-medium.ttf {U+20E0,E2,E3FreeMono + 他U+20D3-5,D8-A} (+3文字 U+20F1-3) 済
U+2100Letterlike Symbols
[字様記号]
3個Symbola, Quivira {FreeSerif} 済
U+2150Number Forms
[数字字形]
7個FreeSerif {Quivira} 済
U+2190Arrows
[矢印]
(標準) {Quivira}
U+2200Mathematical Operators
[数学演算子]
(標準) {Quivira}
U+2300Miscellaneous Technical
[その他の技術用記号]
21個Symbola {Quivira} 済(+ U+23F4-C)
U+2400Control Pictures
[制御文字画像]
(標準) {Quivira}(+ U+2427-3D)
U+2440Optical Character Recognition
[光学式文字認識記号]
(標準) {Quivira, Symbola}
U+2460Enclosed Alphanumerics
[囲み英数字]
1個(NEGATIVE CIRCLED DIGIT ZERO) Quivira
U+2500Box Drawing
[罫線素片]
(標準) {Quivira}
U+2580Block Elements
[ブロック要素]
(標準) {Quivira}
U+25A0Geometric Shapes
[幾何学模様]
(標準) {Quivira}
U+2600Miscellaneous Symbols
[その他の記号]
73個Symbola
U+2700Dingbats
[絵文字]
16個Symbola 済(+ U+2700)
U+27C0Miscellaneous Mathematical Symbols-A
[その他の数学記号A]
5個Symbola {Quivira} 済
U+27F0Supplemental Arrows-A
[補助的矢印A]
(標準) {Quivira}
U+2800Braille Patterns
[ブレール式点字]
(標準) {Quivira}
U+2900Supplemental Arrows-B
[補助的矢印B]
(標準) {Quivira}
U+2980Miscellaneous Mathematical Symbols-B
[その他の数学記号B]
(標準) {Quivira}
U+2A00Supplemental Mathematical Operators
[補助的数学演算子]
(標準) {Quivira}
U+2B00Miscellaneous Symbols and Arrows
[その他の記号と矢印]
5個Quivira 済(+ U+2B4D-F&5A-EF)
U+2C00Glagolitic[グラゴル文字
(スラブ系語最古文字クロアチア近代迄)]
94個Quivira 済 {MPH 2B Damase, BukyVede (free to use)}
U+2C60Latin Extended-C
[ラテン文字拡張-C]
4個Quivira
U+2C80Coptic [コプト文字
(コプト語:旧エジプト民族の言語)]
123個Quivira 済{Analecta}
U+2D00Georgian Supplement
[グルジア文字 補助]
2個Quivira, MPH 2B Damase
U+2D30Tifinagh
[ティフナグ文字(トゥアレグ語:北西アフリカ)]
4個
(残1字)
(DejaVuSans=TamaloutNoufUNICODE, MPH 2B Damase)
Quivira(残:U+2D7F TIFINAGH CONSONANT JOINER)
U+2D80Ethiopic Extended
[エチオピア文字 拡張]
(標準) {AbyssinicaSIL-R(AbyssinicaSIL1.200.zip)(SIL)}
U+2DE0Cyrillic Extended-A
[キリル文字 拡張A]
32個Quivira
U+2E00Supplemental Punctuation
[補助的句読点] 13個
53個Symbola 済(+U+2E3C-42) {Quivira}
U+2E80CJK Radicals Supplement
[CJK部首 補助]
(標準)
U+2FE0[unassigned 16 characters block]
U+2F00Kangxi Radicals
[康熙部首]
(標準)
U+2FF0Ideographic Description Characters
[部首配置記述文字]
(標準){Quivira}
U+3000CJK Symbols and Punctuation
[CJK記号・句読点]
7個BabelStoneHan(Arphic Public License) 済 {花園明朝A(HanaMinA), 3020&33-5&b-d:IPAGothic, 3030:STIXGeneral-Regular,U+303F:不明}
U+3040Hiragana
[ひらがな]
(標準)
U+30A0Katakana
[全角カタカナ]
(標準)
U+3100Bopomofo
[中国語注音符号]
(標準)(+ U+312E)
U+3130Hangul Compatibility Jamo
[ハングル互換字母]
(標準)
U+3190Kanbun
[漢文の読点]
2個BabelStoneHan
U+31A0Bopomofo Extended
[ハングル注音字母 拡張]
3個BabelStoneHan
U+31C0CJK Strokes
[CJK字画]
(標準)
U+31F0Katakana Phonetic Extensions
[カタカナ表音 拡張(追加拗音)]
(標準)
U+3200Enclosed CJK Letters and Months
[CJK囲み文字と月]
13個花園明朝A(HanaMinA) 済 {AR PL UMing(uming.ttc)}
U+3300CJK Compatibility
[CJK互換文字]
37個花園明朝A(HanaMinA)
U+3400CJK Unified Ideographs Extension A
[CJK統合漢字拡張A]
(標準)
U+4DC0Yijing Hexagram Symbols
[六十四卦易記号]
(標準)
U+4E00CJK Unified Ideographs
[CJK統合漢字]
1個(U+9FCC) 花園明朝A(HanaMinA)
U+A000Yi Syllables
[彝(い)文字]
1165個NuosuSIL(OFL1.1) 済
U+A490Yi Radicals
[彝(い)文字部首]
55個NuosuSIL
U+A4D0Lisu
[リス文字]
48個Quivira
U+A500Vai
[ヴァイ文字]
300個Dukor(掲載元 OFL1.1) 済 {Quivira}
U+A640Cyrillic Extended-B
[キリル文字 拡張B]
58個Quivira 済 {FreeSerif}
U+A6A0Bamum[バムン文字
(20世紀〜中部アフリカ カメルーン宮廷)]*
全88個None (Ver.5.2 2009/10)
U+A700Modifier Tone Letters
[声調修飾文字]
12個Quivira
U+A720Latin Extended-D
[ラテン文字拡張-D]
91個Quivira
U+A800Syloti Nagri
[シロティ・ナグリ文字]
44個MPH 2B Damase
U+A830Common Indic Number Forms
[共通インド数字形]*
10個AnnapurnaSIL-1.100.zip(OFL1.1) 済
{Siddhanta(一部商用不可)}
U+A840Phags-pa
[パスパ文字]
56個BabelStone Phags-pa(free to download and use)済
U+A880Saurashtra
[サウラーシュトラ文字]
81個Pagul_v1.0.zip(Pagul.ttf)(GPLv3) 済 {Sourashtra(licence不明) (+ U+A8C5)}
U+A8E0Devanagari Extended
[デーヴァナーガリー文字 拡張]*
28個(標準=Lohit-Devanagari.ttf:最新版は完全対応)AnnapurnaSIL-1.100.zip 済 {Siddhanta(一部商用不可)}
U+A900Kayah Li
[カーヤ文字]
47個Kantarawaddy(GPLv3) 済
U+A930Rejang
[ルジャン文字(インドネシア スマトラ島北西岸)]
37個Rejang済(掲載元:GPLv2(indonesian-fontsにも収録))
U+A960Hangul Jamo Extended-A
[ハングル字母 拡張A]*
(標準)(UnBatang)
U+A980Javanese[ジャワ文字(ジャワ語:インドネシアの
4割の母語 ジャワ島中央/東部/西部北岸
)]*
91個Tuladha Jejeg(TuladhaJejegGr_1.92.zip)(OFL) 済
{javanese.ttf(掲載元: GPLv2)}
U+A9E0[unassigned 32 characters block]
U+AA00Cham
[チャム文字(カンボジア, ベトナム中南部)]
全83個CJM KH 001(Freeware, Non-Commercial)
[unifont (Code2000)]
U+AA60Myanmar Extended-A
[ミャンマー文字 拡張A]*
(標準)
U+AA80Tai Viet [タイ・ヴェト文字
(ラオス北部 タイ中部 ベトナム北西部)]*
56個Tai Heritage Pro(TaiHeritagePro2_5.zip)(OFL) 済
U+AAE0Meetei Mayek Extensions
[マニプリ文字 拡張]*
全32個None (Ver.6.1 2012/01)
U+AB00Ethiopic Extended-A
[ゲエズ文字 拡張A]*
32個標準の古いAbyssinica_SIL.ttf要除却
AbyssinicaSIL-R(AbyssinicaSIL1.200.zip)(OFL) 済
U+AB30[unassigned 144 characters block]
U+ABC0Meetei Mayek
[マニプリ文字]*
56個Eeyek(GPL2(copying.txt)) 済
U+AC00Hangul Syllables
[ハングル音節文字]*
(標準)
U+D7B0Hangul Jamo Extended-B
[ハングル字母 拡張B]*
(標準)
U+D800High Surrogates [上位代用符号位置]
参考:サロゲートペア(代用対)
(システム)上位コード1024個(1,048,576字の符号化拡張用)
U+DB80High Private Use Surrogates
[上位私用代用符号位置]
(システム)上位代用符号中、私用文字(外字)と看做されるもの。
U+DC00Low Surrogates [下位代用符号位置](システム)1024個の下位コード(1,048,576文字の符号化拡張用)
U+E000Private Use Area [私用領域(外字領域)](外字)自由活用
U+F900CJK Compatibility Ideographs
[CJK互換漢字]
11個花園明朝A 済
U+FB00Alphabetic Presentation Forms
[アルファベット表記字形]
(標準)(5個過大)→下駄文字に変化
U+FB50Arabic Presentation Forms-A
[アラビア表示字形A]
441個Amiri 済 {BabelStoneHan2/3}
U+FE00Variation Selectors [異体字セレクタ](システム)参考:ユニコード(特殊用途文字), Standardized Variants
U+FE10Vertical Forms
[縦書字形]
(標準)
U+FE20Combining Half Marks
[半記号(合成可能)]
(標準)Symbola(+7文字 U+FE27-D)
U+FE30CJK Compatibility Forms
[CJK互換字形]
(標準)
U+FE50Small Form Variants
[小字形]
1個(SMALL EM DASH) BabelStoneHan
U+FE70Arabic Presentation Forms-B
[アラビア表示字形B]
(標準)
U+FF00Halfwidth and Fullwidth Forms
[半・全角字形]
1個(U+FFA0 HALFWIDTH HANGUL FILLER)
[unifont] 無表示に
U+FFF0Specials [特殊文字](システム)参考:ユニコード(特殊用途文字) {Quivira}
続きを読む
posted by Mire at 00:12 | Comment(1) | TrackBack(0) | Linux | このブログの読者になる | 更新情報をチェックする

2012年10月26日

UUNZIP-0.0.6a Installing Package Has Released for Linux Users!

English text was wroted below in this article.(英語の文書はこの記事の下方に書きました。)
 さて、昨日installer.pyのソースコードを公開してから、ちょちょいのちょいでパッケージを作れば終わりだと、思ってたが、そうではなかった。最低限のパッケージで良しとすれば、確かにuunzip.pyとinstaller.pyのみをセットにして配布すれば済むだろうが、やっぱ、使ってもらうには最低限、「1.インストール方法」と「2. 最低限の使い方」を記したREADME.TXT程度は添付する必要がある。確かに、uunzip.pyとinstaller.pyのソースコードの中には、そりなりの記述があるので読んでねというのも一興だろうが、それをプログラムに興味のない一般ユーザに求めても仕方がないだろう。

 ということで新ためてREADME.TXTを作成した次第だ。でも、ここで詰ったのがやはり外国人ユーザへの対応で英語という壁だ。プログラムを書く以上、確かに他の人が書いたプログラム資産を活用する為に英語のREADME.TXTは結構読んでいる訳だが、それを書こうとすると、日本語の様には言葉が出て来ないし、所詮、broken englishとなってしまう。broken englishでも仕方ないので書いたのだが、余り複雑な言い回しは、英語では思いつきもしないし無理に英語にしても英語にならないので省かざるを得ない。悲しい限りである。
 その結果ほぼ英語らしき単文を並べ、説明不足と思う部分は、具体的サンプルを掲載添付することで補うことになった。

 まあ、実際のREADME.TXTがどれだけNativeな人々に通用するかは判らないが、当方クラスの英語読解力の人間なら、熱意で英語でなく英語の行間や実際のプログラムを操作して理解出来るのでここらで勝手に良しとしようと思う。

 そんな所で手を打ったと言うか打ちきったREADME.TXTの和訳と言うか、英語で書いたつもりの日本語が以下のテキストである。英語のそれもそうだが、当然充分とは言えないので、もし、この辺りに手を入れて頂ける方がいたらとても有難い。

             uunzip-0.0.6a/readme-ja(utf-8).txt


############################################
uunzip(旧称:unzip-cp932) 0.0.6a 2012-10-23
############################################

 これは、Mire(まぁいいやぁ) がメンテしています。 Bug連絡には、次のBlogのURLを
ご利用下さい。
http://pythonlife.seesaa.net/article/298750061.html

 このuunzip(旧称:unzip-cp932)とそのソースコードは「GPL」ライセンスの条項に
基づくことで活用頂けます。(GPL Licence詳細: http://www.gnu.org/licenses/gpl.html )

=========================
A. uunzipのインストール
=========================

0.  既にお済ませのことでしょうが、ダウンロードした「uunzip-0.0.6a.tgz」を解凍後
そのディレクトリに移ります。

$ tar xvzf uunzip-x.x.x.tgz
uunzip-0.0.6a/
uunzip-0.0.6a/readme.txt : このファイルの英語版
uunzip-0.0.6a/uunzip.py : uunzipのPythonソースコード
uunzip-0.0.6a/readme-ja(utf-8).txt : このファイル
uunzip-0.0.6a/installer.py : インストーラ (A-2)
uunzip-0.0.6a/uunzip-example_other_ja : サンプルスクリプト (B-9)
$ cd uunzip-x.x.x


1.  Linuxのコンソール端末で「whereis python」を実行して下さい。uunzipを実行させ
たいpythonを選んで下さい。

実行例::

$ whereis python
python: /usr/bin/python2.6-config /usr/bin/python2.6 /usr/bin/python /usr/lib/python2.6 /usr/lib64/python2.6 /usr/include/python2.6 /usr/share/man/man1/python.1.gz
$


2.  その選択したpythonで「installer.py uunzip.py'」を実行して下さい。この
installer.py は 'uunzip' を '/usr/local/bin'下にインストールします。

実行例::

$ su -
Password:<type root password>
# /usr/bin/python2.6 installer.py uunzip.py

or

$ sudo /usr/bin/python2.6 installer.py uunzip.py
[sudo] password for <your-id>: <type your password>
This installer runs with '/usr/bin/python2.6'
set 'uunzip.py' to /usr/bin/python2.6
'/usr/local/bin/uunzip' was wroted.

Check result. See below.
# ls -l /usr/local/bin/uunzip
-r-xr-xr-x. 1 root root 68312 10月 25 15:51 2012 /usr/local/bin/uunzip

with executing permission
# printenv | grep PATH
PATH=/sbin:/bin:/usr/sbin:/usr/bin

/usr/local/bin already exists in PATH.
# whereis uunzip
uunzip: /usr/local/bin/uunzip

'uunzip' command exists.
$


==================
B. uunzip を使う
==================

1. ZIPファイル内の書庫情報をリスト表示するには
===============================================

uunzip <1.a zip file>


2. ZIPファイルの書庫内の全ファイルを解凍するには
=================================================

uunzip <1. zipファイル> <2. 解凍先ディレクトリ>


3. ZIPファイルの書庫内の特定ファイルを解凍するには
====================================================

uunzip <1. a zipファイル> <2. 解凍先ディレクトリ> <3. ファイル1> <3. ファイル2> ...


4. ヘルプを見るには
====================

uunzip --help


5. 他言語で作成されたZIPファイル用に「encoding」と「encodings」を変更するには
==============================================================================

uunzip <1> <2> <3> ... encoding='gb18030' "encodings=['cp950','big5hkscs','Big5','utf-8']


6. uunzipの公開変数の値をチェックするには
==========================================

uunzip <1> <2> <3> ... <variable1>=<value1> ... help=True


7. uunzipの表示を他言語にするには
==================================

uunzip <1> <2> <3> ... "answers=['y','n','A','N','r']" msg_replace='\rreplace \"%s\"? [y]es, [n]o, [A]ll, [N]one, [r]ename: ' msg_zippath='\rArchive: ' msg_new_name='\rnew name[%s]: ' msg_mkdir='\rcreating: \"%s\"' msg_exit='\r%s was stoped.' msg_skip='\r\"%s\" was skipped over.' msg_unzip='\rinflating: \"%s\"' msg_exists='uunzip: cannot find or open' msg_readerr='Cannot read this file as zip.' "zinfo_items=[u'Length ',u'Date',u'Time',u'Name']" "zinfo_widths=[9,10,5,4]" zinfo_files='files' param='param'

日本語化の例::

uunzip <1> <2> <3> ... "answers=['y','n','A','N','r']" msg_replace='\r既存ファイル:\"%s\"\nこれを上書きしても宜しいのですか?\nやる[y], 抜かす[n], 有る分全部上書き[A], 何もせず終了[N], 別名なら保管[r]: ' msg_zippath='\r書庫ファイル: ' msg_new_name='\r新たな名前[%s]: ' msg_mkdir='\r作成中: \"%s\"' msg_exit='\r%s は以降の処理を中止しました。' msg_skip='\r\"%s\" を飛ばしました。' msg_unzip='\r解凍中: \"%s\"' msg_exists='uunzip: 探せないか開けません' msg_readerr='ZIPとして読めません。\nこれがZIPファイルなら再取得をお勧めします。' "zinfo_items=[u'サイズ ',u'年-月-日',u'時:分',u'ファイル名']" "zinfo_widths=[9,10,5,4]" zinfo_files='件' param='引数'


8. uunzipの表示を日本語にするには
==================================

uunzip <1> <2> <3> ... jang='ja'


9. 既定の変数セットの変更をするには
====================================

 下記の様なシェルスクリプトを作り「chmod +x <シェルスクリプトのファイル名>」を実行します。
「./uunzip-example_other_ja」を実行しご覧下さい。これはジョークサンプルですが。

#!/bin/sh
#-*- coding: utf-8 -*-
## this script is a joke example for transfering to other Japanese. ##
uunzip "answers=['y','n','A','N','r']" msg_replace='\r既存ファイル:\"%s\"\n上書きでええん?\n殺って[y], 抜いとき[n], みな殺ったれ[A], そん何止めてぇ[N], 名前変えまひょ[r]: ' msg_zippath='\r書庫ファイル: ' msg_new_name='\r新ファイル名[%s]: ' msg_mkdir='\r作成中: \"%s\"' msg_exit='\r%sでした。また今度ぉ' msg_skip='\r\"%s\" は止しといたで' msg_unzip='\r開梱中: \"%s\"' msg_exists='uunzip: 見えまへん' msg_readerr='ZIPにゃ見えまへんな\nもっ遍貰うて来て' "zinfo_items=[u'デカさ ',u'年-月-日',u'時:分',u'ファイル名']" "zinfo_widths=[9,10,5,4]" zinfo_files='個' param='引数' $*


10. ヘルプ文書の変更をするには
===============================

 既定パスが、'/usr/local/etc/uunzip/man/uunzip.hlp' のテキストファイルを新たに
作成しこのファイルをコピペした後、お望みなら、翻訳または修正して下さい。


11. 'ja'の様な、ご自分の言語用の「lang」値を作るには
=====================================================

 お作りの変数セットまたはシェルスクリプトを Mire in JapanのBlogのURLにお送り
願います。 http://pythonlife.seesaa.net/article/298750061.html

 これをお読みになれたなら、このURL(uunzip-0.0.6a.tgz)からダウンロードしてuunzipをご利用下さい。
尚、ドキュメント整備とバグとりへのご協力を必要としています。良かったら宜しくお願い
します。

 読み返すと、手を入れたくなるのだが、一般ユーザが使う範囲で言えば問題ないかなと思っている。その英語と思って、これより先に書いたものが次のREADME.TXTだ。続きを読む
posted by Mire at 22:00 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2012年10月25日

Python ScriptをLinuxコマンドとしてinstallする「installer.py」

 前稿でのuunzip公開でようやく、文字化けから開放されたZIP解凍を提供出来たはずではあるが、このままでは、やはり、ある程度プログラミングに馴染みがあるか興味のある方しか利用しようとしないだろう。折角、作ったからには、それなりに、その便益を広く共有したいと言うのが人情だ。その為には、helpにある通り、「python uunzip.py」ではなく「uunzip」のみで利用出来る様にするinstallerを付けたパッケージの作成が、不可欠である。
 本稿は、その実現の為に今回作成したinstallerを公開することにする。仕様としては次の様になっている。
  1.  「拡張子を省いて実行出来る様にinstallしたいPythonスクリプト」自体を走らせたいPythonへのフルパスで、この「instaler.py」を実行することで、拡張子を省いて実行出来る様にinstallしたいPythonスクリプトの実行Pythonを決定する。
  2.  第1引数には、拡張子を省いて実行出来る様にinstallしたいPythonスクリプトのコードを指定する。この「instaler.py」は、そのソースコードを読込み、第1行目にある実行Pythonへのパスを、1の指定通りに書替えたものを「/usr/local/bin」(既定)以下に拡張子の「.py」を外したファイルで書込み、必要となる実行権付与等を行なう様にしている。
  3.  必要なら、第2引数に指定することで、既定のinstall先「/usr/local/bin」を別のものに変更することも出来る。但し、そのinstall先は、環境変数PATHに予め登録されていることが必要である。もし、環境変数PATHにないパスを指定したいなら、その登録は、手作業で行なって頂くことが前提なので、既定の「/usr/local/bin」でないなら、個人のみに有効な「~/bin」辺りを推奨する。でも、ここに実際には無いディレクトリを指定すると、その旨表示して終了する。これも、事前に別途、手動で作成することが必要と言うことだ。
  4.  install処理が終わったら、その実体を検査表示する様にした。
  5.  使い方は、「instaler.py」に引数を何も付けずに実行することで表示する。
  6.  当然ながら、「/usr/local/bin」等ユーザのホーム領域以外をinstall先とするには管理者権限で実行することが必須となるので、予め、rootパスワードを使って「su -」で、管理者になって行なうか、ユーザへの設定を予めした上で「sudo」とユーザパスワードで、行なうことになる。

 「uunzip」での具体的な実行例は次の通りである。実行させるPythonの指定は、必ずしも、この様にバージョン番号付である必要はないが、明示しておくことを推奨する。例えば、CentOS6の素の環境では/usr/bin配下に2つ程、Pythonの実行ファイルがあるが、これらはいずれも同じものであるが、これがOSのupdateで勝手にグレードアップまたはダウンされたとしたら、動作しなくなる可能性は完全否定することは出来ないからである。無論、当方の公開しているPythonプログラムであれば、アクロバティックなものはないので、Python2.6が、2.5に落ちようととも、2.7に上がろうとも、外部モジュールに問題がなければ動作する訳で、その傾向はPython2.xの互換性重視の姿勢によるものだ。例えそうであっても、手持ちのものがどの環境で動作することを前提に存在したかを明示する価値はあるものと思うからである。




[mire@localhost ~]$ ls -la /usr/bin/python* | grep -v config
-rwxr-xr-x. 2 root root 9032 6月 18 22:19 2012 /usr/bin/python
lrwxrwxrwx. 1 root root 6 6月 19 02:12 2012 /usr/bin/python2 -> python
-rwxr-xr-x. 2 root root 9032 6月 18 22:19 2012 /usr/bin/python2.6
[mire@localhost ~]$
[mire@localhost ~]$ sudo /usr/bin/python2.6 installer.py uunzip.py
[sudo] password for mire:
This installer runs with '/usr/bin/python2.6'
set 'uunzip.py' to /usr/bin/python2.6
'/usr/local/bin/uunzip' was wroted.

Check result. See below.
# ls -l /usr/local/bin/uunzip
-r-xr-xr-x. 1 root root 68312 10月 25 01:39 2012 /usr/local/bin/uunzip

with executing permission
# printenv | grep PATH
PATH=/sbin:/bin:/usr/sbin:/usr/bin

/usr/local/bin already exists in PATH.
# whereis uunzip
uunzip: /usr/local/bin/uunzip

'uunzip' command exists.
[mire@localhost ~]$


 以下が、「installer.py」のソースコードである。今回、当方では「uunzip」の配布用に活用するが、同様の用途であれば、そのままでも充分に活用出来るだろう。ライセンスは、例により、GPLなので、ソースコードも含めて有効に活用頂ければ有難い。

続きを読む
タグ:Python Installer
posted by Mire at 03:01 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2012年10月24日

【Linux】文字化けで解凍不能なZIPファイル用「uunzip」第6版リリース

 前稿でunzip-cp932の第4版をリリースして以来、末尾に記載したucode()関数を活用したバカチョンのunzipコマンドの作成に勤しんで来た。これ自体の動作確認は早々に録れていたのだが、ついでに、利用言語別の翻訳対応やらドキュメント整備やら、仕様拡張の度に修正している内に結構時間を費やしてしまった。でも、ドキュメント整備をしながら動作チェックを進めた結果、良くやってしまう、とんでもない凡ミスを公開することだけは避けることが出来た様には思う。

 ということで予告通り、今版より改名し、uunzipとさせて頂いた。命名の気持ちはUniversal UNZIPなのだが、実際は、Uno UNZIP、つまり、一つのUNZIPツールって所であることも確かなことなので取り敢えず中をとって「Uni UNZIP」の略ということにさせて頂くことにした。命名の最初の発想は、キー入力で楽したかっただけってことは内緒だ(笑)。

 仕様的には機能提供重視で曲がりなりにその目的達成させた為、未だ発展途上なものの、少なくとも日本国内の日本語中心のユーザなら、ZIPファイルをバカチョンで文字化け無く解凍頂けるものになったと思うし、その気になってくれた外国人ユーザーにも活用出来る程度の機能とドキュメント整備は出来たかな? と思う。まぁ、当方の英語力で書いたbroken engllishでは伝わらないことも多いだろうが、自分も判らない英語ドキュメントは実際に使って試てから理解している口なので、その気になってくれたら何とかなるものと思っている。
 後、足りていないものはinstallerの公開だが、それは、次稿で行ない、本稿のuunzipと合わせた配布パッケージを作成し、掲載しようと思っている。乞うご期待と言ったところだ。

 尚、使い方等は、ソース中のヘルプに入っているので改めて、本文に記載することは遠慮させてもらう。エスケープシーケンスの制御文字を含む為、多少見難いとは思うが、ご勘弁頂きたい。

            ~/uunzip.py (前半)


#!/usr/bin/python2.6
#-*- coding: utf-8 -*-
u"""
uunzip: UUNZIP(Uni UNZIP) unzips an zip arcive file that created with OS for any
language encoding. Default setup is for Japanese Language encodings. If
not worked well, Set encoding, encoding0 and enocdings option for your
language's encodings.

USAGE: uunzip <zip file> <path for extract files into> <target file1> <target file2> ...

※  Windows日本語版で作成したZIPファイルはアーカイブ情報の文字コードがcp932で
ある為、Linux上のツールによっては文字化けの為、解凍自体が出来ないことすらある。
 このソースコードはcp932をuncode化し問題解消図ったunzip-cp932を起源とするが、
今回、文字化け対策としてPython標準の全encodingを試す仕様にしたことから少なく
とも日本語利用中心の利用者間のZIPファイル交換なら、既定値のままで意識すること
なく双方向に解凍することが出来る筈だ。中文、ハングルと言った東アジア系
の言語圏のユーザであれば、変数encoding等をコマンドラインオプションで指定替え
することで同様に対応可能かと思う。但し、西欧言語には一切の配慮やテストもして
いないので、その成否は判らない。レポート頂けると有難いところだ。
 見た目はLinux標準のunzipに近い操作性をエミュレートしているが、unzip形式の
豊富なコマンドオプションは実装していない。引数位置は基本的に固定で、全てを
省略するか「--help」をつけると簡易ヘルプを、第1引数のZIPファイルのみを指定した
場合には、「unzip -l」相等の書庫情報リスト表示を解凍先ディレクトリ指定席の
第2引数を追加することで初めて主目的の解凍処理が機能する。さらに第3引数以降には
ZIP書庫内の解凍対象ファイルを必要なだけ個別で列記指定出来る。
 以上、機能的には少ないながらも「ヘルプ表示」「書庫一覧」「一括解凍」そして
「指定ファイルの書庫解凍」の4機能を提供出来ている。
 しかし、これだけでは日本語以外のユーザ環境では適切に対応出来ない可能性がある
のも事実なので、予め有用な既定値を与えている変数については「=」を挿み値を変更
出来る様にした。

【専用関数】
prn_help() : 簡易ヘルプ表示の関数
def unzip() : 個別ファイルの解凍先への解凍処理の本体
prn_ZipInfo() : 書庫情報の非表示
ZipInfo_sum(z) : 書庫情報の総ファイル長とファイル数のタプルを返す
exist_filename() : 拡張子補完を含め指定ファイル名の存否確認後存在名を返す
and_items() : 2つのリスト共通の文字列を返す関数(各要素は文字列に限る)
new_name() : 3桁の数値iを附記した非重複ファイル名候補を提示し入力
u_unzip() : 「uunzip(旧称:unzip-cp932)」の本体関数
main() : コマンド引数を処理しu-unzip()関数の引数を確定する関数
【汎用系関数】
select() : コンソールプロンプトを出し求める範囲の返答の英字1文字を返す
unicode_width() : UNICODE文字列の文字幅を返す関数(2010-05-10公開分)
unicode_ljust() : UNICODE左寄せ
unicode_center() : UNICODE中央寄せ
unicode_rjust() : UNICODE右寄せ
replaces() : 特殊文字をpython表記に置替える関数
"""
__author__ = "Mire in Japan"
__date__ = "2012-10-23"
__version__ = '0.0.6a'
__copyright__ = 'Copyright (c) 2012-09-28 Mire'
__license__ = 'GPL'
__url__ = 'http://pythonlife.seesaa.net/article/298750061.html '

__history__ = U"""【更新履歴】
0.0.1 2012-09-28  リリース初版
0.0.1a 2012-09-30  解凍処理中のみ個別ファイル名を画面表示する様に変更
0.0.2 2012-10-01  書出先に同名ファイルがある場合の処理選択を追加
オリジナルのunzipと異なりファイル名変更時に非重複名を
生成し提示する仕様に
 仕様変更部分の説明書きを修正
 ファイル名は引用符で囲んで表示する様に
0.0.3 2012-10-02  第3引数以降に解凍ファイル(複数)を指定出来る様に仕様変更
 さらに、第1引数だけのときは書庫情報の一覧を表示する様に
することで、解凍時には第2引数の解凍先の指定が必須となった。
0.0.4 2012-10-05  unzip-cp932の本体をunzip4cp932()関数に記述し、最下部の
実行部分はその引数定義に留めた。またunzip4cp932()関数はフロー
中心の記述に留め、具体的な処理は個別関数に記述した。
 また、オリジナルのunzipと異なり一覧表示時の項目幅も引数で
カスタマイズ可能にした。日本語化も変数のリテラル値を変更する
だけだ。
0.0.5 2012-10-06  ユニバーサルなunicode変換関数ucode()を適用、cp932に限らず
ZIP書庫情報の文字化けに対応した(つもり)。但し、既定では、現在
ucode()のencoding候補のencodingsには日本語関係のみ搭載。
[ 恒久的な別解としては、Python標準モジュールのzipfile.pyへの
patch作成もある。ここで充分テストした上で考えることにする。]
 zipとして読めないときのメッセージ表示を追加。
 このリリースより、名称をunzip-cp932からuunzipに変更。
0.0.6 2012-10-18  独自様式ながら、main()関数内定義の一部変数について、コマンド
オプションで、指定可能にした。u_unzip()関数にはuuzipの全機能を
main()関数は既定値の設定に加え、u_unzip()関数内のコマンド引数
の処理を移行、「味噌も○ ○ も」的色彩を薄めた。これにより、
encodingとencodingsを指定替えすることで多言語利用での「下手な
鉄砲も数打ちゃ中る」的精度と効率を上げることが取り敢えず可能に
なった。
0.0.6a 2012-10-23  ucode()関数のencoding名をPython内定義名称に統一し重複除去
Clean up source. edited documents of this help and functions.
enabled help customize with making help file. wrote on help
command options example.for other language users.
"""
__todo__ = u"""【TODO】: 対応する気はないけど(笑)備忘の為、課題を列記
*  オリジナルのunzipとは異なり、zip解凍の機能のみをpythonで実現したものだ。
従って、不具合解決や思いついた仕様を何時でも盛り込める。
*  ただ、unzip同等にコマンドとして実行するには、その為、Linux環境別に第1行目の
pythonへのpathを調整する必要がある。これは別途listallerで近日対応予定だ。
*  オリジナルのunzipとは異なり、unzipにある豊富なオプションには完全未対応。
これについては、強制上書等コマンド処理で有効なものはいずれ実現させる予定だ。
*  オリジナルのunzipとは異なり、第1引数のzipファイルのみを指定した場合は、
その書庫内のファイル一覧を表示する仕様としている。その為、解凍には第2引数の
「解凍先ディレクトリ」の指定が最低限必須となる仕様とした。
*  オリジナルのunzipとは異なり、第2引数は「解凍先ディレクトリ」の固定であり、
解凍対象ファイル名ではない。第3引数以降が解凍対象ファイルの指定席である。
*  現公開スタイルはBlogでのこのソースコードの表示公開のみだ。いくらLinux用と
言っても一般ユーザにはinstaller添付の配布パッケージが必要だろう。installerは
別途汎用で作成した上で、配布パッケージファイルを作成し近日DL可能にしたい。
"""

### 【専用関数】 ###
def read_help(file='uunzip.hlp'):
u"""
replace help_text function
"""
from os.path import exists
if exists(file):
fpi = open(file, 'r')
lines = fpi.readlines()
fpi.close()
help_txt = u''.join(lines)
return help_txt
else:
return None

def prn_help(pub_vanames=[], variables={}, help_txt=None):
u"""display help func.
簡易ヘルプ表示の関数
"""
if help_txt==None:
help_txt = u"""uunzip(unzip-cp932) %s of %s. Maintained by %s. Send bug
reports using %s
You can use uunzip(unzip-cp932 old name) and this source code under the terms of
the \'%s\' Licence.(See for detail: http://www.gnu.org/licenses/gpl.html )

USAGE: uunzip[ --help][ <a zip file>[ <path for extract files into>[ <file1> ...][ <valiable>=<value> ...]]]

1. Displays this.help.and values of public variables.
unnzip
or
unnzip --help

2. Displays files infomation list in zip file's archive.
uunzip <1.zipfile>

3. Extracts all archive files into specified path.
uunzip <1.zipfile> <2.path for extract files into>

4. Extracts specified file(s) into specified path.
uunzip <1.zipfile> <2. path for extract files into> <3.file1> <3.file2> ...

5. Specifies zip file's encoding.
uunzip <1> <2> <3> ... encoding='<zip file's encoding>'

6. Specifies zip files's encodings for your languages
uunzip <1> <2> <3> ... "encodings=['<encoding1>','<encoding2>'...]"

7. Transrates uunzip display. Please, transrate to your language.
uunzip <1> <2> <3> ... "answers=['y','n','A','N','r']"\\
msg_replace='\\rreplace \\"%%s\\"? [y]es, [n]o, [A]ll, [N]one, [r]ename: '\\
msg_zippath='\\rArchive: '\\
msg_new_name='\\rnew name[%%s]: '\\
msg_mkdir='\\rcreating: \\"%%s\\"'\\
msg_exit='\\r%%s was stoped.'\\
msg_skip='\\r\\"%%s\\" was skipped over.'\\
msg_unzip='\\rinflating: \\"%%s\\"'\\
msg_exists='uunzip: cannot find or open'\\
msg_readerr='Cannot read this file as zip.'\\
"zinfo_items=[u'Length ',u'Date',u'Time',u'Name']"\\
"zinfo_widths=[9,10,5,4]"\\
zinfo_files='files'\\
param='param'

8. Checks the value of variables spcified for customizing uunzip.
uunzip <1> <2> <3> ... <variable1>=<value> help=True

UUNZIP(Uni UNZIP) unzips an zip arcive file that created with OS for any
language encoding. Default setup is for Japanese Language encodings. If not
worked well, Set encoding, encoding0 and enocdings option for your language's
encodings. Command line option helps you to custamize for your zip archive files
created with Other Operation System.

Command line options of UUNZIP


See below for detail in Japanese.

詳細は下記参照(日本語のみ)

利用方法: uunzip[ --help][ <zipファイル>[ <解凍先ディレクトリ>[ <解凍対象ファイル1> ...][ <変数名>=<値> ...]]]

※ 書庫情報の表示には「ZIPファイル」1つを指定する。さらにZIP書庫内ファイルの
全解凍には「解凍先ディレクトリ」を続けて引数指定する。ZIP書庫内の特定ファイル
のみを解凍したい場合には、その後にそれらのファイル名を続けて引数指定する。
動作上の見栄えはunzipを模倣していているがコマンド式の多様なオプションは一切
実装していない。しかし以下の独自仕様で「文字コードの指定」「表示の日本語化」
を実現している。従って、よく使うオプションについては、Windowsであればbatch、
Linux系であれば、shellスクリプトに、その実行通り記述し、それを実行すれことで
容易にカスタマイズ出来る。uunzipは相応の蓋然性で多言語環境でも上手く文字化けを
回避するとは思うが、それが出来ない場合にはencoding、encoding0そしてencodingsに
以下の例示を参考に試して頂くと解決出来る可能性が高いものと思う。

unzip準拠表記を日本語に : lang (例、lang='ja')
ZIPファイルの文字コード : encoding (例、encoding='latin_1' )
手元PC OSの文字コード : encoding0 (例、encoding0='euc-kr' )
頻出文字コードの優先リスト: encodings (例、encodings=['gb18030','Big5'])
例(exapmles):
简体中文: "encodings=['cp950','big5hkscs','Big5','utf-8']"
繁體中文: "encodings=['gb18030','gbk','GB2312','Big5','hz','utf-8']"
한 국 어: "encodings=['cp949','utf-8','euc-kr','iso2022_kr','johab']"
西  欧: "encodings=['cp1250','mac_roman','cp1252','cp850','iso8859_15'
,'latin_1','utf-8','cp1140','cp500']"
※ 用途に合わせ要編集(Edit for your needs)
全encodingを試すか否か : test_all (例、test_all=True test_all=False)

 また、日本語化同様、他言語表示化も、以下の変数に対するコマンド引数を翻訳し、
適宜レイアウトを調整すれば概ね納得の行くだろう。
 以下に、オリジナルのunzip英語表記のコマンドオプション引数と日本語表記の例を
示しておくので、テキストエディタ上にコピペの上お好きな言語に翻訳した後に、
uunzup の後にコマンドオプションとして付けて実行して試てエラーにならず、正しく
「【変更可能な変数と現在値】」として表示されたら成功だ。必要によりencoding、
encodings及びencoding0辺りを上記のものを参考に適切に補完すれば、手持ちの殆どの
ZIPファイルが処理可能になるものと思う。文字列は全てunicode文字列であることが
必須で、スペース文字や引用符を含む場合に正しくOSに認識させるには含む引用符とは
異なる引用符で引数全体を囲む必要があることを忘れないで頂きたい。

"answers=['y','n','A','N','r']"\\
msg_replace='\\rreplace \\"%%s\\"? [y]es, [n]o, [A]ll, [N]one, [r]ename: '\\
msg_zippath='\\rArchive: '\\
msg_new_name='\\rnew name[%%s]: '\\
msg_mkdir='\\rcreating: \\"%%s\\"'\\
msg_exit='\\r%%s was stoped.'\\
msg_skip='\\r\\"%%s\\" was skipped over.'\\
msg_unzip='\\rinflating: \\"%%s\\"'\\
msg_exists='uunzip: cannot find or open'\\
msg_readerr='Cannot read this file as zip.'\\
"zinfo_items=[u'Length ',u'Date',u'Time',u'Name']"\\
"zinfo_widths=[9,10,5,4]"\\
zinfo_files='files'\\
param='param'

「lang='ja'」相当の翻訳でのコマンドオプション引数の例:

"answers=['y','n','A','N','r']"\\
msg_replace='\\r既存ファイル:\\"%%s\\"\\nこれを上書きしても宜しいのですか?\\nやる[y], 抜かす[n], 有る分全部上書き[A], 何もせず終了[N], 別名なら保管[r]: '\\
msg_zippath='\\r書庫ファイル: '\\
msg_new_name='\\r新たな名前[%%s]: '\\
msg_mkdir='\\r作成中: \\"%%s\\"'\\
msg_exit='\\r%%s は以降の処理を中止しました。'\\
msg_skip='\\r\\"%%s\\" を飛ばしました。'\\
msg_unzip='\\r解凍中: \\"%%s\\"'\\
msg_exists='uunzip: 探せないか開けません'\\
msg_readerr='ZIPとして読めません。\\nこれがZIPファイルなら再取得をお勧めします。'\\
"zinfo_items=[u'サイズ ',u'年-月-日',u'時:分',u'ファイル名']"\\
"zinfo_widths=[9,10,5,4]"\\
zinfo_files='件'\\
param='引数'

※ また逐一uunzip実行の度に、これらのコマンドオプションを手打ちやコピペするのは
非効率だ。確実なコマンドオプションの組合せが作成出来たなら、それをLinuxなら
シェルスクリプト、Windowsならバッチファイルにしてしまえば良いだろうし、他の
周辺ユーザにも提供したいなら、当方のBlogに連絡頂ければ適切な言語区分で機能する
様対処するつもりだ。

 同様に、このヘルプ文書(help_txt)も理論的には翻訳すれば同様の方法で可能かも
しれないが、引数で渡すにはあまりに大き過ぎるので、テキストファイル(help_file)
で指定出来る様にしている。このヘルプ文書の他言語訳または独自のヘルプ文書を書き
込んだファイルが、変数help_fileの示すパス存在すれば、そちらが優先表示される。

【コマンドオプションについて】
 以下の仕様で一部変数の既定値を変更可能です(変更可能な全変数は末尾を参照)。

<変数名>=<値> : 単一の整数、浮動小数点、論理値、None等
<変数名>='<値>' : 半角英数による文字列
<変数名>=u'<値>' : 日本語文字列等のUNICODE文字列
<変数名>=[<数値>, ...] : 数値の配列リスト
"<変数名>=['<値>', ...]" : 文字列の配列リスト
"<変数名>=[u'<値>', ...]" : UNICODE文字列の配列リスト

※ 蛇足ながら解凍後のファイル中の文字コード自体は当然圧縮時のままです。ファイル
の中身のコード変換は例えばnkf辺りがその守備範囲だ。そこ辺りを探って頂きたい。

【解凍先での上書きトラブル対応】
 また、解凍先に解凍ファイルと同じ名のファイルがある場合は、以下の様にその対応を
オリジナルのunzip同様、選択出来る様にしている。

%s

 [y]es : 上書きとする。※ 既存のファイルは復活出来ない。
 [n]o : 上書きしない。※ ファイルは既存のままで整合検査が必要なことも。
 [A]ll : 全てを上書き。※ 既存のファイルがあれば、それは復活出来ない。
 [N]one : 処理を中止。 ※ もう、何(None)もしません(笑)。
 [r]ename : 別名前で実行。※ オリジナルのunzipと異なり新ファイル名候補も提示。

 尚、「[r]ename」ではファイル名の末尾に数字を附加したファイル名を生成し候補と
して提示する。それで是なら改行、否ならCtrl+Shift+CとCtrl+Shift+Vでコピペする等
して、ファイル名入力し改行することになる。そうして、指定したファイル名が重複
していないなら解凍が実行され、不意の上書きは防止出来る。
 しかし、このuunzip(旧称unzip-cp932)には<解凍先ディレクトリ>を第2引数で指定
出来るので、一つでも「overwrire?:"<file>"」と表示されたなら[N]oneで何にもせず
処理を中止して、新たに新規の解凍先名を指定しuunzipを実行しZIPの中身全てを解凍
する方が推奨出来る。新規の解凍先名のフォルダは現存しないなら自動で作成し解凍が
なされるので手間は要らないし、テキストファイルならばlinuxの標準コマンドで
「diif -du <dir1> <dir2>」とすることで差分チェックも容易に出来るからだ。

【ライセンス】
 広く活用頂く為、GPLとしてます。GPLの日本語詳細は次のURL等で確認して下さい。
http://sourceforge.jp/projects/opensource/wiki/licenses%%252FGNU_General_Public_License_version_3.0

 このuunzipは%sライセンスの公開義務等に従いうことでこのソースコードも改変し
ご活用頂けます。その場合の改変内容の公開は不具合連絡同様、下記のBlogへの
コメントで済ませて下さる形で構いません。
%s

%s""" % (__version__, __date__, __author__, __url__, __license__
, ucode(variables['msg_replace'][1:] % ('<file>')), __license__, __url__
, __history__)

print help_txt

## 変更可能な変数名と値の一覧 ##
print u'【変更可能な変数と現在値】'
if variables['zip_name']: #第1引数=ZIPファイル名の値表示
print u'%s=zip : u\'%s\'' % (unicode_ljust('<%s1>' % \
(variables['param']), 8), variables['zip_name'])
else:
print u'%s=zip : None' % \
(unicode_ljust('<%s1>' % (variables['param']), 8))
if variables['dir']: #第2引数=解凍先ディレクトリの値表示
print u'%s=dir : u\'%s\'' % \
(unicode_ljust('<%s2>' % (variables['param']), 8), variables['dir'])
else:
print u'%s=dir : None' % \
(unicode_ljust('<%s2>' % (variables['param']), 8))
print u'%s=file:' % (unicode_ljust('<%s3>' % (variables['param']), 8)),
if (type(variables['selections']) is type(['list'])#第3引数=解凍指示書庫内ファイルの値表示
or type(variables['selections']) is type(('list'))):
#list、またはtupleなら、
s = u'[' # list形式で
v_list=[]
for i in variables['selections']: # list/tuple内変数値を1つずつ、
if type(i) is type('a'): # 文字列型なら、
v_list.append(u'\'%s\'' % ucode(i)) # 文字列表記で
elif type(i) is type(u'a'): # unicode文字列型なら、
v_list.append(u'u\'%s\'' % ucode(i))# unicode文字表記で
elif type(i) is type(1): # 整数型なら
v_list.append(u'%d' % (i)) # 整数として
elif type(i) is type(1.23): # 浮動小数点型なら、
v_list.append(u'%f' % (i)) # 浮動小数点として
elif type(i) is type(None): # Noneなら、
v_list.append(u'None') # Noneとして
elif type(i) is type(True): # Trueなら、
v_list.append(u'True') # Trueとして
elif type(i) is type(False): # Falseなら、
v_list.append(u'False') # Falseとしてv_listに貯込み
s += u','.join(v_list) # v_listをカンマでつなぎ追記
s += u']' # 括弧を閉じてから、
print s # 表示
else: #そうでないなら、
print variables['selections'] # Python標準出力で表示

vals = variables.keys() #変数名リストを作成し
vals.sort() #並べ替え
for v in vals: #それを1つずつ、
if v in pub_vanames: # 公開変数名の分だけ、
if v=='help_txt':
if variables[v]==None:
print u'%-13s: *** \'help_file\' not exists! ***' % (v)
else:
print u'%-13s: *** This help is loaded from help_file. ***' % (v)
elif type(variables[v]) is type('a'): # 文字列なら、
print u'%-13s: \'%s\'' % (v # 非表示の特殊文字を置替えた
, ucode(replaces(variables[v])))# unicode文字表記で表示
elif type(variables[v]) is type(u'a'): # UNICODE文字列なら、
print u'%-13s: u\'%s\'' % (v # 非表示の特殊文字を置替えた
, ucode(replaces(variables[v])))# unicode文字表記で表示
elif (type(variables[v]) is # list、またはtupleなら、
type(['list'])or type(variables[v]) is type(('list'))):
s = u'%-13s: [' % (v) # list形式で
v_list=[]
for i in variables[v]: # list/tuple内変数値を1つずつ、
if type(i) is type('a'): # 文字列型なら、
v_list.append(u'\'%s\'' % ucode(i))
# 文字列表記で
elif type(i) is type(u'a'): # unicode文字列型なら、
v_list.append(u'u\'%s\'' % ucode(i))
# unicode文字表記で
elif type(i) is type(1): # 整数型なら
v_list.append(u'%d' % (i)) # 整数として
elif type(i) is type(1.23): # 浮動小数点型なら、
v_list.append(u'%f' % (i)) # 浮動小数点として
elif type(i) is type(None): # Noneなら、
v_list.append(u'None') # Noneとして
elif type(i) is type(True): # Trueなら、
v_list.append(u'True') # Trueとして
elif type(i) is type(False): # Falseなら、
v_list.append(u'False') # Falseとしてv_listに貯込み
s += u','.join(v_list) # v_listをカンマでつなぎ追記
s += u']' # 括弧を閉じてから、
print s # 表示
else: # それ以外は
print u'%-13s: ' % (v), variables[v]# 変数名の後にpython既定表示

## 個別ファイルの解凍先への解凍処理本体 ##
def unzip(z #ZipFileオブジェクト
, unicode_name #unicode変換後のファイル名
, name #素のzip書庫内のファイル名
, filepath #zip書庫内ファイルの書出し先フルパス名
, msg_unzip=u'\rinflating: \"%s\"' #zip書庫内ファイルの解凍時のメッセージ
, bites=256): #書込み単位バイト数
u"""unzip a file from a zip file into filepath
個別ファイルの解凍先への解凍処理の本体関数、既存ファイル
の上書き判定でも同じ記述となるので冗長性解消の為に関数化
"""
print msg_unzip % (unicode_name)#解凍処理中の個別ファイル名を表示(2012-09-30)
#引用符で囲んで表示する様に変更(2012-10-01)
x = z.open(name, 'r') #ZIPファイル内の中身ファイルを開く
fpo = open(filepath, 'wb') #unicode文字列化したファイルの書込みを
d = x.read(bites) #ZIP内の個別ファイルを256biteずつ(既定)読取り
while d: #中身がある限り、ループ継続
fpo.write(d) # 解凍して行く
d = x.read(bites) # 次の256バイト(既定)を読取り、ループ折返し
x.close() #ZIPファイル内の中身ファイルを閉じる
fpo.close() #unicode文字列化したファイルを閉じる

def prn_ZipInfo(zip_name, encoding=None, encodings=[], test_all=False
, msg_zippath=u'\rfilepath:'
, zinfo_items = [u'Length ', u'Date', u'Time', u'Name'] #リスト項目名
, zinfo_widths = [9, 10, 5, 4] #リスト項目幅
, zinfo_line = u'-' #罫線用文字
, zinfo_files=u'files' #ファイル数の数詞
, msg_readerr=u'Cannot read this file as zip.' #zipとして読めないとき
):
u"""display archive infomation list in a zip file, such as 'unzip -l'
以下の様式の「unzip -l」相等の書庫情報一覧を表示する関数
既定値では以下の通り、
Length Date Time Name
--------- ---------- ----- ----
12345 2012-10-04 12:34 readme.txt
--------- -------
123456789 123 files
 但し、「unzip -l」の様にファイル長が9桁固定のままでは様式が壊れる可能性が
あるので、そこを自動調整可能な方向に仕様変更。2012-10-04
"""
from zipfile import ZipFile, BadZipfile #ZIP形式の圧縮ファイルの操作
t = zinfo_items
w = zinfo_widths
zinfo_size = u'%%%dd ' % (w[0])
print msg_zippath, zip_name #の引数を画面出力
# ZipFileオブジェクト生成 #
try:
z = ZipFile(zip_name, 'r') # 第1引数指定のZIPを読込モードで開き
except:
print msg_readerr # zipとして読めない旨表示し
return # prn_ZipInfo()を抜け
# (u_unzip()に戻りuunzip終端に)

sum , count = ZipInfo_sum(z) #総ファイルサイズ, ファイル総数
l = len('%d' % (sum)) #総ファイルサイズの表示文字数(幅)
max_len = max(w[0], l)
zinfo_header0 = u'%s %s %s %s' % (unicode_rjust(t[0], max_len)
, unicode_center(t[1], w[1]), unicode_ljust(t[2], w[2])
, t[3]) #項目名ヘッダー
zinfo_header1 = u'%s %s %s %s' % (''.ljust(max_len, '-')
, ''.ljust(w[1], '-'), ''.ljust(w[2], '-')
, ''.ljust(max(w[3], unicode_width(t[3])), '-'))
#罫線ヘッダー
cnt_str = u'%d %s' % (count, zinfo_files) #ファイル件数
zinfo_footer0=u'%s %s %s %s' % (''.ljust(max_len, '-')
, ''.ljust(w[1], ' '), ''.ljust(w[2], ' ')
, ''.ljust(unicode_width(cnt_str), '-'))
#罫線フッター
print zinfo_header0 #u' Length Date Time Name'
print zinfo_header1 #u'--------- ---------- ----- ----'
infolist = z.infolist() # 指定したZIPの書庫情報リストを取得
for info in infolist: # 書庫情報リストからファイル情報を順に取出し
print zinfo_size % (info.file_size) , # 解凍後のファイルサイズ
print u'%4d-%02d-%02d %02d:%02d' % ( # unzipでは「月-日-年」の順だか
info.date_time[:5]),# ISO準拠の「年-月-日」の仕様に
print u' \"%s\"' % ( # 空白文字を含むものをcopy&pasteする時に
ucode(info.filename, encoding, encodings, test_all))
# 有用な二重引用符囲みな仕様に
zinfo_footer1 = u'%%%dd %%s' % (w[0])
print zinfo_footer0 #u'--------- -------'
print zinfo_footer1 % (sum, cnt_str) #u'%9d %d files'

def ZipInfo_sum(z):
u"""total sizes of archive file infomation
書庫情報の総ファイル長とファイル数のタプルを返す関数
用途先: prn_ZipInfo()関数内のヘッダーとフッダーの項目幅決定で活用
"""
sum = 0 #解凍後の総ファイルサイズの初期化
infolist = z.infolist() #書庫情報リストを取得
for info in infolist: #そのリストから書庫情報を1つずつ
sum = sum + info.file_size # 解凍後の総ファイルサイズに加算
return sum, len(infolist) #総ファイル長とファイル数のタプルを返す

def exist_filename(filename #ファイルのフルパス名
, ext #補完する拡張子
, message='cannot find'): #ファイル不存在時のメッセージ
u"""file name exists in zip file archive
拡張子補完を含め、指定名のファイルの
存在を確認し在れば名前を返し無いなら
messageを表示した上でNoneを返す関数

uunzip: cannot find or open "abc.zip"
, "abc.zip.zip"
or "abc.zip.ZIP"
"""
from os.path import exists
f1 = '.'.join([filename, ext.lower()]) #第1引数+'.zip'
f2 = '.'.join([filename, ext.upper()]) #第1引数+'.ZIP'
if exists(filename): #第1引数が実在ファイルなら
return filename # 第1引数をZIPファイル名に
elif exists(f1): #第1引数+'.zip'が実在ファイルなら
return f1 # 第1引数+'.zip'をZIPファイル名に
elif exists(f2): #第1引数+'.ZIP'が実在ファイルなら
return f2 # 第1引数+'.ZIP'をZIPファイル名に
else: #第1引数のファイルは不存在なら
print message, # その旨表示して
l = unicode_width(message) # メッセージの文字長 ※全角半角未対応!!
print '\"%s\"' % (filename) # 比較したファイル名候補を
print '%s,' % (''.ljust(l-1)), # オリジナルのunzipにならい表示
print '\"%s\"' % (f1) #  但し、ファイル名の候補は比較し易い
print '%sor' % (''.ljust(l-2)), # 様に改行し頭を揃える様にした。
print '\"%s\"' % (f2) #
#exit() # ※ システム終了は、活用側記述とする
return None # Noneを返す

def and_items(list1, list0, encoding0, encoding, encodings, test_all):
u""" list of file names common to both lists of text into unicode
2つのリスト共通の文字列を返す関数(各要素は文字列に限る)
用途: 書庫情報list0と入力値list1で一致するリストの生成
"""
and_list=[] #解凍対象ファイル名のリスト
for item1 in list1: #順に
itm1 = ucode(item1, encoding0, encodings, test_all)
# 比較の為unicode文字列にしてから
i = 0
for item0 in list0: # ZIP内ファイル名一覧の中で
if itm1==ucode(item0, encoding, encodings, test_all):
# 解凍可能な完全一致の分は
and_list.append(item0) # 解凍対象ファイルリストに追加
exit # ループから抜ける
and_list = sorted(set(and_list), key=and_list.index)
return and_list #重複除去後のlistを返す

def new_name(wname, i=1, prompt=u'\rnew name[%s]: ', code='utf-8'):
u"""prompt with a file name candidate for rename
既存ファイル名と重複しない3桁の数値iを附記した候補の
ファイル名を提示した上で、ファイル名入力を促す関数
"""
from os.path import exists, splitext #ファイルの存否判定, 拡張子分離用
from sys import stdin #コマンドラインからの標準入力
root, ext = splitext(wname) #拡張子を分離し
fpath = wname #初期値には元々のファイル名をセットし
while exists(fpath): #生成文字列のファイルが存する限り、
fpath = '%s_%03d%s' % (root, i, ext)# 3桁数字附加のファイル名を生成
if exists(fpath): # 生成文字列のファイル存在なら
i += 1 # iを進め
else: # ファイルとして不存在なら
print prompt % (fpath), # それを候補として角括弧で表示し
fn = stdin.readline().strip() # ファイル名の手入力を促す
if not fn.strip()=='': # 入力があったら、
fpath = fn # それを書出ファイル名に
return fpath #ループが終わればその新ファイル名を返す
続きを読む
posted by Mire at 03:35 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2012年10月05日

【Linux】文字化けで解凍不能なZIPファイル用「unzip-cp932」第4版リリース

 初版リリースから、色々と手を入れて来たがようやく満足の行くレベルに達し、やることが無くなって来たので、再度、ここに掲載することにした。
 機能的には、依然、オリジナルのunzipの持つ豊富なオプションは実装していないが、ZIPの書庫情報表示、解凍対象ファイル(複数可)指定、そして、解凍対象ファイルと同名の既存ファイルがある場合のunzip同等の対応を実現したことで基本的に必要となるものは網羅出来たものと考えている。
 また、好みの問題だが、基本的に埋込みのリテラル値については関数の引数として、変数定義しているので、日本語化や文字コードを入れ替えることで、Windows側で文字化けするZIPファイルの解凍作業にも活用出来る様に変更することが出来るものと思う。

 但し、依然、インストーラは作成していないので、単独での利用に当たっては初版同様コピペでファイルを作った上で1行目を環境に合わせ修正保存後、「chmod +x」で実行モードを有効にし、「/usr/local/bin」等の環境変数PATHの及ぶ区画に移動することは、必要となっている。

 第4版のソースコードは以下の通りなので、良ければ、ご活用頂きたい。続きを読む
posted by Mire at 05:03 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする
月額見放題1,000円開始キャンペーンバナー(画像ありver)
紺碧の艦隊 ルパン三世 GREAT CHASE クリックプロモーション
<< 2013年01月 >>
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
カテゴリ
タグクラウド
ファン
利用中のオープンソース
最近のコメント
最近の記事
過去ログ
QRコード
レガシーなアプリはいかが?
Dell 法人のお客様ページ
  • 【法人様向け】デル、お得なキャンペーン情報
  • 法人のお客様向け ストレージソリューション
  • 法人のお客様向け ネットワークソリューション
  • 【SOHO法人様向け】デル・オンライン広告限定ページ
  • デル-個人のお客様ページ
  • 【個人のお客様向け】デル・オンライン広告限定ページ
  • オンライン広告限定キャンペーンページ
  • ソフトウェア&周辺機器 パソコン工房
    ツートップインターネットショップ(twotop.co.jp) マウスコンピューター/G-Tune
  • ×

    この広告は1年以上新しい記事の投稿がないブログに表示されております。