自分のブログ名

sheephumanのブログ

ひつじ好きな人間のブログ。

PythonでZIPファイルを扱ってみる記録


しきりにプログラミングをしたいという知人が居て、仕方が無いので骨折り作業をしている。僕もスキルは欲しいし。
プログラミングそのものを仕事にするのは生涯ムリだろうと思います。
VsCodeのセットアップが出来なかったんでPyCharm使ってます。

ZIPを扱うアプリの制作です。
目標としてはEXE化して、ドラッグ&ドロップでZIPを生成するとこまでやりたい。


まず試してみたコード 

qiita.com

初心者がC#やったりすると実行方法が分からなくて苦労するんだけど、Pythonは楽でいいですね。コピペで終わるから。



Tkinderの動画でGUIの基礎を学ぶ

www.youtube.com
動画って意外と疲れるんですよね。ちょっとでも打ち間違えると動かんし。
Tkinderは比較的コードがシンプルで楽ですね。



Python(tkinter)にてテキストボックスの高さや幅(大きさ)、色、複数行で作成する方法【ラベルも併せて解説】 | ウルトラフリーダム


【Python】テキストボックス(Tkinter.Entry)の作成・クリア・取得・セット | 鎖プログラム



qiita.com


f:id:sheephuman:20210408203529p:plain

デモプレイ動画

音楽流して作業してるんで図らずも入ってしまう('ω';)

www.youtube.com




ソースコード全文

コピペで動くはずです。

デモ手順:

  1. ファイル選択画面でzipファイルを指定してください
    2. 「新しいフォルダ」を作成し、保存場所を指定してください
    今回はTest.zip(個人的お宝がぞうを入れたもの)を使用しています(動画参照)
from tkinter import *
from tkinter import messagebox as mb
import os, tkinter, tkinter.filedialog, tkinter.messagebox
import zipfile



win = Tk()
mylabel = Label(win, text="ZipFileのパス")
mylabel.pack(fill = 'x', padx=20, side = 'left')
mylabel.pack()

text = Entry(win,width=100)
text.pack(fill='x', padx=5, side = 'right')
SourceFile = Entry(win)



text.pack()
#SourceFile.pack()
text.insert(END, " ")
SourceFile.insert(END, " ")


def ok_click():
    # ファイル選択ダイアログの表示
    root = tkinter.Tk()
    root.withdraw()
    fTyp = [("", "*")]
    iDir = os.path.abspath(os.path.dirname(__file__))
    file = tkinter.filedialog.askopenfilename(filetypes=fTyp, initialdir=iDir)
    a = file
    text.insert(END,a)

    # ファイルの展開
    with zipfile.ZipFile(a) as myzip:
        extractFolder = tkinter.filedialog.askdirectory()
        myzip.extractall(extractFolder)  # zipファイルに含まれているファイルを全て取り出す
        tkinter.messagebox.showinfo('ひつじプログラム', '処理が完了しました!')

okButton = Button(win, text="OK", command=ok_click)
okButton.pack()

win = mainloop()

あとがき


意外とあっさり終わりました。PySinpleGUIは何やらごちゃごちゃして分かりづらかったんだよね。 ドラッグ&ドロップは気が向いたらやります。

C#でファイルリネームアプリを開発してみた記録

 

 最初Pythonでやろうとしたんだけど、いきなりPythonで開発するのは敷居が高いと思われたため、開発が楽なC#(WinForm)でたたき台を作ってみる事にした。

 特にGUIはCodingしなければならないため、Visual Studioみたいに直感的にマウスで並べるという訳にはいかない。

 



参考にしたソフトウェア

f:id:sheephuman:20210328133916p:plain

 

 

とりあえず似たような機能を適当に実装してみる。

 

 

f:id:sheephuman:20210329181909p:plain

 

 

実行結果画像

f:id:sheephuman:20210329182245p:plain



f:id:sheephuman:20210329185713p:plain 

 

前提条件として、

C:¥test フォルダを作成しておき、そこにテスト用ファイルをコピーしておいた。

 

 

プロジェクトファイル

drive.google.com

ソースコード全文



面倒なので一応注釈はつけるが、個別には分けない事にしている。 ちなみにエクスプローラー風のUIはBlogページのソースコードを流用している。一応感謝の意を。



www.doraxdora.com

独自の実装は実行ボタンを押したときの挙動ぐらいである。


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;

namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // ドライブ一覧を走査してツリーに追加
            foreach (String drive in Environment.GetLogicalDrives())
            {
                // 新規ノード作成
                // プラスボタンを表示するため空のノードを追加しておく
                TreeNode node = new TreeNode(drive);
                node.Nodes.Add(new TreeNode());
                treeView1.Nodes.Add(node);
            }
            // 初期選択ドライブの内容を表示
            setListItem(Environment.GetLogicalDrives().First());
        }
        DirectoryInfo di;

        private void Form1_Load(object sender, EventArgs e)
        {
            
            // 初期選択ドライブの内容を表示
            setListItem(Environment.GetLogicalDrives().First());
        }

        private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            TreeNode tn = e.Node, tn2;
            string d = tn.FullPath;//展開するノードのフルパスを取得
            tn.Nodes.Clear();
            di = new DirectoryInfo(d);//ディレクトリ一覧を取得
            try
            {
                foreach (DirectoryInfo d2 in di.GetDirectories())
                {
                    tn2 = new TreeNode(d2.Name, 1, 2);
                    tn.Nodes.Add(tn2);
                    tn2.Nodes.Add("...");
                }
                foreach (FileInfo fi in di.GetFiles())
                {
                    tn2 = new TreeNode(fi.Name, 3, 3);
                    tn.Nodes.Add(tn2);
                }
            }
            catch { }
        }


        /// リストビューの項目を設定します.
        /// </summary>
        private void setListItem(string filePath)
        {
            // リストビューのヘッダーを設定
            listView1.View = View.Details;
            listView1.Clear();
            listView1.Columns.Add("名前");
            //listView1.Columns.Add("更新日時");
            //listView1.Columns.Add("サイズ");

            try
            {
                // フォルダ一覧
                DirectoryInfo dirList = new DirectoryInfo(filePath);
                foreach (DirectoryInfo di in dirList.GetDirectories())
                {
                    ListViewItem item = new ListViewItem(di.Name);
                    item.SubItems.Add(String.Format("{0:yyyy/MM/dd HH:mm:ss}", di.LastAccessTime));
                    item.SubItems.Add("");
                    listView1.Items.Add(item);
                }

                // ファイル一覧
                List<String> files = Directory.GetFiles(filePath).ToList<String>();
                foreach (String file in files)
                {
                    FileInfo info = new FileInfo(file);
                    ListViewItem item = new ListViewItem(info.Name);
                    //item.SubItems.Add(String.Format("{0:yyyy/MM/dd HH:mm:ss}", info.LastAccessTime));
                    //item.SubItems.Add(getFileSize(info.Length));
                    listView1.Items.Add(item);
                }
            }
            catch (IOException ie)
            {
                MessageBox.Show(ie.Message, "選択エラー");
            }

            // 列幅を自動調整
            listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
        }


        /// <summary>
        /// ファイルサイズを単位付きに変換して返します.
        /// </summary>
        /// <param name="fileSize"></param>
        /// <returns></returns>
        private String getFileSize(long fileSize)
        {
            String ret = fileSize + " バイト";
            if (fileSize > (1024f * 1024f * 1024f))
            {
                ret = Math.Round((fileSize / 1024f / 1024f / 1024f), 2).ToString() + " GB";
            }
            else if(fileSize > (1024f * 1024f))
                {
                ret = Math.Round((fileSize / 1024f / 1024f), 2).ToString() + " MB";
            }
            else if(fileSize > 1024f)
                {
                ret = Math.Round((fileSize / 1024f)).ToString() + " KB";
            }

            return ret;
        }


        /// ツリービュー項目選択時(前)のイベントハンドラ.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
          
           
                setListItem(e.Node.FullPath);
            
        }

        private void treeView1_BeforeExpand_1(object sender, TreeViewCancelEventArgs e)
        {
            TreeNode node = e.Node;
            String path = node.FullPath;
            node.Nodes.Clear();

            try
            {
                DirectoryInfo dirList = new DirectoryInfo(path);
                foreach (DirectoryInfo di in dirList.GetDirectories())
                {
                    TreeNode child = new TreeNode(di.Name);
                    child.Nodes.Add(new TreeNode());
                    node.Nodes.Add(child);
                }
            }
            catch (IOException ie)
            {
                MessageBox.Show(ie.Message, "選択エラー");
            }
        }

        private void Excutebutton_Click(object sender, EventArgs e)
        {


   //Nodeのフルパス取得
            string SelectedPath = treeView1.SelectedNode.FullPath;

            //List<string> files = listView1.Items.;

            var files = new List<string>();
            int count = 0;
   

   //Nullチェック
            if (textBox2.Text != "")
            { count = int.Parse(textBox2.Text); }


  //items[0].Subitems では一行分しか取得できないため、For文を回す必要があった
            for (int i = 0; i < listView1.Items.Count; i++)
            {
                foreach (ListViewItem.ListViewSubItem item in listView1.Items[i].SubItems)
                {
      //予め宣言しておいたFilesにAddする。
                    files.Add(SelectedPath + "\\" + item.Text);
                }
            }

            foreach (string file in files)
            {
                count++;
    //Path.GetExtension(file); 拡張子取得
                string Unitestring = Path.GetDirectoryName(file) + "\\" + textBox1.Text + count + Path.GetExtension(file);

                File.Move(file, Unitestring);
    
    //Rename結果を表示する。
                listView3.Items.Add(Unitestring);
            }
        }


    }
}



