Python tutorial(前編)

みなさんおはようございます。
この記事はこちらの続きとなっております。

はじめに

というわけで、前回の記事で構築した実行環境を使いながら、Python tutorialを進めてみました。
内容としては比較的経験や知識の多いRubyなどと比べたりしながら、個人的に思ったことなどをまとめています。

ただ、触ってるうちに「これ実際にアプリケーション作る方向に倒した方が良いんじゃね」と思ってしまい、7章以降はざっと流し読みした程度になっています。

タイトルが「前編」となっているのはそのためですが、後編の更新予定は今のところありません。今後にご期待ください。

触りながら思ったことなど

ここからは実際に動かしながら思ったことをまとめていきます。

文字列が不変

Pythonでは一度変数に代入された文字列を編集することが出来ないそうです。

>>> word = "Python"
>>> word[2] = "a"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

新たな文字列が必要な場合は新たな変数を用意する必要があるそう。
確かにそういうコードは汚れがちなので、仕様としてはわりと助かるのかな。

長さチェックの関数

長さチェックの関数は len()。しかし word.len() ではなく len(word)

>>> word = "Python"
>>> word.len()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'len'

>>> len(word)
6

どうやら len() は組み込み関数らしい。rubyだとArrayやらStringやらがそれぞれ size とか持ってたので、このあたりには設計思想の違いがありそうな気配がする。

index付きのループ

Rubyで言うeach_with_index はちょっとスッキリしそう。
とは言っても、Railsやってるとそもそもそんなに使わないのはweb開発だからかな。
Pythonは数学的な使われ方が多いそうなので、そうなるとこういうのよく使うんだろうか。

 a = ["Mary", "had", "a", "little", "lamb"]
for i in range(len(a)):
  print(i, a[i])

------- 出力結果 --------
0 Mary
1 had
2 a
3 little
4 lamb

pass

Pythonでは空のクラスや変数を作ることが出来ないらしく、何がしか書かなければいけない時には pass文 なるものを置いておけるそうな。

>>> class MyEmptyClass:
...     pass
...

また、こっちの使い道は開発してる時にめっちゃ使えそう。

pass のもう 1 つの使い道は、新しいコードを書いているときの関数や条件文の仮置きの本体としてです。こうすることで、より抽象的なレベルで考え続けられます。 pass は何事も無く無視されます

>>> def initlog(*args):
...     pass   # Remember to implement this!
...

関数の代入

関数をオブジェクトとして変数に代入できるのは少しjsチックな感じ

>>> fib  # フィボナッチ数列を求める関数
<function fib at 10042ed0>
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89

引数のデフォルト値

引数のデフォルト値は一回しか評価されないらしい。
下記みたいな感じで関数内で引数への再代入とかやるとやばそうなんだけど、どうやって折り合いつけているのだろう。

def f(a, L=[]):
    L.append(a)
    return L

print(f(1))
print(f(2))
print(f(3))

----------------
[1]
[1, 2]
[1, 2, 3]

moduleの定義方法

rubyで必要だったような module Hoge という構文はいらないっぽい。
メソッド群を書いたファイル名がそのままモジュール名になる感じか。

まとめ

ざっと大まかにこんな感じです。
他にもコメントの書き方の文化とか気になったところもあったりしました。
なんとなく構文の雰囲気とかは掴めたので、次回は少しアプリケーションを作る方向にチャレンジしていきたいな〜と思っています。

Pythonの実行環境を構築してみた

みなさんこんばんは。
私事で恐縮ですが、昨日iQOSを失くしてしまい、とても落ち込んでいます。
どこに置いてきてしまったか定かではないのですが、もし見つけた方は宇賀神までご一報をお願い致します。

はじめに

告知も終わったので本題に。
今週は少ししか勉強時間が取れなかったものの、Python tutorialなるものをやってみたので、そのレポートという感じです。

実行環境構築の手順をまとめていたらそれなりのボリュームになってしまったので、実際にやってみての話は別にまとめようと思います。

どうしてPythonやったんすか

自分の中で触ったことのある言語の幅をもう少し広げたいとは前々から思っていまして。
名前をよく聞く言語の中からとりあえずなんとなくで選んでみました。

とはいえPythonに限らず、言語触ってみたシリーズはこれから色々とやっていきたいなぁと思っております。

本編

というわけで、Pythonの実行環境を作るところから始めました。
tutorialの文章を見る限り、バージョンは3.7が推奨されているようだったので、まずはそちらのインストールから。

とりあえずMacにデフォルトで入っているバージョンを確認

$ python --version
Python 2.7.10

全然足りん。
というわけで、こちらの記事を参考にインストールを進める。

$ brew install pyenv
----------- 中略 -------------
$ pyenv install 3.7.2

