【Windows10】WSL(Windows Subsystem for Linux)で音を出すまで(メモ)【PulseAudio】
はじめに
WSLで音出したいなーと思ったので環境構築した
発生した問題
この辺の記事を参考に、WSlから音を出したかったのですが…
cobodo.hateblo.jp
token2shell.com
待機状態になってくれれば成功なのですが、ターミナルから起動してもうまく待機状態になってくれません。
こんな感じのエラー(エラーはイメージです)がブワーって出た後止まってしまいます
(これは動いてる時のエラーなので、本当に動かない時は違うエラーが出るかも)
う~ん困った
対処法
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って似ててややこしいね。
はじめに
やっぱ用意されているテストデータで解析するより、自分で実データを使って解析してみたいですよね。
そういうわけで、今回はニュース記事のデータセットを使って簡単な分類タスクをやってみます。
今回の結果
映画関連の記事とスポーツ関連の記事をこんな感じ可視化し決定境界をプロットしました。
今回は数学的な説明はしません、それはまた別の機会に。
それでは始めていきましょう。
環境
- 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件です。
クレジット
MOVIE ENTER様 http://news.livedoor.com/category/vender/movie_enter/
Sports Watch様 http://news.livedoor.com/category/vender/208/
使い方
作業ディレクトリを作成し、上記データセットとソースコードをダウンロードして次のようにディレクトリを配置してください。
データセットのルートディレクトリの名前をdataと変更して以下のように配置してください。
次にnewsと同じ階層にnews_maというディレクトリを作成します。
wakati_news_git.py を実行した後にjupyter notebookで tfidf_lr.ipynb を実行すると結果が表示されます。
処理の流れ
- データの前処理&分かち書き
- 文書をTFIDFベクトルに変換
- ロジスティック回帰モデルで文書分類
- 結果の可視化
データの前処理&分かち書き
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()
出力 赤=映画記事, 青=スポーツ記事
スポーツ記事と映画記事のベクトルが各々まとまっているのがわかります。
この二つを分ける境界線を求めれば文書分類ってのができそうですね。
文書データをこんな感じにプロットできるってなんだか魔法みたいですね
ロジスティック回帰モデルで文書分類
さて、文書分類をしていきます。入力された記事を「映画記事」「スポーツ記事」の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)
結果
決定境界がプロットできました。記事を分断するぽい境界になってますね。
おわりに
今回はニュース記事をロジスティック回帰で分類してみましたが、他にも文書分類の手法は数多く存在します。
SVMとかトピックモデルとかk-meansとか、次回以降の記事で扱ってみることにしましょう。
文書のベクトル化にも他の手法がありますので、別の機会でそちらも触れてみようかな。
参考にさせていただいた記事様
https://qiita.com/fujin/items/b1a7152c2ec2b4963160
https://kishiyama.hatenablog.com/entry/2018/06/19/021833
http://ailaby.com/tfidf/
https://qiita.com/yuuki_1204_/items/3c0a298a521dc6e79615
https://qiita.com/0NE_shoT_/items/b702ab482466df6e5569
https://www.sejuku.net/blog/64363
http://ailaby.com/logistic_reg/
http://www.tsjshg.info/udemy/Lec76-79.html
https://docs.pyq.jp/python/machine_learning/tips/train_test_split.html
https://blog.amedama.jp/entry/2018/08/26/095444
https://qiita.com/tomov3/items/039d4271ed30490edf7b
【DEATH】デスメタルのサブジャンル一覧(翻訳)と補足【METAL】
おれは怒っている。地獄の炎がおれの怒りを燃え上がらせた
英語のデスメタルの記事を見るまで、俺はこいつを賞賛していた
「デスメタルの記事があるなんてなんていい世界だ!」ってな
だが英語の記事を見ちまったら真逆の感情になった
日本の記事の残念ところは多くの情報が英語版から削られているところだ
wikipediaの記事はボランティアだ。書いてくれた人には感謝している
英語の記事が後に足された可能性があるし、怒るのはお門違いって訳だが
今回は削られた項目"Subgenres and fusion genres"に含まれる16のデスメタルのサブジャンルについて紹介しよう
あまりメタルのジャンルで議論するのは好きじゃないが、メタルバンドを探す指標として便利なのは確かだ。
この記事を参考に書かせてもらった、ちょっとだけ補足説明(緑)も入れておいた
つまりデスメタルにも色々あるってわけだ、全部暗記しろ
これは保険だが、俺の英語力には限界がある
間違いがあったら指摘をくれ
これが目次だ
- Blackened death-doom
- Blackened death-metal
- Brutal death metal
- Death-doom
- Death 'n' roll
- Deathcore
- Deathgrind, goregrind and pornogrind
- Deathrash
- Industrial death metal
- Melodic death metal
- Slam death metal
- Symphonic death metal
- Technical death metal
全部で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 SilenceやCarnifex, Salt the Woundがメタルコアとデスメタルを融合させた代表的なバンドだ。デスメタルの特徴である、ブラストビートを含む高速ドラム、ダウンチューニングされたギター、トレモロピッキング、グロウルボーカル、ハイピッチのスクリームとメタルコアのブレイクダウンが組み合わせられる。Decibelマガジンはこう述べている「Suffocation(※)のトレードマークの1つであるブレイクダウンは、メタルのサブジャンルであるデスコアを完全に(?)生み出した」。
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
この動画はちっちゃい頃に見てずっと笑ってた
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 BlisterやElectrocutionといったバンドをはじめとして、新しい流れを作った。ポーランドのバンドであるDecapitatedは、ヨーロッパの典型的な現代のテクニカルデスメタルとして認知さた。
テクデスについてはやたら解説が多かったな
---
サブジャンルの紹介は以上だ。
代表的なバンドがまとまっているのはありがたいな
サブジャンルを全部暗記したら全部のバンドを聴け、聴くまで寝るな
最後にデスコアで紹介されていたCarnifexの名曲を貼っておく、2:03くらいの顔がデスコアの全てを体現しているのではないだろうか
では次回の記事で会おう
【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分しないくらいです。
中国の街並みをきらびやかに作った感じの観光地になっています、派手ですね
さて、旧校場路沿いのお店をザーッと見ていくと…
この店にありました!中国ぽい骨董品売り場みたいな場所です!
横にはチャイナドレスが売っていましたね。
百度マップ的にはおそらくここなのですが、このブロックは旧校場路沿いからでもアクセスできました。
一応、googleMapも埋め込んでおきますが現地ではポンコツなので悪しからず...
値段交渉
麻雀牌に駆け寄ったらおっちゃんが「マーチャオ?マーチャオ?」と出してくれました
私はすかさず「Bigger!!Bigger!!」やはり中国麻雀牌は一番でかいのがいいですよね。
おっちゃんの提示額は350元(5431円程度)、私は他の店も見たいと英語で行ったつもりだったのですが...
おっちゃんに英語が通じません
「どうしよ...」とおもったのでなんとか伝えようとしていたら、おっちゃんが電卓を出してきて
「希望額を入れろ」みたいなアクションをしてきました。まあ観光地あるあるですね
すかさず200元と入力!!(多分250くらいで良かった)
おっちゃんはここで「まじかよ笑」みたいなリアクション、その後電卓で300元(4700円くらい)を提示してきました
これ以上やり取りもめんどくさいかったので(疲れていた)、妥協しました
でもこういう所って、最高で1/4くらいは値切れる気がします。次回はゴネてみましょう
観光地は「ゴネ得…!ゴネ得…!(班長)」ですよ
麻雀牌
というわけで入手しました!中国麻雀牌!
(左は現地の本屋で買った中国麻雀本)
デカイ!重い!点棒がない!点棒入れもない!サイコロはある!
これ持って歩くのめっちゃしんどいですよ...
日本の牌と比較
面積
ざっと1.3倍くらいですかね、重みもあってでかい
高さ
厚みも日本の牌より1.2倍くらいあります、でかい
手配13枚並べてみた
横の長さも牌を並べてみると差が出ますね
山を積んでみた
いうまでもないでしょう、10枚並べると2.8中国麻雀牌程度の差が出てますね。
終わりに
というわけで、上海で中国麻雀牌を買った話でした!
上海で麻雀牌を買いたいとおもってる人は参考にしてみてください!
正直ネットで売ってる
【Ubuntu 16.04 LTS】突然グラフィックボードを認識しなくなった時の対処法
【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つです
- GraphMachineの定義に"use_pygraphviz=False"を追加(19行目)
- 画像出力の関数を変更(最終行)
pygraphvizを使わないことを明示して、dotで出力しろ!
って書いてあげてるわけですね
出力された画像
解説サイトと同じ画像が出て、うまく動いてそうですね!!!
という感じでpygraphvizやcondaを使わずにtransitionsが使えそうです~やったね~
winでpygraphviz入れるのはあきらめそう!
余談ですが、anaconda入れたくなかったのは最近はpipでだいたいどうにかなるので新しいの入れると環境がぐちゃぐちゃになりそうなのを懸念してました。
ばいちゃ