焼肉on寿司onピザ

プログラミングとか、かっこいい音楽とかの話を

【Windows10】WSL(Windows Subsystem for Linux)で音を出すまで(メモ)【PulseAudio】

はじめに

WSLで音出したいなーと思ったので環境構築した

発生した問題

この辺の記事を参考に、WSlから音を出したかったのですが…
cobodo.hateblo.jp
token2shell.com

待機状態になってくれれば成功なのですが、ターミナルから起動してもうまく待機状態になってくれません。
こんな感じのエラー(エラーはイメージです)がブワーって出た後止まってしまいます
(これは動いてる時のエラーなので、本当に動かない時は違うエラーが出るかも)
f:id:dokataponiti:20200107234904j:plain
う~ん困った

対処法

WSL側はこちらを参考に導入
cobodo.hateblo.jp

window側はこちらを参考に導入、何が要因でうまくいったかはわかりません…
vogel.at.webry.info


上記記事を参考にpulseaudioのdaemon.confとdefault.paを編集
pulseaudio.exeファイルをダブルクリックするとターミナルが立ち上がって無事に待機状態になりました。

他の記事のやつと追加してやったことは

Win32がどうのってエラーが出ますがちゃんと音は出ます。
※pulseaudioを走らせておかないとWSLからの音は拾えないので注意

具体的処理

WSL側

WSL側の手順はこっちを参考にしましたが、行数とか自分の環境と若干違ったので一応手順をまとめておきます
Windows Subsystem for Linuxのインストールからmikutterをそれらしく動かすまで - cobodoのブログ

まずはインストール

$ sudo apt install pulseaudio

pulseaudioの設定ファイルを書き換えます
読み込み専用ファイルなので sudo vi [ファイル名]で実行して 保存時は:w! とかすると保存できるかと

/etc/pulse/client.confの22行目を書き換える
変更前

; default-server =

変更後

default-server = tcp:localhost


続いて/etc/pulse/default.paの83行目

#load-module module-native-protocol-tcp

こいつの#を消しましょう

WSL側はこれで終了です

Windows

さっきの記事様とほとんど全く同じことをします
まずpulseaudioをダウンロード
https://www.freedesktop.org/wiki/Software/PulseAudio/Ports/Windows/Support/
zipfile containing preview binariesってとこをクリックすればOK
ダウンロードしたら解凍

/pulseaudio-1.1/etc/pulseのファイルを編集します、元のを削除して置き換えましょう
/pulseaudio-1.1/etc/pulse/default.pa

load-module module-waveout sink_name=output source_name=input record=0
load-module module-native-protocol-tcp auth-anonymous=1

参考元の記事様の編集に追加してdaemon.confも編集
/pulseaudio-1.1/etc/pulse/daemon.conf 39行目
変更前

; exit-idle-time = 20

変更後

exit-idle-time = -1

次に管理者でパワーシェルを起動して次のコマンドを実行
ファイウォールの設定らしいです

netsh advfirewall firewall add rule name="PulseAudio" dir=in action=allow protocol=TCP localport=4713

ここまでやったら/pulseaudio-1.1/bin/pulseaudio.exeをエクスプローラーからクリックして実行
黒いターミナルが立ち上がって、待機状態にくれれば成功です。
この後、パワーシェルで実行しても待機状態になりました

動作確認

paplayとかでテキトーなwavファイルを再生してみましょう

$ paplay test.wav
shared memfd open() failed: 関数は実装されていません

こんなエラーが出ますが、音声は再生されるので大丈夫です。



なんかWSLとかのこういう記事の日本語文書探してもあんまないですね、もっと盛り上がれWSL

【Python3】【自然言語処理】ニュース記事をロジスティック回帰で分類+可視化【sklearn】【TFIDF】

あけましておめでとうございます。
2020年一発目は自然言語処理をします。

ところで最近MLPにハマりました、A MultiLayer PerceptronじゃなくてMy Little Ponyの方です。
NLP(Natural Language Processing)とMLPって似ててややこしいね。

はじめに

やっぱ用意されているテストデータで解析するより、自分で実データを使って解析してみたいですよね。
そういうわけで、今回はニュース記事のデータセットを使って簡単な分類タスクをやってみます。

今回の結果
映画関連の記事とスポーツ関連の記事をこんな感じ可視化し決定境界をプロットしました。
f:id:dokataponiti:20200102182019p:plain

