My plot.

イントロクイズの話とか、プログラム関係の備忘録だったり。書きたいことを気が向いたときに書きます。

Spring is here

春ですね。まだまだ寒いし、ってか立春もすぎていなかろうが、私は春休みが来たので春です。 某先輩がブログを毎日更新されているのにも触発され、ここの存在を半分忘れそうになっていたので書くことにしました。

先日、無事卒業論文を上梓しました。結局文語的な文章というのは苦手で、Twitterが私には向いているんだななどと思いながら書いていたり。 4月からは大学院に進学をするわけですが、まだ行き先が決まっていない宙ぶらりんな状態です。決まったら然るべき皆様にはご報告します。

というわけで、春休みにやるべきことをまとめてみよう、という回です。

続きを読む

快適なイントロクイズ出題環境に向けてfoobar2000の整備をしていく

イントロクイズをオンラインで出題しようということで多くの方がfoobar2000を導入いただいているようで、こちらの記事が結構見ていただけているようで。

pgdora56.hateblo.jp

結構、foobar2000での出題が増えてきた中、foobar2000のセッティングで質問をいただくことが増えてきたので、foobar2000のComponentsについてまとめてみようかな、と思っています。

続きを読む

オンラインイントロクイズ出題環境の構築方法についての提案

[2021/7/19追記] 現在はDiscord Audio Stream botを使用する方法が簡単で音質等も良いため主流となっています.こちらのページもご参考になさってください.

pgdora56.hateblo.jp


自分自身への備忘録も兼ねて、オンラインクイズの出題環境構築方法を記載しておきます。Windows環境を想定しています。

全体的に他のサイトに頼りがちです。ごめんなさい。おいおい修正してここだけで完結できるようにします。

オンラインでイントロクイズをしていると、時折解答側の声が返ってきてしまっていることがあると思います。 と、言うのも、私自身自分の声がとても嫌いです。なのでこの現象には割と悩まされていたりします。

そこで、物理的にそれが起こらないような構築をどのように行うか、というのをつらつらと書き記したいと思います。

続きを読む

再開カルテット

数年ぶりにこのブログの存在を思い出したのでなんとなく再開しようかなと思ったり。

ただ数年前とは状況があまりに違って。まず大学進学もしたし、イントロクイズに出会ったのもその後。書く内容はきっと変わっていくんだろうな。 昔の記事を見返しながら、「あ~~クソ雑魚技術野郎だなぁ~」なんて思ったりしてた。まあ今もそんなに高いわけではないから……

技術的な話は引き続き書きたい。Qiitaの事件もあったし、よく考えるとブログのほうが好きに書けるし。まあまあ上手く使っていきたいな。

イントロの話なら入手した音源のことは書いて行きたさ。新譜の話が主ですかね。

あとはBOOTHを始めた。有料で売る気はあんまりなくて、自分の制作物を配布する場所として、GithubのReleaseだと慣れてない人がむずめなので、そういう意味でBOOTHを活用させてもらいたい。

Dora's Sail - BOOTH

そんな感じでいい感じに使っていこう、などと。 コロナのせいでだいぶ暇だし。

タイトルは最近『異世界かるてっと』を見ているため。曲は聴いてるけど見てなかったので…原作全部知らないけど、とりあえず楽しめています。

C# Programmer meets Python

最近、Python(3.x)なんかを触ったりしていたのですが、少し変わった言語だな~~と思ったので、C#プログラマ視点からいくつか特徴的な点を紹介してみようかなと思います。

いくつかの他言語(C#,Java等々)からPython使おうとしてる方は多少参考になるかもしれません、

ただし、私はC#大好きです

そのため、多少否定的になってしまうかもしれませんが、それはご愛嬌ということで。


Python 2.x系は微妙に内容が違いますので、そちらをこれから学ぶ、という方は十分にご注意ください。

全体像として

とりあえずHello, World.の比較。

using System;

namespace sample
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine("Hello, World!");
    }
  }
}


print("Hello, World!")

C#、圧倒的敗北感。

やはりというかなんというか。スマートさではPythonには叶いません。そりゃそうだよ。

かくいう私もpaizaなんかで簡単なコードサクサクやるときはPythonですし。


変数定義

int i = 100;

string player = "SHIZUKA MOGAMI";

bool flag = true;


i = 100

player = "SHIZUKA MOGAMI"

flag = True

