乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

プログラミング

はいどうも乙pyです

今回は
プログラミング初学者が押さえておくべき

プログラム言語の流行として

Githubというサービスが昨年公開した
プルリクエストの
プログラム言語ランキングを
お送りしたいと思います。

ちなみにプルリクエストとは
Githubで開発している開発者が
プログラムを修正しましたぜ!!
っていうのを知らせることです。

このリスエスト数を追うことで
世の中のプログラム言語の流行が分かるというわけです。


動画はこちら



さて早速10位から4位までを発表です。

10位 : Ruby
09位 : C言語
08位 : Bash Shell
07位 : TypeScript
06位 : C#
05位 : C++
04位 : PHP

10-4位までを見てみると
C系は多く入っていますね。

やはりCはプログラムの基本的な言語という位置づけで
必ず10位には入ってきます。

ゲーム開発では
UnityがC#
UnrealEngineがC++なので
スマホアプリの開発には
欠かせ無いものになって来ています。

自分も転職のために
一時期Unityでクソゲー開発に邁進していた時期があり
C#をガリガリ書いていました。


RubyやPHPは
WEBサイトを作るのに
人気のある言語で日本でも多くの会社で
採用されています。

開発者であればLinuxなどのサーバーで
作業をすることも多いと思うので
Bash Shellも当然使っているはずなので
ランキングに入って来ています。


さてここからはトップ3です!!!



03位 : Python
プルリクランキング.009

Pythonは近年での人気が急上昇している言語です。

特に機会学習やAI開発では
この言語の学習者がほとんどで
学んでいないエンジニアがいないです。

他にもWEBサイトやブロックチェーンなどの
アプリケーションを作ることもできるので
初めて学ぶには最適な言語かなと思っています。

こちらで無料講座も開いておりますので
ご参考にしていただければと思います。

Python講座はこちら


02位 : Java
プルリクランキング.010

昔から人気があり
幅広いエンジニアが採用している言語の一つです。

C,Python,JavaはGoogle三大プログラム言語なので
ここを押さえておくのは必須だろうと思います。

近年ではAndroid開発で多く用いられているので
2位に食い込んでいるのかなと思いました。

そして
栄えある流行トップの言語は・・・


01位 : JavaScript
プルリクランキング.011


Javascriptが去年の人気1位だったようです。

ちなみに2位のJavaとは響きは似ていますが
似て非なる言語です。

インドとインドネシア位違う言語です。
なぜこんな名称にしてしまったのだろうか・・・


WEBサイトでは
必ずJavascriptが動きますし
インターネットの世界では外すことの出来ない言語ですね。

近年ではNode.jsなどでサーバー側でも動きますし
Reactなどのフレームワークを用いた開発も盛んで
フロントエンドの開発と言えば
Javascript一択です。

自分はサーバーサイドの言語がメインであるので
UI開発はそこまでやりませんが
簡単なコードを書いたりは出来ます。

3つ巴オセロのコードは
Javascriptで作りましたし

中堅のエンジニアであれば
大体の人は押さえているのでは無いかと
思います。


さて
これからプログラミングを学ぼうと思っている人は
どうやってプログラム言語を選べば良いのでしょうか?

まずは
目的を決めることですね。

何をやりたいかで
学ぶべき言語を決めるのが
良いのではないでしょうか。

あくまでも
プログラム言語は
目的を達成するための手段であって
ただの道具にしか過ぎません。

ですので迷うのであれば
言語は目的を持って決めれば良いのです。


ざっくりと
目的別でプログラム言語を分類してみると

ゲーム開発なら
UnityがC#
UnrealEngineがC++

WEBサイト(WEBアプリ)開発なら
Javascript , PHP , Java , Python

アンドロイド開発とビッグデータ周り
Java

AI , 機会学習なら
Python一択です。



特に目的がなく
なんとなくプログラミングを覚えたい方であれば
PythonかJavaをお勧めします。

Rubyはあまりお勧めしません。
言語別の求人を見ても
求人が少ないからです。


