UoPeople ENGL 0008 顛末記

UoPeople ENGL 0008 中間報告 の続きです。

University of the Peopleの英語力検定コースENGL 0008がはじまって2ヶ月が経過し、コースが終了しました。記憶が新しいうちに印象を残しておきます。

ENGL 0008 後半の内容

後半のコース内容も、前半のコース内容 と比べて大きな変化はありません。ただ、要求される英文の長さが長くなったり、エッセイを書くだけではなく喋っている 動画 をアップロードすることを要求されたりします。

Final Exam

黙々と課題をこなしていくと、最後にFinal Exam

UoPeople ENGL 0008 中間報告

ふとした思いつきで University of the People("UoPeople") に入学を申し込み、まずは必要な英語力をそなえているか確認するコース ENGL 0008がはじまりました。

UoPeopleは入学者に一定以上の英語力を要求していて、入学時にTOEFLの点数や英検の資格などを提出する必要があります。手っ取り早く duolingo english test というオンラインで受験できるテストでも良いようです。詳しくは、English Proficiency (For Non-Native English Speaker

Python で Google Analytics Reporting APIを使う

Adsenseの売上を取得する

from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials

SCOPES = ["https://www.googleapis.com/auth/analytics.readonly"]
KEY_FILE_LOCATION = "xxxxxxxx.json"
VIEW_ID = "99
Django Rest Frameworkの処理メモ

Django Rest Framework、使うたびに中を開けて同じことを調べているので、内部の主要なメソッドのメモを残す。

ViewSetMixin

class ViewSetMixin:
    request:
    args = args
    kwargs = kwargs
    action:Literal["list", "create", "get", "update", "partial_update", "destroy"]

Listの処理

class ModelViewSet:
    def get_serializer_context(self):
        retu

Google Analyticsの「今日」を開くブックマークレット

data:text/html,<script>f=(d)=>`${d.getFullYear()}${('0'+(d.getMonth()+1)).slice(-2)}${('0'+(d.getDate())).slice(-2)}`;d=new Date();y=new Date();y.setDate(d.getDate() - 1);location.href=`https://analytics.google.com/analytics/we
tse サンプル

tse(Python Stream Scripting) サンプル集

ImageMagikでpng画像をjpegに変換

png画像を検索し、jpegに変換する。このとき、横幅が1500px以上なら1500pxに縮小する。

find . -name '*.png' | tse -s "" 'p=Path(L);j=p.with_suffix(".jpeg");P(fr`convert {p} -resize "1500x>" {j}`)'

拡張子別にファイルの件数と合計サイズを出力

find . | tse -ms collections,pprint -
Pythonのhasattr()は遅い?

Pythonには、オブジェクトにある名前の属性が存在するかどうかをチェックする hasattr という組み込み関数があります。

例えば、リストオブジェクトに append という属性が存在するかどうか確認するときは、次のようにかきます。

In [57]:
L = []
print(hasattr(L, 'append'))
print(L.append)
True
<built-in method append of list object at 0x7fbc80542d80>

リストオブジェクトには append という属性が存在し、メソッドだということ

Jupyter Lab 小技集

HTMLなどのデフォルトビューワを設定する

JupyterLabのファイル一覧からHTMLファイルを開くと、デフォルトではHTMLがレンダリングされて表示されます。

私は通常JupyterLabをエディタとして利用しているので、この動作はちょっと不便です。HTMLファイルを編集するのに、ファイル名を右クリックして Open with | Editor を選択しなければなりません。

クリックするだけで編集画面を立ち上げるには、以下の設定を行います。

  1. メニューバーの Setting から、 Advanced Settings Edito

N+1問題におけるORMの重たさについて

tl;dr

ボトルネックはちゃんと測定して把握しないとダメだよ。

N+1問題

DjangoやRailsなど、ORMを利用するWebフレームワークなどの開発では、よく 「N+1問題」 というのが話題になります。ORMでは、あるモデルが参照している別のモデルを参照するとその時点でSQLが発行されてしまうため、気が付かないうちにパフォーマンスが低下する場合がある、というやつですね。

Django

例えば、Djangoで次のようなモデルがあったとき、

class Table1(models.Model):
    text = models
Django メモ集

Djangoのスクリプトを実行する

Djangoのadminユーザをメールアドレス無しで登録するOne liner

テスト用に適当なadminユーザ登録したいだけなのに、パスワードが甘いだのメールアドレスも入れろだの怒られてムカついたときに。

python manage.py shell -c 'from django.contrib.auth.models import User;User.objects.create_superuser("admin", "", "pass")'
Pythonを闇改造して辞書リテラルのキー名や関数呼び出しの引数名を省略できるようにしてみた

先日、Pythonを闇改造した でPythonにちょっとした改造を加えてみました。

この修正は、

def register_user(first, last, addr1, addr2):
    d = {'first': first,
         'last': last,
         'addr1': addr1,
         'addr2': addr2,
         'tel': '123-456-789'}

    requests.post(URL, d)

のようなコードを、JavaScriptの

d = {first, last, addr1, addr2, tel:'123-456-789'}

のように、

d = $

[Python] jashin.dictattrで辞書の要素を属性値として参照する

Pythonで辞書データをたくさん扱うコードを書いていると、辞書の要素をオブジェクトの属性みたいに参照したくなることがあります。

Javascriptなんかだと、辞書でも

data = {
    'name': 'value'
}

alert(data.name)

のように、辞書.名前 で参照できますが、Pythonの場合は

data = {
    'name': 'value'
}

print(data['name'])

となり、数が多いとちょっと面倒になります。

ありがち

久しぶりに、Raindrop.ioPython APIに手を入れてみた

先日から作りかけだったRaindrop.ioPython API、久しぶりに機能追加しました。Webアプリケーションなどでも使えるように、OAuth2で認証して、トークンのリフレッシュなんかもできるようになりました。

Flaskのサンプルアプリケーションはこちら

ほんらい、どってことない作業のハズで、requests-oauthlib を使ってサクッと終了する予定でした。

しかし、どうもリフレッシュがうまく動かない。requests-oauth

[JupyterLab] macOSでターミナルのalt+キーバインディングを使う

先日作成して JupyterLabに送ったパッチ がリリースされていたので、ちょっと紹介します。

これまで、macOS上のブラウザでJupyterLabのターミナルを使うとき、option+f などの、Optionキーを使ったバインディングが効きませんでした。「単語右」のつもりで ⌥f を入力すると、

ƒ

などと言う文字が出てきて、大変不愉快でした。

しかし、このパッチ が取り込まれた現在のJupyter Labでは、OptionキーをMetaキー

Github actionでvenv環境をキャッシュする

これまで、PythonのプロジェクトでGithub Actionを使うとき、こんな感じで仮想環境ごとキャッシュしていました。

# 仮想環境を作成
  - name: Create venv
    run: |
      python3 -m venv .venv

  # 仮想環境をキャッシュから復元
  - name: Cache venv dependencies
    uses: actions/cache@v1
    with:
      path: .venv
      key: venv-${{ runner.os }}-${{ hashFiles('requ
PyArrowとParquet

さて、ビッグデータ全盛の昨今、数ギガバイト程度のデータのやり取りは珍しくもなんともない時代になりました。交換用データファイルのフォーマットもいろいろな形式が使われていますが、ここではPythonで一般的に使われているファイル形式を簡単に検討してみましょう。

CSV

昔から、単純な表形式のデータにはCSVが使われてきました。Microsoft Excelをはじめとしてさまざまなツールでサポートされており、幅広い環境で利用できます。

データの作成

例として10万行・100カラムのデータを作成し、CSV形式で保存してみ

Fletsのルータ設定

ちょっとした実験で、自宅から外部のサーバとTCP接続を試みたところ、どうもうまくつながらなくて往生してました。接続先サーバのFirewallをすべて取っ払っても届きません。

しばらく苦戦した挙げ句、ためしに他のサーバから接続してみると成功。おお?と思って、自宅のPCから試すとつながらない。自宅の回線になんらかの制限がかかっているようなので、別のポートを試してみたらあっさりつながりました。

で、自宅の環境を確認してみると、AtermもNTT Fletsのルータもデフォルトでいくつかポートを制

Github Profileの設定

GithubのProfile画面 に自分の好きなREADME.mdファイルを表示できる、という話を見かけて、試してしました。ちょっと前に試したときには、自分のアカウントではこの機能を使えなかったようですが、いつの間にか使えるようになっていました。

Githubで自分のアカウント名と同じ名前のリポジトリ(私の場合なら atsuoishimoto) を作成し、つぎのように表示されれば機能が有効になっているようです。

Github profile

README.txtの生成

作成したリポジトリに README.md という名前

Flex 絵文字ビルダーの裏側

Flex 絵文字ビルダー というのを作りました。

SlackやDiscordにカスタム絵文字として登録して、リアクションに使う画像を生成するツールです。こんな画像を作れます。

仕組み

最初はこんなツールを作るつもりではなく、 どっかで<svg> 要素の中にHTMLを記述して、画像を <img> 要素に表示する、というコードを見かけて、自分で実験するためのコードでした。

こんな感じで <svg> を作っておいて、

<svg id="svg">
  <foreignObject width="128px" height=
asyncioのTaskに関する基礎知識

pythonのslackclientで非同期タスクを実行したらValueErrorになった話 で、たぶん asyncioのtaskを勘違いしてる気がするので簡単に解説。

要は asyncio.run にコルーチンではなくてTaskを渡したらエラーになった、という話ですが、このページでは、

Taskオブジェクト(asyncioが内部的にloopに委ねるときにwrapするオブジェクト)

と書かれていて、Taskオブジェクトをちょっと誤解している感じがします。このTaskの役割を理解したら納得がいくのではないかと思います。

まず

macOSでデフォルトのPATHは?

macOSで、デフォルトの PATH はどうやって決まってるんだろうか?

macOS Catalina 10.15.5で /etc/profile を見ると、こんな感じになっている

# System-wide .profile for sh(1)

if [ -x /usr/libexec/path_helper ]; then
        eval `/usr/libexec/path_helper -s`
fi

if [ "${BASH-no}" != "no" ]; then
        [ -r /etc/bashrc ] && . /etc/bashrc
f

WindowsでCapsLockキーをCtrlに変更するPythonスクリプト

管理者として実行してください。

import winreg

key = 'System\CurrentControlSet\Control\Keyboard Layout'
scancodemap = (b'\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00'
               b'\x00\x00\x1d\x00:\x00\x00\x00\x00\x00')

with winreg.OpenKey(winreg.HKEY_LOCAL_MA

宣言と定義

いろんなプログラミング言語で、「宣言」と「定義」という用語が出てきます。

C言語などの用語だと、宣言(declaration) というのは、関数や変数の型などの情報を指定することを指します。

Pythonでは、global とか nolocal とかが宣言にあたります。

def func():
    global VAR # 変数VAR はグローバルと 「宣言」
    do_something(VAR)

定義(definition) は、実際に変数などの実体を作成することです。Pythonだと、var=100 とかになります。

var = 100 # 変

プログラムは分割しようという話

困難は群れで分けあえ - かばんちゃんさん

Python.jp Discordサーバを始めてから、早いものでもう2年ほど経ちました。登録者は2700名ほどで、初心者の質問なんかもちょくちょく流れてきます。

で、結構いろんな質問を見てるんですが、初心者はもちろん、プログラミングを始めてからけっこうたつような人でも、質問の内容がどうも怪しい、という人がいます。コンピュータやプログラミングの知識以前に、なにか問題を解決するときに、解決するための基礎的な手順ができていない感じの人たちです。プログ

Ansibleで、Playbookを作らずにロールを指定して実行

ansible "*" -m include_role -a name=ロール名 -i ホスト名,

[Python] 正しくない global の使い方

Pythonは名前だらけでは、Pythonの変数も関数も結局はみんな名前、という解説をしました。この特徴を使って、Pythonのちょっとおもしろい挙動を調べてみましょう。

Pythonの変数には、グローバル変数とローカル変数があります。関数の内部で定義した変数はローカル変数、それ以外はグローバル変数となります。

global_var = "これはグローバル変数です。"

def func():
    local_var = "これはローカル変数です"

グローバル変数は同じモジュール内なら

Pythonは名前だらけ

He would answer to "Hi!" or to any loud cry,
Such as "Fry me!" or "Fritter my wig!"
To "What-you-may-call-um!" or "What-was-his-name!"
But especially "Thing-um-a-jig!"

Pythonでもなんでも、プログラムを書くといろんな名前が出てきます。変数名や関数名、クラス名にモジュール名。

次のコードは、100 という数値に、number という名前をつけます。

In [32]:
numb

JupyterLab CMS化計画

私が管理するこのサイトや python.jpMiyadaikuというSSGを使って構築しています。

記事の執筆は普通にエディタを立ち上げてMarkdownやreStructuredTextで書いていましたが、最近、JupyterLab を使うようになってきました。MiyadaikuはJupyter NotebookからHTMLを作成できるようになっており、私が書くブログ記事の執筆には最適なPythonの実行・ドキュメント環境です。

Notebook以外にも、Preview付きMar

Pythonを闇改造した

思いつきをざっと書いて公開してしまうシリーズ2

Python 3.10 ではこれまでPythonのコンパイルの仕組みが変わり、従来の貧乏くさいLL(1)パーザから PEGパーザに切り替えられる予定になっています。

新パーザはすでにPython3.9に含まれていて、現在のPython 3.9b1でも試せるようになってますので、早速試してみました。

https://github.com/atsuoishimoto/cpython/pull/2

JSON Literal

Pythonのプログラムを書いていて、辞書オブジェクトを書くの

pastecat: クリップボードの画像をファイルに出力するツール

思いつきをざっと書いて公開してしまうシリーズ

クリップボードにコピーした画像を、ファイルに出力するPython製コンソールコマンド pastecat を作りました。

画像を、PNG形式で from_clipboard.png というファイルに出力するときは、

$ pastecat from_clipboard.png

とします。ファイル形式は、出力ファイルの拡張子で決定します。

画像を標準出力に出力するときは、-f オプションでファイル形式を指定します。

$ pastecat -f JPEG > from_clipboard.jpeg

インスト

1 2