今回は数学的な説明はしません、それはまた別の機会に。
それでは始めていきましょう。

環境

  • Mac OS Mojave 10.14.6
  • Python3.7.4
  • Anaconda
  • jupyter notebook
  • Mecab Neologd
  • numpy 1.16.2
  • scikit-learn 0.21.3
  • scipy 1.3.1

numpyだけは1.17だとうまく動かない場合があったので、あとのライブラリはメモ程度に
下記のデータセットをダウンロードして、同じフォルダ構成にすれば(多分)実行できると思います。

データセット

こちらのニュース記事を利用させていただきました。ありがとうございます。
ダウンロード - 株式会社ロンウイット
今回処理したデータは映画関連の記事が870件、スポーツ関連の記事が900件です。

使い方

作業ディレクトリを作成し、上記データセットソースコードをダウンロードして次のようにディレクトリを配置してください。
データセットのルートディレクトリの名前をdataと変更して以下のように配置してください。
次にnewsと同じ階層にnews_maというディレクトリを作成します。
f:id:dokataponiti:20200101232155p:plain
wakati_news_git.py を実行した後にjupyter notebookで tfidf_lr.ipynb を実行すると結果が表示されます。

処理の流れ

  1. データの前処理&分かち書き
  2. 文書をTFIDFベクトルに変換
  3. ロジスティック回帰モデルで文書分類
  4. 結果の可視化

データの前処理&分かち書き

Neologd使いたかったので、ターミナルでpythonを実行します(jupyter notebookで使えなかった...)

>python3 wakati_news_git.py

自然言語データ(特に日本語)の前処理には少しコツがあります。
ここを突き詰めるとキリがないので、今回あつかったポイントを箇条書きしておきます。

  • 英語を全て小文字に統一
  • 扱う品詞の限定
  • 動詞を標準形に統一

あとは、データを分かち書きするだけなんでサクッといきましょう。
ここでnews_wakati.txtを生成します。(形態素を空白で区切ったデータ)

以下、jupyter notebookでの実行となります。

文書をTFIDFベクトルに変換

sklearnを使ってサクッと文書のベクトル化ができます。
TFIDFの説明はこちらをご覧ください。
tf-idf - Wikipedia

簡単にいうと、文書を特徴づける単語ほど値が大きくなるってことです。

import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer(use_idf=True, min_df=0.02, stop_words=[],token_pattern=u'(?u)\\b\\w+\\b')
#data_path = "./data/news_ma/"
    
#分かち書き文章を取得
with open("./data/news_ma/news_wakati.txt", 'r') as rfile:
    lines = rfile.readlines()
    docs = np.array([l.replace("\n", "") for l in lines])
    #["文書aの分かち書き", "文書bの分かち書き", ...]

#tfidfベクトルの生成
tfidf_vecs = vectorizer.fit_transform(docs)
print(tfidf_vecs.shape) #(文書数, 語彙数)
print(vectorizer.vocabulary_) #語彙一覧

TfidfVectorizer()でmin_dfやmax_df、stop_wordsを設定することで、結構それっぽいベクトルになったりします。
TFIDFのベクトルは単語の数だけ次元数があります。ベクトルの数は文書数となります。
今回のTFIDFベクトルのtfidf_vecs.shape出力結果は、(1770, 1507)になります。
使用されている単語と頻度の例がこんな感じです。ニュースっぽいでしょうか?

'dvd': 84, 'エンター': 278, 'られる': 249, '女': 769, '目': 1184, 'する': 178, '真実': 1192, '孤独': 789, '2006年': 25, '連載': 1410

次元圧縮

ベクトルを生成したらプロットしたくなるのが男の子というもの
しかし、1507次元のベクトルをどうやってプロットしたらいいでしょう?
ここで、SVDと言われる手法が登場するわけです。SVDによって次元数の大きいベクトルを低次元に圧縮することができます。

具体的な手法はこちらの記事が大変わかりやすく解説してくれています。僕もこれで勉強しました。
mieruca-ai.com

さて、2次元に圧縮できればx軸y軸でデータをプロットできそうです。
次のコードでTFIDFベクトルを2次元に圧縮しましょう。

#プロット用に次元削減
from sklearn.decomposition import TruncatedSVD
svd = TruncatedSVD(2)
svd_vecs = svd.fit_transform(tfidf_vecs)
print(svd_vecs)

