山pの楽しいお勉強生活

勉強の成果を垂れ流していきます

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でツッコミを頂いたのでコードを修正しております。ありがとうございます!

2017年の反省と2018年の目標

はじめに

2018年も既に2月となっておりますが、2017年の反省と2018年の目標を書きます。

2017年

転職の1年でした。活動自体は1月から7月の入社まで。(退職は3月末)入社後も色々な意味で慣れない仕事に追われていた1年でした。 転職活動では、皆様にご迷惑とご心配をかけてしまいました。本気で反省しております。

反省

英語

英語を勉強

  • 具体的な最終目標はなし
  • なるべく毎日何かやる
  • TOEICを3月と12月に受験
    • 1月に受けたかったけど、すぐ申し込んですぐ受けられるというものではないらしい。
    • 1/5に申し込んで3月受験。
  • 転職前までは割とやっていて習慣化していた。
  • が、通勤退勤中に行っていたためニート転職期間の3ヶ月?にやる気喪失。
    • 日々の日報を見ると3/30までは行っていた記録あり。
  • 1月にTOEIC受けた事は○だが、TOEICが難しすぎて逆にやる気が削がれたのも良くなかった。
  • 「○○をしたい → 英語を勉強する」という動機が弱かったため続かなかったと思われる。

何か作る

何か作る

  • 当初の目標と方向性は大きく異なるが、家庭内システム(Raspberry Pi)を作ったとは言えるかなと思う。
  • が、目標作った時に考えていたと思われる「公開して誰かに使ってもらえるもの」という事だと×。
  • 作業用リポジトリとか、日報とか見てると途中途中で色々作ろうとはしてるけど、結局作れてないので反省したい。

2018年

仕事が結構変わったためそれに合わせた目標を2つと、個人的な目標を1つにしてみた。 仕事の面でもプライベートでも今後の人生に大きく関わってくる1年だと思うので、ちょっと頑張っていきたい。

統計検定3級

  • 今の会社は分析が中心なので、社員は全員統計検定を取る義務があるらしい。
  • せっかく、そういう会社にいるので波には乗っておけの精神で取る予定。
  • 正直、やる気はそこまでないけど、数学は好きだったのでやれば楽しくなると思う。

PythonWebサービス作成

  • 会社内ではとりあえず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 LinuxBash on Ubuntu on Windows)でインストールされるbashを使用。

手順

#!/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
  • タスクスケジューラ起動

f:id:yamap_55:20171208234801p:plain

  • 「基本タスクの作成」 or 「タスクの作成」
  • 名前やトリガーは適切な値に設定
  • 操作

f:id:yamap_55:20171208234805p:plain

注意

  • シェルの文字コードは「UTF-8」、改行コードは「LF」。
  • シェルに色々書きたい人は、Ubuntuのデフォルトシェルがbashじゃなくてdashであることを頭に入れておいたほうが良いかも?

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" "ほげほげでした。" "ほげ通知"

参考

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

環境変数に追加は手でやってください。

後書き

Windowsでもエイリアスの設定ができるらしいので、こっちが楽かも。

MarkdownでSlide作成して自分のGitHub Pagesで公開する

MarkdownでSlide作成して自分のGitHub Pagesで公開する奴を作りました。 資料がアチラコチラに散らばることがなく、テキストでGitなので差分が見れたりと結構便利です。 動きがあるスライドなどは辛いですが、さくっと作る時には良いかと思いますので良かったら使ってみてください。

忙しい人用まとめ

経緯とか

私はスライド資料をPowerPointKeynoteで作るのが嫌なのでMarkdownで作成しGitHubで管理しています。*1今までは、そのスライドをSlideck(https://slideck.io/)というサービス*2でスライド表示していたのですが、たまに繋がらない事があったり、HTTPSで警告が出るようになったりとしていて、最近サイト自体が消えてドメインが別の方のものになってました。😂

代替サービスも色々探してはいたのですが中々しっくりくるものに巡り会えず。(一応下の方にまとめておきます。)自分でなんとかしようとなった次第です。

Markdownをスライド表示するreveal.jsは以前少しだけ触ったことがあったので、外部ファイルからファイルを読み込める事ができることは知っていました。なので、GitHubにあるMarkdownファイルを直接読ませたら表示できるのでは?っと読ませたら普通にスライドが表示されました。*3

という事で、最終的にはGitHub Pagesとして作成してみました。

使い方

初回

スライド追加

PDF出力をする場合

注意点

  • GitHub Pagesなので更新が遅い場合があります
    • ブラウザにキャッシュされている場合もある(キャッシュクリアや別ブラウザ、シークレットモードなどで確認)
  • 古いブラウザは考慮していません
  • オフラインでは見れません(↓のPDF化参照)

調査した代替サービス(覚えているものだけ)

  • GitPitch
    • GitHubで管理
    • × リポジトリ1つが1スライド
    • × ヘッダやフッタに色々ついてくるっぽい
  • Qiita
    • ○ Qiitaの記事をスライドで表示可能
    • × GitHub管理ではない(資料が分散してしまう、芝が生えない)
    • ○ たくさんの人に見てもらえる
  • Marp
    • × クライアントアプリケーション
      • 好きなアプリケーションを入れられない場合があるかも?そもそも自分のPCが使えない場合もあるかも?
    • ○ 結構盛り上がってるっぽい : 参考
    • GitHubに☆がいっぱい! : 参考
  • WikiNote
    • △ 匿名
    • × 誰でも変更可能
    • × GitHub管理ではない(資料が分散してしまう、芝が生えない)
    • × スライドモードでスライドが2枚づつ作成されている?
  • Generate Google Slides from markdown

*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

LT.2:Reactに不変の愛を @boiyaa

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

LT.5:Chromeデベロッパーツールを自分色に染める @jumpei_ikegami

LT.6:flowがReactにもたらすもの @takanorip

  • 発表資料
    • まだ公開されていない?
  • 技術書展出店予定
  • flow?
    • 静的型チェッカー
  • 小さく試せる
    • レガシー環境下でも使える
  • AltJSではないのでESの機能すべて使える
  • Reactと相性がいい
    • 作ってる所が一緒
  • エラーが出た時に参考にできる情報がない
  • flowは後から入れても大丈夫なので、小さく入れてみると良い

LT.7:ReactでPDF帳票を出力する @stakezaki

LT.8:レガシーな環境にTypeScriptを導入した話 @ama

  • 発表資料
    • まだ公開されていない?
  • レガシーな環境とは。
  • 型があるって素晴らしい!
  • ある程度は書き方が統一できる
  • jQueryを使っていたら、jQueryの型定義が既にある。
  • 独自の型定義をどこまで頑張るのか問題。
  • JavaC#のエンジニアが多い場合にはTypeScriptがいい!

LT.9:同じとは @chikoski

*1:特に後半