桜鯰フォント : 毛筆で現代的でバランスのいい字体でフリーで漢字が使える凄いフォント


フリーフォントで簡単ロゴ作成で再現

とにかく凄いです。稀有で貴重なフリーフォントなんですが、なかなか探す気にならないと出会えないフォントです。ダウンロードはできるのですが・・・

http://ux.getuploader.com/sumineko/download/1/Ounen-mouhitsu.otf

フォントが単体でアップロードされているのみです。
( この場所もイマイチ良く解らない場所 )

作者さんの Twitter アカウントはなんとか Google 検索で確認できるのですが、もう使用しておられないようです。

フリーフォントは、インターネットで配布されていつのまにか配布元が消えてしまうという事は良くあります。このフォントもフリーという事で深く追求しないほうがいいのかもしれません


フリーフォント

SILオープンフォントライセンスに対する基本的な考え方

みんなで自由に使う

まず、できない事がただ一つあります。それは、『元のフォントと同じ名前を使えない』という当たり前の事で、これは『自由にみんなで使えるフォント正しく管理する』という目的だと思えばいいと思います。この制約にしても、実は元の著作権所有者が書面による明示的な許可を与えておれば可能のようなので、『制約』というものには到底あたらないと思います。 ライセンス的な文章を読み取る場合、あといくつか制限がありますが、残りのものは殆ど『みんなで自由に使うためのルール』のようなものです。

1) 単体で販売してはならない

これを許してしまうと、オープンソースライセンスと矛盾してしまいます。だから禁止されていますが、たとえば『Hello world』のような簡易なプログラムであっても同梱することで回避することが出来るので、これは『オープンソースライセンスですよ』と言ってるだけです。

2) 派生フォントは SILオープンフォントライセンスです

『フォントソフトウェアは、改変の有無にかかわらず、一部または全体を問わず、すべてをこのライセンスに基づいて配布しなければならず、また、他のライセンスに基づいて配布することはできない』 これも当たり前で、オープンソースライセンスの骨子ですね。これを制限しないと、途中で誰かが勝手な事をして、みんなで使えない事になってしまいます。

3) 他のソフトウェアと同梱する場合は

誰でもフォントを自由に使える事が解るようにする必要があります(つまりライセンス情報を付加しなさいって事)。それさえ守れば、同梱したソフトウェアを SILオープンフォント 込みで、再配布しようが、販売しようが自由って事です。

4) フォントから作られたグラフィックは

当然、そのグラフィックを作った人が著作者となります。グラフィックを作った人は、そのフォントを『使っただけ』なので、何の制約も受けません。もちろん元のフォントが持つライセンスも何も関係ありません。ただ、気持ちとして『これ使ったんだよ』と明示する事を阻む理由は無いので自由にやって下さいという事になります。 これに関しては、SIL へメールを送った人のブログにあったのですが、現在消失しているのでインターネットアーカイブから確認できます

参考リンク

SIL Open Font License (SILオープンフォントライセンス) SIL Open Font License(wikipedia) 関連する記事 IPAフォントライセンスv1.0 の骨子について

IPAフォントライセンスv1.0 の骨子について

2016-02-21

IPAフォントと再配布の自由

とても簡単な事で、IPAフォントを元にして作成されたフォントは、IPAフォントと同じように、『再配布の自由を制限してはならない』という事です。 具体的に書かれている箇所は以下のとおりです。
3.3.3 Web等のだれもがアクセスできる方法により一般公開しなくてはならない。
派生プログラムを再配布する際には、作成した当該派生プログラムを一般公開しなければなりません。一般公開とは、当該派生プログラムを誰もが自由に入手できるようWeb等に公開することです。すなわち、派生プログラムを、ハードウエア製品等に内蔵させて配布する場合には、別途、Web等による一般公開が必要となります。また公開いただいた派生プログラムは、第三者の誰もが「IPAフォントライセンスv1.0」のもとで公開し再配布できることを明示してください。

この内容からも明らかですが、IPAフォントから作られたフォントは全て『誰でも自由に使えなければならない』という事です。言い換えると、勝手に追加の制限事項を派生プログラムが指定してはならないという事です。

これには実例があります

IPAフォントライセンスv1.0は非共存ライセンスと判明

この記事では、切り口が『共存』というところなので、この骨子とは少しズレた展開になっていますが、前述の骨子を前提に読んでいくととても内容が明瞭になっていきます。また、この内容には続きがあって以下のような記事もあります。

MigMixフォントのライセンス変更要求に関して

ここでは、『最も制約の厳しいライセンスが全体のライセンスと等しくなる』が中核ですが、結局 M+ と IPAフォントライセンスv1.0 をどちらも許してしまうと、矛盾が生じます。何故なら、 M+ では、派生プログラムに新たに制限を加える事は許されていますが、IPAフォントライセンスv1.0 ではそれは許されていません。つまり、矛盾が生じるわけです。

