<mermaid> 後追いで、マーメイドの絵を出す。

JQuery.ajax()とかで、後追いで、マーメイドmermaidのソースsourceを読んで絵を作る方法。

mermaid.init()をする。 うまくいった! すばらしい。

jsfiddleで遊んでみた。
https://jsfiddle.net/3hx9ag6m/2/

すっごくお世話になったところ。助かりました。(vv)
naosim.hatenablog.jp

マニュアル。
https://mermaidjs.github.io/usage.html

<Python> アルファベットのリストを作る。

chr()アスキーコードを入れればOK! 逆は、ord()だよーん。

In [61]: [chr(i) for i in range(65,65+26)]
Out[61]: 
['A',
 'B',
 'C',
 :
'X',
 'Y',
 'Z']

In [62]: a = [chr(i) for i in range(65,65+26)]

In [63]: [ord(i) for i in a]
Out[63]: 
[65,
 66,
 67,
 68,
:
 88,
 89,
 90]

参考にさせてもらいました。
hetapy.hatenablog.com

アスキーコード表。
http://www.k-cube.co.jp/wakaba/server/ascii_code.html

<pandas, Python> ふたつのカラムの値でソートする。

2つ、ふたつのカラムcolumnの値でソートsortする。

In [58]: df = pd.DataFrame({'a':[2,2,1,1,1],'b':[2,1,3,1,2],'c':['a','b','c','d','e']})

In [59]: df
Out[59]: 
   a  b  c
0  2  2  a
1  2  1  b
2  1  3  c
3  1  1  d
4  1  2  e

In [60]: df.sort_values(['a','b'], ascending=[True, True], inplace=False)
Out[60]: 
   a  b  c
3  1  1  d
4  1  2  e
2  1  3  c
1  2  1  b
0  2  2  a

inplace=Trueにすると、データフレームDataFrameの中身をソートしたもので置き換える。

いつものスタックオーバーフロー。
stackoverflow.com

<pandas, Python> カラムの値を比較して、同じ値の行を抽出する。

カラムcolumnの値を比較して、同じ値の行rowを抽出する。 対象のカラムを選択して、apply()をして、その中で、lambda関数で文字列比較処理をすればいい。

In [7]: df = pd.DataFrame({'a':[1,2,3,4,5],'b':[1,4,6,8,10],'c':[5,7,8,9,10]})

In [8]: df
Out[8]: 
   a   b   c
0  1   1   5
1  2   4   7
2  3   6   8
3  4   8   9
4  5  10  10

In [37]: df['e'] = df[['a','b']].apply(lambda x: 'hage!' if x[0] == x[1] else 'hige.', axis=1)

In [38]: df
Out[38]: 
   a   b   c      e
0  1   1   5  hage!
1  2   4   7  hige.
2  3   6   8  hige.
3  4   8   9  hige.
4  5  10  10  hige.

過去記事が役にたった。よかった。よかった。
nekoyukimmm.hatenablog.com

<mermaid> マーメイドにリンクを埋め込む

マーメイドmermaidで作った絵に、リンクlinkを埋め込む。

click行を追加すればオッケー。 下記、例。

<h2>mermaid in html</h2>
<div class='mermaid'>
    graph TD;
    subgraph box
    A(Start)-->B(Do some stuff)
    B(Take some rest)-->C(do more)
    click B "http://www.yahoo.co.jp" "This is a link"
    end
</div>

1つ問題が。 clickで指定する要素名(この場合は、B)は、1文字しかだめ。
2文字にすると、リンクの埋め込みがうまく動かない。

いつもお世話になってる、スタックオーバーフロー。
stackoverflow.com

<Python> 関数名と行番号を取得する。

デバックdebugしてる時に、関数名function nameと行番号line numberを表示したくなったので、ググった。

sys._getfram()ちゅうやつでできるらしい。例。

In [92]: import sys

In [93]: def hage():
    ...:     print(sys._getframe().f_code.co_name)
    ...:     print(sys._getframe().f_code.co_filename)
    ...:     print(sys._getframe().f_code.co_firstlineno)
    ...:     print(sys._getframe().f_code.co_code)
    ...:     print(sys._getframe().f_lineno)
    ...:     for i in dir(sys._getframe().f_code):
    ...:         print('{} {}'.format(i, getattr(sys._getframe(), i, '-')))
    ...:         