Javascriptは
あとあと必然的に覚えることになるかと
思うので最初に選ばなくても
いずれはやることになるかと思います。

自分はこの言語ランキングのうち
RubyとTypeScriptをのぞいた
8つの言語に触れたことがありますが

メインで使っているのは
現在はPythonです。

自分がプログラミングを始めた時は
Javaを学んでいました。

それでJavaならある程度なんでも
書ける所までやり、
その後Pythonに移行しました。

まずはメインで書ける言語があると
他の言語への移行はスムーズに進みます。

基礎が出来ていれば
他のプログラム言語の
学習コストが大幅に下がるため
まずは一つなんでもできる言語を
身に付けるのがいいかと思います。

一番驚いたのは
Pythonはコードを書く量が
圧倒的に少なくなるので
コードを追いやすく
初学者にはとても向いているのでは
ないかと思っています。

Javaと同じコードを書いても
10から3分の1程度のコード量で済むのと
学習コストが圧倒的に少なかったです。

求人で見るとPythonの求人は
玄人向けの求人が多いので
その点ではJavaに劣るかもしれませんが

どのみちエンジニアであれば
複数の言語は使えて当たり前かと思うので
今ある仕事を変えたい方は
その目的に合った言語を学ぶのがいいかと思います。


ということで
こういった言語の流行を押さえておくと
これからプログラミングを学びたい方の
プログラム言語の選択に一役買うのでは
無いかと思います。

参考になれば幸いです。

それでは

はい

先日TBSで放送されていた
「水曜日のダウンタウン」

こちらで放送されていた説
「三つ巴対決そこそこ盛り上がる説」


これに出てきてた
三つ巴オセロをJavascriptで再現してみました

解説動画はこちら



さて
ここではHTML , Javascript , CSSを用いて
オセロゲームを再現しています。

黒白赤のターン制でボードは8x8マス
自分の色以外の色であれば
ひっくり返すことができることとしました。


最初の配置は
番組内で用いられていた配置を採用しています。

スクリーンショット 2019-03-21 14.27.48

これは3つは並べておかないと
黒白のターンで赤が全て潰されてしまうからです。

初手で黒が赤白を挟みにゆくと

スクリーンショット 2019-03-21 14.28.29

こうなります。

黒を置いた時に
間のコマが赤か白であれば
ひっくり返せるようなアルゴリズムです。

続けて行くと
スクリーンショット 2019-03-21 14.28.39

こんな感じで埋まって行き

スクリーンショット 2019-03-21 14.28.53

最後はこうなりました。

どう端を取るか
どう取らせるか

3人対戦だと
ここら辺を考えるのが
だいぶ面白くなりますね

通常のオセロよりも
盛り上がるかもと思ってみたり。

もしかしたら
9x9マスとか増やしたほうが
良いのかもしれません。


パスをどうするとか
レギュレーションをどうするかとか
ルール決めが
三つ巴オセロゲームを面白くするための
重要項目になりますね。

4人対戦とか
長方形や星型、いびつな形でのボード
2人組みでチーム対戦できるとか
(黒白 , 青赤で相手チームの色をひっくり返せる)
Hexボードとか・・・


既存のゲームでも
少し改造してやることで
全く違ったゲームになり
遊びの幅が広がりますね。

もし何か
改造して欲しい、検証して欲しい
ゲームなどがあればTwitterやYotube他
コメントいただけると幸いです。

ソースコードも
希望があればお送りしたいと思いますので
コメントよろしくお願いいたします。

それでは!!





画像処理のプログラムを書いていたら
画像にモザイクをかけるのが
楽しすぎて遊んでしまいました。

解説動画はこちら



モザイクイーーズ!!!



第1問
この画像は誰でしょうか?



moza1


第2問
moza2


第3問
moza3


分かる人には
わかっちゃうかもしれないですね

答えは
動画をご覧くださいませ。

モザイクをかける
コードはこちら
from PIL import Image, ImageFilter
from ipywidgets import interact, FloatSlider, IntSlider
%matplotlib inline