結論

オープンソースライセンスとして、継承されるものは全て元と同じ自由を保証しなければならないという事です。

8. 特定製品でのみ有効なライセンスの禁止

プログラムに付与された権利は、それがある特定のソフトウェア配布物の一部で あるということに依存するものであってはなりません。プログラムをその配布物 から取り出したとしても、そのプログラム自身のライセンスの範囲内で使用ある いは配布される限り、プログラムが再配布される全ての人々が、元のソフトウェ ア配布物において与えられていた権利と同等の権利を有することを保証しなけれ ばなりません。 

IPAフォントライセンスはOSIによる「オープンソース定義(OSD)」に準拠したライセンスと認定されている。
(※ MigMixフォントのライセンス変更要求に関しての記事内より)

※ 元記事は 2015年03月28日 作成

▼ 以下 2015年08月08日 追記

では、WEBフォントとしてはどうか

結論として IPA フォント(または IPAフォントを元に作られたフォント)は WEBフォントとして使用可能です。ですが、利用の際に面倒なライセンス上のルールがあるので『使わないでおこう』と思わざるを得ない内容になっています。( 使える使え無いでいうと、IPA フォント自体や、IPA フォントを元にして作られたフォントは『自由に使えなければならない』というのがライセンスの骨子なので、使えて当たり前なんですけれど )

で、別に IPA である必要も無く、M+ フォントや他にいくらでも使える日本語フォントがあるわけですし。

それでも使おうという場合は、実際に IPA へ問い合わせた実績のもと記述された記事があるので参照して下さい。

WebフォントのCSSとライセンス記載まとめ

2016-06-17 に LIXIL INAX に 30年前の便器を買い替えた。排水管が長いので、大洗浄8L 仕様に変更してもらって、止水栓のメータで計ったら 9L 流れた。そういうもんか ???

2016-06-17

あまり深く考えずに便器を交換したわけです。30年前のものをずっと使って来ていたので、最近の便器の常識とか全く知らなくって、たまたま、タイミング的に『アクアセラミック』という新製品を買うことになった上に、結構な金額の買い物なので、いろいろ興奮もしてましたし。

節水型なんていう意識が全く無かったです

後からインターネットで詳細を調べて、イマドキは 5L で大を流すという事にとても不安を覚えました。 YHBC-ZA10H + YDT-ZA180H のメーカー詳細 『節水型』というキーワードに気が付いたのは、施工業者が作業終わって帰る時の簡単な説明に出てきた時です。その時、過去の古い便器で節水しようとタンクの中にペットボトルを入れて、排水が詰まりかけた記憶が蘇ったわけです。 「うち、排水管長いんで、あまり流れないと困るんですよ」 と、施工業者に問いかけました。すると、業者さんはタンクの中をチラっと見ただけで 「MAX です」 と言い放ったわけです。

施工業者が知らなかった事実

そもそも、カタログ上大洗浄は 5L で、小洗浄は3.8Lなわけです。施工業者は、この便器が 8L 仕様に変更できることを知らなかったのです。 (PDF)ECO6、ECO5 便器の洗浄水量を大洗浄8L( 小洗浄6L) にする方法( WEBアーカイブ ) この PDF は、施工業者が帰った後に疑問に思って調べたらすぐ出て来たものです。これ以外にも、排水管が 10メートルを超える場合には、5L では問題が出るという情報も見つけました。 便器の水量を上げる方法( トイレリフォーム専門店 ) そこで、販売店のほうに電話をかけて、施工業者がこの事実を知らないようだという事実と最後のやりとりを説明してもう一度調整に来てもらうように頼みました。

買った人はもらえない『施工説明書』というもの

再びやって来た施工業者は、メーカーに問い合わせて『施工説明書』の4ページに書いてあると言われた事を私に説明してくれました。そして、帰りにその説明書をいただきました。読んでみると、施工後のチェック項目(水漏れ・溜水面の点検)が書いてあるので、『施工説明書』はもらったほうが吉です。 メーカーに PDF であるのも確認しました。 ちゃんと増量できたかは、目視でもはっきりしていましたが、調整前にタンクがいっぱいになるまでの時間を計ってあったので比べました。結果、かなり増えていたので調整は成功です。 この時、正確な量はわからなかったというか、計る方法に気が付かなかったわけで、あとから計って結構びっくりするわけではあります。

というか、『何故』5L が標準なのか

メーカの 8L に関する必要性に対する説明は、『一部の地域では、便器の洗浄水量が大洗浄8L以上に規定されている場合があります』という理由です。ですから、5L で問題無いという見解なわけです。 しかし、調べてみると実際に詰まってしまうというトラブルの記事をみつけたのですが、この記事からは二つの大きなことを教訓として得る事ができます。 節水トイレの盲点 結論から言うと、この当事者の方のケースは、施工業者が 小と大を反対にセットしてしまった事にあります(初歩的な単なる取り付けミス)。よって、ここからの教訓の二つはこうです。 1) 節水型の 大 で普通に流す事ができる 2) 節水型の 小 では詰まってしまう ここからいろんな事実を知りました。もっとさらに調べたわけで、やはり無知は罪悪だと痛感しました。知らないとイザという時にはとても苦労をしてしまうのは間違い無いようです。

