飽きるまでやります。

私の私による私のためのメモ。内容に一切の責任を負えません。

YAPC::Tokyoに参加した話

概要

YAPC::Tokyoに参加したので感想です.
感想を上げるまでがイベントだとかなんとか.

私のスペック

琉大生です.

Perlは2時間くらいしか触ったことがありません.普段はPython機械学習OpenCVなどしています.Cもほんの少し分かります.
今回は別件で東京に行く必要があって日にちが自由に選べる感じだったので,合わせてYAPCに参加した次第です.

交通費支援への申請は自重しましたが,学生無料に感謝します.

Opening

ノベルティが豪華でした.シールはあまりPCに貼らないのでどうしようかという感じですが,mercariのがYAPC感と浅草感があり良かったです.
今年のテーマは報恩謝徳ということで,Macの辞書で一発で変換できない聞きなれない熟語でしたが,恩に感謝し報いることということで,色々なところで開催され東京に帰ってきた(らしい)YAPCにぴったりのテーマだと感じられました.

チームが前に進み続けるために僕たちが考えたこと

Perl入学式の資料で名前が出ていたので名前だけ知っていたpapixさん.

Hatena Blogという大きなサービスの開発現場の話を聞けたのは貴重な体験であったと思います.
なんかすごそうな人たちの集まりであっても開発は停滞しそれに対してアジャイル(スクラム)は有効な一手になるという知見を得ました.電子的なメモがたくさんある時代でも物理メモってある程度の効果を発揮するのは分かるという感じでした.

私とOSS活動とPerl

前田隼輔さん.

言語間の違いを統一したいからコードを書いて,公開したいというより会社で使いたいからGitHubに上げたというストーリーは面白かったです.
些細なことでもアップロードしていいらしいCPANという存在も大きいのかなと感じました.

僕も何か書いたらGitHubに上げたいと思います.

Perl to Go

xaicronさん.

GoもPerlも分からんので8割分からなかったです.勿体無い感がすごい.
Goは流行っているし興味があるのでそのうちやりたいと思っていますが,なかなか時間が厳しい感じがあり辛いという感じです.

ランチセッション

昼ごはんに浅草っぽいお弁当をもらいました.私の後ろの席の人が,弁当のスポンサーなのに弁当が残ってなくて食べられなかったと嘆いておりすんませんと思いながら美味しく頂きました.感謝します.

1つ目のお話はGarudaというシステムの話でした.Pythonではデータは基本的にテーブル構造になっていればなんとかなるみたいなところがあるので,いまいち実感が湧かずといった感じでした.ユーザが手段を意識せずにデータを使えるのは強みな印象を受けました.

2つ目のお話は20歳でPerlエンジニアになった方のお話でした.遊撃チーム,イカしたネーミングの部署だと思いました.

Perl on Rails

大仲 能史さん.

良い機能があるので移植していき,裏目的でRailsを布教するという動機が面白かったです.
こういった機能の移植って,他言語のチュートリアルを終えた後の一手としても良い気がします.

PerlプログラムでPerlプログラムを修正する方法

Kang-min Liuさん.

Perlのことは分からないので笑いどころがよく分からない部分等もありましたが, "ゴミコード…社内にいっぱいある(小声)" というぼやきはよく覚えています.

レガシーPerlビルド 〜現代に蘇るPerl[1..5].0とPerl6〜

我らがアナグラさん.キャーアナグラサーン.

これを聞きに東京まで来た…というと過言ですが,同じ社会的身分(?),すなわち同じ大学同じ学科同じ学年の知人の登壇なのでPerlは分からないが聞きました.

Perlのことは分からないので昔を振り返るというのは年齢層が高い(らしい)Perl界隈にはウケていたと思います.事実私の後ろの席の人が彼はPerl界の若手のホープだ!!琉大熱いな!!とべた褒めしていました.@AnaTofuZがホープだというのは事実だと思いますが琉大は関係ないんじゃないかなという認識があるので,琉大生は彼と後2年同じ環境にいることをもっと活用しよう!という感じです.

