寿司on焼肉onピザ

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

【Python】ソートを思い出す

思い立ったのでpythonでソートアルゴリズムを書いてみました。

自分用のまとめとしても残しておきます。

 

Pythonにはソートや配列関係の便利な関数がありますが、勉強のためになるべく使わずに実装。Cでやれよ

 

内容は

github.com

 

参考

ヒープソート - Wikipedia

クイックソート - Wikipedia

https://www.amazon.co.jp/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0-%E7%AC%AC3%E7%89%88-%E5%B9%B3%E7%94%B0-%E5%AF%8C%E5%A4%AB/dp/4627726538

ヒープソートに関してはこちらをかなり参考にしています。

[Python] ヒープソートの実装方法とアルゴリズム │ Web備忘録

 

 

【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中国麻雀牌程度の差が出てますね。

終わりに

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

上海で元に両替したら機械が壊れてて別室で両替した話

はじめに

こんにちは。実は諸用で上海に行ってきました。
今回は両替の話をします。

一般的な中国元の両替のおすすめまとめ

  • 最低限のお金(交通費、当日の食事代)は日本で両替しておく
  • 大きいお金は中国の銀行での両替がおすすめ(手数料無料)(レート一律)
  • ホテル、両替機はレートが悪いor 手数料がかかる(らしいです)(未検証)
  • 余裕があれば日本の銀行で銀聯カードを作っておく

銀聯カードはそこら中で使えるマークがあったのであると便利ですよ、現地の人はQRコード支払いかカード支払いが主流のようです。コンビニで現金だすと「まじかw」みたいな感じになりますよ
銀行の窓口の受付時間は9:00〜18:00
主要銀行は土日も営業しているようですね。

この辺は他の人も紹介してくれていますね。

www.mapple.net

実際の流れ

飛行機に乗る前に交通費+1食分の飯代くらいは国内で両替しました。(4500yenくらい)
虹橋空港の両替所だと1000円くらい取られるらしいですね。(マジ?)
空港のみずほ銀行は手数料200円ちょいでしたよ。(羽田から虹橋に行く人なんて稀だと思うが)
実際にどの銀行で両替するかは両替額、レートと手数料と相談ですかね。
僕が行った日だと、中国元のレートはみずほ銀行が一番良かったですね。

www.haneda-airport.jp

トラブルなしの場合の両替の話だけ知りたい人はここまででOKです。
ここからは、機械の故障で特殊なケースで両替を行なった話を書いていきます。

経緯

ホテルに到着したのが夜だったので銀行はやってませんでした。
次の日の朝に中国銀行に向かったのですが…
私「日本円を中国元に両替したい(英語)」
受付「今パスポート読み取る機械が壊れていてできない、今エンジニアを呼んでいる」
私「まじか」

ってことで中国銀行で両替はできませんでした。
そこですぐ近く(てか同じ建物)にあった上海銀行に行ってみました

わい「両替したい」
受付「そこの中国銀行でできるで」
わい「機械が壊れていてできなかった」(Google翻訳を見せる)
ここから受付の人がぞろぞろ出てきて中国語でなんか喋り始めました。
多分、中国銀行の機械が壊れてることは伝わったのかな?おそらく「この日本人どうしよう」と話し合ってたんだと思います(申し訳ねえ)

話がまとまったのか、
受付「両替してやるから、こっちにきて」
と言われ薄暗い別室に通されました(これヤバイやつ?って思っちゃった)
気軽に両替しにきたのに物々しい感じでヒエ〜〜〜〜

多分、機械が使える他の銀行探したほうが処理が早かった気がする

おそらく、パスポートの登録を手打ちで入力でやってくれたって感じですね。

最後には、超分厚いドアの金庫からわざわざ現金を出してくれました

いや〜お手数おかけして申し訳ないとはこのこと...

記入書類

さて、ここから書類の話です。こういう金融系の書類って英語で書かれると何書いたらいいのかわからんのですよ。色々項目ありましたが、よくわかんなかったのシリーズをメモしておきますね。

Currency of the money: 通過の種類
日本円ならJPYです

Amount of money: 両替する金額(日本円)
例えば2万円両替するなら、20000って書けばOK

Adress: ホテルの名前と住所
チェーン店のホテルだと向こうもどれかわからないので、住所まで把握しときましょう!

Phone Number: ホテルの電話番号
自分の携帯電話の番号ではありません!ホテルの電話番号です!
で同じ欄に名前を書けと言われたらローマ字の名前を書きましょう

外貨の種類 と 中国元の種類 (チェック式)
両方Cash(現金)を選べば大丈夫です、現金が出てきます
もし現金にしたくなかったら他のを選んでください(そんな観光客はレアだと思うけど)

どっかの項目の署名が「パスポートと同じ署名」を要求されました
自分は漢字で書いてたので、ローマ字で書いたら「違うぜ」って言われました

 

ともかく...お手数をおかけしました...
ありがとう上海銀行!

中国のお店の人みんないい人ばっかで感心しました