イマどきの節水型とは

トラブルに合われた方のメーカーは TOTO ですが、INAX も同様イマドキの便器では節水型が当たり前で、5L であっても10メートル以上流れる事を試験済みの製品なわけです。(逆に10メートル超えた場合の対応が皆無のようでどうかとは思いますが) 一般的な家庭ではほぼ問題は出ないで 5L で大を流す事ができるようになっています。海外では、水が貴重なので、逆に15L も使うわけなはいかないのです。その量が海外では厳しく決められているそうです。 何故 5L で流す事ができるかは、企業秘密かもしれませんが、一般的には『渦』を使って汚物をうまく流す技術のようです。 でも、3.8L だと詰まる仕様である事は認識しなくてはいけません 知らないで、タンクの中に節水用のなにかを入れると詰まります。また、大のつもりで小を使ってしまうと詰まります( 個人の認識レベルでレバーの向きと大・小 が逆の場合もある )。なにせ、ギリギリの技術のせめぎあいの間での水量なので、ちょっとした間違いで大きなトラブルになるかもしれません。 ウチは、排水が 10メートル超えてるし、曲がってる場所が最低でも2箇所あるし、8L でやっと安心です。小でも、節水時の大より多いですし。 で、実際計ったら・・・ 大で 9L、小で 7.5L でした。これはちょっとなぁ・・・・。メーカーの節水を前面に出してるぶんの誤差にしては大きいと思うんですが。 止水栓は実際に 1.5L のペットボトルに溜めて水量 1.5 と確かめてから、大と小を流しました。

JScript / VBScript : 指定したフォルダ内のフォルダ毎の使用済みサイズを読める範囲でレポートする

▼ JScript のダウンロード

▼ VBScript のダウンロード

System Volume Information は、無駄に使われてる場合が多いそうです。( 今日 5G 削除しました ) ✅ 参考ページ

show-folders-size.js

001.// ************************************************
002.// カンマ編集
003.// ************************************************
004.String.prototype.number_format =
005.function (prefix) {
006.        var num = this.valueOf();
007.        prefix = prefix || '';
008.        num += '';
009.        var splitStr = num.split('.');
010.        var splitLeft = splitStr[0];
011.        var splitRight = splitStr.length > 1 ? '.' + splitStr[1] : '';
012.        var regx = /(\d+)(\d{3})/;
013.        while (regx.test(splitLeft)) {
014.                splitLeft = splitLeft.replace(regx, '$1' + ',' + '$2');
015.        }
016.        return prefix + splitLeft + splitRight;
017.}
018. 
019.// ************************************************
020.// オブジェクト
021.// ************************************************
022.var Shell = new ActiveXObject("Shell.Application");
023.var WshShell = new ActiveXObject("WScript.Shell");
024.var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
025. 
026.// ************************************************
027.// 管理者権限のコマンドプロンプトで再実行
028.// ************************************************
029.if ( WScript.Arguments.length == 0 ) {
030.        Shell.ShellExecute( "cmd.exe", "/c cscript.exe " + Dd(WScript.ScriptFullName) + " next" + " & pause", "", "runas", 1 );
031.        WScript.Quit();
032.}
033. 
034. 
035.var target = SelectDir( "対象フォルダを選択して下さい" )
036.if ( target == "" ) {
037.        WScript.Quit();
038.}
039. 
040.WScript.Echo( target )
041. 
042.// ************************************************
043.// フォルダオブジェクト取得
044.// ************************************************
045.var objFolder =  Fso.GetFolder(target)
046. 
047.var folderCollection = new Enumerator(objFolder.SubFolders);
048. 
049.var TargetSize = 0;
050.var obj;
051.var num;
052.var line;
053.for ( ;!folderCollection.atEnd(); folderCollection.moveNext()) {
054. 
055.        obj = folderCollection.item();
056.         
057.        try {
058.                num = Math.floor(obj.Size / 1024) / 1024;
059.                num = Math.floor( num * 1000 ) / 1000
060.                line = Lpad(("" + num).number_format()," ", 15) + " M : " + obj.Name
061.                WScript.Echo( line );
062. 
063.                // フォルダ全体の合計
064.                TargetSize = TargetSize + obj.Size
065.        }
066.        catch(e) {
067.                WScript.Echo( obj.Name + " : 処理できません");
068.        }
069. 
070.}
071. 
072.WScript.Echo( "" );
073. 
074.num = Math.floor(TargetSize / 1024) / 1024;
075.num = Math.floor( num * 1000 ) / 1000
076.line = Lpad(("" + num).number_format()," ", 15) + " M : " + "表示合計"
077.WScript.Echo( line );
078. 
079.// ************************************************
080.// ディレクトリ選択
081.// ************************************************
082.function SelectDir( strTitle ) {
083. 
084.        var obj
085. 
086.        obj = Shell.BrowseForFolder( 0, strTitle, 0x4B, 0 )
087.        if ( obj == null ) {
088.                return "";
089.        }
090.        if ( !obj.Self.IsFileSystem ) {
091.                ErrorMessage = "ファイルシステムではありません";
092.                return "";
093.        }
094. 
095.        return obj.Self.Path;
096. 
097.}
098. 
099.// ************************************************
100.// ダブルクォートで囲む
101.// ************************************************
102.function Dd( strValue ) {
103. 
104.        return "\"" + strValue + "\""
105. 
106.}
107. 
108.// ************************************************
109.// 指定数、指定文字列左側を埋める
110.// ※少数以下3桁の調整
111.// ************************************************
112.function Lpad( strValue, str, nLen ) {
113. 
114.        var i;
115.        var wk = "";
116. 
117.        for( i = 0; i < nLen; i++ ) {
118.                wk += str;
119.        }
120.         
121.        var test = strValue.split(".");
122.        if ( test.length == 2 ) {
123.                if ( test[1].length == 0 ) {
124.                        strValue += "000"
125.                }
126.                if ( test[1].length == 1 ) {
127.                        strValue += "00"
128.                }
129.                if ( test[1].length == 2 ) {
130.                        strValue += "0"
131.                }
132.        }
133.        else {
134.                strValue += ".000"
135.        }
136. 
137.        return ( wk + strValue ).slice( nLen * -1 );
138. 
139.}