WebVRで作品を作って展示しよう

hitode909さん.個人的に一番印象に残ったトークでした.Perlが分からないというバイアスはありますが.

WebブラウザVRができるという,もはや何を言っているんだという感じですがしっかりVRで素直に驚きました.
難しそうな技術,例えばVRであったり,そういったものを広く一般に使いやすくする橋渡し的な技術は偉大だと思います.

私は新しいアイデアというものを出すのが苦手なので,hitode909さんの発想力が羨ましい感じでした.

実演 サーバレスPerl - 顔認識データを扱おう

わいとんさん.

Perlで顔認識…一体どうやるんだ…と勝手に間違った期待を持って聞いたトークでしたが,タイトル通りサーバレスPerlの方が主題でした.
環境が用意されていない言語って体験したことがないので,Perl界隈の人は苦労してそう…という印象でした.

Dive into MySQL Error

yoku0825さん.

最近SQLの知識が基本的なことしかないのに地獄のようなMySQLのデータを掘っていてとても辛いので聞きました.

こんにチバ!!
が一番印象に残っていると言ったら流石に失礼ですがこんにチバという感じでした.

結果としてシンタックスエラーとかそういう話ではなく,もっと大局的なSQLのエラーだったので私の辛さは軽減されませんでしたが,狭い世界での話ではなく,エラーコードの番号の仕組みだとか区分だとかの勉強になる話や,エラーメッセージベタ打ちだとかの恐ろしい話とか,普段触らない分野の話を聞けたのは素直にためになったという感じでした.

LT

ライトニングすぎて忘れました.

Closing

Perlは好きですか? に対して手を上げなかったところ何しに来たんですかねwと言われすんませんという感じでした.別に嫌いではないので許してください.

印象に残っている言葉は2つあって,1つは ”YAPCなのにPerlの話題が多かった” です.
僕がPerlのメリット的な点を@AnaTofuZに聞いた時彼が言った,Perlはコミュニティという言葉の妥当性を感じる言葉でした.

もう1つは貢献についての話でした.
私は特定の言語を愛しているということはなく特に技術力が高いわけでもないので,技術的な貢献力はほぼ皆無と言っていいんですが,そういった人間に対して,例えば感想エントリを上げるだとか,そう言った貢献の仕方を “できる” 側の人が言ってくれるのは結構な救いなのではと感じました.

懇親会

懇親会は不参加でした.
人に私を紹介する前に私が私の行き先を決めかねている感じなので色々な懇親会はパスしているんですが,来年度は色々なコミュニティの懇親会など行って人と関わってみたいという感じはあります.

おわりに

YAPC::Tokyo2019の感想でした.
運営の方も参加者の方もありがとうございました.

condaの話

概要

anaconda何もわからん…のでメモします.

仮想環境を作る

conda create -n ENVNAME python=VERSION PACKAGE1 PACKAGE2…

pythonも厳密にはパッケージ扱いで,環境を作るときについでに環境にインストールするパッケージを指定できる.
パッケージのとこにanacondaを指定するとanacondaの全部のパッケージが入る.

python=を指定しない

python=を指定しない場合,仮にactivateしたところでpythonanaconda3/bin/とかにある.このインタプリタはパッケージを/anaconda3/lib/python3.6/site-packages/あたりで探す.

ということは追加パッケージをインストールせずに,numpyやらpandasといった最初からanacondaに入ってるパッケージのみを使うならconda createする必要がない.

追加パッケージをインストールする

python=を指定しない場合,activateしたところでインタプリタはanacondaデフォルトのものを使ってるので,pip installしたらanacondaデフォルトの環境が汚れることになる.conda install pipをすればpythonやらpipが環境にインストールされるが,ややこしいのでconda createの時点でpython=を指定した方が無難そう.

