スマートフォン用の表示で見るMPがありません。ONNASONに参加するため沖縄に行っていたのでその感想を書きます。前後に予定が入っていたり、沖縄に行くのはなかなかしんどいのであまり参加に乗り気でなかったのですが、学生は宿泊代と交通費を負担していただけるということで参加することにしました。本祭の日は朝早く出発しなければなかったので前日から沖縄入りしついでに前夜祭に参加してきました。バーでいろんな方とゆるーく食事をとりながらLTを聞くという感じでした。見たトーク萬國之津梁charsbarさんによるトークで、氏が参加したPerl関係のイベントやそこでどんなことをしたかについて話されていました。プロダクション導入した結果GraphQLがどういうものなのか少し気になっていたので聞くことに。リクエストのパラメーターがちゃんと定義されていて型安全に扱える点がよさそうな感じでした。GraphQLを使ったアプリの実装や運用についてかなり詳しく話されていたので、参考にして試してみようかと思います。PerlでのHTTP/2について触れたいHTTP2ってHTTP1.1と違って何ができるのか、どんなことが変わるのかといったことやPerlでHTTP2を利用するためのライブラリなどが紹介されていました。(前半の内容は前にやっていて僕が見ていたかったトークの内容とかぶっていたそうですが、僕は前のトークを見ていなかったのでありがたかったです・・・)HTTP2でコンテンツを配信するサーバーの実装は並行処理がふえたりと今までとかなり雰囲気が違ってきてきそう、とても丁寧に解説されていたので、これを気にHTTP2を触ってみようかと思います。サーバープッシュはHTTP2も含めていろいろな方法が使えるようになっているようですが、どれを使うのがいいんでしょうかね。ApplicationWebアプリのサーバープッシュの部分だけ別のサーバーでやるという発想で作られたWebSocketとHTTPの相互変換プロキシサーバkuiperbeltについてのトークでした。これを使えばLLでもWebSocketを使ったアプリをだいぶいい感じにかけるんではないでしょうか新しい概念から作っていてもうなんかすげえって感じでした。ベストトーク賞もこれに投票しました。Perl6の最新情報についてのトークでした。6月ごろにでるであろうPerl5.28での変更点とかPerl6がどんなふうになっているかは興味があったので見れてよかったです。Perl5.28での変更点で気になったのはハッシュがkey/valueのスライスでdeleteできるようになることと正規表現文法が拡張されることでした。他にもスマートマッチやgiven-when文などを実用的にするための変更が入る予定だったそうですが、一部のモジュールが壊れたので没になったそうです。experimentalなままで早く外れないかなーと思っていただけに残念でした。後方互換性を維持しながら言語の開発を進めることって大変なんですね。Perl6はぼちぼちって感じでした。Inlineモジュールの世界Inline系モジュールがどのように動いているのかがわかり面白かったです。メリットやデメリットもまとめられていて、導入時の判断基準にできそうでした。ランタイムエラーが起きた時にPerl側で捕捉できないというのがつらそうで、組み込む言語側でなんとかするしかないのかなあと思いました。Perlコーディングテクニック2018最近のPerlの便利な機能やモジュールの紹介をされているトークでした。Module::Findあたりでしょうか。便利そうなのでどんどん使っていきたいと思います。最近のPerl関連の情報ってあまり多くないのでありがたかったですね。Perl6のエコシステム最近のPerl6のエコシステムについてのお話でした。最初はgithubで配布していましたが、最近はCPANでやるようになっているようです。インストーラーもpandaからzefになっていて、いろいろ変わっているなーと感じました。mi6というオーサリングツールもあって、簡単にモジュールを挙げられるようになっているそうです。zefの実装がなかなかいい感じだということで(workaroudも多いそうですがw)参考にしていきたいと思います。懇親会に参加するのは初めてで、いろんな方とお話出来てよかったです。Mouseの不具合(?)の話をskajiさんとお話できたのは良かったです、なかなか解決は難しそうですがp-r送ろうと思います。翌日は飛行機が出るまで少し時間があったので首里城に行っていました。独特の雰囲気や眺めがとても素晴らしかったです。)という風に明記されていませんが、追加の引数はそのままSQL::Translator::Schema::Table::add_constraintに渡されるので上記の方法で追加できます。そもそもトリガはあまり使うべきではないのかもしれませんが...他にも渡したいオプションがあればSQL::Translatorのドキュメントを読むとどんなことができるかわかります。予定変更してだいたい2ヵ月くらい前から卒研の合間に少しずつRustを勉強し始めているのでその感想を書こうかと思います。そんなにがっつり使いこんでいないので参考程度に見てください。Rustってどんな言語?C並みの速度で実行することができてかつメモリ管理の安全性と並行処理に関する機能を強化したり、関数型言語由来の機能を取り入れた言語です。メモリ安全性を保証するためにほかの言語と比べてかなり独特な仕様があります。独自のメモリ安全性を保証するための概念が気になったのと、現代的な機能がたくさんあったのでRustをすることにしました。現代的な機能や関数型由来の機能が多くてミスのすくないプログラムを書きやすいまず変数はデフォルトでimmutableです。mutと宣言する必要があって、関数に渡すときとかもmutをつけないと値を変更できません。慣れてないと面倒ですがわかりやすいです。Maybeに相当するOption、Eitherに相当するResultというのがあって、クロージャも当然使えます。型推論もありますねメモリ安全性を保証するための機能はすばらしいと思ったRustでは1つの値に対して変数は1つしか対応させられないようになっています。そのためか、他のプログラミング言語では変数に値を代入するといいますが、Rustでは束縛するといいます。変数は値に対する所有権をもち、変数がスコープから外れると所有権をもっている値のリソースを解放します。何らかの値を束縛している変数を新しい変数に束縛しなおした場合は、新しい変数に所有権が移動して前の変数からは値を参照できなくなります。この仕組みのおかげで、メモリの解放し忘れがなくなります。ファイル名でテストが実行できます。所有権になれるのがなかなかつらい所有権という考え方自体はいいと思うのですが、配列やコレクションの要素にも所有権があって、コレクションを操作するときはそのあたりも考慮しなければいけなくてかなり難しいです。普通のイテレータを取得すればもとのコレクションの要素の所有権がイテレータのほうに移ってしまってコレクションを束縛していた変数が使えなくなったりとか、コレクションの要素の参照のイテレータを使うなら要素を使うときに参照外ししないといけなかったりとか、考えることが多いです。クロージャを使う際も所有権が絡みでいろいろ覚えることがあります。それと話はそれますが配列の値を参照するときのインデックスもunsginedでないとだめで、あまり考えずに整数型を使ってプログラミングしているとあとあとキャストしないといけなくて面倒だったりします。標準入力から値を受け取るのがつらい競プロの問題解くときとか結構つらいです。以下C++との比較です。nums[1]);外部ライブラリを使えばだいぶましになるそうです。まとめRustはいい言語だとは思うのですが、慣れるまで動くものを作るのにだいぶ時間がかかってしまいそうだと感じています。慣れても所有権を意識しながらプログラムを書かないといけないので適当に書いているとコンパイルが通るまですごい時間がかかりそう。};Middlewareを使うときにPlack::Session::Stateを継承したクラスのインスタンスとPlack::Session::Storeを継承したクラスのインスタンスを渡す。試しに動かしているみたいな時以外はPlack::Session::State::Cookieのドキュメントをちゃんとみて指定したほうがいいと思う。storeの方はPlack::Session::Store::Fileが使われていて、バックエンドにはStorableが使われている。Cacheのがあって、好みや用途で使いわけられるし、CPANにはRedisバックエンドのモジュールがあったり、なんなら自分でPlack::Session::Storeを継承した独自のモジュールを作って使うこともできる。Mojoliciousで使う有名だけど、Mojoliciousのセッション機能はセキュリティ的に貧弱というかそもそもセッションといえないような感じなので、Mojoliciousで開発しているときでもPlack::Middleware::Sessionを使いたい場面が多い。鉄板なのはMojoliciousアプリをPSGIアプリとして起動させてPlack::Middleware::Sessionを使う方法だけど、これだとPSGIサーバーを使わなければならなくなるので、まだどのサーバーを使うか決めていない場合や開発時にMojolicious組み込みのサーバーを使って開発を進めていきたいときなんかは、Mojolicious::Plugin::PlackMiddlewareというプラグインがあるのでそれを使ってPlack::Middleware::Sessionを使うといい。(もしかしたらすべてのPlack::Middlewareは動かないかもしれないが少なくともSessionは使えた)これを使ったログイン機能のMojolicousでの実装例ORMにTengかAnikiを使っているとする。次のような感じでPlack::Sessionのインスタンスを作ってテストすればいい。'./etc/sessions'),})まだわかってなさそうなところがあるので、間違ってたりしているところがあれば指摘していただけると嬉しいです。TwitterIN科3年Perl大好きなことで有名かもしれません。しては、クソコードを生み出しにくい現代的なPerlを書く方法を周知する必要があると強く感じ、この記事を書くことにしました。全部書こうとすると長くなりすぎるので、今回は僕が特に重要だと思うもの数点を紹介します。本題に入っていきます!Perlのコードを書きはじめる時に必須の記述Perlのコードを書きはじめるときは、先頭にかならず下記の2行を記述するようにしましょう。プラグマというものをロードしています。プラグマとは?Perlでは、何も宣言せずに使用した変数はなんとグローバル変数になってしまいます。strictプラグマを使うと変数を必ずmyで宣言*4しなければならないようになります。myで宣言した変数の有効範囲はブロック内のみなので、サブルーチン、if文、for文の中などでmyで宣言した変数は外部から参照できないようになります。具体的には以下のような感じになります。!!\n";また、変数を宣言しなければエラーがでるようになるので、変数のタイプミスにも気付きやすくなります。プラグマは様々な警告を出してくれるようになります。初期化されていない変数を使用した時や、数値として解釈できない文字列で計算をした時などに警告を出してくれるようになります。warningsを書きましょう!open関数は3引数で呼び出し、ファイルハンドルは変数に格納する昔の方法でファイルを開いて読み込む処理を書くと、以下のようになります。FH;これには幾つか問題があります。1つはファイル名とファイルオープンモードを指定するところが同じ文字列であることにより、脆弱性が生まれることです。2つめはファイルハンドルがグローバル変数のような扱いになることです。*5このように上記のコードはヤバイので、以下のように書くようにしましょう。サブルーチンを呼び出さない実は&を使わずにサブルーチンを呼び出すこともできます。呼び出すこともできるむしろ、&を使って他の人が作ったサブルーチンを呼び出したりすると、意図しない挙動になったりする場合があるのでやめましょう。他言語をメインで使っていた人も、&をつけないほうがわかりやすくていいんじゃないでしょうか。モジュールを使うPerlで時刻を取得するにはlocaltime関数を使用しますが、現在ではCPAN*7に楽に時刻を扱うことができるモジュールが何種類かあるので、それを活用するようにしましょう。Perl5.9.5以降の場合は時刻をオブジェクトとして扱うことができるモジュール、Time::Pieceが標準で添付されています。するだけで使えるのでPerl5.9.5以降を使っている方は是非Time::Pieceを使うようにしましょう。Time::Pieceを使うと、localtime関数で書いていた処理が以下のように簡単書くことができます。\n";変数をたくさん宣言しなくていいですし、年や月なども足したりせずに取得できるのでいいですね!なお、学校にある古いサーバーの幾つかでは動いているPerlのバージョンも低いので、Time::Pieceモジュールがない場合があります。:(間接オブジェクト記法でメソッドを呼び出さない例えば、以下のようなコードです。こここれは、CGIモジュールのnewというメソッド(もといコンストラクタ)を、間接オブジェクト記法という方法で呼び出しています。JavaやC++と違って、newは演算子ではありません。ちなみに、通常のメソッド呼び出しは次のようにします。CGI->new;Perlではメソッド呼び出しは->でやるんですよ。Javaの.が->になったと考えてください。引数をとるメソッドを最初の間接オブジェクト記法で書くとどうなるでしょうか。なる読みにくいですね...。最新のPerlでは間接オブジェクト記法で書くと警告を出すようにしようとする流れがあるようです。将来警告がでるかもしれないことを考えると、やっぱり間接オブジェクト記法はやめておいたほうがいいです。するutf8プラグマというものがあります。これはPerlスクリプト内でunicode文字列を扱えるようにするプラグマです。これを使うと、length関数でunicode文字列がちゃんと文字数を返すようになったり、変数名などに日本語が使えるようになったりします。使いこなすのに少しコツがいるので今回は説明しません。さいごに以上ー、現代的なPerlの書き方のうち、重要だと思うものを何点か紹介しました。:(また、Perlはシェルスクリプト的な使い方もできますし、CPANを利用することでほんとにいろいろできるので、よければ授業以外でも使ってみてください。Perlを使っている人はよくこう呼ばれます。プラグマとはロードするとロードしたコード側に何らかの影響を及ぼすモジュールのことです。グロブとして扱われます。具体的にはサブルーチンプロトタイプが無効になります。Perlの便利なモジュールがたくさん置かれている、素晴らしい場所です。下のコードのようにException::Tinyを継承したクラスで例外を発生させる時にconfessを使ってもスタックバックトレースが表示されません。$class->new(%args);}原因はわかりません!!他の例外搬送クラスはどうなんでしょうかね。Carpのドキュメント、バグのところにオブジェクトは受けつかないと書いてありますね。上記の方法かlongmessを格納する方法しかなさそうです。誰かいいモジュールを知っている方がいらっしゃればぜひ教えていただきたいです。APIの使い方って感じですが。v3はGoogleのアカウントを持っている上で認証しないと使用できないようなので、ドキュメントを参考に準備をします。https://developers.google.com/youtube/v3/getting-started?hl=ja途中で作成するAPIキーを後で使うことになるのでメモっておきましょう。APIをリクエスト↓JSONが返ってくるのでそれをPerlのデータ構造に変換ってかんじです。コードはこんな感じになりました。利用できる、知っておくと便利な型Perlにおける動的なモジュールロードのメリットとデメリットについて月別アーカイブMPがありません。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。