zshrcとzshrc-eの違い

zshlsofnestatコマンドが使えなくなっていたので、調べたらbrew install zsh --enable-etcdirで直るとのこと。zshを一度消して、再インストールをしたらホームディレクトリに.zshrc-eとファイルが出来ていました。

zsh5.0.5を入れたら、PATHがおかしくなった - くろの雑記帳

中身は.zshrcと同じっぽかったので、それを.zshenvから読み込むようにsource ~/.zshrc-eと記載したのですが、どう読み込んでいないようです。結果としては.zshrc-e.zshrcにリネームして読み込むようにしたら直りました。

下記によると、.zshrc-eのeはexampleという意味だったようです。.zshrcのサンプルコードだったわけですね。

osx - What is the difference between .zshrc and .zshrc-e - Super User

Railsのモデルをループで回してdestoryする時に、関連テーブルのレコードも削除したい

下記のモデルと対応するテーブル、3つずつ作成して実験しました。括弧内はカラムを表しています。

  • Post(title)
  • Tag(name)
  • PostTag(postid, tagid)

これでdb/seeds.rbにレコードの追加、削除を記述します。title1という記事につけられたtag2を削除します。これで関連テーブルであるPostTagのレコードは削除されるのでしょうか?

# db/seeds.rb
Post.create(title: "title1")
Post.find(1).tags.create(name: "tag1")
Post.find(1).tags.create(name: "tag2")
Post.find(1).tags.create(name: "tag3")

Post.find(1).tags.all.each do |tag|
  if tag.name == "tag2"
    tag.destroy
  end
end

rails dbで確認してみると関連テーブルのレコードは残ったままになっています。

sqlite> select * from posts;
1|title1|2015-10-05 05:11:36.390481|2015-10-05 05:11:36.390481
sqlite> select * from tags;
1|tag1|2015-10-05 05:11:36.423221|2015-10-05 05:11:36.423221
3|tag3|2015-10-05 05:11:36.437542|2015-10-05 05:11:36.437542
sqlite> select * from post_tags;
1|1|1|2015-10-05 05:11:36.429950|2015-10-05 05:11:36.429950
2|1|2|2015-10-05 05:11:36.434520|2015-10-05 05:11:36.434520
3|1|3|2015-10-05 05:11:36.439099|2015-10-05 05:11:36.439099

for文の一時変数に入れたものでは消えないのでしょうか?いいえ。ちゃんとrailsには機能が備わっています。こういう時にdependent: :destroyを使います。

# app/model/post.rb
class Post < ActiveRecord::Base
  has_many :post_tags, dependent: :destroy
  has_many :tags, through: :post_tags
end

# app/model/tag.rb
class Tag < ActiveRecord::Base
  has_many :post_tags, dependent: :destroy
  has_many :post, through: :post_tags
end

# app/model/post_tag.rb
class PostTag < ActiveRecord::Base
  belongs_to :post
  belongs_to :tag
end

これでpostを削除した時、tagを削除した時に、そのidを持つposttagのレコードは削除されます。注意すべきところは、上記の例だとid:11のpostを削除した場合は、そのpostにつけられたtagが残っていてもpostid:1のpost_tagのレコードは削除されます。tagを削除した場合も同じことが起こります。

Railsのモデルバリデーションとカラム制約のユニークはどう挙動が変わるのか

下記のモデルと対応するテーブル、3つずつ作成して実験しました。括弧内はカラムを表しています。

  • Post(title)
  • Tag(name)
  • PostTag(postid, tagid)

db/shema.rbにadd_index :tags, :name, unique: trueを追加して、モデルにバリデーションを追加すると、エラーのスタックトレースが表示されます。

Loading development environment (Rails 4.2.3)
irb(main):001:0> Tag.create(name: "tag1")
   (0.1ms)  begin transaction
  SQL (0.7ms)  INSERT INTO "tags" ("name", "created_at", "updated_at") VALUES (?, ?, ?)  [["name", "tag1"], ["created_at", "2015-10-05 04:56:25.110261"], ["updated_at", "2015-10-05 04:56:25.110261"]]
SQLite3::ConstraintException: UNIQUE constraint failed: tags.name: INSERT INTO "tags" ("name", "created_at", "updated_at") VALUES (?, ?, ?)
   (0.1ms)  rollback transaction
ActiveRecord::RecordNotUnique: SQLite3::ConstraintException: UNIQUE constraint failed: tags.name: INSERT INTO "tags" ("name", "created_at", "updated_at") VALUES (?, ?, ?)
    from /Users/mitsuru/.rbenv/versions/2.2.2/gemsets/vainglory/gems/sqlite3-1.3.10/lib/sqlite3/statement.rb:108:in `step'
# ...省略
commands_tasks.rb:39:in `run_command!'
    from /Users/mitsuru/.rbenv/versions/2.2.2/gemsets/vainglory/gems/railties-4.2.3/lib/rails/commands.rb:17:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'

次はsema.rbだけではなく、モデルにvalidates :name, uniqueness: trueを加えて試してみます。