python=を指定したら必要なパッケージをインストールしないといけないが,まずconda installを使った方がいいらしい.condaになかったらpip installをするのがいいらしい.

onoz000.hatenablog.com

もしくは参考ブログに書いてあるように,全部pip installがいいらしい.しかしこれをやるとanacondaとは…ってなってしまう.venvでいいんでは…

jupyter notebookを使う

anacondaを使う人はだいたいjupyter notebookを使うんだと思う(適当).ところでjupyterとpythonは別なのでpython=で環境を作ってactivateしても,jupyter notebookを打つとanacondaデフォルトのjupyterを使ってしまう.そうすると環境にインストールしたパッケージが使えないので,conda install jupyterする必要がある.

venvを使う

anacondaのpythonでも当然venvは使えるけど今のanacondaのpythonは3.7だと思うので意味があるのかは謎.

所感

conda create -n ENVNAME python=VERSION anacondaが一番anacondaのメリットを受けられるんじゃないかなあという感じ.もしくはanaconda指定+nbextensionを入れた環境を作っておいて--cloneするか.
パッケージの依存パッケージのバージョン違いとかで起こりうる問題を解決してくれるのがメリットだという話も聞いた.

バージョン管理+仮想環境したいだけならpyenv+venvでいいんでは(anaconda容量大きい…).
データ分析的なやつをしないが特別なパッケージが欲しい時はconda createせずにvenvするとかでも良さそう(anaconda指定は時間がかかる).

createのときにanaconda指定で全部入り環境ができるってやつ,公式ドキュメントのどこに書いてあるんだか分からなかった…

1人Perl入学式 #2

概要

Rails完全に理解する予定だったが諸事情でPerlが一切わからないのにYAPC::Tokyo 2019に参加することになったのでPerlをやっていきます.

参考

github.com 沖縄の学生の間で大人気のこれでやっていく.

事前

特に今回の構文基礎というところでいちいちファイルを保存するのがめんどくさいのでインタラクティブモードみたいなのがないのかぐぐった.昔はせっせと.cなど書いていたのに….

root@788dcc3faa9b:~/perl-entrance# cpanm Devel::REPL
・
・
・
77 distributions installed
root@788dcc3faa9b:~/perl-entrance# cpanm Term::ReadLine::Perl
・
・
・
Enter arithmetic or Perl expression: exit
OK
Successfully installed Term-ReadLine-Perl-1.0303

re.plで起動して挨拶できたので多分ちゃんと入ったんでしょう….

変数

謎の記号$は変数であることを示す記号らしい.謎の記号だと思っていたけど簡単だった.
シングルとダブルクォートでエスケープするしないはRubyでも見た気がする.忘れそう.
myは型宣言の代わりに書くと理解しておこう….

スカラ変数完全に理解した.

標準入力

scanfでもinputでもなくPerlの標準入力はmy $hoge = <STDIN>;でいけるらしい.分かりやすくていい気がする.
chompで末尾の改行をなくす話は対話モードではよくわからなかったけどイメージはつくので覚えておくに止めます.

四則演算

文字列連結.だけは馴染みがない概念な気がした.あとはきっと大丈夫でしょう….

if else文

if () {

}

にすごい懐かしみを感じる….

文字列の演算に特別な演算子があるということ,間違った比較が無理やり通っちゃうところはハマりそうな感じがした.truefalseがないのにびっくり.

論理演算子

完全に理解した.

for文,配列

謎の記号@完全に理解した.配列の要素にアクセスするときは@$になるのむずすぎない….

my @array1 = ( 1, 2 );
my @array3 = ( @array1, 3 ); #=> (1, 2, 3)

これ1次元配列になるなら2次元配列ないんか?と思った調べたらリファレンスという名前でちゃんとあるらしい,そりゃそうですyね.

perlのfor文の回数指定がなんかやりづらい気がする…毎回my $hoge (..)書くのか….
と思ったけどfor i in range() やらfor(int i=0, i<n, i++)書くのと労力は大差ないか.