出力:

[[ 0.38588807 -0.05177993]
 [ 0.56464581 -0.03317373]
 [ 0.41480447 -0.14996453]
 ...

しっかりと二次元になっていますね。

ニュース文書のプロット

上で求めたベクトルをプロットしましょう。

import matplotlib.pyplot as plt
%matplotlib inline
#とりあえず可視化
color_ctr = "red" #赤:映画記事 青:スポーツ記事
for x in range(len(svd_vecs)):
    if x >= 870:
        color_ctr = "blue"
    plt.plot(svd_vecs[x][0], svd_vecs[x][1], marker='o', linestyle='none', alpha=0.4, color=color_ctr)

plt.grid(True)
plt.show()

出力 赤=映画記事, 青=スポーツ記事
f:id:dokataponiti:20200101235757p:plain

スポーツ記事と映画記事のベクトルが各々まとまっているのがわかります。
この二つを分ける境界線を求めれば文書分類ってのができそうですね。

文書データをこんな感じにプロットできるってなんだか魔法みたいですね

ロジスティック回帰モデルで文書分類

さて、文書分類をしていきます。入力された記事を「映画記事」「スポーツ記事」の2クラスに分類するタスクです。
今回は教師あり学習手法の一つである、ロジスティック回帰という手法を使用します。
文書分類やスパムフィルタリングではSVMもよく使用されています。
ロジスティック回帰 - Wikipedia

詳細な解説はまた別の機会でやるとしましょう。
コードはこんな感じ

#ロジスティック回帰をやってみる
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression as LR
from sklearn.model_selection import cross_val_score
#データのラベルを生成
label = ["movie" if i < 870 else "sports" for i in range(len(docs))]
#学習
clf = LR(solver='lbfgs')

# 交差検証
scores = cross_val_score(clf, tfidf_vecs, label, cv=5)
# 各分割におけるスコア
print('交差検証の各回の精度: {0}'.format(scores))
print('精度の平均: {0}'.format(np.mean(scores)))

今回は交差検証で精度を確認しています。
交差検証 - Wikipedia

結果

交差検証の各回の精度: [0.99717514 1.         0.99717514 1.         0.99717514]
精度の平均: 0.9983050847457626

データが元からしっかりと分離されているので、精度の平均は約0.998と高い数値を示していますね。

結果の可視化

ここからはおまけです。
せっかくなので決定境界をプロットしてみましょう。
先ほど、1507次元のベクトルを使いましたが、今回は2次元に圧縮したデータで文書分類を行います。
2次元のデータにしてしまえばプロットは簡単にできそう、ということですね。

可視化の準備
2次元のベクトルを使用しロジスティック回帰モデルを構築します。
決定境界の重みとバイアスを取得しましょう。

#曲線をプロットしてみる
import math

#先ほど2次元に圧縮したsvd_vecsを利用する
#学習用と訓練用にデータの分割
X_train, X_test, y_train, y_test = train_test_split(svd_vecs, label, test_size=0.3)
lr = LR(solver='lbfgs')
lr.fit(X_train, y_train)

#print("訓練データの正解率:" ,lr.score(X_train, y_train))
print("テストデータの正解率:", lr.score(X_test, y_test))
#print (lr.predict(X_test)) #テストデータを入れて分類してみた結果
print ("バイアス:" ,lr.intercept_)
print ("重み:", lr.coef_[0])
テストデータの正解率: 0.9830508474576272
バイアス: [1.75716636]
重み: [-5.64512381 13.37045192]

この値は乱数が絡んでくるので多少変動します。
バイアスと重みを境界線関数にぶち込んでプロットすれば決定境界を描画することができます。

可視化

#境界線関数
def logistic(t, w):
    return (-w[0] * t - lr.intercept_[0])/w[1]

#ロジスティック関数の描画
#svd_vecのx軸の最大値から最小値まで50回のプロット
t = np.linspace(np.min(svd_vecs, axis=0)[0],np.max(svd_vecs, axis=0)[0],50)
y = np.array([logistic(ele, lr.coef_[0]) for ele in t])
plt.plot(t,y)
plt.grid(True)

#tfidfベクトルのプロット
color_ctr = "red" #赤:映画記事 青:スポーツ記事
for x in range(len(svd_vecs)):
    if x >= 870:
        color_ctr = "blue"
    plt.plot(svd_vecs[x][0], svd_vecs[x][1], marker='o', linestyle='none', alpha=0.4, color=color_ctr)

結果
f:id:dokataponiti:20200102182019p:plain
決定境界がプロットできました。記事を分断するぽい境界になってますね。

おわりに

今回はニュース記事をロジスティック回帰で分類してみましたが、他にも文書分類の手法は数多く存在します。
SVMとかトピックモデルとかk-meansとか、次回以降の記事で扱ってみることにしましょう。
文書のベクトル化にも他の手法がありますので、別の機会でそちらも触れてみようかな。


【DEATH】デスメタルのサブジャンル一覧(翻訳)と補足【METAL】

おれは怒っている。地獄の炎がおれの怒りを燃え上がらせた

怒りの矛先は日本語のデスメタルwikipedia

ja.wikipedia.org

 

英語のデスメタルの記事を見るまで、俺はこいつを賞賛していた

デスメタルの記事があるなんてなんていい世界だ!」ってな

 

だが英語の記事を見ちまったら真逆の感情になった

日本の記事の残念ところは多くの情報が英語版から削られているところだ

 

wikipediaの記事はボランティアだ。書いてくれた人には感謝している

英語の記事が後に足された可能性があるし、怒るのはお門違いって訳だが

 

今回は削られた項目"Subgenres and fusion genres"に含まれる16のデスメタルサブジャンルについて紹介しよう

あまりメタルのジャンルで議論するのは好きじゃないが、メタルバンドを探す指標として便利なのは確かだ。

 

この記事を参考に書かせてもらった、ちょっとだけ補足説明(緑)も入れておいた

en.wikipedia.org

つまりデスメタルにも色々あるってわけだ、全部暗記しろ

 

これは保険だが、俺の英語力には限界がある

間違いがあったら指摘をくれ

 

これが目次だ

 

全部で16項目、いくぜ

 

Blackened death-doom

最初はブラックメタル関係のサブジャンルの説明からだ。ブラックメタルを知らない人のために説明すると、協会を燃やして豚の生首をステージに持っていくような音楽ジャンルだ

ドゥームメタルの特徴であるスローテンポ、モノリシックなドラムとブラックメタル調のグロウルが組み合わさったデスメタルだ。

バンドの例:Morast,Faustcoven,The Ruins of Beverast,Bölzer

Blackened death-metal

Blackened death metalはブラックメタル的な要素が組み合わさったデスメタルだ。トレモロピッキング、反キリスト、悪魔的テーマの使用、ブラックメタルで使用されるコード進行などが特徴だ。死体のペイントや鎧を着たりするのはブラックメタルと一緒だ。

バンドの例:Belphegor, Behemoth, Akercocke

 

Blackened death metalの中にもサブジャンルがあるので紹介する

Melodic black-death

blackened melodic death metalやmelodic blackened death metalと言われているらしい。ブラックメタルとヨーロッパのロマン主義にインスパイアされたメロディックデスメタルバンドってのがこのジャンル。しかし、他のブラックメタルと違う部分はメロディーと物語性の表現だ。つまりブラックメタルメロデスってわけだな。メロデスの説明は最後にある

バンドの例Dissection, Sacramentum, Embraced, Naglfar

War metal

このジャンルはwar black metalやbestial black metalと言われている。攻撃的・不協和的・混沌という特徴を持つサブジャンルだ。ロックハードジャーナリストのウルフ・リューディガーミュールマンが"rabid"(狂気じみてる)とか"hammering"(金槌的!みたいな感想かな?ギターの話ではないだろう)と言っているらしい。

バンドの例: Repulsion, Autopsy, Sarcófago 

Brutal death metal

みんな大好きブルデス。Brutal death metalはメロディーや音色よりも重さ・速さ・複雑なリズムを重視するジャンルだ。リフの特徴は高速・ブリッジミュートを用いたパワーコード・単音と言われている。最速最凶

カンニバルコープスは日本でも有名なバンドだ

バンドの例: Cannibal Corpse, Dying Fetus, Suffocation, Skinless

Death-doom

ドゥームメタルの特徴であるスローテンポと悲観的な雰囲気と、デスメタルの深いデスボイスとダブルキックバスドラムを組み合わせたジャンルがこのジャンルだ。ヘルハンマーとケルティックフロストの初期の作品の影響を受け、1980年代後半に登場、1990年代には一般的になっている。

バンドの例:Winter, Disembowelment, Paradise Lost, Autopsy, Anathema, My Dying Bride

Funeral doom

Death-doomサブジャンルとして、葬送歌(ダージ音楽)とDeath-doomを組み合わせたジャンルがこれだ。 非常に遅いテンポ、虚無感と絶望感を思い起こさせる雰囲気が特徴だ。エレキギターひどく歪んでいる。またキーボードやシンセサイザーが表現する「夢のような」ダークな雰囲気を作り出す。ボーカルは哀しみに満ちた詠唱とグロウルで構成され、メインパートではないことが多い。

バンドの例:Mournful Congregation (Australia), Esoteric (United Kingdom), Evoken (United States), Funeral (Norway), Thergothon (Finland), and Skepticism (Finland)

Death 'n' roll

デスメタルのグロウルのボーカル、歪んでデチューンギターリフと1970年代のハードロック/ヘビーメタルの要素が組み合わさったジャンルだ。デスンロールってパンありそう

バンドの例:Entombed, Gorefest, Six Feet Under

Deathcore

お待たせしました、俺たちの青春デスコア 

メタルコアの人気に伴い、メタルコアの特徴とデスメタルの特徴が組み合わさったのがデスコアだ。 Suicide SilenceCarnifex, Salt the Woundメタルコアデスメタルを融合させた代表的なバンドだ。デスメタルの特徴である、ブラストビートを含む高速ドラム、ダウンチューニングされたギター、トレモロピッキング、グロウルボーカル、ハイピッチのスクリームとメタルコアのブレイクダウンが組み合わせられる。Decibelマガジンはこう述べている「Suffocation(※)のトレードマークの1つであるブレイクダウンは、メタルのサブジャンルであるデスコアを完全に(?)生み出した」。

※Suffocationはアメリカ出身のデスメタルバンド

wikiにスーサイが書いてあって嬉しいぞ

Deathgrind, goregrind and pornogrind

閲覧注意!下水注意!

グラインドコアの壮絶さ、速度、短さとデスメタルの複雑さを組み合わせたスタイルがこのジャンル。goregrindはゴアや法医病理学(?)というテーマに焦点を当てている。要するにグロと死体 pornogrindは性的でポルノなテーマを扱う。名前まんまだな

バンドの例:Brujeria, Cattle Decapitation, Cephalic Carnage, Pig Destroyer, Circle of Dead Children, Rotten Sound, Gut, Cock and Ball Torture

この動画はちっちゃい頃に見てずっと笑ってた

www.youtube.com

Deathrash

デススラッシュではない、デスラッシュだ!

death-thrashとも呼ばれるこのジャンルは、デスメタルの要素とスラッシュメタルを組み合わせたジャンルだ。このジャンルはバリ島で有名になり、ジャカルタでの観光開発に対する批判を集めた。wikiに突然この逸話出てきたんだけど、実話?

バンドの例:Grave, Mortification, The Crown, Incapacity, Darkane, Deathchain, Sepultura

Industrial death metal

インダストリアルミュージックとデスメタルを組み合わせたジャンル

これしか説明がなかった... 

バンドの例:Fear Factory, Anaal Nathrakh, Autokrator, Meathook Seed

Melodic death metal

お待たせしました、メロデスです

Swedish death metalは Melodic death metalの先駆けと考えられている。しばしば「メロデス」と表現される。メロディックデスメタルはいくつかのデスメタルの特徴を融合させたヘビーメタルで、イギリスのヘビーメタルニューウェーブに大きな影響を受けている。他のデスメタルと異なるポイントとして、グロウルの代わりにスクリーム、遅めのテンポ、多くのメロディーとたまに聞こえるクリーンボーカルがあげられる。

Carcassは1993年にHeartworkで最初のメロディックデスメタルのアルバムをリリースしたと言われているが以下のバンドがイェーテボリ(※)メタルサウンドメロデスのパイオニアとして知られている。

バンドの例In Flames, Dark Tranquillity, At the Gates

Arch Enemyももちろん好きだぜ

イェーテボリスウェーデン港湾都市

Slam death metal

ハードコアパンクの要素を取り入れている 、90年代のニューヨークのデスメタルから発展したマイクロジャンルがこいつだ。他のデスメタルとは対照的に、ギターソロとブラストビートを重要視していない。その代わりに、ミドルテンポ、ブレイクダウン、ブリッジミュートのリフ、ヒップホップ調のボーカルとドラムリズムを取り入れている。

バンドの例:Devourment, Cephalotripsy, Abominable Putridity

Symphonic death metal

シンフォニックデス!

 クラシックミュージックの要素を取り入れたデスメタルがこいつだ。

バンドの例:Apocalypse, Septicflesh, Necronomicon, Children of Bodom, Haggard(2000's album)

ちなみにガキ使の笑ってはいけないで流れるSEではチルボドが使われている

Technical death metal

Technical death metalはtech-death, progressive death metalやprog-deathとも言われている。テクデスではダイナミックな曲構造(?)変拍子、不規則なハーモニーとメロディーを採用している。Technical death metalやprogressive death metalと言われるバンドは、デスメタルの美しさとプログレッシブロック、ジャズ、クラシック音楽の要素を融合させる。technical death metalという語は、速さ、激しさ、複雑さを重視するバンドを説明するときに使用されることがあるが、progressive death metalとtechnical death metalの境界が明確にあるわけではない。略してテクデス、プログデスと言われるバンドの代表例を以下に示す。

バンドの例:Nile, Edge of Sanity, Opeth

クラシックミュージックの影響を受けたテクデスバンドの例として、Necrophagist, Spawn of Possessionがあげられる。デスメタルの先駆者であるDeathは、最後の年に彼らのスタイルをプログレッシブな方向へと洗練させた。ドイツのバンドのAtrocityのHallucinations (1990)とHuman (1991)はこのジャンルのアルバムである。このスタイルは他のバンドに大きな影響を与えた。ヨーロッパではGory BlisterElectrocutionといったバンドをはじめとして、新しい流れを作った。ポーランドのバンドであるDecapitatedは、ヨーロッパの典型的な現代のテクニカルデスメタルとして認知さた。

テクデスについてはやたら解説が多かったな

 

---

サブジャンルの紹介は以上だ。

代表的なバンドがまとまっているのはありがたいな

サブジャンルを全部暗記したら全部のバンドを聴け、聴くまで寝るな

最後にデスコアで紹介されていたCarnifexの名曲を貼っておく、2:03くらいの顔がデスコアの全てを体現しているのではないだろうか

www.youtube.com

では次回の記事で会おう

【Python3】listをset()とlist()で.sort()とsorted()

はじめに

AtCoderの例題解いてたら、こんがらがったので自分の整理メモ

本題

例えば、配列 [5, 1, 4, 2, 7, 100, -12, 2, 1, 4, 1, 5, 100] があったとして、オリジナルの要素だけにしてソートする という時

set()やらsort()を使うと1行でオリジナル化とソートができる、覚えておこう

l = [5, 1, 4, 2, 7, 100, -12, 2, 1, 4, 1, 5, 100]
print(sorted(list(set(l)))) # [-12, 1, 2, 4, 5, 7, 100]


今まではなぜか.sort()を使っていた。.sort()が返す値はNoneなのでset()と一緒に書けない、美しくない

l = [5, 1, 4, 2, 7, 100, -12, 2, 1, 4, 1, 5, 100]
l = list(set(l))
l.sort()
print(l) # [-12, 1, 2, 4, 5, 7, 100]

大事なのは、

関数が返す値を理解しておけってこと、
プログラミング5年目で気づきました。(雑魚)


ドット無し関数()が返す値はなんかある
.ドットあり関数()が返す値はNone 、だがこいつはくっついてる値をいじるんだな
って感じなのを理解できたので寝ます。

上海で中国麻雀牌を買った話

 

はじめに

これはコロナが流行る以前の話です。ご了承ください。

 

諸用で中国に行きました、ついでに上海で中国麻雀牌を買った話をします。
麻雀牌って結構売ってる場所が限られていて外国人が情報なしで探すのは結構難しいかもしれません。上海のGrobal Horbarとかいうくそでかショッピングモールにはありませんでしたね。

購入場所

ググったところこの記事↓しか情報がないのでとりあえず行ってみることに。

https://4travel.jp/os_qa_each-7110.html

豫園商場(豫园商城)豫园駅から徒歩10分しないくらいです。

中国の街並みをきらびやかに作った感じの観光地になっています、派手ですね

f:id:dokataponiti:20191126111800j:plain

 

さて、旧校場路沿いのお店をザーッと見ていくと…
この店にありました!中国ぽい骨董品売り場みたいな場所です!

f:id:dokataponiti:20191126111803j:plain

横にはチャイナドレスが売っていましたね。

f:id:dokataponiti:20191126111808j:plain

 

百度マップ的にはおそらくここなのですが、このブロックは旧校場路沿いからでもアクセスできました。

f:id:dokataponiti:20191126112533p:plain

一応、googleMapも埋め込んでおきますが現地ではポンコツなので悪しからず...

goo.gl

値段交渉

麻雀牌に駆け寄ったらおっちゃんが「マーチャオ?マーチャオ?」と出してくれました
私はすかさず「Bigger!!Bigger!!」やはり中国麻雀牌は一番でかいのがいいですよね。
おっちゃんの提示額は350元(5431円程度)、私は他の店も見たいと英語で行ったつもりだったのですが...

おっちゃんに英語が通じません

「どうしよ...」とおもったのでなんとか伝えようとしていたら、おっちゃんが電卓を出してきて
「希望額を入れろ」みたいなアクションをしてきました。まあ観光地あるあるですね

すかさず200元と入力!!(多分250くらいで良かった)

おっちゃんはここで「まじかよ笑」みたいなリアクション、その後電卓で300元(4700円くらい)を提示してきました
これ以上やり取りもめんどくさいかったので(疲れていた)、妥協しました
でもこういう所って、最高で1/4くらいは値切れる気がします。次回はゴネてみましょう
観光地は「ゴネ得…!ゴネ得…!(班長)」ですよ

麻雀牌

というわけで入手しました!中国麻雀牌!

f:id:dokataponiti:20191126111809j:plain

(左は現地の本屋で買った中国麻雀本)
デカイ!重い!点棒がない!点棒入れもない!サイコロはある!
これ持って歩くのめっちゃしんどいですよ...

 

日本の牌と比較

面積

f:id:dokataponiti:20191202115657j:plain

ざっと1.3倍くらいですかね、重みもあってでかい

高さ

f:id:dokataponiti:20191202115701j:plain

厚みも日本の牌より1.2倍くらいあります、でかい

手配13枚並べてみた

f:id:dokataponiti:20191202115637j:plain

横の長さも牌を並べてみると差が出ますね

山を積んでみた

f:id:dokataponiti:20191202115646j:plain

f:id:dokataponiti:20191202115649j:plain

いうまでもないでしょう、10枚並べると2.8中国麻雀牌程度の差が出てますね。

終わりに

というわけで、上海で中国麻雀牌を買った話でした!
上海で麻雀牌を買いたいとおもってる人は参考にしてみてください!
正直ネットで売ってる

【Ubuntu 16.04 LTS】突然グラフィックボードを認識しなくなった時の対処法

また自分の環境で起こる可能性があるのでメモとして書いときます

症状

conda関係のパッケージなどをインストールして再起動したら画面の解像度がおかしくなっていました。
試しに以下のコマンドを打ち込んでみても、ドライバーがないというメッセージが返ってきました。
(GPUが認識していればGPUの情報が返ってくるはずです)

nvidia-smi

管理者以外のアカウントもログインしてもログイン画面に戻される無限ループ
また守れなかった...

対処法

とりあえずsudo apt-get

sudo apt-get update
sudo apt-get upgrade

これでなんか元に戻りました(謎)

他の原因

これで治らない場合はドライバの入れ直しとかした方がいいかもです。
他に参考にした記事も載せておきます。
qiita.com

qiita.com

【Python3】【Windows10】状態遷移パッケージtransitionsをAnaconda, pygrapgvizなしで使用する方法

はじめに

pythonの状態遷移管理パッケージtransitionsは、簡単に状態遷移を記述できる非常に便利なパッケージです。以下のページで日本語で非常に詳しくまとめてくださっています。(ありがたい)
qiita.com

基本的に、ここに書いてある通りに試していけばいいのですが、ライブラリのインストールで壁にぶち当たったので書いておきます。

環境

Windows10
Python3.7.4
Anacondaは非導入
【追記】transitions 0.7.1

発生した問題

Pygraphvizが入らねえ
Anaconda入れたくねえ

発生した経緯

今回の問題の原因は、状態遷移を表示する画像パッケージのインストールで問題が発生しているようです。transitionの開設サイトに書いてある通り(conda無しver)に進めると

pip install git+https://github.com/pytransitions/transitions.git@dev-graphviz

このコマンド試すとエラーが...
gitから直接ダウンロードしてsetup.pyしてもダメでした
結局原因がわからず、pygraphvizをどうにか入れる方法を探したのですが...

「Anacondaを使わずに」pygraphvizを導入する方法の一つで、以下も試しましたが、うまくできず...(雑魚)
hytmachineworks.hatenablog.com

解決方法

transitions解説サイトをよく読むと次のような記述が...

※ちなみに次期Versionの0.70ではPyGraphvizは使用しない方向になっているので、Version0.69までの対応となる見込みです。(「Windowsの場合」参照のこと)

な~~~んだ、じゃあpygraphvizを使わないtransitionsのコードを書けばええのか~~
というオチでした
ちゃんと読めよ

てことで、pygraphvizを使わないでtransitionsを使う方法をご紹介します

pygraphvizを使用せずにtransitionsを使う

日本語でこの解説してるページがなかったので書いておきますv
transitionsのソースが載ってるgithubと先述の日本語解説サイトを参考にしています
github.com

インストール

まずは最新版のtransitionsとgraphvizをインストールしてください
graphvizは公式サイトから、Stable 2.38 Windows install packagesをインストールしてからpipしましょう。その後、パスも/binまで通して再起動
https://graphviz.gitlab.io/download/

pip install transitions
pip install graphviz

dotが通っているか確認、バージョンが出てきたら成功です

dot -V

出力例

dot - graphviz version 2.38.0 (20140413.2041)

transitionsで状態遷移図の出力

例の開設サイトに載っているwindows向けのコードですが、実行すると
"Exception: AGraph diagram requires pygraphviz"というエラーが発生します
pygraphvizを要求してくるわけですね

import graphviz
from IPython.display import Image, display
from transitions.extensions import GraphMachine

states = ['A', 'B', 'C']        #状態の定義

class Matter(object):
    def __init__(self, filename=None):
        self.output = filename

    def action_output_graph(self, *args, **kwargs):
        dg = model.get_graph(*args, **kwargs).generate()
        if isinstance(self.output, str):
            graphviz.Source(dg, filename=self.output, format='png').render(cleanup=True) 
        else:
            display(Image(dg.pipe(format='png'))) 

model = Matter('test')         #ファイル出力する場合は、Matter('test')にする。
machine = GraphMachine(model=model, states=states, initial='A', 
                       auto_transitions=False, ordered_transitions=True,
                       title='', show_auto_transitions=False, show_conditions=False, 
                       finalize_event='action_output_graph')    

model.action_output_graph()     #初回のみ手動実施


こちらを次のように書き換えるとうまく実行され、同じフォルダに状態遷移の画像が出力されます

変更後のコード

import graphviz
from IPython.display import Image, display
from transitions.extensions import GraphMachine

states = ['A', 'B', 'C']        #状態の定義

class Matter(object):
    def __init__(self, filename=None):
        self.output = filename

    def action_output_graph(self, *args, **kwargs):
        dg = model.get_graph(*args, **kwargs).generate()
        if isinstance(self.output, str):
            graphviz.Source(dg, filename=self.output, format='png').render(cleanup=True)
        else:
            display(Image(dg.pipe(format='png')))

model = Matter()
machine = GraphMachine(model=model, states=states, initial='A',
                       auto_transitions=False, ordered_transitions=True,
                       title='', show_auto_transitions=False, show_conditions=False,
                       finalize_event='action_output_graph', use_pygraphviz=False)
# use_pygraphviz=Falseを追加

model.get_graph().draw('test.png', prog='dot') #画像出力 ファイル名をここで指定

変更点としては2つです

  1. GraphMachineの定義に"use_pygraphviz=False"を追加(19行目)
  2. 画像出力の関数を変更(最終行)

pygraphvizを使わないことを明示して、dotで出力しろ!
って書いてあげてるわけですね

出力された画像

f:id:dokataponiti:20191008201929p:plain
解説サイトと同じ画像が出て、うまく動いてそうですね!!!


という感じでpygraphvizやcondaを使わずにtransitionsが使えそうです~やったね~
winでpygraphviz入れるのはあきらめそう!

余談ですが、anaconda入れたくなかったのは最近はpipでだいたいどうにかなるので新しいの入れると環境がぐちゃぐちゃになりそうなのを懸念してました。
ばいちゃ