あいみょんの曲はなぜどこかで聞いたことがあるのか
存在しないノスタルジー
あいみょんの曲を聞いていて不思議に思うことがある。
例えば、「ハルノヒ」という歌
私はこれを聞いていると「この曲はこれまでに無かったんだな」という思いが湧く。
「マリーゴールド」などの他の曲でも同じだ。
凡庸に言い換えると、生まれてからどこかで聞いたことがあるような気がしてくる。
もちろん、この曲は彼女が作成したものであり、これまで存在していないはずの曲だ。
ノスタルジーは、懐かしさは、経験の中にしか生起しない。このような気持ちはどこから湧き上がるのだろう?
あいみょんは平成の総括
私の友人の言葉を借りると、あいみょんというのは平成という時代の「総括」なのだという。
平成を彩った曲たちをJoisoundの平成カラオケ年表で簡単に振り返ってみる。
平成初期1992~1995年
平成初期の1992年代、日本はバブル崩壊後の未曾有の不景気だった。そして伝説的なバンド、Judy and Maryの解散直後でもある。このとき流行っていたのは中村美穂&WANDSの「世界中の誰よりきっと」やT-BOLONの「Bye For Now」、Mr.Childrenの「innocent world」である。
「世界中の誰よりきっと」は男女の混声が特徴的な楽曲である。基本ややスローテンポで、メロディを牽引しているのはピアノだが、ギターの音色もしっかり主張している。バンドブームの片鱗も感じることができる一曲である。
「Bye For Now」はキレのある高音と情熱的なソロが特徴的なバラードだ。GLAYの「However」などは、この曲の影響を強く感じることができる。現代日本のROCKにおけるバラードの中心的な流れを作った曲と言えるのではないだろうか。
そしてMr.Childrenの「innocent world」も外せない。言わずとしれたミスチルの名曲である。ピアノを中心に展開されるミドルテンポのしっとりとしたに乗せた力強い歌詞は、不景気のどん底にあった日本社会に響いたのかもしれない。
この3つの曲に共通するのは、曲名がそのまま曲中の特徴的なメロディとして登場する点である。平成初期の曲は曲名をそのまま歌うことが多いようだ。
平成初期1995~2000年
ガラケーが定着し始めた時代、華原朋美の「I'm proud」、スピッツの「チェリー」、Every Little Thingの「Time goes by」、宇多田ヒカルの「Automatic」なんかが流行っていた。
この辺りもスピードがある曲というよりもミドルテンポやバラードが多い。「I'm proud」や「Time goes by」は1980年代から続く邦楽の流れを汲んでいるように感じるが、「Automatic」や「チェリー」に関しては現代的な雰囲気を感じ取ることができる。
平成中期2000年~2005年
スマホが出始め、地上デジタル放送が始まった時代の転換期である。その一方で、非正規雇用の増大や経済の不安定感が高まり、社会学者が言う「社会の紐帯」が断絶し、分断社会が形成され始めた時代でもある。
サザンオールスターズの「TUNAMI」、ポルノグラフィティや「アゲハ蝶」や「サウタージ」、MONGOL800の「小さな恋のうた」や「あなたに」、大塚愛の「さくらんぼ」、SMAPの「世界に一つだけの花」、オレンジレンジの「花」、一青窈の「ハナミズキ」などの曲が流行った。
この辺りからギター・ボーカル・ドラム・ベース編成の所謂「バンド・ミュージック」が音楽シーンに台頭し始めた。その一方で、前世代の残香を感じさせるシンセやピアノを多用したアイドル曲の人気も健全である。社会が分散化するにつれて、音楽のジャンルも大幅に多様化した。メジャー音楽は世間一般ーオタク層ーロック層といったよう具合に、各ドメインは独立な市場を形成し、「多様化の時代」に進んでいく。
平成中期2005年~2010年
新たなテクノロジーが社会に浸透し、旧来の価値観が本格的に崩れだす時代である。インターネットが普及することで、それまで社会に片隅に追いやられていたいわゆる「陰キャ」と呼ばれる人々が、「2ちゃんねる」などを中心としてネット上でのプレゼンスを高めていく。それと同時に、Twitterを始めとする匿名のSNSも誕生し、匿名の一般市民がインターネット上で交流を始める。
この時代に流行ったのは、レミオロメンの「粉雪」、湘南乃風の「純恋歌」、エグザエルの「Lovers Again」、GReeeeNの「キセキ」、高橋陽子の「残酷な天使のテーゼ」、そして2010年の9位ではあるが、supercellの「メルト」もランク入りした。
この曲目からも分かる通り、バンド・ミュージックからラップ、ダンスミュージック、ボーカロイド、アニソンまで、音楽のジャンルが明らかに増大した。これまでは表に大々的に出ることのなかったジャンルが、一気に花開いた時代だ。
代表的なボーカロイドである「初音ミク」のプロジェクトは2007年から始動しており、黎明期の楽曲ksの「Packaged」などは、主にニコニコ動画で人気を博した。ボーカロイドの主戦場はCDでのメジャーデビューではなく、ニコニコ動画やYouTubeといったプラットフォームである。この頃に小・中学生だった子どもたちと、それ以前の世代の人では、「音楽の価値」に対する認識も変わり始める。CDとして、実態のあるモノとして音楽を捉える人々と、音楽には実態はなく、動画サイトで無料で手に入れるものだと考える層で、「音楽の価値観」に関する断絶も深まっていく。
また、大人が視聴する対象としての「アニメ」が、インターネットを通して社会で受け入れ始めたこの時期に、アニソンがランク入りすることも象徴的な出来事ではないだろうか。
平成後期2010年~2015年
スマホが世の中に出始め、SNSが急速に普及し、インターネットは一部のオタクのものではなく、誰もが使うツールとなった。様々な意見・思想・イデオロギーがインターネット上で繋がる中で、音楽はさらに多様化していく。
この時に流行ったのはAKB48の「ヘビーローテション」、少女時代の「Gee」や同じく韓流のKARA「ミスター」も流行した。他にも、ゴールデンボンバーの「女々しくて」、初音ミクの「千本桜」、松たか子の「Let it go~ありのままで~」、秦基博の「ひまわりの約束」、SEKAI NO OWARIの「RPG」・「Dragon Night」などが流行った。また、きゃりーぱみゅぱみゅもこの頃に流行りだし、「にんじゃりばんばん」などがヒットしている。
バンド・ミュージックとしては、ONEOKROCKやUnison square garden、Backnumberなどが流行った。他にも椎名林檎、RADWIMPS、BUMP OF CHICKENなどが挙げられるが、これらのバンドはオリコンやカラオケのランキングで上位には来ていないようだ。
このことからも分かる通り、世間の趨勢はダンスミュージックや、大人数のアイドルグループの曲にあることが分かる。その一方で、バンド・ミュージックやボーカロイド、アニソンは社会の趨勢にはならないものの、SNSや各種動画サイトの中で強力なコミュニティを形成し、根強いファンとなった。
このような背景から、音楽における社会の分断はこの頃が最盛期と考えられる。ダンスミュージックやアイドルの音楽を好む、ライトユーザー層と、バンド・ミュージックやボーカロイド、アニソンを支える音楽のヘビーユーザー層がきっぱりと別れ、ネット上とリアルはかつて無いほどに分断される。
お互いは交じること無く、お互いの領域で好みの音楽を聞く状態となり、「ヒット曲」という概念は完全に消失する。音楽の細分化が進み、コミュニティの分断が進んだため、音楽に関する「共通理解」が失われることとなる。つまり、道端ですれ違ったふたりが居たとして、そのどちらも知っている曲というものが無くなるのである。これは平成初期の音楽事情と大きく異る点と言える。
平成後期2015~2018
この頃になると、インターネットやSNSは子供から老人まで使う普遍的なツールとなった。誰もがインターネットで自分の意見を発し、誰かの意見に否応なく触れる時代である。これまでオタクの巣窟であったニコニコ動画やYoutube、2ちゃんねるには一般人が新しいコンテンツを求めて流れ込み、旧来のエコシステムが崩壊し、これまで不可侵だった各コミュニティの壁が消え、カオスの時代が到来した。
音楽の質も変わり始め、各ジャンルが独立して築き上げた音楽の体系を、他のジャンルが取り込むなどし始めた。いわば、平成後期から現在は多様化から「融合」の時代に進化したと言える。
さて、平成の最後期に流行った音楽を紹介する。まず星野源の「恋」、RADWIMPSの「前前前世」、米津玄師の「Lemon」、Official髭男dismの「ノーダウト」、乃木坂46の「シンクロニシティ」や櫻坂46の「サイレントマジョリティー」などである。
「恋」・「前前前世」・「Lemon」・「ノーダウト」このあたりは、ある意味バンド・ミュージックの再来でもあるが、質がかなり異なる。まずギターやベースはコードをジャキジャキ刻むものから、高音域の対旋律を優しく奏でるような演奏に変わり、代わりにピアノやシンセ、ストリングスなど、かつてはボーカロイド、アイドルの楽曲、ダンスミュージックなどで多用された楽器を全面に出し初めている。そして曲調もゴリゴリのロックから、ポップスよりになり、音程の上げ下げが激しいキャッチーなメロディが増えた。
その一方で、櫻坂46や乃木坂46などもアイドルグループの楽曲も、ギターやドラムの音を取り入れ、芯のあるサウンドを志向するようになった。メロディもキャッチー一辺倒ではなく、早口でまくしたてるなどの、ボーカロイド的な要素も入り始めた。
そして、ボーカロイドは衰退期を迎えている。ボーカロイドの側からヒットが生まれることは少なくなり、こちらは逆に元のコミュニティに構造に戻り始めたように見える。しかし、ボーカロイドの側がバンドミュージックに歩み寄る事例もこの時代に視ることができた。例えば、Wowakaが「ヒトリエ」としてデビューしたり、40mpも「イナメトオル」という名前で自分の声で歌うようになった。有名な話だが、米津玄師もかつては「ハチ」名義でボーカロイドを作曲している。これも「融合」の時代を象徴する出来事のように思える。
そしてあいみょん
このように、現代音楽は「全員で共通」→「分断」→「多様化」→「融合」という流れを踏んでいる。この流れの中で、あいみょんはどう位置づけることができるだろうか。その答えがまさに「平成の総括」たる彼女の曲たちなのである。例えば、マリーゴールドという曲
この曲の芯はギターロックだろう。イントロやソロ、アウトロの印象的なメロディは歪んだ音色のギターで奏でられている。それだけでなく、要所要所に気の利いたギターフレーズが入り、この曲の主体が何たるかを印象づける。バックには(よく聞かないとわからないが)アコースティックギターが、エレキギターのアルペジオと共にコード感を出している。また、上の方ではピアノが対旋律を薄く鳴らしている。決してでしゃばる訳ではないが、薄いシンセとともに全体を包み込み、爽やかな曲でありながら、どこかノスタルジーで、反対に最先端にも感じさせる不思議な雰囲気を作っている。
つまり、これまでに述べてきたあらゆるジャンルの知見が織り交ぜられていて、一つの「完璧な融合の形」を形成している。音楽にとって、平成は分離と融合が一つのサイクルとして回った。これからの時代は、音楽に関して、何かしら一つのコンセンサスができていくのではないだろうか。
ポストあいみょんの音楽
それぞれのジャンルは、もはや他のジャンルの存在と不可分な存在である。他のジャンルの知見を取り入れ続け、新しい音楽を開拓しなければ、現在のボーカロイドのように勢いを失ってしまう。
音楽におけるコンセンサスが失われ、各分野が融合する流れの中で、あいみょんは象徴的なアーティストと言えるだろう。実際に、あいみょんに続く今日の邦楽は、Official髭男dismやking gnuなど、独特でありながら、他分野を融合させた新たなフロンティアを開拓し続けている。
TikTokからヒットが生まれるように、これまでの常識を覆すような形で音楽は進化している。ポストあいみょんには、一体どのような「融合」の形をみることができるだろうか。
宣伝
ココナラでフリーのライターをやっています。
これまでに290件以上の受注実績があります。
大学入試の小論文、学生・社会人の方のレポートの作成・添削のご相談はこちらまで!
PythonでGUIの名簿管理アプリを作る
GUIアプリとは?
Pythonでエクセルの名簿ファイルに名前・電話番号・性別を登録するGUIアプリを作ります。
GUIアプリというのはGraphical User Interfaceの略で、カーソルでボタンを押したり、スライドさせたりといった直感的な操作が可能な画面のことをいいます。もっと言えば、マウスで操作できるのは基本的に全てGUIと呼ばれるものです。
私達がパソコンと聞いて想像する作業の殆ど全てはGUIで行うことができます。ブラウザの操作やword、EXCELは全てGUIアプリです。
GUIの反対の概念にCUIというものがあります。これは、例えばコマンドプロンプトなどがそうです。
PythonでGUIアプリを作るには?
PythonでGUIのアプリを作る際、有名なモジュールにtkinterがあります。昔からあるモジュールですが、コードが長くなるなど、やや使いにくいです。
そこで、今回は最近開発されたPySimpleGUIを使ってみます。インストールしていない人は、プロンプトで
$pip install pysimplegui
と打ち、インストールしましょう。
作りたいアプリの機能
次のような操作が可能なアプリを目指します。
①GUIで氏名・電話番号・性別を入力する
②アプリがエクセルファイル”meibo.xslx”を作成する(開く)
③meibo.xslxに入力された情報を書き込む
このようなアプリがあれば、いちいちエクセルファイルを開かなくとも名簿管理が可能になります!
プログラミング
モジュール
使うモジュールは以下の通りです。
import PySimpleGUI as sg import os import openpyxl import datetime
PySimpleGUIはGUIの設計、osはファイル操作、openpyxlでエクセルファイルの操作、datetimeで日付の取得です。
エクセルファイルの作成
一番初めにアプリを使うときは、ファイルが存在しません。ですので、まずファイルを作成します。
しかし、2回目以降はファイルが存在するため、同じようにファイルを作ると内容が白紙で上書きされます。
従って、もしファイルが存在していればファイルを作る操作を行わないようにします。
os.path.exists(file_name)はfime_nameが同じ階層にあればTrue、なけれがFalseを返します。
file_name = 'meibo.xlsx' if os.path.exists(file_name) == False: book = openpyxl.Workbook() book.save(file_name)
行名の設定
表の1行目ではその行が何の値なのか示す必要があります。
sheet['A1'] とすることで、A1に任意の値を入れることができます。
これは何度上書きされても大丈夫なので、一回目とそれ以外で特に場合分けしません。
book = openpyxl.load_workbook(file_name) sheet = book['Sheet'] sheet['A1'] = '作成日' sheet['B1'] = '氏名' sheet['C1'] = '性別' sheet['D1'] = '電話' book.save(file_name)
ここまでを実行すると、
となり、行名が入ったことがわかります。
レイアウトの設定とGUIの生成
layoutというリストを作成し、GUIの情報を書き込んで行きます。基本的に、リストのn番目の要素はそのままn行目として反映されます。
そしてwhileループでイベントを検知するまでGUIの表示を続けるようにします。もし「確定」ボタンが押されれば、GUIを閉じます。
layout = [ [sg.Text('名簿入力')], [sg.Text('名前', size=(15, 1)), sg.InputText('武田ヒロト')], [sg.Text('電話番号', size=(15, 1)), sg.InputText('123-4567-8901')], [sg.Text('性別',size=(15,1)),sg.Radio('男',group_id ='sex'),sg.Radio('女',group_id ='sex')], [sg.Submit(button_text='確定')] ] window = sg.Window('名簿作成アプリ',layout) while True: event,values = window.read() if event in (None,'確定'): break
ここまでを実行すると、以下のような画面を生成できます。
エクセルファイルに書き込む準備
次に、入力された情報を取り出します。入力された情報はvaluesに入っているので、
name = values[0] phone = values[1] if values[2] == True: sex = "男" else: sex = '女'
というようにして、情報を取り出します。
もし男を選択すると、valuesには
{0: '武田ヒロト', 1: '123-4567-8901', 2: True, 3: False}
という感じにデータが格納されます。もし"2"がTrueなら男ですし、Falseなら必然的に女です。
日付は
time = datetime.date.today() today = str(time.year) + '/' + str(time.month) + '/' + str(time.day)
というように処理します。datetime.today()はそのままだと2020-1-1というフォームで値を返すので、そのままエクセルファイルに書き込むと表示が汚くなります。
時間を2020/1/1のようにスラッシュで区切るためにこのような形にします。
エクセルファイルに書き込み
あとは取得した情報を書き込むだけです。
最後の行に追加する必要がありますので、エクセルファイルの最後の行をsheet.max_rowを使って取得します。
エクセルの中では1から行を数えますが、Pythonでは0から数えることに注意します。
book = openpyxl.load_workbook(file_name) row = sheet.max_row + 1 sheet = book['Sheet'] sheet['A'+str(row)] = today sheet['B'+str(row)] = name sheet['C'+str(row)] = sex sheet['D'+str(row)] = phone book.save(file_name) print(values) #GUIを閉じる window.close()
ここまでを実行すると、
このように、名簿に情報が記録されてます。
さらに、
と別の情報を入力すると、、、
このように、後ろにきちんと情報が追加されていることが分かります。
プログラム全体
import PySimpleGUI as sg import os import openpyxl import datetime #エクセルファイルが無ければ作る file_name = 'meibo.xlsx' if os.path.exists(file_name) == False: book = openpyxl.Workbook() book.save(file_name) #エクセルファイルの一行目を設定 book = openpyxl.load_workbook(file_name) sheet = book['Sheet'] sheet['A1'] = '作成日' sheet['B1'] = '氏名' sheet['C1'] = '性別' sheet['D1'] = '電話' book.save(file_name) #レイアウト定義 layout = [ [sg.Text('名簿入力')], [sg.Text('名前', size=(15, 1)), sg.InputText('武田ヒロト')], [sg.Text('電話番号', size=(15, 1)), sg.InputText('123-4567-8901')], [sg.Text('性別',size=(15,1)),sg.Radio('男',group_id ='sex'),sg.Radio('女',group_id ='sex')], [sg.Submit(button_text='確定')] ] window = sg.Window('名簿作成アプリ',layout) #確定ボタンが押されるまで表示を続ける while True: event,values = window.read() print(event,values) if event in (None,'確定'): break #エクセルファイルに書き込むために変数を整理 name = values[0] phone = values[1] if values[2] == True: sex = "男" else: sex = '女' #時間を2020/1/1のようにスラッシュで区切る time = datetime.date.today() today = str(time.year) + '/' + str(time.month) + '/' + str(time.day) #書き込み book = openpyxl.load_workbook(file_name) row = sheet.max_row + 1 sheet = book['Sheet'] sheet['A'+str(row)] = today sheet['B'+str(row)] = name sheet['C'+str(row)] = sex sheet['D'+str(row)] = phone book.save(file_name) #GUIを閉じる window.close()
宣伝
ココナラでフリーのライターをやっています。
これまでに280件以上の受注実績があります。
大学入試の小論文、学生・社会人の方のレポートの作成・添削のご相談はこちらまで!
coconala.com
Pythonで単回帰分析を実装する
今週はPythonで単回帰分析をやってみましょう。
モジュールを使えば簡単にできますが、それでは面白味がないので、回帰係数の計算までスクラッチで実装します。
回帰分析とは何か?
回帰分析とは2つの変数-仮にx,yとする-の間の関係を直線で考えることです。xに対するyの値を直線の関係で捉えることとも言えるでしょう。回帰分析は、xに対するyの値の予想に使うことができます。
例えば、アイスの売上と気温を考えてみましょう。
横軸に気温、縦軸にアイスの売上をプロットすると、以下のような関係がありました。
0℃のときは1日に10個程度売れ、30℃のときには約40個が売れています。
これは明らかに、気温が上がった時にアイスの売上も増加していると言えそうです。
ここで、これらの点に可能な限り寄り添うような直線を考えてみましょう。
直線というのはつまり、1次関数なので、こんな式を考えてみたいわけです。
気温が高いほどアイスの売上が大きいことは自明です。しかし、実際にどの程度伸びているのでしょうか。つまり、1℃気温が上がったとき、何個売上は増えるのでしょうか?このようなことを回帰分析で明らかにします。
本当は複雑な数式展開があるのですが、なんだかんだ計算すると次の式で傾きと切片を求めることができます。
これらを実際に求めて、同じ平面にプロットすると次のような図になります。
回帰式は でした。つまり、気温が1℃の上がると約10個売上が増えると言えます。
36℃のときの売上は、回帰式から
と予測できるわけです。
Pythonで回帰式と図を出力する
最後にPythonで上の図と回帰式を得るためのコードを考えていきます。
モジュール
図をプロットするためのモジュールです
import matplotlib.pyplot as plt import numpy as np
標準入力からxとyのデータを得ます。
x = list(map(int,input("xを入力").split())) y = list(map(int,input("yを入力").split())) #これは先程の気温とアイスの関係です。 #x = [0,5,10,15,20,25,30,35] #y = [10,19,20,21,29,36,40,45]
平均
和を要素で割るだけですね
x_ave = sum(x)/len(x) y_ave = sum(y)/len(y)
分散
分散は平均と各要素の差を2乗し、全て足し合わせていきます。
for文を使って下のように実装できます。
#xの分散 x_var = 0 for i in range(len(x)): x_var += (x_ave - x[i])**2 x_var = x_var/len(x)
共分散
共分散はxの各要素と平均の差とyの各要素を掛けたものの総和を取り、要素数で割ります。
#共分散の計算 cov = 0 for i in range(len(x)): cov += ((x[i]-x_ave)*(y[i]-y_ave)) cov = cov/len(x)
回帰係数
回帰係数は以下の通り計算すれば出ます。
a = cov/x_var b = y_ave - a*x_ave #回帰式 s = "y = {0}x + {1}".format(a,b) print("回帰式 : ",s)
プロット
直線と散布図をプロットします。
scatterは散布図、plt.plotで直線を書いていきます。
legendは凡例です。
Range = np.arange(0,max(x)) reg = a*Range + b plt.title("Regression analysis") plt.scatter(x,y) plt.plot(Range,reg,color="r",label="Regression line") plt.legend() plt.xlabel("℃") plt.ylabel("Ice") plt.savefig("regression_result.png")
プログラム全体像
import matplotlib.pyplot as plt import numpy as np x = list(map(int,input("xを入力").split())) y = list(map(int,input("yを入力").split())) #x = [0,5,10,15,20,25,30,35] #y = [10,19,20,21,29,36,40,45] #x,yの平均 x_ave = sum(x)/len(x) y_ave = sum(y)/len(y) #xの分散 x_var = 0 for i in range(len(x)): x_var += (x_ave - x[i])**2 x_var = x_var/len(x) #共分散の計算 cov = 0 for i in range(len(x)): cov += ((x[i]-x_ave)*(y[i]-y_ave)) cov = cov/len(x) #回帰係数の計算 #傾き a = cov/x_var #切片 b = y_ave - a*x_ave #回帰式 s = "y = {0}x + {1}".format(a,b) print("回帰式 : ",s) #直線と散布図のプロット Range = np.arange(0,max(x)) reg = a*Range + b plt.title("Regression analysis") plt.scatter(x,y) plt.plot(Range,reg,color="r",label="Regression line") plt.legend() plt.xlabel("℃") plt.ylabel("Ice") plt.savefig("regression_result.png")
ここまでを実行すると、先程も提示した
この図が得られます。
宣伝
ココナラでフリーのライターをやっています。
これまでに280件以上の受注実績があります。
大学入試の小論文、学生・社会人の方のレポートの作成・添削のご相談はこちらまで!
coconala.com
Pythonで計算ドリルをpdfで生成する
やりたいこと
今週は小学生くらいの児童向けの計算ドリルを、Pythonで自動生成するプログラムを書いてみます。
実現したいことは次の2つです。
①足し算の式 (ex 1+1=)を20個ほど作成する
②計算式をpdfに書き出し、印刷できる状態とする。
プログラムの説明
モジュール類
最終的に作るのはpdfファイルです。まずはpdfを扱うためのモジュールをインポートします。
#乱数を発生させる import random #pdfをいじる from reportlab.pdfgen import canvas from reportlab.pdfbase.pdfmetrics import registerFont from reportlab.pdfbase.ttfonts import TTFont
pdfの設定
次に、pdfに書き出すフォントを用意します。適当なttfファイルを用意し、
同じ階層に置いてください
源真ゴシック (げんしんゴシック) | 自家製フォント工房
等
registerFont(TTFont('GenShinGothic', './fonts/GenShinGothic-Monospace-Light.ttf'))
次にファイル名等の設定をしていきます。
#ファイル名の設定 title = '計算テスト' #pdfの下地を準備する pdf = canvas.Canvas(title + '.pdf') pdf.saveState() # フォントを設定 pdf.setFont('GenShinGothic', 25) #タイトルを設定 pdf.drawString(230,780,title)
計算式の作成
ここで1+1=のような文字列を作成する関数を作ります。適当な乱数と問番号(1)等を引数として受け取り (1)1+1= のような文字列を返します
#計算式を作る関数の定義 def generate_problem(a,b,n): s = "({})".format(n) + str(a) + " + " + str(b) + " = " return s
pdf出力
最後に、実際にpdfに書き出していきます。
問番号を保持する変数numを用意し、20問を2問ずつ2列で配置するために、2重forループを回します。
num = 1 #計算式を並べていく for i in range(10): for j in range(2): seed1 = int(random.uniform(1, 20)) seed2 = int(random.uniform(1, 20)) prob = generate_problem(seed1,seed2,num) pdf.drawString(210*(j+1)-100,700-i*80,prob) num += 1 #図の保存 pdf.showPage() pdf.save()
プログラム全体
import random from reportlab.pdfgen import canvas from reportlab.pdfbase.pdfmetrics import registerFont from reportlab.pdfbase.ttfonts import TTFont # フォントを登録 registerFont(TTFont('GenShinGothic', './fonts/GenShinGothic-Monospace-Light.ttf')) #ファイル名の設定 title = '計算テスト' #pdfの下地を準備する pdf = canvas.Canvas(title + '.pdf') pdf.saveState() # フォントを設定 pdf.setFont('GenShinGothic', 25) #タイトルを設定 pdf.drawString(230,780,title) #計算式を作る関数の定義 def generate_problem(a,b,n): s = "({})".format(n) + str(a) + " + " + str(b) + " = " return s num = 1 #計算式を並べていく for i in range(10): for j in range(2): seed1 = int(random.uniform(1, 20)) seed2 = int(random.uniform(1, 20)) prob = generate_problem(seed1,seed2,num) pdf.drawString(210*(j+1)-100,700-i*80,prob) num += 1 #図の保存 pdf.showPage() pdf.save()
以上を実行すると、こんな感じのpdfファイルを作ることができます。
宣伝
ココナラでフリーのライターをやっています。
これまでに280件以上の受注実績があります。
大学入試の小論文、学生・社会人の方のレポートの作成・添削のご相談はこちらまで!
coconala.com
2週間でTOEIC900点を達成する勉強法
2020/9のTOEIC公開テストで900点を取得しました。
そのときの勉強方法を紹介していきます。
想定する読者
ある程度普遍的なことについても書いていますので、誰にとっても参考になるとは思っています。
しかし、特に2週間の勉強だけで900点を目指す場合、以下の能力が最低でも必要です。
・高校レベルの英文法を十分に理解している
・英検準1級レベルの語彙力と長文への耐性を持っている
・英検準1級レベルのリスニングを合格点以上聞き取ることができる
もっと具体的に言うのであれば、
・今TOEICを受けても700点は取れる
・いくらでも時間を掛けていい(聞き直してもいい)なら8割以上得点できる
程度の英語力が必要です。
つまり、本稿は700点レベルの人が短期間で900点に達する方法、と読み替えてもよいでしょう。
もしそこまで達していない方はこちら
(執筆予定)
の勉強法を試して頂ければと思います。
このブログで扱わないこと
本稿では、あくまで勉強方法に的を絞って説明します。
実際の問題の回答の切り方や、先読みなどのテクニックは扱いません。
TOEICを受ける心構え
TOEICにおいて大切なのは全てにおいて、とにかくスピードです。
基本的に、TOEICの問題は時間さえ掛ければある程度得点できるようにできています。
TOEICで700点を取れるのであれば、時間を掛ければ900点以上取ることができます。(逆に、時間を掛けても7割程度の得点率ならば、これから述べる勉強方法でそれ以上の点数を引き出すのはほぼ無理です)
700点は英語力のベンチマークの一つと言えるでしょう。700点が取れないのであれば、文法・語彙・読解力・聴解力のどれかに深刻な問題があります。
まずはそれを直さなければ先には進めません。
使う参考書
今回の勉強方法で使う参考書は、
・中村紳一郎,Susan Anderton 監 ,小林美和,Bradley Towle 著
TOEIC® L&Rテスト精選模試 リスニング3
TOEIC® L&Rテスト精選模試 リスニング3 | 小林美和, Bradley Towle, 中村紳一郎, Susan Anderton |本 | 通販 | Amazon
・中村紳一郎,Susan Anderton 監 ,小林美和,Bradley Towle 著
TOEIC® L&Rテスト精選模試 リーディング3
TOEIC® L&Rテスト精選模試 リーディング3 | 小林美和, Bradley Towle, 中村紳一郎, Susan Anderton |本 | 通販 | Amazon
・公式TOEIC® Listening & Reading 問題集 7
www.amazon.co.jp
だけです。
選定理由
先にも述べましたが、TOEICにおいて大切なのは全てにおいて、とにかくスピードです。
問題形式に慣れることで、本来ならば時間を掛けなければ取れないような得点を、短時間の回答でも取れるようにする必要があります。
精選模試3について
精選模試3はTOEICの本番を想定した問題が5回分収録されています。
この問題集はリスニング・リーディング共に非常に難易度が高いです。
まずリスニングは早くてクセが強く、聞き取りにくいです。内容は複雑で、文章も長いです。part2なんかは特に難しく感じると思います。
リーディングも文章が長い傾向にあり、part7の後半などは全ての文書に目を通さないと回答できません。part5も、本来のTOEICの1.5倍位時間がかかります(私の場合)。
この問題集は、問題形式に慣れること、難易度の高い問題で高地トレーニングをすることを狙いとしています。
5回もやれば小一時間語れるくらいには形式に慣れます。
そして、難易度が高いと言っても、何度も聞き直したり、読み直せば理解できる程度なので、良い負荷になります。
※後ろの方に得点率と実際の点数の対応表がありますが、これは殆ど当てになりません。
公式問題集について
私個人の意見としては、公式問題集は必ずしも必須ではないと考えています。
通常の問題集も、結局公式問題集を参考に作られているので、間接的にそのエッセンスは得ていますし、何より、公式問題集は模試よりも簡単だからです。(あと高い)
公式問題集を使う目的は、本番のナレーションとTOEIC本番のレベル感を感じるくらいです。これだけを何度も解き直すような使い方はしなくてもいいと思います。
勉強方法
私が実際に行った勉強の方法は次の4ステップです。
①問題を2回解く
②解説を読んで解き直し
③散歩する
④音読する
ひとつひとつ解説していきます。
①問題を2回解く(リスニング・リーディング共通)
step1.普通に解く
まず、時間を測りながら普通に問題をときます。
精選模試の場合、制限時間+10分程度であれば許容範囲です。
難しいので、それくらいはどうしてもかかってしまいます。でもOKです。それで何も問題ありません。
このとき、回答の根拠が乏しい問題・よくわからなかった問題には必ず解答用紙にマークを付けてください。(△・☓等)
見直しはしなくても良いです。
step2.丸付け
回答の番号だけを見て丸付けを行います。
step3.とき直し
間違えた問題+回答の根拠が乏しい問題を、制限時間なしで解き直します。
リスニングに関しては、何回聞き直してもOKです。
Step4.丸付け
間違えた問題+回答の根拠が乏しい問題を再度採点します。
ここで間違えた問題に関しては問題集にマークします。
②解説を読んで解き直し(リスニング・リーディング共通)
③散歩する
さて、一番気になるこの項目です。
やることは2つです。
問題を解いてから1時間以上休憩し、
リスニング問題を聞きながら40分程度の散歩に出かける、それだけです。
Step1.休憩
問題を解いてから1時間以上休憩する。
ここまでの勉強で4時間はかかると思います。一気にやってしまいたい気持ちは分かりますが、脳を落ち着かせるためにも休憩しましょう。
また、復習まで時間を置くことで、長期記憶としてスクリプトが脳に保存されます。
英語の試験でどれだけ多くの英語に「見覚えがあるか」の勝負です。見覚えがある英文はそれだけ脳の処理が早くなり、楽に読めます。リスニングでも同じです。聞いたことがある言い回しは脳が早く処理してくれるので、その分考えることにリソースを割けます。
Step2.散歩
リスニング問題を聞きながら40分程度の散歩に出かける。
スクリプトを脳に定着させるために行います。
この散歩があるのと無いのでは結果が相当変わります。
TOEICで700点前後で、そこからなかなか先に行けないという方の多くは、問題を解くスピードが足りていません。
問題を解くスピードを上げるためには、英文を速く処理するのが大切です。
そのために、聞き覚えのある英文として印象づけることで、脳の負荷を軽くし、処理能力をupさせます。
また、このときリスニングを聞きながら、頭の中で設問に答えることも意識してください。
TOEICの場合、問題は紙に書いてありますが、一応声でも読まれます。それに対して脳内で答えます。
といっても難しいことではありません。TOEICのリスニングは設問が簡単なので、例えば「~は誰ですか?」という質問なら紙を見なくても答えられます。
こうすることで、本番でも「答え」の予測力が上がり、設問の先読みの精度も上がります。
わざわざ散歩をする理由ですが、次の2つがあります。
①「ついで感」が良い
散歩の「ついでに」リスニングをやることに意味があります。
日常生活の中でわざわざ椅子に座ってリスニングに集中する、みたいなのって1日の中で2回もできますか?私にはかなりキツいです。まず集中できませんし、眠くもなります。総じて「聞き直す」メリットが失われます。
そこで、散歩をしながらリスニングをやることで、適度に運動に気を紛らわせながらリスニングに取り組むことができます。
歩くだけでは暇です。聞くだけでも暇です。しかし、2つ同時にやると、適度に色々と神経を使うので不思議と集中できるのです。
また、運動とリスニングが同時にできてしまうお得感もあります。これはモチベーションの維持に重要です。
②散歩は脳を活性化させる
適度な運動は脳を活性化させることが知られています。
実際、歩きながらリスニングをすると脳が冴える(気がします。)
個人差はあると思いますが、少なくとも椅子に座って集中するよりも高い学習効果があると私は実感しています。
ですので、例えば洗い物や洗濯などの家事をしながらリスニングをしても同様の効果がある可能性があります。
④音読(リスニングのみ)
最後に音読です。これは寝る前にやりましょう。
本来は全ての問題を音読するのが良いのですが、それだと疲れてモチベーションも下がるので、数を絞り、やり方も簡略化します。(何時間も音読をすると、最後にはグダグダになり、かえって学習効果を下げます)
音読の対象は問題集にマークした問題のみです。即ち、2回間違えた問題だけということです。これらの問題は根本的に聞き取れていないと考えられるので、音読もやって脳に叩き込んでおきましょう。
Step1.リピーティング
音声を流し、スクリプトを読みながら、2~3語遅れて声に出します。
スケジュール
勉強のやり方の概要は述べましたが、2週間で900点を取るためにはこれらを効果的に行う必要があります。
ここからは1日ごとのスケジュールを書いていきます。
1日目
第1回模試のリスニング・リーディングを①~④の手順で行う。
2日目
第1回模試の問題集にマークされた問題だけを解き直す(全問正解を目指す)。
第2回模試のリスニング・リーディングを①~④の手順で行う。
3日目
第2回模試の問題集にマークされた問題だけを解き直す(全問正解を目指す)。
第3回模試のリスニング・リーディングを①~④の手順で行う。
4日目
第3回模試の問題集にマークされた問題だけを解き直す(全問正解を目指す)。
第4回模試のリスニング・リーディングを①~④の手順で行う。
5日目
第4回模試の問題集にマークされた問題だけを解き直す(全問正解を目指す)。
第5回模試のリスニング・リーディングを①~④の手順で行う。
6日目
第5回模試の問題集にマークされた問題だけを解き直す(全問正解を目指す)。
公式問題集1回目のリスニング・リーディングを①~④の手順で行う。
7日目
公式問題集1回目にマークされた問題だけを解き直す(全問正解を目指す)。
問題集・解説につけたマークを全て消す。
第1回模試のリスニング・リーディングを①~④の手順で行う。
8日目
第1回模試の問題集にマークされた問題だけを解き直す(全問正解を目指す)。
第2回模試のリスニング・リーディングを①~④の手順で行う。
9日目
第2回模試の問題集にマークされた問題だけを解き直す(全問正解を目指す)。
第3回模試のリスニング・リーディングを①~④の手順で行う。
10日目
第3回模試の問題集にマークされた問題だけを解き直す(全問正解を目指す)。
第4回模試のリスニング・リーディングを①~④の手順で行う。
11日目
第5回模試の問題集にマークされた問題だけを解き直す(全問正解を目指す)。
公式問題集2回目のリスニング・リーディングを①~④の手順で行う。
12日目
公式問題集2回目にマークされた問題だけを解き直す(全問正解を目指す)。
模試の第1回~第3回までの問題集にマークされた問題をとき直し、手順③・④を行う。このとき、間違えた問題には問題集に分かるように異なるマークを付ける。
13日目
模試の第4回~第5回までの問題集と公式問題集第1回・第2回にマークされた問題をとき直し、手順③・④を行う。このとき、間違えた問題には問題集に分かるように異なるマークを付ける。
14日目
12日目と13日目に間違えた問題をとき直し、手順③・④を行う。
明日が試験なら早めに寝る。
おわりに
これが私が2週間でTOEIC900点を取得したときの勉強方法とスケジュールです。
これだけやれば短期間で200点程度伸ばすことが可能です。
現在の勉強方法やスケジュールにご不安がある方は、DMなどにて勉強方法の相談にも乗っております。
どうぞお気軽にご連絡くださいませ。
Pythonでライフゲーム Gifでアニメ化
ライフゲームとは
ライフゲームとは、生物の栄枯盛衰をシミュレートするモデルです。
まずはどのようなものか、完成品を見てみましょう。
黄色いマスが生物がいるところ、紫の部分はなにもないところです。
シミュレートしてみると、黄色い部分がウヨウヨと動いていることがわかります。
移動したり、その場でとどまったり、特徴的な模様を創り出す場所もあります。
ライフゲームでは、生物は次のようなルールで動いています。
あるマスに生物がいるとき
→もしそのマスの周囲に生物が2・3匹居れば生存
→1匹なら死亡(過疎)
→4匹以上でも死亡(過密)
あるマスに生物がいないとき
→もしそのマスの周囲に生物が2匹以下か4匹以上ならそのまま
→3匹いればそのマスに生物が誕生
このような単純なルールに従っているにも関わらず、全体としては非常に複雑な動きが見られます。
このような、全体の動きが個々の単純な動きにとどまらないようなシステムを「複雑系」と呼びます。
プログラム
Pythonを使ってライフゲームを作っていきます。
ライフゲームを作るに当たり、次のような部品が必要になります。
①シミュレートするフィールドを作る
②シミュレーションを行う
③結果を保存し、gifにする
さて、まずは全体がどのようになっているのか見てみましょう。
#モジュール類 from random import randint import matplotlib.pyplot as plt import numpy as np import os from PIL import Image #シミュレーション結果の出力先 di = "./" pics = di + "pictures/" gif = di + "simulation_results/" #のフォルダ作成 try: os.mkdir(pics) os.mkdir(gif) except: pass #結果を図に起こし、保存 def make_fig(world,t): picsfname = pics + str(t) + ".png" pictitle = "Generation No." + str(t) plt.figure() plt.title(pictitle) plt.imshow(world) plt.savefig(picsfname) plt.close() #自分の周囲8マスを探し、生物の有無を確かめる def serch(world,x,y): #カウンタ c = 0 #探索 for i in range(x-1,x+2): for j in range(y-1,y+2): c += world[i][j] c -= world[x][y] #周囲に3匹入れば生存、2匹ならそのまま、それ以外は死亡 if c == 3: return 1 elif c == 2: return world[x][y] else: return 0 #パラメータ入力 d = int(input("枠の大きさ")) n = int(input("何世代?")) world = [] #フィールドの生成 #生物の初期位置は乱数で決める for i in range(d): tmp = [] for j in range(d): if randint(0,100)%7 == 0: tmp.append(1) else: tmp.append(0) world.append(tmp) #初期状態を記録 make_fig(world,0) #メインループ for t in range(1,n): newworld = [] for i in range(d): tmp = [] for j in range(d): tmp.append(0) newworld.append(tmp) for i in range(1,d-1): for j in range(1,d-1): newworld[i][j] = serch(world,i,j) for i in range(d): for j in range(d): world[i][j] = newworld[i][j] make_fig(world,t) #./picturesに保存した図を繋ぎ合わせてgifにする frames = [] giffname = gif + "simulation.gif" #画像の読み込み for i in range(n): picname = pics + str(i) + ".png" new_frame = Image.open(picname) frames.append(new_frame) #gif化 frames[0].save(giffname, format='GIF', append_images=frames[1:], save_all=True, duration=400, loop=0) print("finished")
モジュール類
from random import randint import matplotlib.pyplot as plt import os from PIL import Image
乱数生成のためのrandom、
図表作成のためのmatplotlib、
ディレクトリ操作のためのos、
gifを作るためのPILをインポートします。
①シミュレートするフィールドを作る
まずどのようなフィールドを作るのか標準入力から受け取ります。
パラメータは枠の大きさと何世代シミュレートするのかです。
#パラメータ入力 d = int(input("枠の大きさ")) n = int(input("何世代?")) world = []
フィールドを生成します。
初期状態の生物の分布は乱数を使って適当に定めます。
乱数を生物の分布を示す0/1に落とし込むため、
横枠の長さ分だけ乱数を発生させ、
次にその乱数が7の倍数なら1を
それ以外なら0を一時変数tmpに代入し、
フィールドを示すリストworldにまとめて格納します。
#フィールドの生成 #生物の初期位置は乱数で決める for i in range(d): tmp = [] for j in range(d): if randint(0,100)%7 == 0: tmp.append(1) else: tmp.append(0) world.append(tmp) 後ほど作る、状態記録のための関数make_figで初期状態を記録します。 #初期状態を記録 make_fig(world,0)
最後にシミュレーション結果の出力もここで設定しておきましょう。
try文で./pictures/というディレクトリがあればそこに画像を保存し、なければ作成します。シミュレーション結果は./simulation_results/に保存します。
#シミュレーション結果の出力先 di = "./" pics = di + "pictures/" gif = di + "simulation_results/" #のフォルダ作成 try: os.mkdir(pics) os.mkdir(gif) except: pass
②シミュレーションを行う
ライフゲームのキモはここです。
まずは
あるマスに生物がいるとき
→もしそのマスの周囲に生物が2匹居れば生存
→3匹ならそのまま
→1匹なら死亡
→4匹以上でも死亡
あるマスに生物がいないとき
→もしそのマスの周囲に生物が2匹以下か4匹以上ならそのまま
→3匹いればそのマスに生物が誕生
というルールを実現するためにマスの周囲を確認し、そのマスの状態をどう遷移させるのか定める関数を作ります。
#自分の周囲8マスを探し、生物の有無を確かめる def serch(world,x,y): #カウンタ c = 0 #探索 forの範囲をこのように定めることで、角に来ても #枠外を探索することがない for i in range(x-1,x+2): for j in range(y-1,y+2): c += world[i][j] #自分自身は探索しない c -= world[x][y] #周囲に3匹入れば生存、2匹ならそのまま、それ以外は死亡 if c == 3: return 1 elif c == 2: return world[x][y] else: return 0
あとはこのルールを全マスに対し、設定した世代だけ回せば完了です。
一世代ごとに状態をmake_figで記録します。
#メインループ for t in range(1,n): newworld = [] for i in range(d): tmp = [] for j in range(d): tmp.append(0) newworld.append(tmp) for i in range(1,d-1): for j in range(1,d-1): newworld[i][j] = serch(world,i,j) for i in range(d): for j in range(d): world[i][j] = newworld[i][j] make_fig(world,t)
③結果を保存し、gifにする
まず結果をmatplotlibで図に起こします。
def make_fig(world,t): #画像の名前を設定します。 #例えば、./pictures/1.png のような名前で保存されます。 #./pictures/はディレクトリ名なので自動的にこの画像は #./pictures/に入ることになります。 #このように連番で名前をつけるのは、分かりやすくする以上に、 #結果が世代でソートされた状態で保存されるため、 #後にgif化しやすいからです。 picsfname = pics + str(t) + ".png" pictitle = "Generation No." + str(t) #枠を生成 plt.figure() #図の上に表示するタイトル plt.title(pictitle) #2次元平面上にプロット plt.imshow(world) #保存 plt.savefig(picsfname) plt.close()
最後に、./pictures/にある画像をまとめて拾ってgif化します。
#画像の在り処を格納するframesリストを作成し frames = [] #シミュレーション結果は./simulation_results/simulation.gif #で保存します。 giffname = gif + "simulation.gif" #for文で画像を次々に読み込みます for i in range(n): picname = pics + str(i) + ".png" new_frame = Image.open(picname) frames.append(new_frame) #それらをまとめてgif化します。 frames[0].save(giffname, format='GIF', append_images=frames[1:], save_all=True, duration=400, loop=0) #プログラムが終了したことを知らせる print("finished")
ここまでを実行すれば、最初のようなgifアニメーションを得ることができます。
宣伝
ココナラでフリーのライターをやっています。
これまでに280件以上の受注実績があります。
大学入試の小論文、学生・社会人の方のレポートの作成・添削のご相談はこちらまで!
coconala.com
HirotoTakedaとは
ココナラでHirotoTakedaという名前でライターをしています。
主なご依頼は小論文やレポートの解答例の作成です。
受験用小論文から、社内レポート・昇進用レポート・大学のレポート、反省文・志望理由書・プログラミングの課題・教科書の問題演習の解答や難しい課題の解説作成まで、幅広いジャンルで執筆しています。
これまでに280件以上のお仕事を頂いております。
これまでにやったお仕事をいくつか抜粋すると…
・早稲田大学、慶應義塾大学等、有名私立の推薦入試・総合型選抜入試の小論文回答例作成・添削、入試現代文の回答例作成
・有名国公立大学、旧帝国大学の推薦・後期・総合型選抜入試の小論文回答例の作成・添削
・早稲田大学・慶應義塾大学を始めとする難関私立大学から、旧帝大~地方国立大学まで、幅広い大学のレポート回答例の作成・添削
・新入社員から中堅~管理職、取締役、役員の方々の社員レポート・昇進用小論文・MBA小論文・社会人入試小論文の回答例作成
希望する大学が小論文試験を課しているが、模範解答がどこにもない…
レポートを書きたいけど、何をどう書けばいいかわからない…
昇進のために小論文を書かなきゃいけないけど、どう書けばいいのか分からない…
教科書の演習問題が解けない…
プログラミング課題が出たけど考え方が分からない…
といった方はぜひご相談くださいませ。