pyenvと言うものがあるらしい。名前からして rbenv みたいなものかと思ったら合ってた。
2行目の pyenv install コマンドを実行したところコケた。 can't decompress data; zlib not available とのこと。エラーメッセージでググってみるとこちらの記事 がヒット。

xcode-selectの最新バージョン(2354)にMojave用のmacOS SDK headerがデフォルトで入っていないのが原因のようです。

とのことです。
下記のコマンドを打って無事解決。

$ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

インストールも完了したので、バージョンを切り替えてみる

$ pyenv global 3.7.2
$ python --version
Python 2.7.10

…あれ?
おかしいなぁと思って最初の記事を見返しても抜けた手順はなさそう。
エラーが起きた様子も特にないので、インストール自体は正常にできていそう。
rbenvのときにやる手順を思い返したところで気づく。

…パス通してなくない?

rbenv と違って pyenv にはいらないのかと一瞬思ったが、調べてみるとそうではなさそう。
というわけで、.zshrc に以下の記述を追加。

export PATH="$PYENV_ROOT/bin:$PATH"
export PYENV_ROOT="$HOME/.pyenv"
eval "$(pyenv init -)"
$ python --version
Python 3.7.2

これでok。無事に準備が整いました。

まとめ

というわけで、Pythonの実行環境が整理できました。
まったく触ったことなかった言語だけど、rubyの経験が活きた場面もあって少し嬉しかったり。
tutorialの内容は次の記事にまとめます〜〜

rubyでサウンドファイル(mp3)を再生する

こんばんは、宇賀神です。
先日gemを作って記事にしたのですが、その時に詰まった事をせっかくなのでまた記事のネタにしようと思います。

何で詰まったんですか

pomodorokun という、25分と5分を延々とカウントダウンするgemを作ったのですが、ラスト5秒くらいで「パ、パ、パ、パーン」て感じの時報っぽい音を流したくて。

調べてみてもrubyでサウンド流す系の事例があまり見かけず、まあそりゃ確かにJavaScriptでやるような内容だし 頑張ってやってみた次第です。

やった事

「rubyで鳴らせないなら、shellで鳴らせばいいじゃない」ということで、 afplay コマンドを使うことにしました。コンソールで試したところ、以下のコマンドでmp3ファイル(countdown.mp3)を再生することが出来ました。この時点でOSX以外への対応が不可能になってますが一旦気にしない。

$ afplay countdown.mp3

後はこれを %w なり使ってruby側から実行すればいいと思ったのですが、どうやらrubyのプロセスから単にコマンドを実行するだけではmp3ファイルは開けないらしく、解決するのに結構時間を使ってしまいました。

救世主Open3

上記の問題はOpen3を使うことで解決しました。
リファレンスによるとOpen3とは、

プログラムを実行し、そのプロセスの標準入力・標準出力・ 標準エラー出力にパイプをつなぎます。

とのことです。正直言うと完全には理解できてないです。
なんとなく感覚としては、プログラムから実行環境の標準入/出力を操作できて、その結果を受け取れる、というような感じで捉えてます。← 優しい読者の方、このあたりマサカリあればください。
最終的なコードとしては以下のようになりました。

Open3.popen3 ("afplay #{File.expand_path('../../sound/countdown.mp3', __FILE__)}")

Open3.capture3() も試してみたのですが、サウンドの再生中に肝心のカウントダウン自体が止まってしまったので、別プロセスで動かせる Open3.popen3() を使いました。

まとめ

今回の技術的な部分としてはこんな感じです。
今後仕事で使うかと言うと微妙なところですが 普段触らないところに触ったので楽しかったです。
他にもimportメソッドに渡すパスがどこから始まるとかそれなりに学びはあったので、総合的にまあ良かったかなと思います。また何かあれば更新します〜

gemを作ってみました

みなさんこんばんは。宇賀神です。

今日は前から一度やってみたかった、gemを作ったお話です。

知ってますか

「ポモドーロ・テクニック」を。25分働いて5分休憩する、という働き方のアレです。知らない方はググってみてください。熱く語っている人がたくさんいます。

かくいう私も知ってはいたものの、今までなんとなく定着せずに来ました。
その原因を考えてみたところ、

  • 時間測るのがめんどくさい
  • ブラウザアプリとかあるけど起動するのがめんどくさい
  • めんどくさい

というのが主だったように思います。
というわけで、その「めんどくささ」をとことん排除するものを作れたらと思ったわけです。

なぜgemなのか

gemを作ってみたかったからです。(きっぱり)
Rails開発を何年かやっていて、色んなgemにお世話になったものの、作ってみたことってなかったなーと思いまして。なんでもいいからやってみたいと思っていたのです。
今回作ったツールについても、既にクオリティの高いものが開発されている点については、一旦見なかったことにしています。

仕様

