Python3でZipの圧縮解凍操作
前記事のPython3でファイル操作に続いて、ZIPの圧縮解凍。 自分が業務内でどうでもいいスクリプト作る際に見るためのメモです。 Python勉強中なので間違っていたり、もっとPythonらしく書ける部分があればコメント欄やTwitterでツッコミお願いします。
コード
Githubにもあげてます。(使用しているファイルも。)
結局、Windows10環境でpyminizipを使用することはできなかった。。。別のモジュール使えばいいのかな?
import os import zipfile import pyminizip from datetime import datetime d = datetime.now().strftime("%Y%m%d%H%M%S") outputDir = "./output/" + d + "/" os.mkdir(outputDir) # -------------- # ZIP解凍 # -------------- # 基本形(とりあえず全部解凍) with zipfile.ZipFile("./data/simple.zip", "r") as zf: zf.extractall(outputDir) # 引数を指定しないとカレントに出力 # パスワード付きzipを全部解凍 with zipfile.ZipFile("./data/password.zip", "r") as zf: zf.extractall(outputDir, pwd="password".encode("ascii")) # encodeしないとエラー # ファイル指定して解凍する with zipfile.ZipFile("./data/somefile.zip", "r") as zf: print(zf.namelist()) # namelistでファイル名確認 # バイトで書き込むので「b」で開く with open(outputDir + "somefile.txt", "wb") as writeFile: writeFile.write(zf.read("somefile/file2.txt")) # readはバイトが返る # テキストで取得したい場合はopenで開いてデコード? # zipfile.open は文字コード指定できない with zf.open("somefile/file2.txt") as targetFile: for line in targetFile: print(line.decode("UTF-8").rstrip()) # -------------- # ZIP圧縮 # -------------- # 基本的な圧縮 with zipfile.ZipFile(outputDir + "compress1.zip", "w") as zf: # 第2引数がない場合は第1引数の通りに格納される。(この場合だと「/data/text1.txt」となる。) zf.write("./data/text1.txt", "text1.txt") zf.write("./data/text2.txt","nest/text2.txt") # パスワード付きは標準ライブラリではできない # pyminizipモジュールを使用する # https://github.com/smihica/pyminizip # ↓で入ればよいが入らない場合には下記参照 # pip install pyminizip # Windows10の場合↓のエラーが出たので、下記の通り「Microsoft Visual C++ Build Tools」をインストール # Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools # その後zlibが必要だと言われたが解決できず。↓が参考になるかも # https://stackoverflow.com/questions/42529239/ # Ubuntuの場合 # sudo apt-get install zlib1g-dev pyminizip.compress("./data/text1.txt", outputDir + "compress2.zip", "password", 5)
Python3でファイル操作
何番煎じだ的な感じですが、自分が業務内でどうでもいいスクリプト作る際に見るためのメモです。 Python勉強中なので間違っていたり、もっとPythonらしく書ける部分があればコメント欄やTwitterでツッコミお願いします。
コード
Githubにもあげてます。(使用しているファイルも。)
import os from datetime import datetime defaultTextPath = "./data/shift_jis-crlf.txt" #defaultTextPath = "./data/utf8-lf.txt" # 基本形(OSのデフォルト?文字コードで読む) with open(defaultTextPath) as f: print(f.read()) # 一括で読み込む # 行毎に読み込む with open(defaultTextPath) as f: for line in f: print(line) # 行毎に読み込む # メモリに全部乗る事、改行が含まれる事に注意 with open(defaultTextPath) as f: for line in f.readlines(): print(line.rstrip()) # 最後の改行も含まれるので注意。「rstrip()」で除去 # 違いはよくわからないが、f.read().splitlines() がオススメされてた # https://stackoverflow.com/questions/15233340/getting-rid-of-n-when-using-readlines # 行毎に読み込む # 使うことあるのか? with open(defaultTextPath) as f: line2 = f.readline() # 1行づつ読み込む(改行文字も含まれる) while line2: print(line2.rstrip()) line2 = f.readline() # 文字コードを指定する場合にはencoding # https://docs.python.jp/3.5/library/functions.html#open # 検索するとcodecsモジュールを使うなどと出てくるが「codecs」は古い! # python 2でもio.openでpython 3と同じ動きとのこと) with open("./data/euc-crlf.txt", "r", encoding="euc_jp") as f: print(f.read()) # ---------------------- # 書き込み # ---------------------- d = datetime.now().strftime("%Y%m%d%H%M%S") outputDir = "./output/" + d + "/" os.mkdir(outputDir) # 基本形(OSのデフォルト?文字コードで書き込み) with open(outputDir + "fisrt.txt", "w") as writeFile: writeFile.write("あいうえお\nかきくけこ\nさしすせそ\n") # Windowsの場合改行コードも何故か\r\nで出力 # 1行ごとに書き込み(OSのデフォルト?文字コードで書き込み) with open(outputDir + "second.txt", "w") as writeFile: # Windowsの場合改行コードも何故か\r\nで出力 writeFile.write("あいうえお\n") writeFile.write("かきくけこ\n") writeFile.write("さしすせそ\n") # 文字コードを指定して書き込み with open(outputDir + "third.txt", "w", encoding="UTF-8") as writeFile: writeFile.write("あいうえお\nかきくけこ\nさしすせそ\n") # Windowsの場合でも改行コードは\nで出力 # -------------------- # 文字コード変換して出力 # -------------------- # 文字コード変換 with open("./data/euc-crlf.txt", "r", encoding="euc_jp") as f: with open(outputDir + "euc-utf8.txt", "w", encoding="UTF-8") as writeFile: writeFile.write(f.read()) # 文字コードと改行コード変換 with open("./data/utf8-crlf.txt", "r", encoding="UTF-8") as f: with open(outputDir + "utf8-shift_jis-lf.txt", "w", encoding="shift_jis") as writeFile: writeFile.write(f.read().replace("\r\n","\n"))
追記(2018/02/28) Twitterでツッコミを頂いたのでコードを修正しております。ありがとうございます!
https://t.co/YWVLSClJgQ() は古くてもういらないです。
— INADA Naoki (@methane) 2018年2月27日
Python 3 では普通の open で open(filename, mode, encoding) で指定できます。
Python 2 なら import io; して https://t.co/Nq0LrUPgLQ() を使えば Python 3 とおなじになります。 https://t.co/zQIGQy8gNL
2017年の反省と2018年の目標
はじめに
2018年も既に2月となっておりますが、2017年の反省と2018年の目標を書きます。
2017年
転職の1年でした。活動自体は1月から7月の入社まで。(退職は3月末)入社後も色々な意味で慣れない仕事に追われていた1年でした。 転職活動では、皆様にご迷惑とご心配をかけてしまいました。本気で反省しております。
反省
- 2017年の目標とか書いてたけどどうだったか。
英語
英語を勉強
- 具体的な最終目標はなし
- なるべく毎日何かやる
- TOEICを3月と12月に受験
- 1月に受けたかったけど、すぐ申し込んですぐ受けられるというものではないらしい。
- 1/5に申し込んで3月受験。
- 転職前までは割とやっていて習慣化していた。
- が、通勤退勤中に行っていたため
ニート転職期間の3ヶ月?にやる気喪失。- 日々の日報を見ると3/30までは行っていた記録あり。
- 1月にTOEIC受けた事は○だが、TOEICが難しすぎて逆にやる気が削がれたのも良くなかった。
- 「○○をしたい → 英語を勉強する」という動機が弱かったため続かなかったと思われる。
何か作る
何か作る
- 当初の目標と方向性は大きく異なるが、家庭内システム(Raspberry Pi)を作ったとは言えるかなと思う。
- が、目標作った時に考えていたと思われる「公開して誰かに使ってもらえるもの」という事だと×。
- 作業用リポジトリとか、日報とか見てると途中途中で色々作ろうとはしてるけど、結局作れてないので反省したい。
2018年
仕事が結構変わったためそれに合わせた目標を2つと、個人的な目標を1つにしてみた。 仕事の面でもプライベートでも今後の人生に大きく関わってくる1年だと思うので、ちょっと頑張っていきたい。
統計検定3級
- 今の会社は分析が中心なので、社員は全員統計検定を取る義務があるらしい。
- せっかく、そういう会社にいるので波には乗っておけの精神で取る予定。
- 正直、やる気はそこまでないけど、数学は好きだったのでやれば楽しくなると思う。
PythonでWebサービス作成
- 会社内ではとりあえずPythonなので、慣れるためにも何か作る。
- → 何かでは作らないので、既存サービスのパクリでも作ろうかと考えております。
- 普通に何か作る際にサクッと作れるくらいには慣れるのが目標。
家庭内SlackBotの作成及び起動
- 昨年末から稼働しているRaspberry Piを中心とした家庭内システム。
- 一応稼働はしているが、先週末辺りにRaspberry Pi(初代)が壊れたので移行から。
- 家族が結構喜んでくれたので、やる気もあるし継続的に改善していきたい。
Windowsから定期的にSlackに投稿する
はじめに
- WindowsからSlackにメッセージを投げたい事があって、面倒だろうなと思って調べてみたらあまりにも簡単だったのでメモ。
- 自分通知用にSlackメッセージ投げたい事あるよね?ない??
- 一言で言うと「Windowsのタスクスケジューラでbash上でシェルを動かして、Slackにメッセージを投げる。」だけ。
- Windows上でシェルが動くと楽で良い。
もうちょっと詳しく
- 定期実行にはWindowsデフォルトのタスクスケジューラを使用。
- Slackにメッセージを投げるにはIncoming WebHooksを使用して、規定のURLにPostする。
- Postするにはシェルを使用。
- 素のバッチで実行するのは面倒っぽい。
- シェルを実行するにはWSL(Windows Subsystem for Linux 旧Bash on Ubuntu on Windows)でインストールされるbashを使用。
手順
- WSL(Windows Subsystem for Linux 旧Bash on Ubuntu on Windows)をインストール
- 色々便利なので入っていない方はこの際入れましょう。
- 参考 : Windows Subsystem for Linuxをインストールしてみよう!
- ↓からIncoming WebHooksを登録
- 登録後に表示される「Webhook URL」を確認
- シェルを作成
#!/bin/sh # Incoming WebHooksのURL WEBHOOKURL="https://hooks.slack.com/services/XXXX/XXXX/XXXX" # slack 送信チャンネル CHANNEL="#test" # slack 送信名 BOTNAME="my_bot" # slack アイコン FACEICON=":ghost:" WEBMESSAGE="Hello Slack!" #Incoming WebHooks送信 curl -s -S -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${BOTNAME}\", \"icon_emoji\": \"${FACEICON}\", \"text\": \"${WEBMESSAGE}\" }" ${WEBHOOKURL} > /dev/null
- タスクスケジューラ起動
- Windowsキー → タスクスケジューラ検索
- 「基本タスクの作成」 or 「タスクの作成」
- 名前やトリガーは適切な値に設定
- 操作
注意
Slackにメッセージ投げる部分抜粋
- Slackに投げるだけなら、curlが使える環境ならPostするだけなので超簡単。
curl -s -S -X POST --data-urlencode "payload={\"text\": \"test dayo\" }" https://hooks.slack.com/services/XXXX/XXXX/XXXX" > /dev/null
Slackに投げる部分をもうちょっと汎用的にした奴
いくつか投げたい通知があったので、少し汎用的にして使っています。
#!/bin/sh # Slack通知スクリプト # 引数1(必須) : メッセージそのものか、メッセージが記載されたファイルPATH(PATHは/mnt/c/...形式) # 引数2(任意) : 出力するユーザ名(未指定の場合は「mybot」) MESSAGEFILE=$1 # slack 送信名 BOTNAME=$2 if [ "$BOTNAME" = "" ] ; then BOTNAME="mybot" fi ls ${MESSAGEFILE} > /dev/null 2>&1 if [ $? = 0 ] ; then WEBMESSAGE=`cat ${MESSAGEFILE}` else WEBMESSAGE=${MESSAGEFILE} fi #WEBMESSAGE=`cat ${MESSAGEFILE}` # Incoming WebHooksのURL WEBHOOKURL="https://hooks.slack.com/services/XXXX/XXXX/XXXX"" # slack 送信チャンネル CHANNEL="#test" # slack アイコン FACEICON=":ghost:" #Incoming WebHooks送信 curl -s -S -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${BOTNAME}\", \"icon_emoji\": \"${FACEICON}\", \"text\": \"${WEBMESSAGE}\" }" ${WEBHOOKURL} > /dev/null
使う時
- shから
/mnt/c/tools/notification2slack.sh "ほげほげでした。" "ほげ通知"
- batから
bash "/mnt/c/tools/notification2slack.sh" "ほげほげでした。" "ほげ通知"
参考
- [10分で出来る]シェルスクリプトの結果をslackに投稿
- 改行コード変換を行っているが、LFならば特に問題なく表示されたので、使用しませんでした。
lsとpwdをコマンドプロンプトで使う
c:\work\20170929>ls 'ls' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
はじめに
コマンドプロンプトで「ls」や「pwd」と打って怒られたので、カッとなってやりました。
真面目に使いたいなら↓辺りを参考に色々使ってみれば良いと思います。
手順
- 以下の内容を「ls.bat」というファイル名で保存。
@echo off dir %1
- 以下の内容を「pwd.bat」というファイル名で保存。
@echo off @cd
- ↑で作成したファイルをパスの通った所に置く。
- 使う。
c:\work\20170929>ls ドライブ C のボリューム ラベルは OS です ボリューム シリアル番号は DE0A-E8AA です c:\work\20170929 のディレクトリ 2017/09/29 04:51 <DIR> . 2017/09/29 04:51 <DIR> .. 0 個のファイル 0 バイト 2 個のディレクトリ 173,906,067,456 バイトの空き領域 c:\work\20170929>pwd c:\work\20170929
コマンドでやる
mkdir c:\shortcuta cd c:\shortcuta echo @echo off >> ls.bat echo dir %1 >> ls.bat echo @echo off >> pwd.bat echo @cd >> pwd.bat set PATH=%PATH%;c:\shortcut ls pwd
環境変数に追加は手でやってください。
後書き
MarkdownでSlide作成して自分のGitHub Pagesで公開する
MarkdownでSlide作成して自分のGitHub Pagesで公開する奴を作りました。 資料がアチラコチラに散らばることがなく、テキストでGitなので差分が見れたりと結構便利です。 動きがあるスライドなどは辛いですが、さくっと作る時には良いかと思いますので良かったら使ってみてください。
忙しい人用まとめ
- SlideをMarkdownで書いて自分のGitHubで管理して、自分のGitHub Pagesで表示できるようにした。
- reveal.js version 3.5.0を使用
- 毎回HTMLとか書きたくないので、Markdownのパスを指定すればスライドが表示されるようにした。
- 真似したい人は、リポジトリをForkやCloneして、GitHub Pagesで公開すればすぐ使えます。(↓に使い方書いてます)
- スライドサンプル
経緯とか
私はスライド資料をPowerPointやKeynoteで作るのが嫌なのでMarkdownで作成しGitHubで管理しています。*1今までは、そのスライドをSlideck(https://slideck.io/
)というサービス*2でスライド表示していたのですが、たまに繋がらない事があったり、HTTPSで警告が出るようになったりとしていて、最近サイト自体が消えてドメインが別の方のものになってました。😂
代替サービスも色々探してはいたのですが中々しっくりくるものに巡り会えず。(一応下の方にまとめておきます。)自分でなんとかしようとなった次第です。
Markdownをスライド表示するreveal.jsは以前少しだけ触ったことがあったので、外部ファイルからファイルを読み込める事ができることは知っていました。なので、GitHubにあるMarkdownファイルを直接読ませたら表示できるのでは?っと読ませたら普通にスライドが表示されました。*3
という事で、最終的にはGitHub Pagesとして作成してみました。
使い方
初回
- git clone or forkして自分のGitHubにリポジトリ作成
- プロジェクトのsettings
- GitHub Pagesとして公開
- 以下にアクセス
スライド追加
PDF出力をする場合
- 公式にも記載がありますが、一応記載しておきます。
- URL末尾に「&print-pdf」を付与して表示。
- ブラウザの印刷設定
- PDFに保存、横向き、背景のグラフィックにチェック
- 保存
注意点
- GitHub Pagesなので更新が遅い場合があります
- ブラウザにキャッシュされている場合もある(キャッシュクリアや別ブラウザ、シークレットモードなどで確認)
- 古いブラウザは考慮していません
- オフラインでは見れません(↓のPDF化参照)
調査した代替サービス(覚えているものだけ)
- GitPitch
- Qiita
- ○ Qiitaの記事をスライドで表示可能
- × GitHub管理ではない(資料が分散してしまう、芝が生えない)
- ○ たくさんの人に見てもらえる
- Marp
- WikiNote
- △ 匿名
- × 誰でも変更可能
- × GitHub管理ではない(資料が分散してしまう、芝が生えない)
- × スライドモードでスライドが2枚づつ作成されている?
- Generate Google Slides from markdown
- 最近発見したのであまり調べてないが、最終的にこれでGoogleSlideに変換してSlideShareなどで公開するのもありかな?
- 参考 : MarkdownファイルをGoogleスライドに変換
*1:どこでもアクセス可能、履歴、差分見れる、芝生えるとメリットいっぱい
*2:ボケてなどを作ってる、ゆーすけべーさんが作成。 http://blog.yusuke.be/entry/2016/03/18/150640
*3:raw表示を行うURLを渡しましょう。 https://raw.githubusercontent.com/…
We Are JavaScripters! @10thに参加してきた #WeJS #yahoolodge
資料など、随時更新します。
はじめに
- 8月25日(金)に「We Are JavaScripters! @10th」という勉強会に参加してきた時のメモです。
- 全てLT、酒飲みながらのメモなので*1、興味のある発表については資料見たほうが早いかと思います。
- 資料については公開され次第、随時追記します。
- 記念すべき10回目!
- ちなみに、登壇者で応募しましたが抽選で落ちました😂
- 6人枠の所に14人?とか。辛い。
- 登壇者9人中6人が、発表タイトルにReactが入っている。
- 人数が↑と合わないのは、スポンサー枠、主催者枠のため。
- ハッシュタグ : #yahoolodge #WeJS
概要
「JSの勉強会って、登壇する人がハイレベルな人ばっかりだな〜」 と思ったのがきっかけで作った勉強会、「We Are JavaScripters」! 自分が学んだこと/気づいたこと/面白かったこと/失敗したこと/ハマったこと/挑戦したこと/デバッグテクニック/オススメツール・開発環境/お気に入りのライブラリ/オレオレライブラリ/実はこうだった言語仕様/tips などなど、 お酒を片手に、気軽に発信できる場を目指しています^^/ ※誰でも怖がらずに登壇できる空気を作りたいだけだけなので、もちろん玄人のみなさんも登壇大歓迎です!!
LT.1:Reactのフォーム画面開発で発生する問題をredux-formで解決する @kazuaki_okamoto
- 発表資料
- redux-formはあまり実務で使用されていないらしい。
- 手上げが少ない。
- http://redux-form.com/7.0.3/
- GitHub☆が7300↑
- React+Reduxより簡単完結。
- FieldArray便利っぽい。
- 配列で取得。
- パフォーマンスのメリット
- Field=Reduxのconnectのような扱い
- V6で大幅に改善。
- 入力値のバリデーションとエラー状態管理
LT.2:Reactに不変の愛を @boiyaa
- 発表資料
- 内容的に公開は難しい予感。
- ElmとJavaScriptを組み合わせたアプリケーションの作り方
- 主催者いじりが始まる。
- elmの話w
- http://elm-lang.org/
LT.3:Take into Accessibility in React @usagi-f
- 発表資料
- まだ公開されていない?
- 元デザイナーの方
- Accessibilityを意識したReactの話。
- 実は相性が良いReactとアクセシビリティ
- UIが容易に制御
- 既に多くの拡張がある
- WAI-ARIA
Web Accessibility Initiative - Accessible Rich Internet Applicationsの頭文字であり、HTMLやSVGで利用できるアクセシビリティ確保のための属性の仕様です。
- aタグのhrefは必須じゃない
この属性は、プレースホルダーリンクを生成するために省略できます (HTML5)。プレースホルダーリンクは従来のハイパーリンクに似ていますが、どこにも移動しません。
- ta11y?
LT.4:CSSの嫌なところを解決できる。そうCSS Houdiniならね。 @fukaminmin
- 発表資料
- まだ公開されていない?
- CSSはブラウザ対応がだるい
- Houdini
- 海外のマジシャン?
- https://twitter.com/mki_skt/status/901043986965569537
- Typed OM
- px計算とかが楽。
- ブラウザの実装状況はひどい。
LT.5:Chromeデベロッパーツールを自分色に染める @jumpei_ikegami
LT.6:flowがReactにもたらすもの @takanorip
- 発表資料
- まだ公開されていない?
- 技術書展出店予定
- flow?
- 静的型チェッカー
- 小さく試せる
- レガシー環境下でも使える
- AltJSではないのでESの機能すべて使える
- Reactと相性がいい
- 作ってる所が一緒
- エラーが出た時に参考にできる情報がない
- GitHubのissueを見る
- flowは後から入れても大丈夫なので、小さく入れてみると良い
LT.7:ReactでPDF帳票を出力する @stakezaki
- 発表資料
- ReactでPDF
- フルスタックエンジニアはいらない
- HTMLとJSだけあればいい
- vte.cx Advent Calendar 2016
- https://admin.1.vte.cx/
- 裏ではnode.jsではなくNashornを使っている
LT.8:レガシーな環境にTypeScriptを導入した話 @ama
- 発表資料
- まだ公開されていない?
- レガシーな環境とは。
- 型があるって素晴らしい!
- ある程度は書き方が統一できる
- jQueryを使っていたら、jQueryの型定義が既にある。
- 独自の型定義をどこまで頑張るのか問題。
- Java、C#のエンジニアが多い場合にはTypeScriptがいい!
LT.9:同じとは @chikoski
- 発表資料
- 2と10は同じ
- 偶数だから
- 同じというのは価値観によるので難しい
- JavaSciprtの同じがわかる表
JSの比較ってこわい #wejs pic.twitter.com/fYw11i3u7H
— さっくる / Saki (@sakkuru) 2017年8月25日
*1:特に後半