Pythonの可変長引数を別の関数にそのまま渡す

可変長引数に引数を追加して別の関数に渡す方法。

キーワード可変長引数の変数kwargs (dict型)に要素を足して、 test2(param1, **kwargs)
のようにアスタリスクを2個つけて渡すだけだった。

def test1(param1, **kwargs):
    print("----------")
    print("test1 func")
    print param1
    print kwargs
    kwargs["param4"] = "added in test1()"
    test2(param1, **kwargs)

def test2(param1, **kwargs):
    print("----------")
    print("test2 func")
    print param1
    print kwargs

test1("tes1", param2="test2", param3="test3")

実行結果

----------
test1 func
tes1
{'param3': 'test3', 'param2': 'test2'}
----------
test2 func
tes1
{'param4': 'added in test1()', 'param3': 'test3', 'param2': 'test2'}

英語での名称

**args は、 可変長引数
variable length argument

**kwargs は、 キーワード可変長引数
keyworded variable length argument
と呼ぶっぽい。 kwargs の kw は keywordの短縮だった。

キーワード可変長引数を変数に入れる

キーワード可変長引数も引数なのだから、変数に入っているべきなのではないかと思ったけど、
PyCharmのエディタでエラーになる。

def test1_2(param1, **kwargs):
    print("----------")
    print("test1_2 func")
    print param1
    print kwargs

    for key,val in kwargs.items():
        exec(key + '=val')
    print param2

PyCharmのエディタで Unresolved reference 'param2' というエラーになる。

実行はできる。

----------
test1_2 func
tes1
{'param3': 'tes3', 'param2': 'tes2'}
tes2

変数の名前が決まっているなら、関数定義に足せばいいっぽい。

def test1_2(param1, param2, **kwargs):
    print("----------")
    print("test1_2 func")
    print param1
    print kwargs

    for key,val in kwargs.items():
        exec(key + '=val')
    print param2

test1_2("tes1", param2="tes2", param3="tes3")

https://stackoverflow.com/questions/18090672/convert-dictionary-entries-into-variables-python

Django Middlewareのメンバー変数(クラス変数?)がリクエストをまたいで保持されていた

ウェブアプリは、1リクエストごとに別のプロセスが生成されて、変数は共有されないと思っていたけど、
Django Middlewareの変数は、リクエスト間で共有されているっぽい。
あとで仕組みを調べようと思う。

https://docs.djangoproject.com/en/1.9/topics/http/middleware/

https://docs.djangoproject.com/en/2.1/topics/http/middleware/

class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

memo

class Middleware1(object):

    _count_test = 1

    def __init__(self):
        # One-time configuration and initialization.
        print "Middleware1: __init__()"

    def process_response(self, request, response):
        """
        viewを実行した後に呼びだされるフック。
        """
        print "Middleware1:" + str(self._count_test)
        self._count_test = self._count_test + 1
        return response

settings.py

MIDDLEWARE_CLASSES = (
  
  "apps.test1.middleware.Middleware1",

)

PyCharm WebServerコンソールログ

Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Middleware1: __init__()
Middleware1:1
[07/Sep/2018 15:29:27] "GET / HTTP/1.1" 200 1015
Middleware1:2
[07/Sep/2018 15:29:28] "GET /xxx HTTP/1.1" 200 182
Middleware1:3
[07/Sep/2018 15:29:28] "GET /xxx HTTP/1.1" 200 70
Middleware1:4
[07/Sep/2018 15:29:28] "GET /xxx HTTP/1.1" 200 571
Middleware1:5
[07/Sep/2018 15:29:28] "GET /xxx HTTP/1.1" 200 163
Middleware1:6
[07/Sep/2018 15:29:29] "GET /xxx HTTP/1.1" 200 2530
Middleware1:7
[07/Sep/2018 15:29:29] "GET /xxx HTTP/1.1" 200 85
Middleware1:8
[07/Sep/2018 15:29:29] "GET /xxx HTTP/1.1" 200 0
Middleware1:9
[07/Sep/2018 15:29:29] "GET /xxx HTTP/1.1" 200 581
[07/Sep/2018 15:29:29] "GET /xxx HTTP/1.1" 200 5016
Middleware1:10
Middleware1:11
[07/Sep/2018 15:29:29] "GET /xxx HTTP/1.1" 200 53882
[07/Sep/2018 15:29:33] "GET /xxx HTTP/1.1" 200 9004
Middleware1:12
[07/Sep/2018 15:29:33] "GET /xxx HTTP/1.1" 200 9004
Middleware1:13
Middleware1:14
[07/Sep/2018 15:29:33] "GET /xxx HTTP/1.1" 200 9004

MariaDBでタイムゾーンを設定しようとしたらエラーになった。

/etc/my.cnf

[mysqld]
default-time-zone='Asia/Tokyo'

/var/log/mariadb/mariadb.log

[ERROR] Fatal error: Illegal or unknown default time zone 'Asia/Tokyo'

MySQLでタイムゾーンの設定 - There's an echo in my head
この記事にあるコマンドを実行したらmariadbが起動した。

mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -u root -p mysql

Djangoのモデルデータをテスト用コードから呼び出した時のエラー

動作確認のために、普通のPythonスクリプトからDjango Modelを使おうとしたらエラーになった。

エラー1:

django.core.exceptions.ImproperlyConfigured: Requested setting CACHES, but settings are not configured. You must either define the environment variable  DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.  

PyCharmの設定で、Run Configurations > Environment variables に
name:DJANGO_SETTINGS_MODULE
value:AppName.settings
value:settings
を足して解決。

エラー2:

django.core.exceptions.AppRegistryNotReady: The translation infrastructure cannot be initialized before the apps registry is ready. Check that you don't make non-lazy gettext calls at import time.  