FizzBuzz問題にチャレンジ!!した.けどここまでの知識で書いたコードを乗っけるのも恥ずかしい.

落ち穂拾い

for文はC風にかけたりもするらしい.これがティムトゥーディーですか?

終わりに

Perlのコード目にしたとき$@が謎の記号だなーって思ってたんですが謎が解けました.

第2回完全に理解した.

1人Perl入学式 #1

概要

Rails完全に理解する予定だったが諸事情でPerlが一切わからないのにYAPC::Tokyo 2019に参加することになったのでPerlをやっていきます.

参考

github.com 沖縄の学生で大人気のこれでやっていく.

第1部 環境構築

環境構築…UbuntuMacWindowsDockerだな!!1

https://hub.docker.com/_/perl/
Dockerも全くわからないのでそのうち真面目に勉強しようと思っていたのに順番が逆になってしまった.

何もわからないけどbuildpack-depsから色々を引っ張ってきてこれは色々辿るとdebianが元らしい.つまりDebianの上にPerlの環境を作ったものが簡単に手に入るらしい,多分.

Perl6は色々あるらしいので5使っとけとのお言葉を頂いたので5を使います.

% docker run -it perl:5 bash
root@2bda2ed3b591:~# perl --version

This is perl 5, version 28, subversion 0 (v5.28.0) built for x86_64-linux-gnu
root@871e61de4fbf:~# perl -e 'print "hellowa\n"'
hellowa

一生世界に挨拶していたい.

第2部 ターミナルとシェル入門

完全に理解した.

第3部

僕はvimやらemacsといったスーパーハカーが使うようなものは使えないのでIDEが使いたい…sshでもするの…何もわからん…という感じだったがdocker run -vでことなきを得た,多分.

perldocは最初から入っていた.さすがdockerですね! 知らんけど

終わりに

第1回完全に理解した.

ジェネレータの話

概要

そろそろジェネレータでも理解しようと思いました.
言語自体の詳細な仕様みたいなことはあまり勉強しないので正確な仕様はググったほうがいいです.

iterator

Pythonにおけるイテレータはだいたい反復可能なオブジェクトのことを指すはずです.
listやtupleやdictやそれらに似た色んなやつですね.
4. 組み込み型 — Python 3.6.5 ドキュメント

ものすごく噛み砕くと

  • __iter__()__next__()を持っている
  • __iter__()でこいつはiterableなオブジェクトですよと宣言する
  • __next__()で次の要素にアクセスできる
  • for文は__iter__()__next__()を勝手に呼んでくれる

generator

オリジナルのiterableなオブジェクトを作りたいときgeneratorを使うようです.
__iter__()__next__()を持ったクラスを作れば良いわけですがめんどくさいのでジェネレータで簡単に作ろうみたいな感じらしいです.yield式を使います.

defで関数を作るときにreturnでなくyieldを使うことでその関数はジェネレータになり,1回値を生成したら中断して呼び出し元に制御が戻るみたいな動きをします.

適当に書いてみる

def myrange(start, stop, step):
    x = start
    while x < stop:
        yield x
        x += step
for i in myrange(0,5,1):
    print(i)

"""
0
1
2
3
4
"""

yieldなしも書いてみる.

class MyRange(object):
    def __init__(self, start, stop, step):
        self.start = start
        self.stop = stop
        self.step = step
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.start >= self.stop:
            raise StopIteration()
        value = self.start
        self.start+=self.step
        return value
mr = MyRange(0,3,1)
print(next(mr))
print(next(mr))
print(next(mr))
print(next(mr))

"""
0
1
2
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
"""

yieldがすごく簡単なのが分かりました.

メリット

メモリの節約なんかに使うそうです.逆に言えば資源を気にしなくて良いときはあんまり使わないんですかね.

終わりに

ジェネレータ完全に理解した.

SUSHI

寿司は好きですか?

概要

