Perlがくしゅう帳(Rubyも)

プログラミングの勉強会の参加記録や学んだことなど。 twitter ID : @tomcha_で活動しています。 最近は主にPerl関連の勉強会やコミュニティに参加しています。移転前のブログはこちら->http://ruby.doorblog.jp/

vimrcの旅 ~その2~

DAY3

"不可視文字を表示

set list
set listchars=tab:>-,extends:<,trail:-,eol:\

"行末行頭のカーソル移動で前後の行に移動できる様にする

set whichwrap=b,s,h,l,<,>,[,],~

"インサートモードでのカーソルキー形状変化(Macのみ)

let &t_SI = "\e]50;CursorShape=1\x7"
let &t_EI = "\e]50;CursorShape=0\x7"

DAY4

"文字コードUTF-8に指定

set encoding=utf-8

"タブを空白で入力する

set expandtab

"標準タブは4

set tabstop=4
set softtabstop=4

"行末まで移動できるようにする

set virtualedit=onemore

vimrcの旅 ~その1~

DAY1

Vimのテキストエリアに行番号をつける

set number

自動バックアップファイル、自動スワップファイルを作らない

set nobackup
set noswapfile

DAY2

インサートモードで、ctr + jでノーマルモードの戻る

inoremap <C-j> <C-[>

インサートモードで、素早く jj でノーマルモードの戻る

inoremap <silent> jj <C-[>
inoremap <silent> っj <C-[>

OSのクリップボードを使う

set clipboard=unnamed

vimrcの旅 ~出発準備~

所信表明

software design 2020年8月号がVimの特集(VSCodeも)だったので、かねてから気になっていた.vimrcをゼロから作る修行の旅へ出ることにしました。

現在使っている.vimrcは、ネットの記事やら雑誌やら知り合いからのアドバイスなどから色々とコピペ・追加を繰り返し、351行(空白行、コメントアウト行含む)の状態です。コメントを書いたりしているものの綺麗に整理されている訳ではなく、中にはあまりよく分かっていない記述やプラグインなどもちらほらと。

まずは完全に理解したプラグインや設定を1つずつ増やしていき、納得度の高い.vimrcに育てていこうと思います。

旅の出発の準備

とはいったものの、現状のvimrcも使い慣れている部分は多々あり現在の環境を完全に手放すのも色々と支障が出てしまいます。
なので、現行.vimrcと育成用.vimrcを切り替える方法を探してみたのですが見つからず、シェルスクリプトで切り替えるツールを作ってみました。

change vimrcということで、cvrc.shというスクリプトです。実行すると、~/.vimrcエイリアスのリンク先を、dotfilesディレクトリ内にある.vimrc と .vimrc_bringupを交互に切り替える動作をします。

#!/usr/bin/env zsh

oldlink=`readlink ~/.vimrc`
if test $oldlink = "/Users/${USERNAME}/dotfiles/.vimrc"; then
    newlink="/Users/${USERNAME}/dotfiles/.vimrc_bringup"
elif test $oldlink = "/Users/${USERNAME}/dotfiles/.vimrc_bringup"; then
    newlink="/Users/${USERNAME}/dotfiles/.vimrc"
else
fi
ln -sf $newlink ~/.vimrc
echo "changed alias ${oldlink} -> \e[32m${newlink}\e[m"

今日は出発の準備編ということで、これから1つずつ増やして記事も書いていこうと思います。

YAPC::Nagoya::Tiny 2019 に参加しました

2019-11-3に愛知県名古屋市で開催されたYAPC::Nagoya::Tiny 2019に参加してきました。
YAPCとは、プログラミング言語"Perl"を軸とした技術カンファレンスです。 f:id:tomcha0079:20191103102925j:plain:w450

今回は1日だけの縮小版のYAPC。色々な地方のPerlコミュニティを育て、いずれはフルサイズ版YAPCが開催できる様にとのミッションを掲げられて開催とのことです。

名古屋の印象

名古屋は関西からも東京からも新幹線で1時間〜1時間30分あれば到着でき、新幹線の駅が都心部直結なので関西・関東のどちらからも参加しやすい感じでした。
今回は10:30開場、11:00スタートだったので前乗りはせず、朝一番の新幹線で新大阪から名古屋へ向かいました。

本編トーク

技術者ではないので難しいトークは理解して消化までは難したっかです。
その中でazumakuniyukiさんのmakeの話は、makeコマンドを使った事がなかったので色々な自動実行タスク集として使うのが便利そうで、自分もやってみようと思いました。特にgit ammend何やったっけ?は自分でもしょっちゅうあるのでとても共感しました。
また、木本さんのトークの中でも、Linuxコマンドのオプションが覚えられない!との話題もあり、プロのエンジニアの方々も自分と同じ悩み?を持っているのが新鮮でした。
utagawakkさんの多言語使いのPerlについての話は、普段Perl入学式サポーターでは初心者寄りの気持ち担当を自称していながら、「あー、そんなところを疑問に思うのか!」という既に当たり前になっている視点を改めて知ることができてとても刺さりました。

また、ゲストスピーカーの伊奈 林太郎さんの「はてなブックマークの歴史」のトークは、専門知識は分からないながらも、普段使っている巨大サービスも、コツコツと少しずつ改修を積み上げて運用・改修していくんだなーと、サービス改修の歴史の裏側が知ることができ、異業種ながらプロジェクトX的な仕事の話の様でとても面白かったです。

LTでは、八雲アナグラさんのリガ道中記は、なかなか海外カンファレンスと経験する機会はないので、もっともっと長時間でレポート聞きたいLTでした。

ランチタイム

お昼は歩いて名古屋名物味噌煮込みうどんを食べに行きました。熱々で体もホットに温まりました。
f:id:tomcha0079:20191103125106j:plain:w450

懇親会、2次会、3次会

公式の懇親会は焼酎がたくさんある居酒屋さんでした。そして二次会はキャッシュオンのビールのお店、三次会は和民へ。
はてな社の方々や、著名なPerlHackerの方々とご一緒できました。charsbarさんのPerlへの熱い想いがすごく伝わってきてとても印象的でした。微力ながら自分でも出来る事をコミュニティに恩返ししたいなぁと思いました。またhitode909さんご夫妻ともお話もできて楽しかったです。
カンファレンス本編も、その後の懇親会での交流もとても有意義で楽しい1日でした。

名古屋土産

名古屋のお土産は紹介されていたソウルフードを。

これめちゃめちゃ美味しくて、家族からまた名古屋へ行った時に買ってきてと催促されました。寿がきや味噌煮込みうどん、マジおすすめ。

次回YAPC

さて、次のYAPCは2020年3月27日〜28日に開催される京都!

blog.yapcjapan.org

微力ながらお手伝いもさせて頂いております。フルサイズのYAPC、今回Nagoyaへ参加された方も参加できなかった方も一緒に楽しみましょう!今から楽しみですね!

Perl入学式

さて、直近のPerl入学式ですが、2019年11月30日にin大阪は第5回が、in東京は秋開講第1回が開催されます。

perl-entrance-osaka.connpass.com

perl-entrance-tokyo.connpass.com

どちらも興味ある方は参加してみてください!

カンファレンスに行ってみよう!

カンファレンスって何でしょう? それは、ITエンジニアの参加型お祭り?!とても楽しくて為になるイベントです。でも初めて参加するとなると、なんだか敷居が高くて初めて行くには不安がありますね。ましてや初心者やコミュニティに参加したばかりだと参加する勇気が出ないかもしれません。
しかしそれは大変もったいない!

自分のカンファレンス初参加は、2012年にYAPC::Asiaでした。夏休みの旅行を兼ねて参加してみて、色んなPerlやプログラミング技術の発表を聞いたり、考え方などのマインド的なトークを聞いたり、面白い技術を使ったネタトークなど何もかもが新鮮でとても興味深い濃密な時間が過ごせました。
また、カンファレンスには"懇親会"が付き物で、お酒を飲みながら(飲めない人はソフトドリンクで)ざっくばらんに技術の事を教えてもらったり、とにかく本編もアフターも楽しい事&有益な事づくしです!

そして毎年YAPCに参加しているうちに、いつもの勉強会で話した事のある知っている人をHubにして、知り合いから知り合いへエンジニア繋がりを広げていきました。
Perl Mongerの皆さんはとても優しい良い人たちばかりだったので、どんどんPerlのコミュニティにのめり込み、今でもPerl入学式のスタッフとしてコミュニティへ参加させてもらっています。
エンジニアではない自分でもこれだけ楽しめて実りがあるイベントなので、エンジニアの方(若手もシニアも全ての方も)やエンジニア志望の方なら絶対にカンファレンスに参加した方が良いと自信を持っておすすめします!

そして、YAPC::Nagoya::Tiny 2019 が11月3日(日)に名古屋で開催されます。

yapcjapan.connpass.com

"Tiny"とは、小さなという意味。
毎年恒例のYAPCより規模を小さくしての1日ポッキリ開催のカンファレンスです。丸一日色んな人のトークが聞けて、チケット代は1,000円と非常にお得です。
また、規模が小さいということは、それだけ参加者同士の距離が近くなるということ。全国各地の初心者仲間から、普段ではなかなか知り合う事ができない凄腕ハッカーまで、色んな人達と交流できるチャンスです!すでに懇親会の告知ももう始まってますね。

yapcjapan.connpass.com

もちろん私も参加します!すでに本編チケットも懇親会チケットも入手購入済みです。 それでは、YAPC::Nagoya::Tiny 2019でお会いしましょう!

そうそう、通常サイズの大型カンファレンス、 YAPC::Kyoto も2020年3月に開催されますよ!

blog.yapcjapan.org

Perlで色々なアルゴリズムを実装してみた その2

アルゴリズムの実装力を養成するため、Perlで書いてみましたの続編です。

こちらの本の第8章から

図解入門よくわかるアルゴリズムの基本と仕組み (How‐nual Visual Guide Book)

図解入門よくわかるアルゴリズムの基本と仕組み (How‐nual Visual Guide Book)

再帰(第8章)

再帰アルゴリズムとは、その関数が目的を達成するまで、自分自身を何度も呼び出す構造となっている面白い構造です。
自分自身を深く深く掘り下げて、到達点に達した途端にすべてが解決するという、ピタゴラスイッチ的な面白い仕組みでとても好きなアルゴリズムです。
が、この「どう自分自身を掘り下げる(関数を呼び出す)か」「解決の到達点は何なのか」の勘所がなかなか難しいアルゴリズムでもあります。

最大公約数を求めるコード

2つの数の最大公約数を求める方法にユークリッドの互除法という方法があるそうです。2つの数を互いに割り算していくと答えが出る方法です。
その方法の理解はまだ出来ていませんが、とりあえずその仕組みを再帰で実装してみました。
「何度も割り算をしていく」が自分自身を掘り下げる関数に、「余りが0になった時」が解決の到達点っぽいですね。

最大公約数をユークリッドの互除法を使って再帰で実装する

階乗を求める

1からある数まで、1ずつ増やした数を掛け算した答えをだす(1 * 2 * 3 * ... * n)問題です。
掛けていく数を1ずつ増やすより、逆にnから1ずつ減らしていって最後に1になった時を解決の到達点と考えるのがポイントです。

階乗を求める

クイックソート

クイックソートは並べ替えのアルゴリズムの1つです。並べ替える元データから任意の1つの値を取り出し、その値より大きいグループと小さいグループの2つのグループに分け、出来たグループでまた同じ動作をしていきます。各グループの要素数はだんだん少なくなっていき、グループ分けが出来なくなるまで少なくなればそこが到達点 と考えます。
まずは自分なりに考えてたコードです。問題点は、グループ分けした要素(配列)を量産しているので、実行時のメモリを沢山使っているところです。

クイックソート1

クイックソートその2

本の実装例では、その1の問題点を見事に解決(新しい配列を量産するのではなく、元の配列内の数値をうまいこと入れ替えることで実装)していたので、その考え方で実装してみました。
配列の値をコピーするのではなく、元の配列の値の場所を入れ替える・・・そう、リファレンスの出番ですね。

クイックソートその2

ニュートン法

微分を使って平方根の値(近似値)を求める方法です。
ニュートン法自体の理解は数学的素養が必要なので、最近通っている高校数学勉強会での知識で、なんとなく分かった様な気がしている状態ですが、理屈の実装自体は難しくありません。

ニュートン法

台形法

ある関数(数学の)で書かれたグラフの面積を、定積分を使って求める方法です。
ニュートン法と同様、数学的素養が必要ですが、理屈の実装自体は難しくありません。

台形法

ダイクストラ

経路探索のアルゴリズム駅すぱあとみたいなやつですね。
自力ではさっぱり分からなかったので解説を読んで実装しました。すべての点の最短経路を求めるていき、その点がゴールなら解決するというアルゴリズムです。

ダイクストラ法

色々な基本アルゴリズムを実装してみましたが、このあたり全てがヒントなしでスラスラ書けるようになれたらなぁと思います。
まだ難しいアルゴリズムはすぐに忘れてしまいそうになるので、精進あるのみです。

Perlで色々なアルゴリズムを実装してみた

ちょいちょい参加している AtCoder で、二分探索のアルゴリズムを時間内に実装する自身がなかったので、基本的なアルゴリズムを手を動かした実装してみました。
まぁ、ソートやサーチなんかは、大体の言語でメソッドや組み込み関数が定義されているので実務で使うことは無いと思いますが、実際にどういう動きをするかを頭で考えてコードで表現する訓練は大事だなぁと思って色々書いてみました。

アルゴリズムについては色々書籍が販売されていますが、手頃な感じの本を入手して最初の問題からコードを書いてみました。普遍的な知識ですね。

図解入門よくわかるアルゴリズムの基本と仕組み (How‐nual Visual Guide Book)

図解入門よくわかるアルゴリズムの基本と仕組み (How‐nual Visual Guide Book)

それぞれのコードは、どんな動きをするのかの趣旨だけ読んで自分なりにコーディングしてみたので、コードにツッコミやアドバイス等々あればお手柔らかにお願いします(笑)。
まずは第7章までの基本編。

値の集合から、条件にあった値を取り出すコード(第4章)

合計

sum

数を数える

count

平均

average

最大値

max

最小値

min

まぁ、この辺りは基本編ですね。プログラミングの初心者の方は、このあたりからコードを書いてちゃんと動くか試してみると良いと思います。Perl入学式の復習にもどうぞ。

順番をソートするアルゴリズムの実装(第6章)

選択ソート

selection_sort

バブルソート

bubble_sort

挿入ソート

insert_sort

シェルソート

shell_sort

ちょっとアルゴリズムっぽくなってきました。シェルソートはグループ分けをどう実装するか、頭の中だけで考えるだけでは混乱したので、実際に動きをノートに書き出して実装しました。
頭で考えて書いたコードは思うような結果になりませんでしたが、ノートに書いて整理するとあっさりと書けました。いきなり書かずにまず整理。
どんな言語でも通用する基本って大事。

値の集合から特定の値を探索するアルゴリズムの実装(第7章)

線形探索

linear_search

二分探索(当たり入り)

binary_search

二分探索(当たりなし)

binary_search2

文字列の照合

strings_search

アルゴリズムの実装、頭の体操的にも面白いですね。引き続き第8章以降もやっていきたいと思います。