show-folders-size.vbs

001.' ************************************************
002.' 管理者権限で実行用
003.' ************************************************
004.Set Shell = CreateObject( "Shell.Application" )
005. 
006.' ************************************************
007.' 管理者権限で再実行
008.' ************************************************
009.if Wscript.Arguments.Count = 0 then
010.        Shell.ShellExecute "cmd.exe", "/c cscript.exe " & Dd(WScript.ScriptFullName) & " next" & " & pause", "", "runas", 1
011.        Wscript.Quit
012.end if
013. 
014.' ************************************************
015.' 除外フォルダ名を スペースで区切って並べる
016.' (簡易的な除外)
017.' ************************************************
018.Dim Exclude
019.Exclude = ".gem"
020.Exclude = Lcase(Exclude)
021. 
022.' ************************************************
023.' 処理用
024.' ************************************************
025.Set WshShell = CreateObject( "WScript.Shell" )
026.Set Fso = CreateObject( "Scripting.FileSystemObject" )
027. 
028.Dim target
029. 
030.' ************************************************
031.' 対象フォルダを選択
032.' ************************************************
033.target = SelectDir( "対象フォルダを選択して下さい" )
034.if target = "" then
035.        Wscript.Quit
036.end if
037. 
038.Wscript.Echo target
039.Wscript.Echo
040. 
041.' ************************************************
042.' フォルダオブジェクト取得
043.' ************************************************
044.Set objFolder =  Fso.GetFolder(target)
045. 
046.' ************************************************
047.' サブフォルダコレクション取得
048.' ************************************************
049.Set colSubFolder =  objFolder.SubFolders
050. 
051.' ************************************************
052.' 一覧
053.' ************************************************
054.Dim TargetSize : TargetSize = 0
055.For Each obj in colSubFolder
056. 
057.        Do While true
058. 
059.                if InStr(Exclude,Lcase(obj.Name)) > 0 then
060.                        Exit Do
061.                end if
062. 
063.                on error resume next
064.                Wscript.Echo Lpad(FormatNumber((Fix(obj.Size / 1024) / 1024),3)," ", 15) & " M : " & obj.Name
065.                if Err.Number <> 0 then
066.                        Wscript.Echo "                  ( " & obj.Name & " : 処理できません )"
067.                else
068.                        TargetSize = TargetSize + obj.Size
069.                end if
070.                on error goto 0
071. 
072. 
073.                Exit Do
074.        Loop
075. 
076. 
077.Next
078. 
079.Wscript.Echo
080. 
081.Dim AllSize
082.Dim er : er = 0
083.on error resume next
084.AllSize = objFolder.Size
085.if Err.Number <> 0 then
086.        er = 1
087.        AllSize = TargetSize
088.end if
089.on error goto 0
090. 
091. 
092.Wscript.Echo Lpad(FormatNumber((Fix(TargetSize / 1024) / 1024),3)," ", 15) & " M : " & "表示合計"
093. 
094.if er = 1 then
095.        Wscript.Echo "                  ( " & target & " のサイズは取得できませんでした )"
096.else
097.        Wscript.Echo Lpad(FormatNumber((Fix(AllSize / 1024) / 1024),3)," ", 15) & " M : " & target & " のサイズ"
098.end if
099. 
100.Dim fsize : fsize = 0
101.For Each file in objFolder.files
102.        fsize = fsize + file.size
103.Next
104.Wscript.Echo Lpad(FormatNumber((Fix((fsize) / 1024) / 1024),3)," ", 15) & " M : " & target & " 下のファイル"
105. 
106.Wscript.Echo
107. 
108.' ************************************************
109.' ディレクトリ選択
110.' ************************************************
111.Function SelectDir( strTitle )
112. 
113.        Dim obj
114. 
115.        Set obj = Shell.BrowseForFolder( 0, strTitle, &H4B, 0 )
116.        if obj is nothing then
117.                SelectDir = ""
118.                Exit Function
119.        end if
120.        if not obj.Self.IsFileSystem then
121.                ErrorMessage = "ファイルシステムではありません"
122.                SelectDir = ""
123.                Exit Function
124.        end if
125. 
126.        SelectDir = obj.Self.Path
127. 
128.End Function
129. 
130.' ************************************************
131.' ダブルクォートで囲む
132.' ************************************************
133.Function Dd( strValue )
134. 
135.        Dd = """" & strValue & """"
136. 
137.End function
138. 
139.' ************************************************
140.' 指定数、指定文字列左側を埋める
141.' ************************************************
142.Function Lpad( strValue, str, nLen )
143. 
144.        Lpad = Right( String(nLen,str) & strValue, nLen )
145. 
146.End Function