寿司データセットというものがあるというのを知ったので中身を見ます.

データセット

www.kamishima.net

All Data Setからsushi3-2016.zipというzipを落とします.中身は

という感じになっています.

カラム名等はデータセットにはついていないのでREADMEを読まないと何が何だか分かりません.日本語のREADMEが読みたい場合は文字コードがJIS(ISO-2022-JP)なのでnkfコマンドなどで変換するといいと思います.

寿司基本データ

どんなデータか知りたかっただけなのでREADME読んだ時点でもう終わりでもいいんですが折角なので適当に見てみました.
適当に列名を付けてsushi3.idataを読み込みました.

   ID    Name  not_Maki  not_Gyokai  Categoriy   Kotteri  Eat-Freq     Price  \
0   0     ebi         1           0          6  2.728978  2.138422  1.838420   
1   1   anago         1           0          3  0.926384  1.990228  1.992459   
2   2  maguro         1           0          1  1.769559  2.348506  1.874725   
3   3     ika         1           0          5  2.688401  2.043240  1.515152   
4   4     uni         1           0          8  0.813043  1.643478  3.287282   

   Sale-Freq  
0       0.84  
1       0.88  
2       0.88  
3       0.92  
4       0.88 

寿司嗜好データ(5000人,100カテゴリ中トップ10)

変な行やら列やらがあって,きっとPythonではなくてなにか別のデータ分析の手段のためのフォーマットなんだろうなという感じでした.

sushi3b.5000.10.orderを,先頭1行と先頭1,2列を除いて読み込みました.

   1   2   3   4   5   6   7   8   9   10
0  58   4   3  44  87  60  67   1  12  74
1  22  31  60  21   8  24   6  12  17  76
2   2  15  13   1   6  25  46  74  56  55
3   8   0   3   9  24  43   4   5  29  40
4   9  47  50  30   4  19  99  55  31  13

こんな感じで5000人分のトップ10寿司ネタ番号が格納されています.

1位に選ばれる寿司ネタ

上の表の1のカラム,すなわち1位に選ばれた寿司ネタとその回数をvalue_counts()しました.

f:id:sdr816:20181119002628p:plain

こんな感じでID8が強そうです.ではID8は何なのかということでpd.margeなどしました.

        1  ID      Name  not_Maki  not_Gyokai  Categoriy   Kotteri  Eat-Freq  \
8   521.0   8      toro         1           0          1  0.551855  2.057532   
19  338.0  19  chu_toro         1           0          1  0.795193  2.034483   
4   307.0   4       uni         1           0          8  0.813043  1.643478   
2   284.0   2    maguro         1           0          1  1.769559  2.348506   
1   283.0   1     anago         1           0          3  0.926384  1.990228   
6   258.0   6     ikura         1           0          7  1.264873  1.979462   
9   229.0   9    amaebi         1           0          6  1.913987  2.068328   
0   215.0   0       ebi         1           0          6  2.728978  2.138422   
15  207.0  15     samon         1           0          1  1.271123  2.045497   
13  158.0  13   hamachi         1           0          0  1.258497  1.874776   

       Price  Sale-Freq  
8   4.485455       0.80  
19  3.167569       0.56  
4   3.287282       0.88  
2   1.874725       0.88  
1   1.992459       0.88  
6   2.695363       0.88  
9   1.924973       0.76  
0   1.838420       0.84  
15  1.511774       0.64  
13  1.673059       0.64 

結果トロが強いということが分かりました.わかる.

安定したつよネタ

各ネタが10位以内に選ばれた回数をカウントしました.すなわちsushi3b.5000.10.orderの中身を列ごとにカウントして全て足し合わせました.apply(pd.value_counts).sum(axis=1)みたいな感じでやりました.

f:id:sdr816:20181119003402p:plain

特に1位と10位の間に差はなく,安定したつよネタだというのが伺えます.IDが若い番号で埋まっているのはもともとそういう感じのデータ順だったんですかね.