型明示しなくていいのか~~なんか気持ち悪いな~~

と私は思ってしまいました。ちなみにC++大好きな先輩にも意見を求めたところ同じ感じでした。

もっとも暗黙的に型宣言してるだけで、型の概念はあります。当たり前です。
初めて入る人にはいいかもしれませんが、ここから明示的な言語に移る時、ちょっと大変な気もしなくもない。まあこの程度ならすぐ慣れますかね~~


条件分岐(=if)

とりあえず簡単に、合格点かどうかなんかを判断させてみます。

int score = 20;

if(score == 100)
{
  Console.WriteLine("満点です!すばらしい!");
}
else if(score >= 80)
{
  Console.WriteLine("合格です。");
}
else
{
  Console.WriteLine("不合格です。");
}


score = 20;

if score == 100:
  print("満点です!すばらしい!")
elif score >= 80:
  print("合格です。")
else:
  print("不合格です。")

括弧で囲わないのか…と、少し最初見にくかったりはしましたが、そこはだんだん慣れてコロン1個が楽になってきました。

そんなことよりelifって。少しは略されたseの気持ちも考えてやれよ!!

はい、茶番です。大体の言語でelse ifのままで略されませんから、少し不思議ではありますよね。


繰り返し構造(=for?)

forの後ろに?がついてるのに気づいた非Pythonプログラマの皆さん。よくぞ気づかれた。

なぜならPythonのforは他言語だとforeach1に当たるのです!!

「おいおい、for使いにくすぎやん!!」

と思われた方、私もそう思いました。

とりあえず "一般的なfor" を使おうとする場面を考えましょう。

for(int i=0;i<10;i++)
{
  Console.WriteLine(i);
}


for i in range(10):
  print(i)

「あれ、思ったより変じゃないのでは?」

ポイントはこのrangeという関数。

これは引数を1つあるいは2つ取りますが、それにより以下のような挙動をします。

list1 = range(5)
# ここでlist1には [0,1,2,3,4] というリスト(配列と似たもの)が代入されるイメージ(正確には違う)

list2 = range(-5,3)
# ここでlist2には [-5,-4,-3,-2,-1,0,1,2] というリストが代入されるイメージ(正確には違う)

つまり、rangeは整数の配列を作る関数と捉えてもらえれば問題ありません2。これをPythonfor(=foreach)と併用したら…

とても強力なのは言うまでもありません。この関数があるため、foreachforを一本化しても問題ないのでしょう。

では、普段のforeachのように使ったときを見てみましょう。

string[] cities = new string[]{"Yokohama", "Nagoya", "Osaka", "Hakata" };
foreach(string c in cities)
{
  Console.WriteLine(c);
}

// (以下出力される値)
// Yokohama
// Nagoya
// Osaka
// Hakata


cities = ["Yokohama", "Nagoya", "Osaka", "Hakata"}
for c in cities:
  print(c)

# (以下出力される値)
# Yokohama
# Nagoya
# Osaka
# Hakata

一つの関数で両方できるのは分かりやすかったりするのかな―と思ったり思わなかったり。他言語やってからやると、慣れれば難しいことはなかったです。

Pythonからプログラミングを始めた方は他をやろうとしたときに「うわっこれいちいち2個に分けてんのかよめんどくさ」とか思うんでしょうかね…

まとめ

とりあえず私がやっていて結構違うな、と思ったところを数点あげてみましたが、とにかくPythonは書きやすいです。

思い立ったらサラッと書ける。

でもやっぱりC#のほうが得意なことはあるわけで……上手に使い分けていければいいんだろうなーということです。どの言語にも言えることですが。

あ、turtleのことを書き損ねた。実用性はどうなのか分かりませんが、手軽にグラフィックが扱えるモジュールのturtleってのがあるので、興味がある方はどうぞ調べてみてください。気が向いたら取り上げます。

そういえばあんまり否定的にならなかったなー(o・∇・o)


  1. (ご存じない方向けの簡単な解説)配列などを指定し、その配列各要素に一度ずつある処理を行わせる、forの姉妹のようなものです。C#の例は繰り返し構造後半で提示するプログラムを参照ください。

  2. range関数、実際にprintしてみるとリストは出ないで、range(10)的なのがそのまま出るんですよね。内部的には遅延評価みたいにしてるんだろうか?その辺は勉強不足。まあ使う上ではリストだと思って使えばほぼ問題ないでしょう。