IE11 を アプリケーションのプラットホームとして使う為の3つの設定

この設定を行うと、インターネットにあるページからでも、Windows のディスクやリソースに直接アクセスが可能になります( ActiveX を使用します )。よく利用されるのは、Excel へのアクセスですが、 ローカルネットワークのデータベースにもアクセスが可能です。




✅ インターネット上の任意のサイトを信頼して追加します

※ ここでは localhost です。インターネット上は 自分のサイト業務上のサイト になります

✅ ActiveX の使用を許可します( この設定で多くの処理が可能になります )

1.Windows Registry Editor Version 5.00
2. 
3.[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\2]
4."1201"=dword:00000000

✅ 以下は ADO でのデーターベースアクセスに必要です

1.Windows Registry Editor Version 5.00
2. 
3.[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\2]
4."1406"=dword:00000000

✅ クリップボードからの貼り付けができるのは IE11 のみです。

通常でもクリップボードへのコピーは可能で、他のブラウザでもクリップボードへのコピーは可能です。
1.Windows Registry Editor Version 5.00
2. 
3.[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\2]
4."1407"=dword:00000000

18年前より IE を使用して、イントラネットの IIS のページ上に表示されたデータを Excel に転送して印刷に使うという処理を今も続けています。Excel でフォーマットを作っておくと、イレギュラーが発生しても Excel を直接変更すれば対応可能です。

大量な単独データが印刷が必要な場合はさすがに PDF( TCPDF ) を使用していますが、単票なら Excel に勝るものはありません。

IIS のタイムアウトを避けるような処理であれば、ADO で直接データーベースにアクセスして様々なデータをローカルに出力できます。

また、Excel のデータを複数セルでコピーして、IE11 の入力フィールドに貼り付けたり直接初期データを登録する事も可能になります。

さらにこれらのページ処理は、HTML だけで完結できる場合は拡張子を .hta として使う事もできます( 最初から HTA 目的で作成するのならば、IE11 の設定は必要ありませんが、HTA のデフォルトを最新にしておく為の META 要素が必要になります。 )

<meta http-equiv="x-ua-compatible" content="ie=edge">

❎ 注意事項として、IE11 のデフォルト状態では、VBSCript は利用できないので、VBScript が必要な場合は META 要素で IE10 以下を設定する必要があります。

<meta http-equiv="X-UA-Compatible" content="IE=8">

関連する記事

IE11 で VBScript のクラスを使用して Excel(Excel.Application) の処理を検証

HTML Application : JavaScript で新しい Excel の Book を作成する

IE11 上でコマンドプロントを模したページ

コマンドプロンプト on IE11( サイトを信頼して設定した場合 )

関連する記事

HTA / ADO / Jscript : Access( .accdb .mdb ) の読み込みと表示

サクラエディタの初期設定

ダウンロード

ダウンロード( 32ビット / Installer.zip ) ※ 設定をそのままでバージョンアップしたい場合は、exe.zip をダウンロードしてインストールフォルダの中に上書きコピー ( 以下、C:\app\sakura\sakura.exe としてインストールしています )

インストール時のオプション

