人生シーケンスブレイク

シーケンスブレイク(Sequence breaking、シークエンスブレイクとも)とは、テレビゲームにおいて開発が想定している攻略ルートを逸脱し、ショートカットする行為のことである。

Django 2.x で Haml ライクなテンプレートを使う

Django記事シリーズ

の1つ目。

nyaruka/django-hamlpy を入れてHamlライクなシンタックスを実現する。

django-hamlpy は特にアナウンスされてないがDjango 2.0.3 でも動作が確認できた。また、Django 1.11.7でも以前に動作確認済み。
ちなみに上記のフォーク元の jessemiller/HamlPy はメンテされていないので現在は動かない。

導入手順

django-halmpyインストール

$ pip install django-hamlpy

補足: alpine環境でdjango-hamlpyインストールの際はgccmusl-devが事前に必要。

ENV RUNTIME_PACKAGES="gcc musl-dev"
RUN apk --update add $RUNTIME_PACKAGES

settings.py変更

テンプレートローダーへ追加

*.haml*.hamlpy ファイルをテンプレートとして読み込み可能にする為に、settings.pyのTEMPLATES内のloadersを以下のように書き換える。

TEMPLATES=[
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['./templates'],
        'OPTIONS': {
            'context_processors': [...] # 略
            'loaders': (
                'hamlpy.template.loaders.HamlPyFilesystemLoader',
                'hamlpy.template.loaders.HamlPyAppDirectoriesLoader',
            ), 
        }
    }
]

APP_DIRS オプションは loaders オプションと競合するので注意。

補足: テンプレートキャッシュを使う場合

本番環境などでテンプレートキャッシュを利用したい場合には、以下のようにする。

TEMPLATES=[
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['./templates'],
        'OPTIONS': {
            'context_processors': [...] # 略
            'loaders': (
                ('django.template.loaders.cached.Loader', (
                    'hamlpy.template.loaders.HamlPyFilesystemLoader',
                    'hamlpy.template.loaders.HamlPyAppDirectoriesLoader',
                    ...
                )),
            )
        }
    }
]

既存テンプレート書き換え

今回は Writing your first Django app, part 1 | Django documentation | Django の polls/index.html を例に書き換えしてみる。

Before: polls/index.html

{% load static %}

<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}" />

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

After: polls/index.html.haml

- load static

  %link{ rel: 'stylesheet', type: 'text/css', href: "{% static 'polls/style.css' %}" }

- if latest_question_list
  %ul
    - for question in latest_question_list
      %li
        %a{ href: "{% url 'polls:detail' question.id %}" }
          = question.question_text
- else
  %p
    No polls are available.

views.py書き換え

template_nameを.haml付きに書き換える。

class IndexView(generic.ListView):
    template_name = 'polls/index.html.haml'

これでエラー無く表示できたらOK。

f:id:ShineSpark:20180312183805p:plain

参考として、↓のリポジトリソースコードを公開しています。 github.com

Railsで、後からcounter_cacheを追加した時にcounter_cacheの初期値を入れたい

サービスリリース後に counter_cache を追加したので、既存レコードのcounter_cacheをリセットしたくなった。

やり方

reset_counters メソッドを利用するとカウンターリセットできる。

Room.reset_counters(id, :column)

子要素の要素数に合わせて修正してくれるので、数値ズレが出てしまった際にも利用可能。

reset_counters (ActiveRecord::Base) - APIdock

適用

Railsコンソール上で、以下のように叩くと全レコードのカウンターをリセットできる。

Room.all.each {|i| Room.reset_counters(i.id, :messages_count)}

レコード数がそれなりにある場合には、 find_each を使う方が良い。

Room.find_each {|i| Room.reset_counters(i.id, :messages_count)}

# バッチサイズを変更したい場合
Room.find_each(batch_size: 100) {|i| Room.reset_counters(i.id, :messages_count)}

migration file にそのまま書いてしまう場合はこう

class AddMessagesCountToRoom < ActiveRecord::Migration
  def up
    add_column :rooms, :messages_count, :integer, default: 0
    Room.find_each {|i| Room.reset_counters(i.id, :messages_count)}
  end
 
  def down
    remove_column :rooms, :messages_count, :integer
  end
end

メタプログラミングRuby

メタプログラミングRuby

Rails5で、Railsコンソールでupdated_atを更新せずにカラムを更新する

環境

状況

  • インターネットで調べた User.record_timestamps = false などを行っても、updated_atが更新されてしまった。
  • mysqlのテーブル情報を確認したら、ON UPDATE CURRENT_TIMESTAMP が付いていた。
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

対応

updated_at カラムに直接元のupdated_atを指定するSQLを実行したらupdated_atを更新せずに更新できた。

User.connection.execute("UPDATE users SET published_at = created_at, updated_at = updated_at WHERE published_at IS NULL")

メタプログラミングRuby

メタプログラミングRuby

使わないiOS Simulatorを削除する

Xcode上で古いiOS Simulatorが残ったままになっている為、手動で削除する。

f:id:ShineSpark:20180309150323p:plain

ここに古いSimulatorが残っている状態なのを解消する。

Runtimeを削除する

/Library/Developer/CoreSimulator/Profiles/Runtimes から、不要なシミュレータのバージョンのディレクトリを削除する。 rmtrash を使っている人はrmをシングルクォートで括って実行しよう。

/Library/Developer/CoreSimulator/Profiles/Runtimes $ sudo 'rm' -rf iOS\ 10.1.simruntime/
/Library/Developer/CoreSimulator/Profiles/Runtimes $ sudo 'rm' -rf iOS\ 10.3.simruntime/

シミュレータ環境の削除