def mozaic(im,i=1,b=4):
    img = im.resize([x // i for x in im.size]).resize(im.size)
    img = img.filter(ImageFilter.GaussianBlur(b))
    return img.resize([x // i for x in img.size]).resize(img.size)

blur_rate = FloatSlider(min=0.1, max=5.0, step=0.1, value=5)
mosaic_pixel = IntSlider(min=1 , max=50,step=1,value=50)

@interact(mosaic_pixel=mosaic_pixel,blur_rate=blur_rate)
def plot(mosaic_pixel,blur_rate):
    im = Image.open('画像のパス')
    im = mozaic(im,mosaic_pixel,blur_rate)
    return im

JupyterNotebookに貼り付けて
画像のパスを入力して
実行すると
スライダーウィジェットと
モザイク画像が出ます。


mosaic_pixel
20
blur_rate
5.00

あとはスライダーで
mosaic_pixel(モザイクの粒度,ピクセル数)と
blur_rate(ブラー,ぼかしの強さ)を
変えると・・・

画像のモザイクの粒度を1ピクセルに向かって小さくすれば
モザイクイズできます。
ブラーはモザイクが強いと効果ないですので
モザイク小さくして頂くと変化してきます。

面白いので
試してみてください。

それでは

またまた数字のトリビアです

解説動画はこちら



まず最初のトリビアは
数字のトリビア.016


一人につき50人の知り合いがいるとして
それを6人まで巡ると地球の人口を超えるというものです。

50を人数の数だけ掛け合わせれば答えが出ます。

コードは
p = 50
for i in range(1,7):
    print('{0: 12}'.format(p ** i))
50
2500
125000
6250000
312500000
15625000000

はい見事に150億となり地球の70億人を越えました。
30人の知り合いでも7億となり日本の人口を越えます。

前に
「水曜日のダウンタウン」で
明石家さんまさんの知り合いそうな人に手紙を送り、
それを繰り返すことで何人たどればさんまさんにたどり着けるかを
検証した際は7人くらいだと思いました。

友達の友達は・・・
を6人繰り返せば
世界中の人と繋がる可能性があるわけです。

これを6次元の隔たりと言うとか言わないとか。
あのGREE社の語源ですね。

お次は
数字のトリビア.017

ちょっとロマンティックな関数が有ります。

それをPythonで再現します。

数学の方の関数を描画するのに
Sympyというのを使います。

from sympy.plotting import plot_parametric
from sympy import Symbol , cos ,sin

def draw_heart():
    t = Symbol('t')
    x = 16 * sin(t) ** 3
    y = 13 * cos(t) -5 * cos(2 * t) -2 * cos(3 * t) - cos(4 * t)
    plot_parametric(x,y,autoscale=True , title='heart' , show=False).show()

draw_heart()

結果は:
heart

なかなか綺麗なハートになりますね。
Sympyは数学的な計算を描画させたりできるので
高校生とかにはちょうどいいかもしれません。


お次は
数字のトリビア.018

平方数
その数値を掛け合わした結果と
その数値の個数,1からの奇数を足した結果が同じになります。

コードは
for i in range(1,21):
    print('{0:02} ** 2'.format(i) , i ** 2)
s = [a for a in range(1,1000,2)]
for i in range(1,21):
    print(i,sum(s[0:i]))

どちらとも同じ結果になります。

1 1  1
2 4  1+3
3 9  1+3+5
4 16 1+3+5+7
5 25 1+3+5+7+9

不思議ですね。
こんな法則があるんです。

はい、次は
数字のトリビア.019

なんとも不思議な計算結果ですね

コードは
for i in range(1,11):
    res = 49 ** i
    print('{0:017}'.format(res) , str(res)[len(str(res))-2:])

結果は:
00000000000000049 49
00000000000002401 01
00000000000117649 49
00000000005764801 01
00000000282475249 49
00000013841287201 01
00000678223072849 49
00033232930569601 01
01628413597910449 49
79792266297612001 01

1から10乗までかけてみました。

確かに奇数乗は末尾が49
偶数乗は末尾が01になりますね。

これを発見した人
相当暇人なんだろうなーと思うトリビアですね。

最後のトリビアは
数字のトリビア.020

単に365回101%かけ続けるだけですが
プログラムなら一瞬です。
1.01 ** 365
37.78343433288728

1日1%成長できるとすると
1年後には約38%成長できることになります。
R天のM谷さんが言っていたとか言わないとか。

ライバルは「昨日の自分」
これを常に心がけたいものです。

今回のトリビアはここまでです。

非常に役に立た無いプログラムを作ってみました。

何処かで架空の国旗を作った
みたいな話が出ていたので
自分も架空の国旗作りに挑戦してみました。

解説動画はこちら




コードはこちら
from PIL import Image, ImageDraw, ImageFont
import matplotlib.pyplot as plt
import numpy as np
import random
%matplotlib inline

size  = (320, 180)
c,o = (0,64,128,192,255) , (32,96,160,224)
colors = [(r,g,b) for r in c for g in c for b in c]
ol_colors = [(r,g,b) for r in o for g in o for b in o]
base_color = random.choice(colors)

def base():
    im =  Image.new('RGB',size)
    target = random.randint(1,6)
    # 配色
    rgb = (random.choice(colors),random.choice(colors),random.choice(colors))
    # べた塗り
    if target ==1:
        [im.putpixel((x,y),rgb[0]) for x in range(size[0]) for y in range(size[1])]
    # 縦半分
    elif target ==2:
        [im.putpixel((x,y),rgb[0]) for x in range(0,size[0]//2) for y in range(size[1])]
        [im.putpixel((x,y),rgb[1]) for x in range(size[0]//2,size[0]) for y in range(size[1])]
    # 横半分
    elif target ==3:
        [im.putpixel((x,y),rgb[0]) for x in range(size[0]) for y in range(0,size[1]//2)]
        [im.putpixel((x,y),rgb[1]) for x in range(size[0]) for y in range(size[1]//2,size[1])]
    # 縦3分
    elif target ==4:
        [im.putpixel((x,y),rgb[0]) for x in range(0,size[0]//3) for y in range(size[1])]
        [im.putpixel((x,y),rgb[1]) for x in range(size[0]//3,size[0]//3*2) for y in range(size[1])]
        [im.putpixel((x,y),rgb[2]) for x in range(size[0]//3*2,size[0]) for y in range(size[1])]
    # 横3分
    elif target ==5:
        [im.putpixel((x,y),rgb[0]) for x in range(size[0]) for y in range(0,size[1]//3)]
        [im.putpixel((x,y),rgb[1]) for x in range(size[0]) for y in range(size[1]//3,size[1]//3*2)]
        [im.putpixel((x,y),rgb[2]) for x in range(size[0]) for y in range(size[1]//3*2,size[1])]
    # 4ブロック
    elif target ==2:
        [im.putpixel((x,y),rgb[0]) for x in range(0,size[0]//2) for y in range(0,size[1]//2)]
        [im.putpixel((x,y),rgb[1]) for x in range(size[0]//2,size[0]) for y in range(0,size[1]//2)]
        [im.putpixel((x,y),rgb[1]) for x in range(0,size[0]//2) for y in range(size[1]//2,size[1])]
        [im.putpixel((x,y),rgb[0]) for x in range(size[0]//2,size[0]) for y in range(size[1]//2,size[1])]
    # 9ブロック
    elif target ==6:
        [im.putpixel((x,y),rgb[0]) for x in range(0,size[0]//3) for y in range(0,size[1]//3)]
        [im.putpixel((x,y),rgb[1]) for x in range(size[0]//3,size[0]//3*2) for y in range(0,size[1]//3)]
        [im.putpixel((x,y),rgb[2]) for x in range(size[0]//3*2,size[0]) for y in range(0,size[1]//3)]
        [im.putpixel((x,y),rgb[1]) for x in range(0,size[0]//3) for y in range(size[1]//3,size[1]//3*2)]
        [im.putpixel((x,y),rgb[2]) for x in range(size[0]//3,size[0]//3*2) for y in range(size[1]//3,size[1]//3*2)]
        [im.putpixel((x,y),rgb[0]) for x in range(size[0]//3*2,size[0]) for y in range(size[1]//3,size[1]//3*2)]
        [im.putpixel((x,y),rgb[2]) for x in range(0,size[0]//3) for y in range(size[1]//3*2,size[1])]
        [im.putpixel((x,y),rgb[0]) for x in range(size[0]//3,size[0]//3*2) for y in range(size[1]//3*2,size[1])]
        [im.putpixel((x,y),rgb[1]) for x in range(size[0]//3*2,size[0]) for y in range(size[1]//3*2,size[1])]
    return im

def overlay():
    im_ol = Image.new('RGB',size,(100,100,100))
    target = random.randint(1,9)
    # 配色
    rgb = (random.choice(ol_colors),random.choice(ol_colors),random.choice(ol_colors))
    for x in range(size[0]):
        for y in range(size[1]):
            # 十字
            if target ==1:
                if (x >= size[0]//7*3 and x <= size[0]//7*4) or (y >= size[1]//5*2 and y <= size[1]//5*2+size[0]//7) :
                    im_ol.putpixel((x,y),rgb[0])
            # 左斜め
            elif target ==2:
                if (x >= y*size[0]//size[1] and x <= y*size[0]//size[1] + size[1]//4) :
                    im_ol.putpixel((x,y),rgb[0])
            # 右斜め
            elif target ==3:
                if (x >= size[0] - size[1]//4  - y*size[0]//size[1] and x <= size[0] - y*size[0]//size[1]) :
                    im_ol.putpixel((x,y),rgb[0])
            # クロス
            elif target ==4:
                if (x >= y*size[0]//size[1] and x <= y*size[0]//size[1] + size[1]//4)  or (x >= size[0] - size[1]//4  - y*size[0]//size[1] and x <= size[0] - y*size[0]//size[1]):
                    im_ol.putpixel((x,y),rgb[0])
            # なし
            elif target ==5:
                pass
            # 左三角
            elif target ==6:
                if (x=size[1]//2):
                    im_ol.putpixel((x,y),rgb[0])
            # ダイヤ
            elif target ==7:
                if (x >= (size[0]  - y*size[0]//size[1]) - size[0]//2 and x<= size[0]//2  + (y*size[0]//size[1])  and y<=size[1]//2):
                    im_ol.putpixel((x,y),rgb[0])
                if ( x >= y*size[0]//size[1]-size[0]//2 and x<= size[0] -(y*size[0]//size[1]-size[0]//2)  and y>=size[1]//2):
                    im_ol.putpixel((x,y),rgb[0])
            # ずれ十字
            if target ==8:
                if (x >= size[0]//7*1 and x <= size[0]//7*2) or (y >= size[1]//5*1 and y <= size[1]//5*1+size[0]//7) :
                    im_ol.putpixel((x,y),rgb[0])
            # 左上
            if target ==9:
                if (x >= 0 and x <= size[0]//3)  and   (y >= 0 and y <= size[1]//2):
                    im_ol.putpixel((x,y),rgb[0])
    if random.choice([True,False,False,False,False,False,False,False]):
        im_ol = Image.new('RGB',size,(100,100,100))
        draw = ImageDraw.Draw(im_ol)
        e_size = max(size)//3
        x1,y1 = (size[0]-e_size)//2 , (size[1]-e_size)//2
        x2,y2 = size[0]-(size[0]-e_size)//2 , size[1]-(size[1]-e_size)//2
        draw.ellipse((x1,y1,x2,y2), fill=rgb[0], outline=rgb[0])
    return im_ol

def simbol():
    rgb = (random.choice(ol_colors),random.choice(ol_colors),random.choice(ol_colors))
    s_size,gray = (size[0]//3,size[1]//2),(100,100,100)
    im_si = Image.new('RGB',s_size,gray)
    draw = ImageDraw.Draw(im_si)
    target = random.randint(1,8)
    if target==1:
        draw.ellipse((0,0,s_size[0],s_size[1]), fill=rgb[0], outline=rgb[0])
        draw.ellipse((30,10,s_size[0],s_size[1]-10), fill=gray, outline=gray)
    elif target ==2:
        draw.ellipse((0,0,s_size[0],s_size[1]), fill=rgb[0], outline=rgb[0])
        draw.ellipse((15,15,s_size[0]-15,s_size[1]-15), fill=gray, outline=gray)
    elif target==3:
        draw.ellipse((0,0,s_size[0],s_size[1]), fill=rgb[0], outline=rgb[0])
        draw.ellipse((0,10,s_size[0]-30,s_size[1]-10), fill=gray, outline=gray)
    elif target==4:
        draw.pieslice((0, 0, s_size[0],s_size[1]), start=     0, end=  60, fill=rgb[0], outline=gray)
        draw.pieslice((0, 0, s_size[0],s_size[1]), start=120, end=180, fill=rgb[0], outline=gray)
        draw.pieslice((0, 0, s_size[0],s_size[1]), start=240, end=300, fill=rgb[0], outline=gray)
    elif target ==5:
        draw.pieslice((0, 0, s_size[0],s_size[1]), start=30, end=150, fill=rgb[0], outline=gray)
        draw.pieslice((0, 0, s_size[0],s_size[1]), start=210, end= 330, fill=rgb[0], outline=gray)
    elif target ==6:
        for x in [i*60+15 for i in range(6)]:
            draw.pieslice((0, 0, s_size[0],s_size[1]), start=x, end=x+30, fill=rgb[0], outline=gray)
    elif target ==7:
        for x in [i*45 for i in range(8)]:
            draw.pieslice((0, 0, s_size[0],s_size[1]), start=x+15, end=x+30, fill=rgb[0], outline=gray)
    elif target ==7:
        pass
    if random.choice([True,False,False,False,False]):
        draw.pieslice((20, 20, s_size[0]-20,s_size[1]-20), start=     0, end= 360, fill=rgb[0])
    return im_si

# 実行部
im_base = base()
im_ol = overlay()
im_si = simbol()
si_x , si_y = im_si.size[0],im_si.size[1]
s_size = (size[0]//3,size[1]//2)
for x in range(size[0]):
    for y in range(size[1]):
        r,g,b = im_ol.getpixel((x,y))
        if all([r!=100,g!=100,b!=100]):
            im_base.putpixel((x,y),(r,g,b))

for x in range(s_size[0]):
    for y in range(s_size[1]):
        r,g,b = im_si.getpixel((x,y))
        if all([r!=100,g!=100,b!=100]):
            im_base.putpixel((x,y),(r,g,b))

file_name = 'fictional_flag.png'
im_base.save(file_name)

使い方は簡単
コードをJupyter Notebookにコピーして
実行するだけ

ランダムで架空の国旗pngファイルを生成します。

簡単に説明すると
base画像をPILで作ります。
この時点で何色かに色分けされた画像ができます。

そこにoverlayで画像を付け足します。
十字とか、斜め線が入ったりします。
最後にsimbolでシンボルマークを付け足して出来上がり。

シンボルはnumpyとImageDrawを使っていろいろやっています。
円を特定の角度分だけ塗ったりすれば
ピザのスライスになり
そこに円を足せば雪マークになったりしますね。


flag


シンボルが左上にしか描画していなかったり、
パターンが少なかったりで
全部のパターンを把握していませんが
まあまあの組み合わせになるんではないでしょうか?

1ピクセルづつ色を塗っているだけの
単純なプログラムで
複雑な形を表現できていないです。

も少しスマートに描く方法は
ないものだろうか・・・

片手間では
この程度でしょうか。


このページのトップヘ