✅ SAKURAで開くのチェックは特に必要ではありませんが、そのレジストリ登録結果は以下の内容になります。( インストールパスは書き換えてください )
1.Windows Registry Editor Version 5.00
2. 
3.[HKEY_CLASSES_ROOT\*\shell\sakuraeditor]
4.@="SAKURAで開く(&E)"
5. 
6.[HKEY_CLASSES_ROOT\*\shell\sakuraeditor\command]
7.@="\"C:\\app\\sakura\\sakura.exe\" \"%1\""



✅ アイコンも表示したいのであれば以下のレジストリの Icon 部分を追加します


1.Windows Registry Editor Version 5.00
2. 
3.[HKEY_CLASSES_ROOT\*\shell\sakuraeditor]
4.@="SAKURAで開く(&E)"
5."Icon"="\"C:\\app\\sakura\\sakura.exe\",0"
6. 
7.[HKEY_CLASSES_ROOT\*\shell\sakuraeditor\command]
8.@="\"C:\\app\\sakura\\sakura.exe\" \"%1\""

クリックで URL を選択しない

✅ これをしておかないと、URL の部分文字列を選択できません

タブバーを表示

✅ この機能がサクラエディタの大きなメリットで、FileZilla でサーバのファイルをタブで変更して素早く編集できます

フォントの設定

✅ デフォルトでは少し小さすぎるので調整します

タブ毎に閉じるボタンを表示する

✅ 作業が速やかに行えます

他で変更されたファイルの同期

✅ サーバ上のファイルが変更された場合に再読み込みします

空白文字を表示させる

✅ 設定がタイプ毎になりますが、まずは基本で設定変更すれば登録されてない拡張子の設定となります。

拡張子の追加

✅ 新たにタイプを追加せずとも、ほぼ同様であれば追加するだけで済みます。

サクラエディタが持っている他の言語を追加登録する

✅ keyword フォルダにある .KWD ファイルを使って PHP 言語を追加しました ※ 少しプロセスが多いので、一つづつ確認しながら行ってください ✅ PHP では HTML も同時に表示される事が多いので、以下のように追加します ✅ 第二以降はオレンジで見にくいので変更します。

Python : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する



pywin32 の利用

Python で Excel を扱うパッケージは openpyxl ですが、Excel の仕様に合わせてファイルを作成しているだけなので、Autofill が利用できません。そこで、ここでは pywin32 を使用して Excel.Application を直接操作します( 実行する PC は Windows で Excel がインストールされている必要があります )。

その前に pip そのものの更新確認

python -m pip install --upgrade pip

先日 pip からアップグレードしようとしたら、見事にバグって pip が無くなってしまいました。その場合は https://bootstrap.pypa.io/get-pip.py から get-pip.py をダウンロードして python get-pip.py を実行します。

それ以降、python から アップグレードするようにしています。

pywin32 のインストール

pip install pywin32

pywin32 は、Windows の COM を処理する為のブリッジです。ですから、Excel.Application に限らず 以下のようなクラスを利用できるようになります。

✅ ADODB.Connection
✅ ADODB.Recordset
✅ ADODB.Stream
✅ WScript.Shell
✅ Shell.Application
✅ Scripting.FileSystemObject
✅ Msxml2.ServerXMLHTTP
✅ CDO.Message
✅ Scripting.Dictionary

▼ pip list

excel-autofill.py

Autofill する為に範囲を選択していますが、Sheet.Cells(1, 2) のように数字で全て表現できるようにしています。これはプログラミングを容易にする事が目的ですが、視認しやすいように Range("A1:A2") と言うような記述方法も可能です

01.import win32com.client
02.import traceback
03.import sys
04.import os
05. 
06.ExcelApp = win32com.client.Dispatch("Excel.Application")
07.# デバッグ時は、Excel の本体を表示させて状況が解るようにする
08.ExcelApp.Visible = True
09.# UI でチェックさせるようなダイアログを表示せずに実行する
10.ExcelApp.DisplayAlerts = False
11. 
12.try:
13.    # ****************************
14.    # ブック追加
15.    # ****************************
16.    Book = ExcelApp.Workbooks.Add()
17. 
18.    # 通常一つのシートが作成されています
19.    Sheet = Book.Worksheets( 1 )
20. 
21.    # ****************************
22.    # シート名変更
23.    # ****************************
24.    Sheet.Name = "Pythonの処理";
25. 
26.    # ****************************
27.    # セルに値を直接セット
28.    # ****************************
29.    for i in range(1, 11):
30.        Sheet.Cells(i, 1).Value = f"処理 : {i}"
31. 
32.    # ****************************
33.    # 1つのセルから
34.    # AutoFill で値をセット
35.    # ****************************
36.    Sheet.Cells(1, 2).Value = "子"
37.    # 基となるセル範囲
38.    SourceRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(1,2))
39.    # オートフィルの範囲(基となるセル範囲を含む )
40.    FillRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(10,2))
41.    SourceRange.AutoFill(FillRange)
42. 
43.    # ****************************
44.    # 保存
45.    # ****************************
46.    Book.SaveAs( os.getcwd() + "\\sample.xlsx" )
47. 
48.except Exception:
49.    ExcelApp.Quit()
50.    traceback.print_exc()
51.    sys.exit( )
52. 
53. 
54.ExcelApp.Quit()
55.print("処理を終了します")