モデルのインポートの前にdjango.setup()で解決。
from apps.app1.models import Model1

django.setup()

shell scriptで¥rの改行があると文字列結合がおかしくなる

https://stackoverflow.com/questions/12358814/concatenating-strings-in-bash-overwrites-them

#!/bin/sh
str1="test1"
str2="abcde"
result=${str1}_${str2}
echo $result
result=$(echo ${str1} | tr -d '\r')_$(echo ${str2} | tr -d '\r')
echo $result
$ sh test1.sh
_abcde
test1_abcde
: command not found: 

MacOSで接続していない外部ディスプレイの領域にウィンドウを移動させた時の対処方法

Chromeのウィンドウをドラッグさせたら画面から消えた。

画面下にある、Dockのアプリ一覧から、
Ctrl + マウスクリック でコンテキストメニューを表示して、
Options > Desktop on Display 1

f:id:kubotti:20170621122119p:plain

メニューのZoomで直るという記事も何個かあったけど、直らなかった。
http://osxdaily.com/2013/08/14/move-window-back-on-screen-mac-os-x/

php 5.5が入っているCentOS6をyum update

エラー

$ sudo yum update --enablerepo=remi
Loaded plugins: fastestmirror, presto
Setting up Update Process
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * remi: mirror.innosol.asia
 * remi-safe: mirror.innosol.asia
 * updates: ftp.iij.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package ConsoleKit.x86_64 0:0.4.1-3.el6 will be updated

省略

---> Package yum-plugin-fastestmirror.noarch 0:1.1.30-37.el6 will be an update
---> Package zsh.x86_64 0:4.3.11-4.el6.centos.1 will be updated
---> Package zsh.x86_64 0:4.3.11-4.el6.centos.2 will be an update
--> Finished Dependency Resolution
Error: Package: gd-last-2.2.4-1.el6.remi.x86_64 (remi)
           Requires: libwebp.so.5()(64bit)
Error: Package: php-pecl-jsonc-1.3.10-1.el6.remi.5.4.x86_64 (remi)
           Requires: php(api) = 20100412-x86-64
           Installed: php-common-5.5.30-1.el6.remi.x86_64 (@remi-php55)
               php(api) = 20121113-64
           Available: php-common-5.3.3-46.el6_6.x86_64 (updates)
               php(api) = 20090626
           Available: php-common-5.3.3-47.el6.x86_64 (base)
               php(api) = 20090626
           Available: php-common-5.4.45-13.el6.remi.x86_64 (remi)
               php(api) = 20100412-x86-64
Error: Package: php-pecl-jsonc-1.3.10-1.el6.remi.5.4.x86_64 (remi)
           Requires: php(zend-abi) = 20100525-x86-64
           Installed: php-common-5.5.30-1.el6.remi.x86_64 (@remi-php55)
               php(zend-abi) = 20121212-64
           Available: php-common-5.3.3-46.el6_6.x86_64 (updates)
               php(zend-abi) = 20090626
           Available: php-common-5.3.3-47.el6.x86_64 (base)
               php(zend-abi) = 20090626
           Available: php-common-5.4.45-13.el6.remi.x86_64 (remi)
               php(zend-abi) = 20100525-x86-64
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest
$ sudo yum update --enablerepo=epel,rpmforge,remi
Loaded plugins: fastestmirror, presto
Setting up Update Process
Loading mirror speeds from cached hostfile

省略

---> Package yum-plugin-fastestmirror.noarch 0:1.1.30-37.el6 will be an update
---> Package zsh.x86_64 0:4.3.11-4.el6.centos.1 will be updated
---> Package zsh.x86_64 0:4.3.11-4.el6.centos.2 will be an update
--> Running transaction check
---> Package libwebp.x86_64 0:0.4.3-3.el6 will be installed
---> Package perl-Time-HiRes.x86_64 4:1.9721-141.el6_7.1 will be installed
---> Package php-pecl-jsonc.x86_64 0:1.3.10-1.el6.remi.5.4 will be an update
--> Processing Dependency: php(zend-abi) = 20100525-x86-64 for package: php-pecl-jsonc-1.3.10-1.el6.remi.5.4.x86_64
--> Processing Dependency: php(api) = 20100412-x86-64 for package: php-pecl-jsonc-1.3.10-1.el6.remi.5.4.x86_64
--> Finished Dependency Resolution
Error: Package: php-pecl-jsonc-1.3.10-1.el6.remi.5.4.x86_64 (remi)
           Requires: php(api) = 20100412-x86-64
           Installed: php-common-5.5.30-1.el6.remi.x86_64 (@remi-php55)
               php(api) = 20121113-64
           Available: php-common-5.3.3-46.el6_6.x86_64 (updates)
               php(api) = 20090626
           Available: php-common-5.3.3-47.el6.x86_64 (base)
               php(api) = 20090626
           Available: php-common-5.4.45-13.el6.remi.x86_64 (remi)
               php(api) = 20100412-x86-64
Error: Package: php-pecl-jsonc-1.3.10-1.el6.remi.5.4.x86_64 (remi)
           Requires: php(zend-abi) = 20100525-x86-64
           Installed: php-common-5.5.30-1.el6.remi.x86_64 (@remi-php55)
               php(zend-abi) = 20121212-64
           Available: php-common-5.3.3-46.el6_6.x86_64 (updates)
               php(zend-abi) = 20090626
           Available: php-common-5.3.3-47.el6.x86_64 (base)
               php(zend-abi) = 20090626
           Available: php-common-5.4.45-13.el6.remi.x86_64 (remi)
               php(zend-abi) = 20100525-x86-64
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

remi-php55

sudo yum update --enablerepo=remi-php55,epel

で動いた。