irb(main):001:0> Tag.create(name: "tag1")
   (0.1ms)  begin transaction
  Tag Exists (0.2ms)  SELECT  1 AS one FROM "tags" WHERE "tags"."name" = 'tag1' LIMIT 1
   (0.1ms)  rollback transaction
=> #<Tag id: nil, name: "tag1", created_at: nil, updated_at: nil>

返り値がちゃんとありますね。これでRuby側のプログラムが止まらずに対処できるようになります。

JavaScriptで座標を配列とオブジェクト、どちらで管理した方が処理が早くなるか実験

オブジェクトより配列を使ったほうが、計算が早くなると思いましたが実際は違いました。C言語の時は、プリミティブ値が連続的に配置された集まりだったから配列の走査が速いのかもしれません。JavaScriptだと配列はArrayオブジェクトなので、なるべくオブジェクトを増やすぐらいならプロパティを増やしたほうがいいということでした。まさか処理速度に約3倍の差が出るとは思いませんでした。

Wordpressにgistを貼り付けると行番号がずれて、文字と重なってしまう

ブログにログを貼り付ける際にgistを使用したのですが、行番号がずれてしまいました。使用しているテーマはWordpressのTwenty Fifteenです。

wrong_gist_number_lint_01_151003

下記の記事によると、cssの競合が起こっているようです。

CSS Conflict between WordPress Twenty Fifteen and embedded Github Gists | Gordon Lesti

テーマの編集からstyle.cssを選び、次を末尾に追加したら直りました。

.gist-file table { table-layout: auto; }

gitでコミットを取り消す方法を、初心者向けにログで解説

gitでさっきのコミットを取り消して、変更したい時がありますよね。その実演を初心者向けにログとして残しておきます。今回は、gistを使いましたが長いログを残すのには便利かなと思いました。gistを整理できるGistBoxというのがあるのですが、タグ機能は公式でつけて欲しいです。

Wantedlyの検索ページからURLの構造を学ぶ

RailsでのURL設計に悩んでいます。今回は検索ページのルーティングを学ぶために、Wantedlyを調べてみました。

検索ページのURLの構造

url_search_wantedly_01_151002

検索ページは次のようになっています。
https://www.wantedly.com/projects/mixed?fresh=true&occupations%5B%5D=engineer

ドメイン部分を外した例を見てみましょう。

フィルター
並び替え おすすめ
職種 エンジニア
職種 デザイナー

で検索するとURLは次のようになります。同じ分類を選んだ場合は、その都度key値が重複して記述されます。今回の場合はoccupationsが2つありますよね。
/projects?type=mixed&occupations%5B%5D=engineer&occupations%5B%5D=designer

ちなみに、%5B[%5D]を表しているようです。配列を表しているみたいですね。

クエリパラメータと英単語

テーブルヘッダーの2列目がクエリパラメータのkey値です。

職種 type
おすすめ mixed
新着 recent
人気 popular
職種 occupations
エンジニア engineer
デザイナー designer
ディレクター director
コーポレート・スタッフ corporate_staff
セールス sales
マーケティング marketing
その他 others
採用形態 project_tags
新卒採用 newgrad
学生バイト・インターン internship
中途採用 mid_career
社会人バイト・契約・委託 contract

「採用形態」も「特徴」でもproject_tags[]は使われています。この2つのプルダウンメニューはプロジェクトのタグのアーカイブ、分類ということです。

特徴 project_tags
勉強会の参加者募集 meetup
ランチをご馳走します lunch
学生さんも歓迎 student
友達と一緒に訪問OK friend
週末だけのコミットでもOK weekend
留学生さん歓迎 international
3000万円以上の新規を調達済み funded3k
1億円以上の資金を調達済み funded1m
東京以外の募集 country_side
NPO npo
社長がプログラミングできる ceocancode
社長がSFC出身 ceoissfc
社長が20代 ceoisin_20s
学生メインのチーム students
海外進出している overseas
TechCrunchに掲載実績あり techcrunch

日本語の表示名に対して英字はかなりシンプルなものを使用しています。意味が正確に直結するというより、イメージのできる名詞を選んでいる感じがしました。

特徴 fresh
Wantedlyに初登場 true

「特徴」のプルダウンメニューの中に1つだけproject_tagsではないものがありました。「特徴」というのはあくまで表示上の分類ということですね。

その他のprojectページ

url_search_wantedly_02_151002

「こちらもおすすめ」という部分を見てみます。

会社ランキングを見る /companies/ranking
今日のピックアップを見る /projects/pickup
動画募集を見る /projects/video
記事募集を見る /projects/writing

projectsの下位にvideowritingといったカテゴリ名がありますね。文字列の場合はフィルターとして使用しているみたいです。プロジェクト個別ページは/projects/29851のようにid値を使用しています。id値とフィルター文字列の使う階層が同じというところがポイントです。

ランキングページ

下記にはずらりと「今週の会社ランキング」が並んでいます。 `ttps://www.wantedly.com/companies/ranking

試しに一位をクリックしてみると、会社ページのIDらしきものがURLに含まれています。Twitterと似ていますね。ユーザーに個別ページをもたせる場合は、アカウント名を使用するのが主流なのかもしれません。 https://www.wantedly.com/companies/digitalmonkey-inc