openpyxl で Autofill 無しの処理

01.import openpyxl
02.import traceback
03.import sys
04. 
05.try:
06.    # ****************************
07.    # 新しいブックを作成
08.    # ****************************
09.    Book = openpyxl.Workbook()
10. 
11.    # ****************************
12.    # 通常一つのシートが作成されています
13.    # ****************************
14.    Sheet = Book.worksheets[0]
15. 
16.    # ****************************
17.    # シート名変更
18.    # ****************************
19.    Sheet.title = "Pythonの処理"
20. 
21.    # ****************************
22.    # セルに値を直接セット
23.    # ****************************
24.    for i in range(1, 11):
25.        Sheet.cell(i, 1, f"処理 : {i}")
26. 
27.    Sheet.merge_cells("C1:F1")
28.    Sheet.cell(1, 3).value = "結合されたセル"
29. 
30.    Book.save('sample.xlsx')
31. 
32.except Exception:
33.    traceback.print_exc()
34.    sys.exit( )
35. 
36.print("処理を終了します")

関連する記事

JScript : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する

関連する Microsoft ドキュメント

Application オブジェクト Workbook オブジェクトのコレクション Workbook オブジェクト Worksheet オブジェクトのコレクション Worksheet オブジェクト Cells プロパティ

C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する



Range オブジェクトの作成に数値を使用します

プログラミングで処理を行うので、Range("A1:A20") というような表現を使わずに、Cells(行,列) を使って Range オブジェクトを作成しています。
01.using System;
02. 
03.namespace excel_2020_11_26
04.{
05.        class Program
06.        {
07.                static void Main(string[] args)
08.                {
09.                        // Excel アプリケーション
10.                        dynamic ExcelApp = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
11.                        // Excel のパス
12.                        string path = Environment.CurrentDirectory + @"\sample.xlsx";
13. 
14.                        // Excel を表示( 完成したらコメント化 )
15.                        ExcelApp.Visible = true;
16.                        // 警告を出さない
17.                        ExcelApp.DisplayAlerts = false;
18. 
19.                        try
20.                        {
21.                                // ****************************
22.                                // ブック追加
23.                                // ****************************
24.                                dynamic Book = ExcelApp.Workbooks.Add();
25. 
26.                                // 通常一つのシートが作成されています
27.                                dynamic Sheet = Book.Worksheets(1);
28. 
29.                                // ****************************
30.                                // シート名変更
31.                                // ****************************
32.                                Sheet.Name = "C#の処理";
33. 
34.                                // ****************************
35.                                // セルに値を直接セット
36.                                // ****************************
37.                                for (int i = 1; i <= 10; i++)
38.                                {
39.                                        Sheet.Cells(i, 1).Value = "処理 : " + i;
40.                                }
41. 
42.                                // ****************************
43.                                // 1つのセルから
44.                                // AutoFill で値をセット
45.                                // ****************************
46.                                Sheet.Cells(1,2).Value = "子";
47.                                // 基となるセル範囲
48.                                dynamic SourceRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(1, 2));
49.                                // オートフィルの範囲(基となるセル範囲を含む )
50.                                dynamic FillRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(10, 2));
51.                                SourceRange.AutoFill(FillRange);
52. 
53. 
54.                                // ****************************
55.                                // 保存
56.                                // ****************************
57.                                Book.SaveAs(path);
58.                        }
59.                        catch (Exception ex)
60.                        {
61.                                ExcelApp.Quit();
62.                                System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp);
63.                                Console.WriteLine(ex.Message);
64.                                return;
65.                        }
66. 
67.                        ExcelApp.Quit();
68.                        // 解放
69.                        System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp);
70. 
71.                        Console.WriteLine("処理を終了します");
72. 
73.                }
74.        }
75.}

関連する記事

JScript : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する

関連する Microsoft ドキュメント

Application オブジェクト Workbook オブジェクトのコレクション Workbook オブジェクト Worksheet オブジェクトのコレクション Worksheet オブジェクト Cells プロパティ

JScript : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する



Range オブジェクトの作成に数値を使用します