マージしました.

     top10  ID       Name  not_Maki  not_Gyokai  Categoriy   Kotteri  \
0   1546.0   0        ebi         1           0          6  2.728978   
1   1535.0   1      anago         1           0          3  0.926384   
3   1457.0   3        ika         1           0          5  2.688401   
5   1447.0   5       tako         1           0          5  3.088459   
6   1412.0   6      ikura         1           0          7  1.264873   
2   1406.0   2     maguro         1           0          1  1.769559   
4   1380.0   4        uni         1           0          8  0.813043   
7   1353.0   7     tamago         1           1          9  2.368071   
8   1321.0   8       toro         1           0          1  0.551855   
10  1297.0  10  hotategai         1           0          4  2.345412   

    Eat-Freq     Price  Sale-Freq  
0   2.138422  1.838420       0.84  
1   1.990228  1.992459       0.88  
3   2.043240  1.515152       0.92  
5   1.717346  1.384330       0.76  
6   1.979462  2.695363       0.88  
2   2.348506  1.874725       0.88  
4   1.643478  3.287282       0.88  
7   1.866223  1.032468       0.84  
8   2.057532  4.485455       0.80  
10  1.785659  1.772196       0.76 

非魚介唯一のトップ10入りの卵がやるなって感じですね.ちなみに1位に選ばれる寿司ネタでの序列は16位でした.

終わりに

寿司が食べたくなりました.
jupyterの結果を綺麗に載せられる方法を募集しています.

このデータはユーザー側のIDもユーザーデータ(出身県など)と紐づけられるので,もっと詳しい感じの分析ができそうです.興味を持った方はぜひ寿司にいきましょう.

Rails Tutorial #4

概要

Rails Tutorial 第4章の日記です。

4章

4.1 ヘルパー自作の話

汎用的なオリジナル関数を作れるよという話のようです。何もreturnしないのに機能してるのは不思議でした。
あとの方に書いてましたがRubyは最後に評価した式の値を自動で返すみたいです。Notebookみたいなイメージですかね。ちょっと違うけど。

4.2 Rubyでの文字列の話

putsはputの3単現じゃなくてput stringらしいですね。3単現だと思っていたのでへーって感じでした。

Python”これ”'これ'に区別はないですがRubyだとシングルは#{}の展開をしなかったりエスケープ文字がそのまま使えるみたいな利点があるらしいです。どうでもいいですけど押しやすいのでダブル派です。

RubyのメソッドでTrue/Falseを返すものは?を末尾につけるらしいです。へー。

後続ifってPythonにはあるのかしら。なさそう便利。
な気がするけど1行だけの処理をするif文ってあんまり書かないかも。デバッグの時は便利そう。

4.3 Rubyでのデータ構造の話

1つ目は配列の話でした。0:2じゃなくて0..2とかで範囲を指定できるらしいです。

2つ目はブロックの話でした。1行ブロックは見たことありませんでしたが続いて複数行ブロックが出てきたのでProgateで見たやつだ!となりました。イテレーターあたりの話ですかね。

3つ目はハッシュとシンボルでした。ハッシュがdictなのは簡単にわかるがシンボルが慣れなくて難しいと感じました。Progateの時も思いましたが変数の前に:がつく時と後ろにつく奴があって絶対これは間違えると思っています。慣れるしかない…。   一応は2つの違いは理解できたような気がします。

Rubyはメソッドの()を省略したり{}を省略したりできるようで初心者には読みにくいように感じました。

4.4 クラスの話

大いなる力には大いなる責任が伴います

最初から組み込まれてるクラスを拡張できるのは大いなる力だと思いました(コナミ)。名前の衝突はどうするんだろう。

attr_accessorは…Progateにあったかなー覚えていないし探すのも面倒なのでこういうのがあるというのを覚えました。

4.5 終わりに

感想

オブジェクト指向言語の経験があれば流し読みでいいかなーという章でした。