最低限の実装しかしてないけど、流石にいくらかは簡単だった。特にサンプルコードは助かった。 Pythonでやるとこの3倍ぐらい時間掛かりそうなんですよね・・・・
出来ることなら無理にGUI化したくないなあという感触。

Amazonで買ったバイク用300Dカバーをレビューする記事

 

前回の記事

 

sheephuman.hatenablog.com

 

 

 

購入したバイクカバー

 なんか放っておいたら在庫切れになっていた。残念。

あとでレビューは入れておく。

 

 

 

 

 

 

 

¥ 1,504で購入。

 

綺麗に折りたたまれた状態で送られてきた。

 今回こそアフィリエイト報酬が来てほしいと願っている。

 

こっちでもほぼ同じだと思うので貼っておく。購入して支援してください

 ¥2000

 

150Dもあるが、300Dの方が長持ちするだろう。

¥ 1800

 

 

”D”とは。

f:id:sheephuman:20210315120302p:plain



shikosakugo.info

糸の太さを表している

『1デニール=9000メートルの糸の質量が1g』のようです。要するに、300D=9000mあたり300g

 

 それだけ耐久性が高いってこと。

 

 

 

評判(300Dのほう)

  • 250㏄向けでもすっぽりと過不足なく入ります。
  • GSR250 にぴったりです。
  • 生地が厚くてシッカリしてる!
  • 総括してみると、この値段ならアリだと思う。
  • 同じ価格帯の物で比べると厚さや質感等1番いいと思いました。

 

 

  

 

300Dとはいえそんなに長期間は持たない(3年ぐらい?)らしいので、主に旅先で使う事にしました。

あんまり安い買い物でもないので、自宅保管ならゴミ袋で作れば十分じゃないのかと。

 

あんまり見かけが立派だと盗難に遭いやすいらしいし。それについては何とも言えません。

Twitterの方々に訊いてみた 今後役に立つ資格や技能

 

 

 

Twitterの方々に訊いた、今後役に立つ資格やその他情報。

 

 

 

 

 

 

  アンケート内容は、今後行く予定の職業訓練学校の志望選びに活用。

 CAD・NC技術科とした。

 

www3.jeed.go.jp

 

 

CADは判ると思うが、NC技術というのは例えば以下のような事を行う。

このように、必ずしも建築とは関わらない。製図はするようだ。

 

www.youtube.com

 

 

重機系は手っ取り早くていいと思っていたのだが、意外と伸びなかった。

組み込みIotはホビーではないかと考えていた。

Rasbery pi で企業向けサーバ構築とかいいと思ってる。

 

www.youtube.com

 

 

 

 

旋盤加工とかかなり大がかりな事をやるらしいので、希望者数はかなり少なかった。

一番多いのはモノづくり技術科だった。

 

 

Web面接のコツ

 

 

 

 

 

今後、職業訓練が終わるまでは積極的な就活はしない。

 

XmindApiのインストールと使い方 ~Git上のオープンソース実行まで~

XmaindAPIについて概説する。

 

archive.codeplex.com

 

github.com

 

 

 

概要

XmindAPIです。

 

MindMapを使用したWebアプリを開発するのにXmindAPIを導入。 XmindAPIを使うのに、Gradleというものが必要。そのGradleを使うにはどーたらこーたら。

 

全くの初心者が自力で何とかしようとしてます。