プログラミングで処理を行うので、Range("A1:A20") というような表現を使わずに、Cells(行,列) を使って Range オブジェクトを作成しています。
01.// ****************************
02.// 初期処理
03.// ****************************
04.WScript.Echo( "処理を開始します" );
05.var WshShell = new ActiveXObject("WScript.Shell");
06.var ExcelApp = new ActiveXObject( "Excel.Application" );
07. 
08.// デバッグ時は、Excel の本体を表示させて状況が解るようにする
09.ExcelApp.Visible = true;
10.// UI でチェックさせるようなダイアログを表示せずに実行する
11.ExcelApp.DisplayAlerts = false;
12. 
13.try {
14. 
15.        // ****************************
16.        // ブック追加
17.        // ****************************
18.        var Book = ExcelApp.Workbooks.Add();
19. 
20.        // 通常一つのシートが作成されています
21.        var Sheet = Book.Worksheets( 1 );
22. 
23.        // ****************************
24.        // シート名変更
25.        // ****************************
26.        Sheet.Name = "JScriptの処理";
27. 
28.        // ****************************
29.        // セルに値を直接セット
30.        // ****************************
31.        for( var i = 1; i <= 10; i++ )
32.        {
33.                Sheet.Cells(i, 1) = "処理 : " + i;
34.        }
35. 
36.        // ****************************
37.        // 1つのセルから
38.        // AutoFill で値をセット
39.        // ****************************
40.        Sheet.Cells(1, 2) = "子";
41.        // 基となるセル範囲
42.        var SourceRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(1,2));
43.        // オートフィルの範囲(基となるセル範囲を含む )
44.        var FillRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(10,2));
45.        SourceRange.AutoFill(FillRange);
46. 
47.        // ****************************
48.        // 保存
49.        // ****************************
50.        Book.SaveAs( WshShell.CurrentDirectory + "\\sample.xlsx" );
51.  
52.} catch (error) {
53.        ExcelApp.Quit();
54.        ExcelApp = null;
55.        WshShell.Popup(error.description);
56.        WScript.Quit();
57.}
58. 
59.ExcelApp.Quit();
60.ExcelApp = null;
61. 
62.// ****************************
63.// ファイルの最後
64.// ****************************
65.WshShell.Popup("処理を終了します");

関連する記事

JScript : Visual Studio Code で、WSH を使用する準備

JScript でエラーが発生した行を知る方法

実行プログラムが cscript.exe や wscript.exe の場合、try ~ catch 内のエラー発生の行番号を知る事ができないので、以下の手順で処理します。
1) 拡張子を hta に変更する
2) WScript を使った実行をコメントにする
3) ソースの先頭に <script> ソースの最後に </script> を記述する
4) さらにソースの先頭に <meta http-equiv="x-ua-compatible" content="ie=edge"> を記述する
5) catch の中で、error.stack を表示する
6) エクスプローラからこのソースをダブルクリックする
    ( HTML アプリケーションホストで実行させる )




.hta 用コード

01.<meta http-equiv="x-ua-compatible" content="ie=edge">
02.<script>
03.// ****************************
04.// 初期処理
05.// ****************************
06.//WScript.Echo( "処理を開始します" );
07.var WshShell = new ActiveXObject("WScript.Shell");
08.var ExcelApp = new ActiveXObject( "Excel.Application" );
09. 
10.// デバッグ時は、Excel の本体を表示させて状況が解るようにする
11.ExcelApp.Visible = true;
12.// UI でチェックさせるようなダイアログを表示せずに実行する
13.ExcelApp.DisplayAlerts = false;
14. 
15.try {
16. 
17.    // ****************************
18.    // ブック追加
19.    // ****************************
20.    var Book = ExcelApp.Workbooks.Add();
21. 
22.    // 通常一つのシートが作成されています
23.    var Sheet = Book.Worksheets( 1 );
24. 
25.    // ****************************
26.    // シート名変更
27.    // ****************************
28.    Sheet.Name = "JScriptの処理";
29. 
30.    // ****************************
31.    // セルに値を直接セット
32.    // ****************************
33.    for( var i = 1; i <= 10; i++ )
34.    {
35.        Sheet.Cells(i, 1) = "処理 : " + i;
36.    }
37. 
38.    // ****************************
39.    // 1つのセルから
40.    // AutoFill で値をセット
41.    // ****************************
42.    Sheet.Cells(1, 2) = "子";
43.    // 基となるセル範囲
44.    var SourceRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(1,2));
45.    // オートフィルの範囲(基となるセル範囲を含む )
46.    var FillRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(10,2));
47.    SourceRange.utoFill(FillRange);
48. 
49.    // ****************************
50.    // 保存
51.    // ****************************
52.    Book.SaveAs( WshShell.CurrentDirectory + "\\sample.xlsx" );
53. 
54. 
55.} catch (error) {
56.    ExcelApp.Quit();
57.    ExcelApp = null;
58.    WshShell.Popup(error.description + error.stack);
59.    WScript.Quit();   
60.}
61. 
62.ExcelApp.Quit();
63.ExcelApp = null;
64. 
65.// ****************************
66.// ファイルの最後
67.// ****************************
68.WshShell.Popup("処理を終了します");
69.</script>

関連する Microsoft ドキュメント

Application オブジェクト Workbook オブジェクトのコレクション Workbook オブジェクト Worksheet オブジェクトのコレクション Worksheet オブジェクト Cells プロパティ