In [94]: hage()
hage
<ipython-input-93-7d9960568d3f>
1
b't\x00t\x01j\x02\x83\x00j\x03j\x04\x83\x01\x01\x00t\x00t\x01j\x02\x83\x00j\x03j\x05\x83\x01\x01\x00t\x00t\x01j\x02\x83\x00j\x03j\x06\x83\x01\x01\x00t\x00t\x01j\x02\x83\x00j\x03j\x07\x83\x01\x01\x00t\x00t\x01j\x02\x83\x00j\x08\x83\x01\x01\x00x2t\tt\x01j\x02\x83\x00j\x03\x83\x01D\x00] }\x00t\x00d\x01j\n|\x00t\x0bt\x01j\x02\x83\x00|\x00d\x02\x83\x03\x83\x02\x83\x01\x01\x00q^W\x00d\x00S\x00'
6
__class__ <class 'frame'>
__delattr__ <method-wrapper '__delattr__' of frame object at 0x00000000071461B8>
__dir__ <built-in method __dir__ of frame object at 0x00000000071461B8>
__doc__ None
__eq__ <method-wrapper '__eq__' of frame object at 0x00000000071461B8>
__format__ <built-in method __format__ of frame object at 0x00000000071461B8>
__ge__ <method-wrapper '__ge__' of frame object at 0x00000000071461B8>
__getattribute__ <method-wrapper '__getattribute__' of frame object at 0x00000000071461B8>
__gt__ <method-wrapper '__gt__' of frame object at 0x00000000071461B8>
__hash__ <method-wrapper '__hash__' of frame object at 0x00000000071461B8>
__init__ <method-wrapper '__init__' of frame object at 0x00000000071461B8>
__init_subclass__ <built-in method __init_subclass__ of type object at 0x000000001DA38550>
__le__ <method-wrapper '__le__' of frame object at 0x00000000071461B8>
__lt__ <method-wrapper '__lt__' of frame object at 0x00000000071461B8>
__ne__ <method-wrapper '__ne__' of frame object at 0x00000000071461B8>
__new__ <built-in method __new__ of type object at 0x000000001DA3C580>
__reduce__ <built-in method __reduce__ of frame object at 0x00000000071461B8>
__reduce_ex__ <built-in method __reduce_ex__ of frame object at 0x00000000071461B8>
__repr__ <method-wrapper '__repr__' of frame object at 0x00000000071461B8>
__setattr__ <method-wrapper '__setattr__' of frame object at 0x00000000071461B8>
__sizeof__ <built-in method __sizeof__ of frame object at 0x00000000071461B8>
__str__ <method-wrapper '__str__' of frame object at 0x00000000071461B8>
__subclasshook__ <built-in method __subclasshook__ of type object at 0x000000001DA38550>
co_argcount -
co_cellvars -
co_code -
co_consts -
co_filename -
co_firstlineno -
co_flags -
co_freevars -
co_kwonlyargcount -
co_lnotab -
co_name -
co_names -
co_nlocals -
co_stacksize -
co_varnames -

他にも、inspectモジュールでもできるらしいが、まあ、これでできたので、良しとする。

参考。
qiita.com

qiita.com

t2y.hatenablog.jp

<logging, Python> ipythonでのlogging

ちと、threadingを使っていたら、どのスレッドが何しているのか?知りたくなり、ロギングloggingしてみた。
したら、ipythonでは、ちと一工夫必要だったのでメモっち。

簡単にいうと、下記をスクリプトに盛り込む。

import logging
logging.disable(logging.FATAL)
# logging.disable(logging.NOTSET)
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logging.basicConfig(format='[%(asctime)s] %(levelname)s %(process)d %(thread)d %(threadName)s %(lineno)d %(funcName)s %(message)s', level=logging.DEBUG)

logging.basicConfig(level=logging.DEBUG)だけでは、levelDEBUGにならず、 logging.debug('hage')が出力されない。

なので、ロガーloggerオブジェクトを生成して、.setLevel(logging.DEBUG)が必要。
どうしてかは、難しいので、よくわからんが、、、

参考にさせてもらったところ。
note.crohaco.net

http://momijiame.tumblr.com/post/41503983502/python-の-logging-力を高める
momijiame.tumblr.com

d.hatena.ne.jp

threading – スレッドによる並列処理を管理する - Python Module of the Week