~/Library/Developer/Xcode/iOS DeviceSupport にもバージョンごとにディレクトリが作成されているので、ここも削除する。

~/Library/Developer/Xcode/iOS DeviceSupport $ ll
total 0
drwxr-xr-x   6 user  staff   192B  1 25 14:41 ./
drwxr-xr-x  32 user  staff   1.0K  1 24 15:48 ../
drwxr-xr-x   5 user  staff   160B  1 25 12:00 11.2 (15C114)/
drwxr-xr-x   5 user  staff   160B  1  5 15:42 11.2.1 (15C153)/
drwxr-xr-x   5 user  staff   160B  1 16 12:55 11.2.2 (15C202)/
drwxr-xr-x   5 user  staff   160B  1 25 12:49 11.2.5 (15D60)/

自分は一度まっさらな状態にしたかったので全て消した。

~/Library/Developer/Xcode/iOS DeviceSupport $ rm 11.2*

確認

Xcodeを再起動して、Simulator一覧を確認したら、古いバージョンのものが削除されていることを確認。

f:id:ShineSpark:20180309150323p:plain

ビルド対象の一覧からも、不要なものが削除されていることを確認した。
(シミュレータ起動時に自動で再作成される)

f:id:ShineSpark:20180309154740p:plain

参考

特定ディレクトリ配下のgitリポジトリのみ別のconfig設定を適用する

デフォルトはGitHub用の設定を利用しているが、会社で利用しているGitLabだけhttp.proxyを適用したい際に以下の方法で実現した。

前提

以下のようなディレクトリ構成を想定

~/git/
├── GitHubのリポジトリ1
├── GitHubのリポジトリ2
├── ...
└── office/ # このディレクトリ配下のみ別の git config を適用したい
    ├── 会社用のリポジトリ1
    ├── 会社用のリポジトリ2
    └── ...

手順

~/.gitconfig に以下の設定を追記する

[includeIf "gitdir:~/git/office/"]
  path = ~/git/office/.gitconfig

会社用の設定を .gitconfig ファイルに記述する

このケースでは、 ~/git/office/.gitconfig に記述する。 以下の記述内容は例。

[user]
    name = <name>
    email = name@example.com
[http]
    proxy = proxy.example.com:8080

使う

~/git/office/ 以下では、~/git/office/.gitconfig の設定もインクルードされる。

リポジトリ単位で個別に設定する必要がなくなるので非常に便利。

参考: Git - git-config Documentation

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉

  • 作者:湊川 あい
  • 発売日: 2017/04/21
  • メディア: 単行本(ソフトカバー)

Ubuntuでsudo apt-get -y upgradeするとdialogで止まる

概要

Packer で Ubuntu AMI を作成しようとしたら、 apt-get -y upgrade で処理が止まって困った時の解決方法。 もしかしたら Docker や Ansible でも出るのではないか。

{
  "variables": {
    "aws_access_key": "{{env `AWS_ACCESS_KEY_ID`}}",
    "aws_secret_key": "{{env `AWS_SECRET_ACCESS_KEY`}}",
    "region": "ap-northeast-1"
  },
  "builders": [{
    "type": "amazon-ebs",
    "access_key": "{{user `aws_access_key`}}",
    "secret_key": "{{user `aws_secret_key`}}",
    "region": "{{user `region`}}",
    "source_ami_filter": {
      "filters": {
        "virtualization-type": "hvm",
        "name": "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*",
        "root-device-type": "ebs"
      },
      "owners": ["099720109477"],
      "most_recent": true
    },
    "instance_type": "m3.medium",
    "ssh_username": "ubuntu",
    "ssh_timeout": "5m",
    "ami_name": "AMI/ubuntu/{{isotime | clean_ami_name}}"
  }],
  "provisioners": [{
    "type": "shell",
    "inline": [
      "sudo apt-get update",
      "sudo apt-get upgrade -y", # ここで止まる
      "sudo apt-get install -y python3-pip",
      "(略)"
    ]
  }]
}

確かにサーバーに直接ログインし、 apt-get upgrade -y したらインタラクティブな画面になってしまい、コマンド操作不能な状況になっていた。
これはヒドい。

対応方法

sudo apt-get upgrade -y ではなく、 sudo DEBIAN_FRONTEND=noninteractive apt-get upgrade -yq を使う。

参考:

うぶんちゅ! (電撃コミックスEX)

うぶんちゅ! (電撃コミックスEX)

Amazon LinuxでConfluenceのマクロの豆腐文字化けを直す。

概要

Amazon LinuxでConfluence 6.6.1をインストールしたら、

Confluence のマクロで日本語が表示されない - Atlassian Documentation や、 Docker ComposeでConfluenceを構築する - Qiita の対応を行っても文字化けが解消されなかったのだが、以下の方法で解消されたので記録。

インストール状況

  • service起動する為に、実行バイナリ版を sudo 付きでインストール
  • その為、java実行環境はOSのものではなくConfluence同梱の /opt/atlassian/confluence/jre

対応方法

例によって ipa-gothic をインストール

$ sudo yum install -y ipa-gothic-fonts

/opt/atlassian/confluence/bin/setenv.shに追記指定するパスは、 fallbackにフォントをコピーだったりシンボリックリンクでなく、直接 /usr/share/fonts/ipa-gothic/ を指定する。

CATALINA_OPTS="-Dconfluence.document.conversion.fontpath=/usr/share/fonts/ipa-gothic/ ${CATALINA_OPTS}"

これで Confluence を再起動すると、マクロのタイトル部分の文字化けが解消する。

CONFLUENCE

CONFLUENCE

  • アーティスト:NOB
  • 発売日: 2017/11/22
  • メディア: CD