Quantcast
Channel: いろいろ備忘録日記
Viewing all 1447 articles
Browse latest View live

Pythonメモ-55 (pygments でシンタックスハイライトさせて遊ぶ) (pygments, pygmentize, syntax highlight)

$
0
0

概要

何かのライブラリをインストールしようとすると、ちょこちょこ見る名前って結構あります。

私の場合、pygmentsってライブラリがよく出てきていたのですが

これが何なのか知りませんでした(恥

Welcome! — Pygments

とっても有名なライブラリなんですね。

何の機能を持っているかというと プログラムコードなどに対して シンタックスハイライトしてくれるというものです。

よくあちこちのブログとかで見る、あのハイライト状態な出力を行ってくれます。

300以上の言語に対応しているとのこと。すごい!

出力も HTML画像とかいろいろ選べる模様。

インストール

condaの場合は、いつものように

$ conda install pygments

で終わりです。Anaconda使っている場合は、最初からインストールされています。

基本的な使い方

とりあえず、ドキュメントをちょっと見てみたら、使い方としては以下のようにするみたい。

  • ハイライト対象のデータを用意する

  • 構文解析器 (Lexer) を選んで生成

  • 出力するもの (Formatter) を選んで生成

  • pygments.highlight関数に渡して出力してもらう

みたいです。

以下のような感じ。python3の構文でHTMLでシンタックスハイライトする場合の基本的なやり方。

# データ 用意
code = """\def hello():    print('hello world')    for x in range(10):        print(x)"""# Lexer 用意
lexer = pygments.lexers.python.Python3Lexer()

# Formatter 用意
formatter = pygments.formatters.html.HtmlFormatter()

# 出力
html = pygments.highlight(code, lexer, formatter)

上のように直接 具象クラス を使ってもいいですが

ヘルパー関数があるのでそれ使ったほうが良さそう。

# データ 用意
code ="""\def hello():    print('hello world')    for x in range(10):        print(x)"""# Lexer 用意
lexer = pygments.lexers.get_lexer_by_name('python3')# Formatter 用意
formatter = pygments.formatters.get_formatter_by_name('html')# 出力
html = pygments.highlight(code, lexer, formatter)

サンプル

以下、サンプルです。

"""pygments に関するサンプルです。最も基本的な使い方を記載しています。- pythonからpygmentsの操作方法- pygmentize コマンドの使い方(コメントで)"""import os
import subprocess

from pygments import highlight
from pygments.formatters import get_formatter_by_name
from pygments.lexers import get_lexer_by_name

from common.commoncls import SampleBase
from common.commonfunc import pr


classSample(SampleBase):
    """    pygmentsのサンプルです。    pythonのコードをハイライト付きでhtmlに出力します。"""defexec(self):
        """処理を実行します。"""# --------------------------------------------------------------------------------# pygments の基本的な使い方#   - http://pygments.org/## pygments を利用する場合、必要なオブジェクトは以下の3つ#   - コード: ハイライト表示対象のコード#   - 解析器(lexer): コードを解析するためのオブジェクト#   - フォーマッタ: 最終的な出力を担当するオブジェクト## lexer と formatter は、各実装クラスを直接つかってもいいが# 以下のヘルパー関数を使用しても取得できる#   - pygments.lexers.get_lexer_by_name()#     - 例えば、言語が python の場合は、"python" or "python3" となる#     - http://pygments.org/docs/lexers/#   - pygments.formatters.get_formatter_by_name()#     - 例えば、HTMLで出力したい場合は "html" となる#     - http://pygments.org/docs/formatters/#     - HtmlFormatterは便利だが、残念な事にHTML4形式で現状出力されてしまう。## 必要なオブジェクトが揃ったら、後は pygments.highlight() に渡すと# 整形データが取得できる# --------------------------------------------------------------------------------
        code = """\def hello():    print('world')    results = []    for x in range(10):        ressults.append(i for i in x)"""
        lexer = get_lexer_by_name('python3')
        formatter = get_formatter_by_name('html', linenos=True, full=True, encoding='utf-8')

        # formatter に対して, 共通パラメータ [encoding] を指定した場合# 結果として受け取るデータの型は、bytes になる。指定していない場合、str となる。# HtmlFormatter にて encoding を指定しない場合、 charset の値が None となることに注意。
        html = highlight(code, lexer, formatter)
        ifhasattr(html, 'decode'):
            html = html.decode('utf-8')
        pr('pygments.html', html)

        file_path = '/tmp/pygments_test.html'withopen(file_path, 'w') as out_fp:
            out_fp.write(html)

        preserve_file = Truetry:
            subprocess.check_call(file_path, shell=True)
        finally:
            ifnot preserve_file:
                os.unlink(file_path)

        # --------------------------------------------------------------------------------# pygmentize コマンドの利用# pygments をインストールすると pygmentize という専用コマンドもインストールされる。# このコマンドを利用すると、pythonスクリプトを書かなくてもハイライト付きのデータが取得できる。## 上のコードと同じような出力を得る場合は以下のようにする# $ pygmentize -f html -O linenos,full -o /tmp/pygments_test.html hello.py# --------------------------------------------------------------------------------defgo():
    """サンプルを実行します。"""
    obj = Sample()
    obj.exec()


if __name__ == '__main__':
    go()

try-python/pygments01.py at master · devlights/try-python · GitHub

pygmentize コマンド

pygmentsをインストールすると、pygmentizeというコマンドもインストールされます。

このコマンドは、いちいちスクリプト書かなくても、上のサンプルの動きと同じようなことをやってくれます。

さくっとハイライトした出力物を生成したい場合は、このコマンドでつくって渡した方が楽ですね。

上のサンプルと同じような出力を得る場合は、以下のようにします。

$ pygmentize -f html -O linenos,full -o /tmp/pygments_test.html hello.py

参考情報


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。


Pythonメモ-56 (pygments で色付き cat コマンドみたいなの作る) (pygments, highlight, get_lexer_for_filename, TerminalFormatter)

$
0
0

概要

前回

devlights.hatenablog.com

ってことで、pygmentsってライブラリを初めて使ってみたのですが

面白かったので、もう少し遊んでみました。

ドキュメント見ると、いろいろ関数があって、Lexerを推定して作ってくれる系のものがあります。

その中にget_lexer_for_filenameという関数があったので

これで、「色付きのcatコマンドみたいなもの」を作ってみました。といっても大事な部分は

全部pygmentsさんにおまかせしているので、何もしていないのですがw

サンプル

以下、サンプルです。

"""pygments に関するサンプルです。pygments に備わっている ファイル名からの予想機能 をつかって 色付きcatコマンド みたいなのを実装しています。usage:  $ python -m trypython.extlib.pygments02 ファイルパスファイルのエンコーディングを指定したい場合は以下のようにします。デフォルトは utf-8 です。  $ python -m trypython.extlib.pygments02 ファイルパス --encoding euc-jp"""import argparse
import os

from pygments import highlight
from pygments.formatters.terminal import TerminalFormatter
from pygments.lexers import get_lexer_for_filename

from trypython.common.commoncls import SampleBase


classSample(SampleBase):
    """    pygments に関するサンプルです。    pygments に備わっている ファイル名からの予想機能 をつかって 色付きcatコマンド みたいなのを実装しています。"""def__init__(self, file_path: str, encoding: str) -> None:
        """オブジェクトを初期化します。        :param file_path: ファイルパス        :param encoding: エンコーディング"""super().__init__()
        self.file_path = file_path
        self.encoding = encoding

    defexec(self) -> None:
        """処理を実行します。        :return: なし"""withopen(self.file_path, mode='r', encoding=self.encoding) as in_fp:
            code = in_fp.read()

        lexer = get_lexer_for_filename(self.file_path)
        formatter = TerminalFormatter(bg='dark')
        result = highlight(code, lexer, formatter)

        print(result)


defgo(file_path: str, encoding: str) -> None:
    """サンプルを実行します。    :param file_path: ファイルパス    :param encoding: エンコーディング    :return: なし"""ifnot os.path.exists(file_path):
        raise FileNotFoundError(f'target file is not found [{file_path}]')
    if os.path.isdir(file_path):
        raiseValueError(f'file_path should be file, NOT directory [{file_path}]')

    try:
        'helloworld'.encode(encoding)
    exceptLookupError:
        raiseValueError(f'invalid encoding [{encoding}]')

    obj = Sample(file_path, encoding)
    obj.exec()


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('file_path', type=str, help='target file path')
    parser.add_argument('--encoding', type=str, default='utf-8', help='file encoding (default: utf-8)')

    args = parser.parse_args()
    go(args.file_path, args.encoding)

try-python/pygments02.py at master · devlights/try-python · GitHub

動かしてみた

Windowsでcmder上で実行した結果が、こんな感じです。

f:id:gsf_zero1:20180118130053p:plain
python -m trypython.extlib.pygments02 /tmp/pytmp/hello.py

f:id:gsf_zero1:20180118130106p:plain
python -m trypython.extlib.pygments02 trypython/extlib/pygments02.py

いいんじゃないでしょうかね。Styleとか調整したらもうちょいましな色付きできるかも。

参考情報

pygmentsでcatとか調べてみたら、以下の情報がありました。すでに やってらっしゃる方もいらっしゃるんですね。

havelog.ayumusato.com

こちらのページでは less も出来るように調整されています。pygmentizeコマンドを使われています。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。

Pythonメモ-57 (サブクラスで __init__ を定義する場合の注意点) (class, super, __init__, Never code a method that just delegates to the superclass)

$
0
0

概要

たまに間違えてバグ作ってしまったりしてるので、忘れないようメモメモ。

python で サブクラスの __init__定義する場合に

super().__init__()

としていないと、親クラスの__init__()が呼ばれないよって話しです。

他の言語の場合 (例えば C#)

C#の場合

using System;

namespace ConsoleApplication1
{
    internalclass BaseClass
    {
        internalint BaseValue { get; }

        public BaseClass()
        {
            BaseValue = 10;
        }
    }

    internalclass DerivedClass : BaseClass
    {
        internalint DerivedValue { get; }

        public DerivedClass()
        {
            DerivedValue = 20;
        }
    }

    internalclass Program
    {
        publicstaticvoid Main(string[] args)
        {
            var x = new DerivedClass();
            Console.WriteLine($"Base={x.BaseValue}, Derived={x.DerivedValue}");
        }
    }
}

と記述して、実行すると

Base=10, Derived=20

って表示されます。つまり、サブクラス側で明示的に親クラスのコンストラクタを

呼んでなくても、この場合は暗黙で デフォルトコンストラクタ が呼ばれます。

python の場合

python の場合、__init__メソッドは厳密にはコンストラクタではないのですが

まあ、大体同じものだということで。以下のようなクラスを定義してみて

classB:
    """ベースクラス"""def__init__(self) -> None:
        self.x = 10classC(B):
    """サブクラス1自分の __init__ を定義していないバージョン"""pass

使ってみると

        obj1 = C()
        pr('C.x', obj1.x)

以下のように表示されます。

C.x=10

予想通りの動作。次に

classD(B):
    """サブクラス2自分の __init__ を定義しているが    super().__init__() を呼んでいないバージョン"""# noinspection PyMissingConstructordef__init__(self):
        self.y = 20

を定義して

            obj2 = D()
            pr('D.x', obj2.x)
            pr('D.y', obj2.y)

ってすると

AttributeError("'D' object has no attribute 'x'",)

となります。サブクラス側が __init__を定義しているので

親クラス側の __init__がオーバーライドされます。 python は素直な言語なので

普通に上書きされます。なので、この場合 親クラスの__init__が呼ばれないとなります。

で、以下のようにするのが正しいやり方。

classE(B):
    """サブクラス3自分の __init__ を定義していて    super().__init__() も呼んでいるバージョン"""def__init__(self):
        super().__init__()
        self.y = 20

呼び出すと

        obj3 = E()
        pr('E.x', obj3.x)
        pr('E.y', obj3.y)

ちゃんと表示されます。

E.x=10E.y=20

まとめ

てことで、サブクラスで __init__定義するときは、必ず

super().__init__()

を呼び出しするべしってなります。

PyCharmのような統合環境使っている場合は自動で挿入してくれていたり

呼び出しを書いていなかった場合は警告が出たりしますので、呼び出し忘れることは

ほぼ無いのですが、エディタで書いてたりすると抜けてたりします。(しましたw

実行すると意味の分からないエラーパターンになるので焦ります。。

ちなみに、このパターンは __init__だけじゃなくて、どのメソッドでも当てはまります。

サンプル

"""Python のクラスについてのサンプルです。サブクラス側で __init__ を定義した場合の注意点について。"""from common.commoncls import SampleBase
from common.commonfunc import pr, hr


classB:
    """ベースクラス"""def__init__(self) -> None:
        self.x = 10classC(B):
    """サブクラス1自分の __init__ を定義していないバージョン"""passclassD(B):
    """サブクラス2自分の __init__ を定義しているが    super().__init__() を呼んでいないバージョン"""# noinspection PyMissingConstructordef__init__(self):
        self.y = 20classE(B):
    """サブクラス3自分の __init__ を定義していて    super().__init__() も呼んでいるバージョン"""def__init__(self):
        super().__init__()
        self.y = 20classSample(SampleBase):
    """サンプルとなるクラスです。"""defexec(self):
        """処理を実行します。"""# ------------------------------------------------------------# (1) サブクラス側が __init__ を定義していない場合#     既定で、 super().__init__() が呼ばれた状態となる# ------------------------------------------------------------
        obj1 = C()
        pr('C.x', obj1.x)

        hr()

        # ------------------------------------------------------------# (2) サブクラス側が __init__ を定義しているが super().__init__() を#     呼んでいない場合、親クラスの __init__ は呼ばれない。## 他の言語に慣れている場合、デフォルトのコンストラクタが呼ばれるのが暗黙的なので# よく間違えてしまう。注意が必要。## PyCharmで作業している場合、IDE側が警告を出してくれるので気付ける。# ------------------------------------------------------------try:
            obj2 = D()
            pr('D.x', obj2.x)
            pr('D.y', obj2.y)
        exceptAttributeErroras e:
            pr('D', e)

        hr()

        # ------------------------------------------------------------# (3) サブクラス側が __init__ を定義していて super().__init__() を#     呼んでいる場合、親クラスの __init__ も呼ばれる。# ------------------------------------------------------------
        obj3 = E()
        pr('E.x', obj3.x)
        pr('E.y', obj3.y)


defgo() -> None:
    """サンプルを実行します。"""
    obj = Sample()
    obj.exec()


if __name__ == '__main__':
    go()

try-python/cls03.py at master · devlights/try-python · GitHub

補足

この点については、書籍「Python in a nutshell」でも記載されていました。

Python in a Nutshell

Python in a Nutshell

書籍内では、

単純に親クラスの処理をデリゲートするだけのメソッドを書いてはいけません。
(Never code a method that just delegates to the superclass)

つまり、以下のようなものは定義したらダメだよってことですね。

classDerived(Base):
    def__init__(self):
        super().__init__()

過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。

JetBrains の IDE の公式マニュアル日本語版サイトが登場 (JetBrains, PyCharm, Rider, Resharper)

$
0
0

概要

いつのまにか、JetBrainsの各製品のマニュアル日本語版サイトが登場してたので、メモメモ。

まだ、ベータみたいなのですが、荒削りな訳の部分もありつつ、普通に読めますね。

JetBrainsのIDE使っている人間としては、嬉しい限り。

pleiades.io

本家のドキュメントは、以下のページから各製品毎のページにいって見れます。

www.jetbrains.com


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。

Pythonメモ-58 (3.7で追加される Data Classes についての情報) (dataclass, PEP 526, A brief tour of Python 3.7 data classes)

$
0
0

概要

Python 3.7 (現在アルファ版公開中)で追加になる Data Classesについての情報メモ。

恐らく、みんな欲しかった機能ではないでしょうか。名前付きタプルも便利ですが、Mutableなデータクラスがサクッと定義できるのは楽です。

Hacker Noonさんで、A brief tour of Python 3.7 data classesという記事が分かりやすかったです。

hackernoon.com

公式ドキュメントは、以下のようになっています。

What’s New In Python 3.7 — Python 3.7.0a4 documentation

今回の追加仕様の元となったPEP。Data Classesは、PEP 526です。

www.python.org

追記)Qiitaの方でもとても分かりやすく説明してくださっている記事発見。感謝。

qiita.com


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。

Java9 + Kotlin 1.2.21 で出る謎の警告メッセージ (java9, kotlin 1.2, kotlinc, An illegal reflective access operation has occurred)

$
0
0

概要

なんか、Java 9 と Kotlin 1.2 だと、謎の警告メッセージが出てきて焦ったので、メモメモ。

私の環境の java は以下のようになってます。

$ java -version
java version "9.0.1"
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM)64-Bit Server VM (build 9.0.1+11, mixed mode)

kotlin 自体は、IntelliJ IDEA のプラグインで入れてます。

kotlincってどこにあるんじゃーって探してたら以下の場所にありました。

$HOME\.IntelliJIdea2017.3\config\plugins\Kotlin\kotlinc\bin\kotlinc

で、kotlin のバージョンは

$ $HOME\.IntelliJIdea2017.3\config\plugins\Kotlin\kotlinc\bin\kotlin -version
Kotlin version 1.2.21-release-88(JRE 9.0.1+11)

たぶん、現時点での最新じゃないかなと。

変な警告でる

で、以下のようなドウデモイイサンプルをコンパイルして実行します。

fun main(args: Array<String>) {
    var i = 100val ii = 100

    println("hello world - $i - $ii")
}

これを、IntelliJ IDEA から実行すると、普通に実行されます。

でも、kotlinc 直接つかってコンパイルすると

$ $HOME\.IntelliJIdea2017.3\config\plugins\Kotlin\kotlinc\bin\kotlinc helloworld.kt
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.intellij.util.text.StringFactory to constructor java.lang.String(char[],boolean)
WARNING: Please consider reporting this to the maintainers of com.intellij.util.text.StringFactory
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

なんか出てきた。

コンパイル自体は普通に完了していて、普通に実行できます。

$ $HOME\.IntelliJIdea2017.3\config\plugins\Kotlin\kotlinc\bin\kotlin HelloworldKt
hello world

バグ?

ネットでいろいろ情報さがしてみると、以下にヒット。

discuss.kotlinlang.org

ここに以下の書き込みが

discuss.kotlinlang.org

java 9 + kotlin で出る既知の問題とのこと。

リンク先に行ってみると

https://youtrack.jetbrains.com/issue/KT-19051

バグ登録されていて、すでに fix 済みになっていました。

Target versions が 1.2.30なので、私の環境の 1.2.21では再現するってことかな。

まあ、とりあえずIDE上は出ないし、キニスンナって事にします。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。

Pythonメモ-59 (dockerでpython 3.7のdataclassを試す) (dataclass, PEP 526, docker, rc-alpine, python 3.7.0a4)

$
0
0

概要

前回、python 3.7 で追加される Data Classes についての情報をメモしたので

devlights.hatenablog.com

ついでにちょっと試してみようと思います。

docker で試す

でも、python 3.7 はまだアルファ版です。いきなり自分の環境に入れたりするのは嫌ですよね。

とかいって、仮想環境をvagrantとかで作ってもいいのですが、今回は docker でやります。

やっぱ楽なので。

Docker Hub の Python ページ見ると rc-stretch, rc-slim, rc-alpineのタグがありますね。

今回は、ちょっとお試ししたいだけなので、サイズが小さい rc-alpineでいきます。

$ docker run -it--rm python:rc-alpine
Unable to find image 'python:rc-alpine' locally
rc-alpine: Pulling from library/python
ff3a5c916c92: Pull complete 
471170bb1257: Pull complete 
3576b9290ad6: Pull complete 
682dced8659d: Pull complete 
e357f9ed8ef3: Pull complete 
Digest: sha256:1a96023decb61dfe2b57ccfd0ec06f51d750999ea659d22a15a6a71760e26dfe
Status: Downloaded newer image for python:rc-alpine
Python 3.7.0a4 (default, Jan 102018, 05:17:21)[GCC 6.4.0] on linux
Type "help", "copyright", "credits" or "license"for more information.
>>>

バッチリ。便利な時代になりましたねぇ。。

てことで、ちょっと遊んでみる。

Data Classes 試してみる

Data Classes については、前回の記事にて分かりやすい情報公開してくださっている方々のページ見るのが一番です。

以下、自分用の軽いメモです。

>>> # Data Class 機能を使うためのimport>>> from dataclasses import dataclass, astuple, asdict
>>> # データクラスを定義してみる>>> @dataclass
... classC:
...     x: int
...     y: str
...     z: int = -1
... 
>>> # OK. できた>>> # インスタンス作ってみる>>> c = C(1, 'helloworld')  # 最後の引数はデフォルト値指定している>>> c
C(x=1, y='helloworld', z=-1)
>>> # 値変更してみる>>> c.x = 100>>> c
C(x=100, y='helloworld', z=-1)
>>> # もう一個作ってみる>>> c2 = C(1, 'helloworld', -1)
>>> c2
C(x=1, y='helloworld', z=-1)
>>> # 同じ?>>> c == c2
False>>> c.x = 1>>> # 同じ?>>> c == c2
True>>> # 同じフィールド数を持つ namedtuple 作ってみる>>> from collections import namedtuple
>>> D = namedtuple('D', ['x', 'y', 'z'])
>>> d = D(1, 'helloworld', -1)
>>> d
D(x=1, y='helloworld', z=-1)
>>> # 同じ?>>> c == d
False>>> # GOOD!!>>> # namedtupleの場合、たまたま同じフィールドを持っていると同じになってしまう>>> E = namedtuple('E', ['a', 'b', 'c'])
>>> e = E(1, 'helloworld', -1)
>>> d == e
True>>> c == e
False>>> # namedtuple は名前の通り、後から値を変更できない>>> e.a = 100# ERROR: AttributeError: can't set attribute>>> # namedtupleは、名前の通り tuple なので、同じ値の tuple と比較すると一致する>>> e == (1, 'helloworld', -1)
True>>> # dataclass はそうならない>>> c == (1, 'helloworld', -1)
False>>> # tuple にするには astuple を使う>>> astuple(c)
(1, 'helloworld', -1)
>>> # dict にするには、asdict を使う>>> asdict(c)
{'x': 1, 'y': 'helloworld', 'z': -1}
>>> astuple(c) == (1, 'helloworld', -1)
True>>> asdict(c) == dict(x=1, y='helloworld', z=-1)
True>>> # 満足>>> quit()
$
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python              rc-alpine           4df58c01b1b7        3 weeks ago         85.8MB
$ docker rmi python:rc-alpine
Untagged: python:rc-alpine
Untagged: python@sha256:1a96023decb61dfe2b57ccfd0ec06f51d750999ea659d22a15a6a71760e26dfe
Deleted: sha256:4df58c01b1b78339129e8849e5ea81db0ce10812df6dcf6b23f0ff5156de9769
Deleted: sha256:b5aeb063aa825d47e012044aff4138520a47ac9594bb1c907e87f7aa2cc50a35
Deleted: sha256:05da2d3b33e649ed13df5c80d59c83e197e0537a016e3c346cc7e660adecd35b
Deleted: sha256:2569558d6fc2c80ba0b3d5d3ae355bfda0edc868d3f7313dd3a8863d80ff42b0
Deleted: sha256:bfb4cbe300f3859ff67b589214f50b43a47db4186217d576a619a4171eed9735
Deleted: sha256:cd7100a72410606589a54b932cabd804a17f9ae5b42a1882bd56d263e02b6215

過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。

Pythonメモ-60 (Pythonチュートリアルを読んで勉強になったこと) (python, tutorial, document)

$
0
0

概要

知り合いから、pythonチュートリアルの書籍版をもらいまして、読んでみたら結構勉強になったことがありました。

Pythonチュートリアル 第3版

Pythonチュートリアル 第3版

私が読んだのは、第三版。pythonのバージョンは3.5のものです。

ネットで公開されている公式のチュートリアルはさらっと読んだつもりだったのですが

やっぱり書籍で読むのもいいですね。

ソースの頭に coding: xxxx 書かなくていい

前にpythonちょこっと使っていたときは、まだバージョンが2の最初あたりだったので

ソースの先頭に

# -*- coding: utf-8 -*-

# coding: utf-8

って記述するのがクセになっていました。python3からはいらなかったんですね。

トリプルクォート文字列書くときのtips

"""で囲んだ文字列は複数行に渡って書くことができます。docstringとかでおなじみのもの。

行末文字も自動的に文字列に付与されるので、たとえば

defdodemoii_kansu(x, y):
    """どうでもいい関数    :param int x: x    :param int y: y    :return: なし"""if __name__ == '__main__':
    print(dodemoii_kansu.__doc__)

というのを実行すると

$ python tekito.py 

    どうでもいい関数

    :param int x: x
    :param int y: y
    :return: なし

という風に、最初の一行目に空行がはいってしまいます。 なので、

defdodemoii_kansu(x, y):
    """どうでもいい関数    :param int x: x    :param int y: y    :return: なし"""

って書いてたのですが、よく考えると以下でいいのね。

defdodemoii_kansu(x, y):
    """\どうでもいい関数    :param int x: x    :param int y: y    :return: なし"""

こうすると、最初の行が継続してることになるので、変な空行入らない。

よくよく考えるとその通りですね。

例外の再送出

これはいつも忘れてしまうので、ついでにメモ。

例外をキャッチした後、そのまま再送出するには

try:
        raiseNameError('hello')
    exceptNameError:
        print('例外でた')
        raise# 再送出

と、raiseのみ記述する。

9.2. Python のスコープと名前空間はMUST READ

9. クラス — Python 3.6.3 ドキュメント

めっちゃ勉強になりました。この章は絶対読んでおいた方がよいです。

global, nonlocalを使う場合はここの内容が理解できていないとバグりますね。

  • 名前空間とは、名前とオブジェクトのマッピングのこと。
  • 名前空間は様々なタイミングで作られ、寿命も様々。
  • ビルドイン名の入った名前空間は、インタープリタの起動とともに作られて、終了まで削除されない。
  • モジュールのグローバル名前空間は、モジュール定義の読み込み時に作られる。
  • 関数のローカル名前空間は、関数がコールされたときに作られて、関数からリターンしたり、関数内で処理されない例外を送出したときに削除される。
  • スコープとは、ある名前空間から直接アクセスできる、範囲のこと。
  • スコープは静的に生成されるが、利用は動的に行われる。
  • スコープは以下のように処理される。
    • 最初に検索されるのは、最も内側にあるローカル名の入ったスコープ
    • これを取り囲む関数がある場合、その名前空間の最も内側のスコープから順に検索される。ここには非ローカルと非グローバルが入っている。
    • 最後から2番目に検索されるスコープには、今いるモジュールのグローバルな名前が入っている。
    • 最後に検索されるのは、最も外側のスコープで、ビルドイン名が入った名前空間。

reprlib

実は知りませんでした。。。便利ですねこれ。

import reprlib
    chars = set('jeijejfnasdouweoefbaefaeugb4epfuabbn')
    print(reprlib.repr(chars))

実行すると

{'4', 'a', 'b', 'd', 'e', 'f', ...}

結果が長い場合は適当なところでちぎって、残りを・・・にしてくれます。

Traceback (most recent call last) の意味

これは、書籍の「付録E」に載っていた内容なのですが、なるほどって思いました。

見慣れているので、なんとも思ってなかったです。そういえば、パっと見意味わからないですよね。

新しい呼び出し(つまり直近の呼び出し)ほど、後ろにあるよ。

って意味。なので、例外のトレースは、下から直近の呼び出しになるので

一番下の呼び出しが、最も直近の呼び出し。

付録F がとてもわかり易かった

これは書籍版にしか無いのかもしれませんが、付録Fは、普段はpython3使っている人が

いろいろな理由により、python2でスクリプトを書かないと行けない場合の注意事項について

記述されています。(たとえば、printがpython2では関数じゃないよとか)

例外の文法が異なるとか。

python3では、

raise例外(引数)

なのが、python2は3種類も書き方がある。

raise例外, 引数  # (1)raise例外(引数)  # (2)raise例外, 引数, トレースバックオブジェクト  # (3)

except の書き方も python3 は

except例外:  # (1)except例外 as e  # (2)except (例外1, 例外2):  # (3)

なのですが、違いがあるのは (2) の 例外オブジェクトを変数にバインドする方法

これが、python2ではカンマなので

except例外1, 例外2:

ってやっちゃうと本来は例外2つキャッチしたかったのに例外1の変数として例外2が使われてしまう。

なるほど。。。これはたまにやってしまいそう。。。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。


Pythonメモ-61 (conda 4.4.0からactivateの仕方が変わってる) (conda, activate, deactivate, 4.4.0, conda.sh)

$
0
0

概要

前に

devlights.hatenablog.com

というのを書いていたのですが、conda activateconda deactivateについて

いつからこうなったのだろうって、conda の changelog みてたら以下がありました。

github.com

どうも、4.4.0からこの形式が始まっているみたいですね。

推奨する形式になってる

With the release of conda 4.4, we recommend a change to how the conda command is made available to your shell environment. All the old methods still work as before, but you'll need the new method to enable the new conda activate and conda deactivate commands.

ということなので、前の方法も以前として使えるよと。その内使うようにしてねくらいの勢いかな。

Windowsの場合は特に影響なし。bashなどを使っている mac や linux に影響する。

以前までは、.bash_profileとかに

export PATH="/condaのパス/bin:$PATH"

って形で設定してたのを、今後は

. /condaのパス/etc/profile.d/conda.sh

ってしてねって書いてありますね。

私の環境は fish shell なので、以下のようにしています。

source(conda info --base)/etc/fish/conf.d/conda.fish

デフォルトの環境名が root から base に変わっている

これも、このリリースノート見る前から気づいていたのですが

いつの間にか、デフォルトの環境名が前は rootだったのに

baseに変わっていました。

これも、このタイミングで変わったんですね。

他にもいろいろ機能追加とか変更されているみたい

上の changelog 見ると、この 4.4.0 でいろいろ機能追加とか変更がされているみたいですね。

検索の仕方とか。

$ conda search conda-forge::python

みたいに、channel::packageの指定方法が出来るようになったみたい。(MatchSpecというらしいです)

正しくは、以下とのこと。

(channel::)name(version(build_string))

過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。

Pythonメモ-62 (glances試してみたら凄く良かった) (psutil, glances, top/htop alternative)

$
0
0

概要

以前に psutil についてのメモをちょっと書いていて

devlights.hatenablog.com

github.com

久しぶりにちょっと使うので、上の github ページみてたら下の方に psutil を使ってるプロジェクトって部分に以下を発見。

nicolargo.github.io

github.com

めっちゃかっこいいやん!topのイケてる版みたいな感じ。

requirements.txt みたら、本当に psutil しか依存してない。。すごいな。

psutil便利すぎますね。

早速試してみました

てことで、早速使ってみました。以下、備忘録です。

インストールは、上記 github ページとかに丁寧にいろいろな方法で記載されています。

今回は、楽なので condaでいきました。

⟩ conda search glances
Loading channels: done
Name                       Version                   Build  Channel        
glances                    2.6                      py27_0  conda-forge    
glances                    2.6                      py34_0  conda-forge    
glances                    2.6                      py35_0  conda-forge    
glances                    2.6.1                    py27_0  conda-forge    
glances                    2.6.1                    py34_0  conda-forge    
glances                    2.6.1                    py35_0  conda-forge    
glances                    2.6.2                    py27_0  conda-forge    
glances                    2.6.2                    py34_0  conda-forge    
glances                    2.6.2                    py35_0  conda-forge    
glances                    2.6.2                    py36_0  conda-forge    
glances                    2.8.2                    py27_0  conda-forge    
glances                    2.8.2                    py35_0  conda-forge    
glances                    2.8.2                    py36_0  conda-forge    
glances                    2.8.6                    py27_0  conda-forge    
glances                    2.8.6                    py35_0  conda-forge    
glances                    2.8.6                    py36_0  conda-forge    
glances                    2.8.8                    py27_0  conda-forge    
glances                    2.8.8                    py35_0  conda-forge    
glances                    2.8.8                    py36_0  conda-forge    
glances                    2.9.1                    py27_0  conda-forge    
glances                    2.9.1                    py35_0  conda-forge    
glances                    2.9.1                    py36_0  conda-forge    
glances                    2.10                     py27_0  conda-forge    
glances                    2.10                     py35_0  conda-forge    
glances                    2.10                     py36_0  conda-forge    
glances                    2.10                       py_1  conda-forge    
glances                    2.11                       py_0  conda-forge

conda-forge側にありますね。てことで、インストール。

⟩ conda create --name glances glances
Solving environment: done## Package Plan ##

  environment location: /Users/xxxx/anaconda3/envs/glances

  added / updated specs: 
    - glances

The following NEW packages will be INSTALLED:

    ca-certificates: 2017.08.26-ha1e5d58_0            
    certifi:         2018.1.18-py36_0                 
    glances:         2.11-py_0             conda-forge
    libcxx:          4.0.1-h579ed51_0                 
    libcxxabi:       4.0.1-hebd6815_0                 
    libedit:         3.1-hb4e282d_0                   
    libffi:          3.2.1-h475c297_4                 
    ncurses:         6.0-hd04f020_2                   
    openssl:         1.0.2n-hdbc3d79_0                
    pip:             9.0.1-py36h1555ced_4             
    psutil:          5.4.3-py36h1de35cc_0             
    python:          3.6.4-hc167b69_1                 
    readline:        7.0-hc1231fa_4                   
    setuptools:      38.4.0-py36_0                    
    sqlite:          3.22.0-h3efe00b_0                
    tk:              8.6.7-h35a86e2_3                 
    wheel:           0.30.0-py36h5eb2c71_1            
    xz:              5.2.3-h0278029_2                 
    zlib:            1.2.11-hf3cbc9b_2                

Proceed ([y]/n)? y

Preparing transaction: done
Verifying transaction: done
Executing transaction: done## To activate this environment, use##     $ conda activate glances## To deactivate an active environment, use##     $ conda deactivate

次に、readme に書いてあるみたいに、起動してみます。

$ glances

ターミナルが以下のようになります。

f:id:gsf_zero1:20180215010922p:plain

見やすいですねぇ。下にアラートも出るみたい。メモリ使いすぎって出てるなw

topと同じように状況が自動更新されていきます。

ヘルプは hキーを押すと出るみたいです。こんな感じ。

f:id:gsf_zero1:20180215011242p:plain

個人的によく使いそうなのは以下ですかね。

  • 数字の1押下
    • CPUのサマリーを切り替え(全体と個別)
  • c押下
    • CPU使用率で並び替え
  • m押下
    • メモリ使用率で並び替え
  • p押下
    • プロセス名で並び替え
  • 数字の5押下
    • 上部のトップメニューエリアみたいな部分を表示切り替え
  • U押下
    • ネットワークI/Oの累積表示の切り替え
  • D押下
    • Dockerのステータスエリアを表示切り替え

IPアドレス

で、よく見たら、上部にIPアドレスが表示されていません。

glancesは、プラグインみたいな感じでいろいろな機能を付与できるようになっているみたいで

ipアドレスを表示するには、別途以下のライブラリが必要とのこと。

netifaces

てことで、インストールしてみましょう。

⟩ conda install netifaces
Solving environment: done## Package Plan ##

  environment location: /Users/xxxx/anaconda3/envs/glances

  added / updated specs: 
    - netifaces


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    netifaces-0.10.6           |           py36_0          14 KB  conda-forge

The following NEW packages will be INSTALLED:

    netifaces: 0.10.6-py36_0 conda-forge

Proceed ([y]/n)? y


Downloading and Extracting Packages
netifaces 0.10.6: ################################################################################################################################## | 100% 
Preparing transaction: done
Verifying transaction: done
Executing transaction: done

オケ。てことで、再度 glancesを表示してみます。

f:id:gsf_zero1:20180215014135p:plain

こんな風にIPアドレスが表示されるようになりました。他にもRabbitMQ用の表示ができたりといろいろあるみたいです。

glancesさん、他にも以下のような機能があるみたいなんですが、今回はここまでにして、また触ったら追記します。

  • Webインターフェースを持ってる。(要 bottle っぽい)
  • クライアント/サーバー形式で動作させることもできる。
    • モニタしたいマシンに glances をサーバーで起動しておけば、別のマシンから見ることも出来る
    • glances自体に restful json api なインターフェースを持っているので、それを使ってデータを取得できる
  • モニタリング情報をいろいろな形式でエクスポートできる
    • csvとか

過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。

Pythonメモ-63 (vscodeのpython拡張でlinterが選択可能になった) (visual studio code, select linter, Jan 2018 Release)

$
0
0

概要

最近、ちょこちょこ vscodeのpython拡張についてメモしてきました

devlights.hatenablog.com

devlights.hatenablog.com

なにかと機能豊富なpython拡張さんですが、2018.01リリースで linterも選択できるようになったみたいです。

Python in Visual Studio Code – Jan 2018 Release – Python Engineering at Microsoft

Select Linter

これまでは、linterの設定するために、設定ファイルを開いて

"python.linting.flake8Enabled": true

みたいに設定する必要があったのですが、これが

  • コマンドパレット開く (Ctrl+Shift+P (macの場合は Cmd+Shift+P))
    • python: Select Linter

で好きなlinterを設定できるようになってます。

注意点として、このモードで選択した場合は選択したlineterのみがONになります。

複数のlinterを設定したい場合、例えば flake8mypyの両方を有効にしたい場合などは

設定ファイルを編集する必要があります。

Create Terminal

あと、コマンドパレットを開いて

Python: Create Terminal

って打ち込んでターミナル起動すると、ちゃんと現在選択している仮想環境でactivateした状態で

ターミナルを起動してくれるようになってますね。condaの場合もちゃんと認識して動作してくれます。

Python: Start REPL

ってしたときも同様にactivateしてからpython起動してくれるようになってます。

便利ですねぇ。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。

いろいろな言語をREPLで試せるサイト (repl.it, C#, python, java, C++, Go, Ruby)

$
0
0

概要

面白いサイト見つけたので、忘れないうちにメモメモ。

いろいろな言語をREPLで試させてくれます。何気に便利ですね。

repl.it - Select a Language

2018/02/19 現在、以下をサポートしてくれているみたい。

  • python3
  • ruby
  • javascript
  • C#
  • Java
  • C
  • C++
  • Go
  • Kotlin
  • Rust
  • php

など

コンパイラ系言語について

C#の方はコンパイラがMonoですね。.NET Coreだったら嬉しかった。

Javaは、1.8系ですね。

C, C++は、gcc 4.6.3 でした。

C++に関しては

https://repl.it/languages/cpphttps://repl.it/languages/cpp11の2つがあります。

後者は、C++11みたい。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。

Pythonメモ-64 (contextlib.redirect_stdout) (stdoutの矛先を一時的に変更する, redirect_stderr)

$
0
0

概要

以前、contextlib.suppress についてメモしたのですが

devlights.hatenablog.com

contextlibモジュールさんには、他にも便利な関数が用意されていまして

結構個人的に利用しているのが、以下です。

contextlib.redirect_stdout

29.6. contextlib — with 文コンテキスト用ユーティリティ — Python 3.6.3 ドキュメント

この関数は何をしてくれるかというと、名前の通り一時的に標準出力つまり、sys.stdoutの出力先を変更してくれるコンテキストマネージャを返してくれます。

例えば、pythonでちょっとしたコマンドみたいなのを作っているとき、コマンドなので出力は標準出力にしておきたいのですが、それだとテストする際にちょっと面倒なので、テスト時はこの関数を使って出力値を StringIO などに変更しておくとあとで確認が簡単だという感じです。

使い方はめっちゃ簡単で、普通に

f = io.StringIO()
with contextlib.redirect_stdout(f):
    help(pow)

print(f.getvalue())

というふうに使います。上の例だと、help()は標準出力に結果を出力するので、そのまま呼び出すとコンソールに結果がその場で出力されるのですが、それを一時的に io.StringIOに入れているといった感じです。

サンプル

以下、サンプルです。

"""contextlib モジュールについてのサンプルです。contextlib.redirect_stdout について記載しています。"""import io
from contextlib import redirect_stdout

from trypython.common.commoncls import SampleBase
from trypython.common.commonfunc import pr


classSample(SampleBase):
    defexec(self):
        """        contextlib.redirect_stdout についてのサンプルを実行します。        :return: なし"""# ----------------------------------------------------------------------# contextlib.redirect_stdout(new_target)## 一時的にsys.stdoutを指定した矛先に向けてくれるコンテキストマネージャ# 兄弟関数として、contextlib.redirect_stderr がある。こちらは sys.stderr用# ----------------------------------------------------------------------# 以下のprint関数は結果をprint関数で出力しているので# 通常だと、標準出力に出力されるが redirect_stdout で矛先を変更している
        f = io.StringIO()
        with redirect_stdout(f):
            Sample.tekito()

        pr('f', f.getvalue())

        # 同様に help() は、通常 stdout に結果を出力するが# redirect_stdout することで結果を StringIO に格納
        f.seek(io.SEEK_SET)
        with redirect_stdout(f):
            help(sum)
        pr('f', f.getvalue())

    @staticmethoddeftekito(begin=0, end=10):
        for i inrange(begin, end):
            print(i, end=',')


defgo():
    """サンプルを実行します。    :return: なし"""
    obj = Sample()
    obj.exec()


if __name__ == '__main__':
    go()

try-python/contextlib02.py at master · devlights/try-python · GitHub

結果は以下のようになります。

f='0,1,2,3,4,5,6,7,8,9,'f=('Help on built-in function sum in module builtins:\n''\n''sum(iterable, start=0, /)\n'"    Return the sum of a 'start' value (default: 0) plus an iterable of "'numbers\n''    \n''    When the iterable is empty, return the start value.\n''    This function is intended specifically for use with numeric values and ''may\n''    reject non-numeric types.\n''\n')

過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。

Pythonメモ-65 (send2trash) (ファイルをゴミ箱に捨ててくれるライブラリ, クロスプラットフォーム)

$
0
0

概要

超有名ライブラリなので、ご存知の方多いと思いますが、一応メモ。

github.com

個人的に pyperclipと同じくらい、しょっちゅう使っているライブラリ。

pyperclipについては、以下でメモ書きました。

devlights.hatenablog.com

何してくれるライブラリ?

文字通り、指定ファイルをゴミ箱に送ってくれるライブラリです。

スクリプト書くときってファイル処理をするものが多いと思いますが

os.unlinkとかでファイルを削除すると、完全に消えてしまいます。(当然ですが

で、一応何かあったとき用とかテスト実行時とかはバックアップをちょいとつくっておいて実行したりするのが多いと思います。

そんなときに、このライブラリ使うとゴミ箱に送ってくれるので、元に戻すのも楽だしファイルも実際に消えてないし精神的に楽です。ついでに、クロスプラットフォームなので、OS関係なく使えます。

インストール

インストールは、conda で一発です。anaconda 環境だと最初から入ってるっぽい?

今回は、わざと専用の仮想環境作ってみました。

⟩ conda create --name send2trash send2trash
Solving environment: done## Package Plan ##

  environment location: /Users/devlights/anaconda3/envs/send2trash

  added / updated specs: 
    - send2trash


The following NEW packages will be INSTALLED:

    ca-certificates: 2017.08.26-ha1e5d58_0
    certifi:         2018.1.18-py36_0     
    libcxx:          4.0.1-h579ed51_0     
    libcxxabi:       4.0.1-hebd6815_0     
    libedit:         3.1-hb4e282d_0       
    libffi:          3.2.1-h475c297_4     
    ncurses:         6.0-hd04f020_2       
    openssl:         1.0.2n-hdbc3d79_0    
    pip:             9.0.1-py36h1555ced_4 
    python:          3.6.4-hc167b69_1     
    readline:        7.0-hc1231fa_4       
    send2trash:      1.4.2-py36_0         
    setuptools:      38.4.0-py36_0        
    sqlite:          3.22.0-h3efe00b_0    
    tk:              8.6.7-h35a86e2_3     
    wheel:           0.30.0-py36h5eb2c71_1
    xz:              5.2.3-h0278029_2     
    zlib:            1.2.11-hf3cbc9b_2    

Proceed ([y]/n)? y

Preparing transaction: done
Verifying transaction: done
Executing transaction: done## To activate this environment, use##     $ conda activate send2trash## To deactivate an active environment, use##     $ conda deactivate

使い方

使い方は、send2trash.send2trash(ファイル)するだけです。

⟩ ipython                                                                                                                      (playground) 
Python 3.6.4 |Anaconda custom (64-bit)| (default, Jan 162018, 12:04:33) 
Type 'copyright', 'credits'or'license'for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?'forhelp.

In [1]: import send2trash

In [2]: import os

In [3]: os.chdir(f'{os.environ["HOME"]}/tmp/pytmp')

In [4]: withopen('py01.py', 'w') as fp:
   ...:     fp.write('print("helloworld")\n')
   ...: 

って感じで、わざと適当なファイルを作っておきます。

その上で、

In [5]: send2trash.send2trash('py01.py')

ってすると

f:id:gsf_zero1:20180220005329p:plain

って感じでちゃんとゴミ箱にいってくれています。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。

carbon (ソースコードをキレイなハイライト状態で画像にしてくれるサイト)

$
0
0

概要

github の Explore 見てたら、表示されてたサイト。

使ってみたら良かったので、忘れない内にメモメモ。

carbon.now.sh

github.com

ページ内のボックスにソースコード入力して、画像にしたりできます。

どんな感じ

ページにそのままコードを貼り付けて、Save Imageボタン押すだけで画像作ってくれます。

予め用意されているスタイルが中々良いですね。

個人的に大好きな Draculaスタイルがあったので歓喜。

こんな感じの画像にしてくれます。

f:id:gsf_zero1:20180220122515p:plain


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。


polacode (指定したソースコードを画像にしてくれる VS Code 拡張機能)(polanoid for your code, visual studio code)

$
0
0

概要

昨日、ソースコードを画像にしてくれるサイトで

devlights.hatenablog.com

について記載したのですが、Visual Studio Codeの方にも同じような拡張機能があったので

忘れない内にメモメモ。

github.com

こっちだと、エディタ内で完結するので、楽ですね。

インストール

インストールは、いつもどおり拡張機能のところに

polacode

って打ち込むと出てくるので、普通にインストールで完了です。

使ってみた

で、試しにつかってみました。

上のpolacodeのサイトにデモムービーがあるのですが

それをみていると以下のようにするみたい

  • コマンドパレット開いて、polacodeで起動
  • 画像にしたい部分を選択
  • 右のエリアに反映されるので、後はシャッターボタンみたいなのを押下すると画像になる

って思ってやったのですが、polacodeのペインに選択したコードが反映されない・・・・

なんで?って思ったら、以下のようにするみたいです。

右の```polacode```エリアのボックスに、画像にしたいコードを貼り付ける

貼り付けるとうまくいきました。このエリア、テキストエリアだったんですね。。。

以下のような感じになります。

f:id:gsf_zero1:20180221123400p:plain

後は、画像を保存してみる。

以下のように出力されました。うん。キレイ。

f:id:gsf_zero1:20180221123435p:plain

ちなみに、VS Codeのスタイルとかは以下のようになっています。

  • テーマは「Dracula」
  • フォントは「Fira Code」

過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。

C#のサンプルコードが沢山あるサイト (1000 C# Programs With Example Code and Output)

$
0
0

概要

以下のサイトにC#のサンプルコードが沢山あったので、忘れないうちにメモメモ。

www.sanfoundry.com

1000個あるのかどうかは確認していないですが、基本的な事からスレッド関連までいろいろありました。

また時間あるときに見てみる。

トップページに戻ってみると、このサイトさん、C#だけじゃなくて他の言語のサンプルとかも山ほどある。 すごいなここ。

http://www.sanfoundry.com/


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。

zetcode さんのチュートリアルシリーズ (ZetCode turorials, 沢山チュートリアルがあるサイト)

$
0
0

概要

前回の

devlights.hatenablog.com

に続いて、ZetCodeさんのチュートリアルシリーズも、ついでにメモメモ。

いろいろな内容でチュートリアルを公開されています。

zetcode.com

多いのが、JavaPythonですが、以下の言語のチュートリアル公開されています。

zetcode.com

zetcode.com

zetcode.com

zetcode.com

zetcode.com

PyQt5

PyQt5のチュートリアルに関しては、Qiitaで、日本語に訳してくださっている方がいらっしゃいます。感謝。

zetcode.com

Qiitaの該当記事に関しては、以下を参照ください。

PyQt5チュートリアル日本語まとめという名前です。

devlights.hatenablog.com


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。

Pythonメモ-66 (pycファイルの生成が行われないようにする) (PYTHONDONTWRITEBYTECODE, sys.dont_write_bytecode, __pycache__, pyc)

$
0
0

概要

よく忘れるので、ちょこっと自分用のメモです。

Pythonでは、モジュールをimportするとデフォルトでインタープリターがソースコードをbytecodeに変換した結果をpycファイルとして書き出すようになっています。

このファイルは、__pycache__という名前のディレクトリに出力されます。(これPython3からこうなったと記憶あり。たしか、Python2系ではpyと同じ場所にpyc出来てたはずです)

Python始めた頃に、「なんだこのディレクトリ?」ってなる人多いのではないでしょうか。

で、このpycファイル、別に無くても構いません。存在する場合、Pythonが実行時にbytecodeへのコンパイルを省略してくれるだけです。

なければ、その都度bytecodeコンパイルが走ります。云わば、キャッシュみたいなものです。pycファイルがあるからといって実行速度が上がるわけではありません。

今回このpycファイルの生成をしないようにする設定についてです。

なんでpycファイル無い方がいいのか?

個人的に以下の理由からです。

  • __pycache__ディレクトリとか勝手に出来上がるのが嫌。てか邪魔

  • pycファイルの中身は、バージョン毎に互換性がない。たまに、同じスクリプトをバージョン切り替えて実行したいときにpycファイルが上書きされたりしたりする。

  • 基本ずっとOFFの状態で作業しているけど、困ったことが今のところ無い。

設定方法

pycファイルを生成しないようにする設定は、以下のどれかで出来ます。

環境変数にPYTHONDONTWRITEBYTECODEを設定する

私自身はこの方法でいつも設定しています。環境変数にPYTHONDONTWRITEBYTECODEという名前で定義します。

値は、なんでもいいです。私はいつも「1」です。

sys.dont_write_bytecodeをTrueに設定する

これは実行時に設定するやり方。

import sys
sys.dont_write_bytecode = True

で、生成されなくなります。

pythonコマンドの-Bオプションをつける

以下のようにします。

$ python -B asyncio01.py

参考情報

stackoverflow.com

stackoverflow.com

1. コマンドラインと環境 — Python 3.6.4 ドキュメント

1. コマンドラインと環境 — Python 3.6.4 ドキュメント

Common Gotchas — The Hitchhiker's Guide to Python


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。

Pythonメモ-67 (JupyterLab試してみた) (JupyterLab is Ready for Users, conda, jupyter lab, PhosphorJS)

$
0
0

概要

JupyterLabのデイリーユースでも利用できるよレベルの版が出た模様。

blog.jupyter.org

以下のように記載されています。

tl;dr: JupyterLab is ready for daily use

以前のJupyter Notebookとはガラっと変わってタブ化などできるようになっているみたいですね

てことで、ちょっと試してみました。

インストール

インストールは、condaでインストールしました。

conda-forgeチャネルにあります。

⟩ conda create --name jupyterlab jupyterlab
Solving environment: done## Package Plan ##

  environment location: /Users/xxxx/anaconda3/envs/jupyterlab

  added / updated specs: 
    - jupyterlab


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    setuptools-38.5.1          |           py36_0         525 KB
    send2trash-1.5.0           |           py36_0          16 KB
    pexpect-4.4.0              |           py36_0          73 KB
    notebook-5.4.0             |           py36_0         6.6 MB
    terminado-0.8.1            |           py36_1          21 KB
    jupyterlab-0.31.8          |           py36_0         8.5 MB
    ipykernel-4.8.2            |           py36_0         145 KB
    simplegeneric-0.8.1        |           py36_2           9 KB
    ------------------------------------------------------------
                                           Total:        15.9 MB

The following NEW packages will be INSTALLED:

    appnope:             0.1.0-py36hf537a9a_0 
    bleach:              2.1.2-py36_0         
    ca-certificates:     2017.08.26-ha1e5d58_0
    certifi:             2018.1.18-py36_0     
    decorator:           4.2.1-py36_0         
    entrypoints:         0.2.3-py36hd81d71f_2 
    html5lib:            1.0.1-py36h2f9c1c0_0 
    ipykernel:           4.8.2-py36_0         
    ipython:             6.2.1-py36h3dda519_1 
    ipython_genutils:    0.2.0-py36h241746c_0 
    jedi:                0.11.1-py36_0        
    jinja2:              2.10-py36hd36f9c5_0  
    jsonschema:          2.6.0-py36hb385e00_0 
    jupyter_client:      5.2.2-py36_0         
    jupyter_core:        4.4.0-py36h79cf704_0 
    jupyterlab:          0.31.8-py36_0        
    jupyterlab_launcher: 0.10.2-py36_0        
    libcxx:              4.0.1-h579ed51_0     
    libcxxabi:           4.0.1-hebd6815_0     
    libedit:             3.1-hb4e282d_0       
    libffi:              3.2.1-h475c297_4     
    libsodium:           1.0.15-hd9e47c5_0    
    markupsafe:          1.0-py36h3a1e703_1   
    mistune:             0.8.3-py36_0         
    nbconvert:           5.3.1-py36h810822e_0 
    nbformat:            4.4.0-py36h827af21_0 
    ncurses:             6.0-hd04f020_2       
    notebook:            5.4.0-py36_0         
    openssl:             1.0.2n-hdbc3d79_0    
    pandoc:              1.19.2.1-ha5e8f32_1  
    pandocfilters:       1.4.2-py36h3b0b094_1 
    parso:               0.1.1-py36hc90e01c_0 
    pexpect:             4.4.0-py36_0         
    pickleshare:         0.7.4-py36hf512f8e_0 
    pip:                 9.0.1-py36h1555ced_4 
    prompt_toolkit:      1.0.15-py36haeda067_0
    ptyprocess:          0.5.2-py36he6521c3_0 
    pygments:            2.2.0-py36h240cd3f_0 
    python:              3.6.4-hc167b69_1     
    python-dateutil:     2.6.1-py36h86d2abb_1 
    python.app:          2-py36h54569d5_7     
    pyzmq:               16.0.3-py36he48b5ad_0
    readline:            7.0-hc1231fa_4       
    send2trash:          1.5.0-py36_0         
    setuptools:          38.5.1-py36_0        
    simplegeneric:       0.8.1-py36_2         
    six:                 1.11.0-py36h0e22d5e_1
    sqlite:              3.22.0-h3efe00b_0    
    terminado:           0.8.1-py36_1         
    testpath:            0.3.1-py36h625a49b_0 
    tk:                  8.6.7-h35a86e2_3     
    tornado:             4.5.3-py36_0         
    traitlets:           4.3.2-py36h65bd3ce_0 
    wcwidth:             0.1.7-py36h8c6ec74_0 
    webencodings:        0.5.1-py36h3b9701d_1 
    wheel:               0.30.0-py36h5eb2c71_1
    xz:                  5.2.3-h0278029_2     
    zeromq:              4.2.2-ha360ad0_2     
    zlib:                1.2.11-hf3cbc9b_2    

Proceed ([y]/n)? y


Downloading and Extracting Packages
setuptools 38.5.1: ################################################################################################################# | 100% 
send2trash 1.5.0: ################################################################################################################## | 100% 
pexpect 4.4.0: ##################################################################################################################### | 100% 
notebook 5.4.0: #################################################################################################################### | 100% 
terminado 0.8.1: ################################################################################################################### | 100% 
jupyterlab 0.31.8: ################################################################################################################# | 100% 
ipykernel 4.8.2: ################################################################################################################### | 100% 
simplegeneric 0.8.1: ############################################################################################################### | 100% 
Preparing transaction: done
Verifying transaction: done
Executing transaction: done## To activate this environment, use##     $ conda activate jupyterlab## To deactivate an active environment, use##     $ conda deactivate

$ conda activate jupyterlab

今回使っているバージョン

⟩ jupyter lab --version(jupyterlab) 
0.31.8

起動

起動は以下のコマンドで行えます。

$ jupyter lab

実行すると、ターミナルには以下のログが表示され、自動でブラウザが開きます。

⟩ jupyter lab                                                                                                                  (jupyterlab)[I 18:44:18.345 LabApp] JupyterLab beta preview extension loaded from /Users/xxxx/anaconda3/envs/jupyterlab/lib/python3.6/site-packages/jupyterlab
[I 18:44:18.345 LabApp] JupyterLab application directory is /Users/xxxx/anaconda3/envs/jupyterlab/share/jupyter/lab
[W 18:44:18.349 LabApp] JupyterLab server extension not enabled, manually loading...
[I 18:44:18.350 LabApp] JupyterLab beta preview extension loaded from /Users/xxxx/anaconda3/envs/jupyterlab/lib/python3.6/site-packages/jupyterlab
[I 18:44:18.350 LabApp] JupyterLab application directory is /Users/xxxx/anaconda3/envs/jupyterlab/share/jupyter/lab
[I 18:44:18.359 LabApp] Serving notebooks from local directory: /Users/xxxx/tmp/pytmp
[I 18:44:18.359 LabApp]0 active kernels
[I 18:44:18.359 LabApp] The Jupyter Notebook is running at:
[I 18:44:18.359 LabApp] http://localhost:8888/?token=5c4eaf8fb8717ddf020f790d236c1e1abe4b6e2221678437
[I 18:44:18.359 LabApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 18:44:18.360 LabApp] 
    
    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=5c4eaf8fb8717ddf020f790d236c1e1abe4b6e2221678437

起動すると以下のような感じです。

f:id:gsf_zero1:20180225210313p:plain

Notebook作ってみる

新規ノートブックは、起動時に表示されているランチャー画面からクリックすると起動できます。

f:id:gsf_zero1:20180225210433p:plain

使い方などは、今までのJupyter Notebookと同じです。

タブを分割して表示

JupyterLabで便利な機能の一つに、エディタを分割表示出来る点があります。

Notebookではこれが出来ませんでした。以下のような感じです。

f:id:gsf_zero1:20180225210639p:plain

分割する場合は、エディタのタブをドラッグすると、どのペインに表示するかが表示されます。

PhosphorJS?

上のブログ記事みると、以下のように記載されていました。

JupyterLab itself is co-developed on top of PhosphorJS, a new Javascript library for building extensible, high-performance, desktop-style web applications.

このUIは、PhosphorJSというJavascriptライブラリで実現されているみたいですね。

メモメモ。

phosphorjs.github.io

これ、なんて読むんだろ???

追記) フォスファーって読むみたいですね。 明けの明星・・・・かっこいいですね。

ejje.weblio.jp

追記 (2018/02/26)

herokuにjupyterlabをデプロイするためのリポジトリがアップされてましたね。アップしたのはrequestsとかで有名なkennethreitzさん。(herokuの方だったんですね)

github.com

twitter.com


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。

Viewing all 1447 articles
Browse latest View live