Gradlew Installdistしてみる”の項が多分最短。

 

C#か何かのアプリケーション開発に使用するかもしれない(※1)。

 

※1 しないかも知れない

 

使用方法

 

とりあえず、GithubからHDD上のローカルストレージへとダウンロードしてくる事にする。

 

ビルド/インストール/xmindapiディレクトリで実行可能なサンプルを構築するには、「gradlew installDist」を実行します。そのディレクトリから、bin/xmindapiを使用してサンプルを実行できます。

 

とあるので、 gradlewについて調べることにする。

 

Gradle - Wikipedia

GradleApache AntApache Mavenのコンセプトに基づくオープンソースビルド自動化システム

 

 

qiita.com

 

 

 

 早速gradleをダウンロードしてみる

後で考えてみると、入れなくてもよかったんじゃないかと思う。多分。

 

めんどくさい。

gradle.org

 

gradle はGradle | Releases 以下にある。

 

 

Pathを通す

とりあえず何も分からないので、役に立ちそうなソースは端から引っ張ってこなくてはならない。キツい。

qiita.com

 とりあえず環境変数とPathを通しておく。それぐらいだったらまあ出来る(多分)。

 

参考

Windows10にGradleをインストール - Qiita

 

 

>解凍したフォルダを環境変数GRADLE_HOMEにそのパスを設定します。また、GRADLE_HOME/binにパスを通しておきます。

実際は %GRADLE_HOME%\bin ?



 

動作確認

ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation.

 

 

Javaのインストールがされていないらしい。

 

 

 

JavaをインストールしてPathを通す

 Javaを落としてきた。

https://www.java.com/ja/download/ie_manual.jsp

 

 

 

動作確認

 

それでもGradleの実行に失敗

JAVA_HOME is set to an invalid directory: C:\Program Files (x86)\Java\jre1.8.0_281\bin

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation.

f:id:sheephuman:20210313132140p:plain

 

解決方法

qiita.com

 

再度動作確認

なかなかうまくいかないので、コマンドプロンプトで設定してみた。

結果成功。

C:\Users\USER>set JAVA_HOME="C:\Program Files (x86)\Java\jre1.8.0_281"

C:\Users\USER>gradle -version

Welcome to Gradle 6.8.3!

 

 

 

さっそくXmaindAPIをGradleでビルドしてみる

公式Gitより。

 Run "gradlew installDist" to build a runnable sample in the build/install/xmindapi directory. From that directory you may run the examples using bin/xmindapi

 

 

 

 よく分からないので、とりあえずgradlew.batをコマンドプロンプト上で実行してみる。

 

 

 

 

 

 

なにやらダウンロードしてくる。

 

 

 Exception in thread "main" java.net.ConnectException: Connection timed out: connect

 

と表示された。

どうやら失敗しているらしい。

at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)

 

説明を読み返してみる。

GitHub - sappling/xmindapi: Samples using the xmind api

How To Build

These samples include a gradle build file and wrapper. Use the provided gradlew file to create a project for your IDE or a command line runner for the samples. You will need to have a Java 8 SDK installed and your JAVA_HOME environment variable set.

Run "gradlew idea" to generate a project for IntelliJ Idea Run "gradlew eclipse" to generate a project for Eclipse.

Run "gradlew installDist" to build a runnable sample in the build/install/xmindapi directory. From that directory you may run the examples using bin/xmindapi.

 

 

 

 

とりあえずIntelliJ Ideaで開くことが出来た。

f:id:sheephuman:20210314085547p:plain

 

 

 

 Runしてみても何も開かない。APIだからだろうか。

f:id:sheephuman:20210314094556p:plain

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings. 

 

このビルドでは非推奨のGradle機能が使用されていたため、Gradle7.0との互換性がありません。

 

 

とあるのは、Gradle 7.0から推奨されないコマンドがあるということらしい。

 

 

itneko.com

 

 

こんなに疲れるとは思いませんでしたわ。

f:id:sheephuman:20210314112548p:plain

 

 

 

 

何処が問題なのか調べてみる

qiita.com

 

 

 

f:id:sheephuman:20210314100445p:plain

 

↓問題があるのはどうもcompileが非推奨になっているためのようである。

dependencies {
compile fileTree(dir: 'lib', include: '**/*.jar')
compile group: 'com.intellij', name: 'annotations', version: '7.0.3'
}