いくら個人開発といっても、ソフトウェアを作るには仕様が必要です。
というわけで目的である「めんどくささを排除する」を満たせるよう、ざっくり以下の感じの仕様を決めました。

- ターミナルで動作するアプリであること
- 25分 → 5分 → 25分...というように、延々とカウントダウンをし続けること
- 25分の終わりの際に流している音楽を止めること
- 5分の終わりの際に流していた音楽を再生すること

結論から言うと下の2つは現在未実装です。
というか最後のやつは実現できるかわからんレベルの理想です。

出来上がったもの

ソースコードはGitHubで公開しております。名前は鳥山明先生の名作、Dr.スランプをインスパイアしています。モジュール名とかもちょいちょいインスパイアしてます。(途中で名前変えてガッチャガチャになったのは内緒の話)
https://github.com/ugajin/pomodorokun

実際の使用画面はこんな感じ
Image from Gyazo

…gifにしたら想像以上に地味でした。
5秒前からカウントダウンの音鳴らすとかしているんですが、gifでは伝えられない。

使い方はREADMEに書いておきますので、気が向いた方は使ってやってください。
もちろん技術的に詰まった面とかもありましたので、そのへんは別の記事にまとめますね。

これから実装したい機能

上に書いた未実装の2つ以外にも、実装しながら思いついたやつもあったのでメモも含めて。

- 音を止めたり流したり
- `you gotta 5 pomo!` とかみたいにpomo数を表示したい(英語が合っているかは知らない)
- 起動コマンドにオプションつけることで効果音変更したい
- 起動コマンドにオプションつけることでworkingとbreakingの時間を指定したい
- 4pomoごとに20分の休憩にしたい
- 起動中のターミナルが寂しいのでなんか賑やかにしたい

こんな感じでやりながらアイデアも出たので、しばらくこのへんで遊ぶかもしれないです。

おわりに

数年振りに個人開発やってみたんですが、やってみるとやっぱり楽しいですね。
アラレちゃんインスパイアとか、個人開発じゃなきゃ出来ないようなおふざけも許されるので、久々にプログラミングを純粋に楽しめてたと思います。

今度はiOSアプリとか作ってみたいなぁ。作ったことないけど。

first post

初めましての方ははじめまして。そうでない方はこんにちは。宇賀神です。

最初の投稿ということで、最近何してんすかとか、なんで急にブログやり出したとか、何書いていくんすか、みたいな部分について、ゆるい気持ちで書いていこうと思います。

最近何してんすか

2017年に大学を卒業してから、それまで1年半ほどバイトでお世話になっていた株式会社スタートアップテクノロジーに新卒で入社しました。

スタテクでは開発やったり、プロジェクトやメンバーのマネジメントだったり、新人教育だったり、コーポレートブログの記事書いたり、教育系の新規事業の立ち上げに関わったり、そのスクールで講師やったり、イベントの運営だったり、採用面接なんかもやったりしました。

色々やらせてもらった中で、エンジニアとしてもう一回自分の技術とちゃんと向き合いたい&そのための時間が欲しいということで、退職をさせてもらうことになりました。

3月からは一旦フリーランスとして活動します。生活のためお金を稼ぐ一方で、自分の興味ある技術に触ったりしていく予定です。

とはいえそんなに長くやる予定もなく、ある程度エンジニアとしての方向性が見えたら、それを頼りに就活をしようと思っています。フリーランス怖いし。

なんでブログ作ったん

この本を読んだからです。

https://www.amazon.co.jp/gp/product/B01GDS0994/ref=oh_aui_d_asin_title_o01_?ie=UTF8&psc=1

Image from Gyazo

これによるとブログを作っておくと

  • 継続的な学習のモチベーション
  • 就活の時の自己紹介ツール
  • コメントなどのフィードバックによって学習内容の理解を深められる

などのメリットがあるということだそうで。
3つめのやつはコメントをもらう前提なので、すぐにというわけにはいかないですが、個人的に1つめのメリットと、2つ目のメリットも就活を控えている身にはかなり魅力的だったので、とりあえず作ってみることにしました。

これ何のブログなん

個人的に勉強したこととか、触ってみた技術とかを書いていこうと思います。エモい話はなんかガラじゃないので今のところあまり書く気はないです。

触る技術のレベルについてはあんまり気にしないつもりです。記事を書くことや学習自体のハードルを上げてしまうとブログを書くことがめんどくさくなってしまうので。インプットとアウトプットの継続を一番の目的とします。

まとめ

基本的にはこんな感じでゆるくやっていく予定です。
技術的な解釈が違っていたりする場合とかはコメントとかでマサカリ全力投球していただけると助かります。僕のメンタルはそうそう壊れないので、160km/hのストレートで投げ込んでいただいて大丈夫です。

てなわけで、読んでくれた方ありがとうございました。これから末長く見守ってやってください。

続けていけるといいなぁ。