これをImplementationに書き換えてみる。

 

qiita.com

 

 ↓Buildが正常に通った。

f:id:sheephuman:20210314100843p:plain

 

 

あとで気が付いたのだが、コマンドプロンプトgradlew eclipse や

gradlew idea  を実行するとそのIDE上で開けるようにビルドしてくれるらしい。分かる人には分かるのだろうが・・・・・・・・・

 

 

f:id:sheephuman:20210314115914p:plain

 

 

でもIntelliJ Idea上で Buildしたらエラーになった。

「File」 → Project Structureの中身を弄ってたらエラーは治った。

 

f:id:sheephuman:20210314122606p:plain

 

どうやって実行するのかはいまいちよく分からん。

 

Hunter×Hunter フィンクス



 また、Eclipseでの開き方は分かっていない。

 

 

 

Gradlew Installdistしてみる

Gradlewファイルが E:\applicatiom2(安置したフォルダ)\xmindapi-masterにあるので、コマンドプロンプトでXmaind-Maseterがあるフォルダまで移動する。

 

これを実行しているようである。

f:id:sheephuman:20210314111109p:plain

 

Error

f:id:sheephuman:20210314110239p:plain

Could not find tools.jar. Please check that C:\Program Files (x86)\Java\jre1.8.0_281 contains a valid JDK installation.

とあるので、tools.jarを引っ張ってくる。

 

qiita.com

Java Platform, Standard Edition 8 Reference Implementations  から

Oracle Linux 7.6 x64 Java Development Kit (md5) 167 MB

を落としてくる。

 

あとは参考ページの指示通りに行う。

 

今度はBuildを通せたようである。

f:id:sheephuman:20210314110838p:plain

 

どうなったのか分からん。

実行ファイルのようなものは何も作成されないようである。

 

xmindapi-master.jarが E:\インストールフォルダ\xmindapi-master\build\libs

に作成されたのが確認できたが、クリックしても何も動いてない。

 

 

 

再度説明を読み返してみる

GitHub - sappling/xmindapi: Samples using the xmind api

Run "gradlew installDist" to build a runnable sample in the build/install/xmindapi directory. From that directory you may run the examples using bin/xmindapi.

とあり、見てみると

 

build/install/xmindap直下に以下のファイルが作成されていた。

 

bin以下

xmindapi-master

xmindapi-master.bat

 

 

lib以下

annotations-7.0.3.jar

org.xmind.core_3.6.1.jar

org.xmind.ui.mindmap_3.6.1.jar

xmindapi-master.jar

  

 

f:id:sheephuman:20210314112420p:plain

 

 

どうやって使うのか分かりませんわ.....

 

 

 

とりあえずCmd上で実行してみる

 

f:id:sheephuman:20210314113329p:plain

 

xmindapi-master simpletree を実行すると、同じディレクトリにsimpletree.xmindというXmindファイルが作成される。これはその名の通り、Xmindで開くファイルのようである。

 

 

Xmindで開いてみた(クリックで拡大)

jp.xmind.net

 

f:id:sheephuman:20210314114240p:plain

XmaindAPIで作成したXmindファイル

 

 

 

あとがき

 

 

羊の飼育のように手間がかかった。

つーかなんでこんなに大変なの?僕みたいな初心者を簡単に誘導するように作られてはいないため、かなりの手間がかかってしまった。

 

しかもコレ、実用的に使えんのかねって感じ。 よく分からん。

 

 

とりあえず、初めてGit上のオープンソースなファイルを実行までもっていく事が出来た。

バレンタインデーに強引にチョコレートを贈った話

 

TwitterのClavisひつじさんにバレンタインデーのチョコレートを贈りました。

 

構想

 

 

 

 

 

 

 

 

メルカリを介してやり取りした

f:id:sheephuman:20210313152425p:plain

 

送料が思ったより高いんで上乗せ。

 

コンビニで1000円で購入した。

 

反応

 

後で美味しく頂いたらしい。

 

これからも続けよう。メルカリで出すと知らない人が購入しようとするので、出来るだけ知り合いに買ってもらう。

お知らせ

 

 付き合いは大事にしたiので、なるべく知x&てる人の記事は読みに行く事にしているのですが、僕もpか3'ry消耗するnで、34&'(5;:]3df"3ことにしました。

 

f:id:sheephuman:20210310204259p:plain

 

 

これからも$=^1しくお願いします。敬具。