memo-pad’s blog

自分のためのメモをまとめています。ここに書いてある内容については責任は負いません。全て自己責任でお願いします。

Linux MintでWQHDのモニタをつなぐとフリーズしてしまうときの対策

TL;DL

  1. 最近のCPUならxserver-xorg-video-intelをアンインストール
    apt remove xserver-xorg-video-intel
  2. PCを再起動 

状況

  • Thinkpad x220でLinux Mintを使用
  • DisplayPortでWQHD(2560x1440)のディスプレイと接続
  • デフォルトでWUXGA(1920x1200)が選択される
  • ディスプレイ設定からWQHDを選択すると、デスクトップ環境(Cinnamon)がフリーズ

調査 

何が悪そうか
  • ディスプレイドライバの問題?
  • DisplayPortのケーブル自体の問題?
  • X220自体の問題?
  • Linux Mintの問題?
  • Cinnamon環境の問題?
一通り調べた結果
  • Linux Mintのissueに、それらしきissueがありました。

github.com

OK, we've got news on this and it's turning to be (at least) an upstream issue in the Intel driver. We've got both good news and bad news about this....

Bad news: This driver is no longer maintained so it's very unlikely this will get fixed.

Good news: This driver is only useful for really old Intel GPUs (10 year old and more... the likes of i800x, i915, i965) and it is not recommended for recent Intel GPUs. Instead, it is recommended to use modesetting, not only to avoid this freeze issue, but also to get better performance.

Anyhow, there are two solutions to this problem:

Solution 1 - Recommended for people with modern Intel GPUs (2007 and newer)

Remove the Intel driver to use modesetting instead:

apt remove xserver-xorg-video-intel

And then reboot the computer.

Solution 2 - Recommended for people with old Intel GPUs (i965, i915, i8xx..etc)

Disable VSync:

echo CLUTTER_VBLANK=none >> ~/.profile

And then log out.

日本語でざっくり

clefebvreさんのこの文章読むと、

  • このIntelのドライバ(xserver-xorg-video-intel)は10年以上前の古いIntel GPUのためのもので、最近のIntel GPUでは非推奨
  • 代わりに、modesettingを使うのが推奨されている
  • modesettingにすると、フリーズ問題を回避できるだけじゃなく、パフォーマンスもよくなる

というようなことが書いてあります。

対策

ということで、Solution1に書いてあるxserver-xorg-video-intelをアンインストール後、再起動というのを試してみました。

 

 再起動後にWQHDディスプレイに接続すると、前回と違って最初からWQHDがデフォルトで選択されており無事出力されました。

 

もし、同じような現象起こっている人がいれば、参考までにどうぞ。

PostgreSQLとPostGISで位置情報を使用する

現在地と近いデータ持ってくるのにPostgreSQLPostGISを使ったので、その時の構築メモ

現在地取得の仕方とかは書いてないです

環境

PostgreSQLインストール

$ wget https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm
$ sudo rpm -ivh pgdg-centos10-10-2.noarch.rpm
$ ls -l /etc/yum.repos.d/
-rw-r--r--  1 root root 1004 Sep 24 18:54 pgdg-10-centos.repo
$ sudo yum install postgresql-server --disablerepo=* --enablerepo=pgdg10
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~略~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Installed:
  postgresql10-server.x86_64 0:10.2-1PGDG.rhel7

Dependency Installed:
  postgresql10.x86_64 0:10.2-1PGDG.rhel7
  postgresql10-libs.x86_64 0:10.2-1PGDG.rhel7

Complete!

PostGISインストール

$ sudo yum install postgis24_10
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~略~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Installed:
  postgis24_10.x86_64 0:2.4.3-1.rhel7

Dependency Installed:
  CGAL.x86_64 0:4.7-1.rhel7
  CharLS.x86_64 0:1.0-5.el7
  SFCGAL.x86_64 0:1.2.2-1.rhel7
  SFCGAL-libs.x86_64 0:1.2.2-1.rhel7
  SuperLU.x86_64 0:5.2.0-5.el7
  armadillo.x86_64 0:8.300.0-1.el7
  arpack.x86_64 0:3.1.3-2.el7
  atk.x86_64 0:2.22.0-3.el7
  atlas.x86_64 0:3.10.1-12.el7
  avahi-libs.x86_64 0:0.6.31-17.el7
  blas.x86_64 0:3.4.2-8.el7
  boost-serialization.x86_64 0:1.53.0-27.el7
  cairo.x86_64 0:1.14.8-2.el7
  cfitsio.x86_64 0:3.370-10.el7
  cups-libs.x86_64 1:1.6.3-29.el7
  fontconfig.x86_64 0:2.10.95-11.el7
  fontpackages-filesystem.noarch 0:1.44-8.el7
  freexl.x86_64 0:1.0.4-1.el7
  gdal-libs.x86_64 0:1.11.4-12.rhel7
  geos36.x86_64 0:3.6.2-3.1.rhel7
  giflib.x86_64 0:4.1.6-9.el7
  graphite2.x86_64 0:1.3.10-1.el7_3
  gtk-update-icon-cache.x86_64 0:3.22.10-5.el7_4
  gtk2.x86_64 0:2.24.31-1.el7
  harfbuzz.x86_64 0:1.3.2-1.el7
  hdf5.x86_64 0:1.8.12-10.el7
  hicolor-icon-theme.noarch 0:0.12-7.el7
  lapack.x86_64 0:3.4.2-8.el7
  lcms2.x86_64 0:2.6-3.el7
  libICE.x86_64 0:1.0.9-9.el7
  libSM.x86_64 0:1.2.2-2.el7
  libXcomposite.x86_64 0:0.4.4-4.1.el7
  libXcursor.x86_64 0:1.1.14-8.el7
  libXdamage.x86_64 0:1.1.4-4.1.el7
  libXext.x86_64 0:1.3.3-3.el7
  libXfixes.x86_64 0:5.0.3-1.el7
  libXft.x86_64 0:2.3.2-2.el7
  libXi.x86_64 0:1.7.9-1.el7
  libXinerama.x86_64 0:1.1.3-2.1.el7
  libXrandr.x86_64 0:1.5.1-2.el7
  libXrender.x86_64 0:0.9.10-1.el7
  libXxf86vm.x86_64 0:1.1.4-1.el7
  libaec.x86_64 0:1.0.2-1.el7
  libdap.x86_64 0:3.13.1-2.el7
  libgeotiff.x86_64 0:1.4.0-1.rhel7
  libgfortran.x86_64 0:4.8.5-16.el7_4.1
  libgta.x86_64 0:1.0.4-1.el7
  libquadmath.x86_64 0:4.8.5-16.el7_4.1
  libthai.x86_64 0:0.1.14-9.el7
  libtool-ltdl.x86_64 0:2.4.2-22.el7_3
  libwebp.x86_64 0:0.3.0-7.el7
  libxshmfence.x86_64 0:1.2-1.el7
  libxslt.x86_64 0:1.1.28-5.el7
  lyx-fonts.noarch 0:2.2.3-1.el7
  mesa-libEGL.x86_64 0:17.0.1-6.20170307.el7
  mesa-libGL.x86_64 0:17.0.1-6.20170307.el7
  mesa-libGLU.x86_64 0:9.0.0-4.el7
  mesa-libgbm.x86_64 0:17.0.1-6.20170307.el7
  mesa-libglapi.x86_64 0:17.0.1-6.20170307.el7
  mpfr.x86_64 0:3.1.1-4.el7
  netcdf.x86_64 0:4.3.3.1-5.el7
  ogdi.x86_64 0:3.2.0-4.rhel7
  openblas-openmp.x86_64 0:0.2.20-3.el7
  openjpeg-libs.x86_64 0:1.5.1-17.el7
  openjpeg2.x86_64 0:2.1.0-7.el7
  pango.x86_64 0:1.40.4-1.el7
  pixman.x86_64 0:0.34.0-1.el7
  poppler.x86_64 0:0.26.5-17.el7_4
  poppler-data.noarch 0:0.4.6-3.el7
  postgresql10-contrib.x86_64 0:10.2-1PGDG.rhel7
  proj49.x86_64 0:4.9.3-3.rhel7
  unixODBC.x86_64 0:2.3.1-11.el7
  xerces-c.x86_64 0:3.1.1-8.el7_2

Complete!

PostgreSQL+PostGISでサンプル実行

準備

$ sudo /usr/pgsql-10/bin/postgresql-10-setup initdb
Initializing database ... OK
$ sudo systemctl start postgresql-10
  • postgresユーザになり、DBに接続
$ sudo su postgres

$ psql -U postgres
could not change directory to "/root": Permission denied
psql (10.2)
Type "help" for help.
  • テスト用DBを作成
postgres=# CREATE DATABASE test;
CREATE DATABASE
  • テスト用DBに接続
postgres=# \connect test
You are now connected to database "test" as user "postgres".
  • PostGISが有効になっていることを確認
test=# CREATE EXTENSION postgis;
CREATE EXTENSION

test=# select PostGIS_full_version();
                                                                                postgis_full_version

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 POSTGIS="2.4.3 r16312" PGSQL="100" GEOS="3.6.2-CAPI-1.10.2 4d2925d6" PROJ="Rel. 4.9.3, 15 August 2016" GDAL="GDAL 1.11.4, released 2016/01/25" LIBXML="2.9.1" LIBJSON="0.11" RASTER
(1 row)

サンプルの実行

  • サンプル用のテーブル作成
postgres=# \connect test
You are now connected to database "test" as user "postgres".
test=# CREATE TABLE locations
test-# (
test(#   id bigserial NOT NULL,
test(#   name character varying(128) NOT NULL,
test(#   "position" geometry,
test(#   CONSTRAINT id PRIMARY KEY (id)
test(# )
test-# WITH (
test(#   OIDS=FALSE
test(# );
CREATE TABLE

(コピペ用)

CREATE TABLE locations
(
  id bigserial NOT NULL,
  name character varying(128) NOT NULL,
  "position" geometry,
  CONSTRAINT id PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
  • データの挿入(POINTは経度Lon 緯度Latの順番なので注意)
test=# INSERT INTO locations (id, name, position) VALUES (1, '東京駅', ST_GeomFromText('POINT(139.767052 35.681167)', 4326));
INSERT 0 1
test=# INSERT INTO locations (id, name, position) VALUES (2, '大阪駅', ST_GeomFromText('POINT(135.495951 34.702485)', 4326));
INSERT 0 1
test=# INSERT INTO locations (id, name, position) VALUES (3, '名古屋駅', ST_GeomFromText('POINT(136.906398 35.181446)', 4326));
INSERT 0 1
  • 博多駅(130.420611 33.590045)から近い順でデータを取得
test=# SELECT * FROM locations ORDER BY ST_DistanceSphere(position, ST_GeomFromText('POINT(130.420611 33.590045)', 4326)) OFFSET 0 LIMIT (5);
 id |   name   |                      position
----+----------+----------------------------------------------------
  2 | 大阪駅   | 0101000020E610000064ADA1D4DEEF60401D774A07EB594140
  3 | 名古屋駅 | 0101000020E61000001DE56036011D6140B9FE5D9F39974140
  1 | 東京駅   | 0101000020E61000009BCAA2B08B786140A60EF27A30D74140
(3 rows)

(補足)postgresユーザ以外からでもパスワードで接続できるように設定変更

$ sudo su postgres -c 'psql --username=postgres'
could not change directory to "/home/user": 許可がありません
psql (10.1)
Type "help" for help.
  • DBユーザのパスワード設定
postgres=# ALTER USER postgres with encrypted password 'postgres';
ALTER ROLE

postgres-# \q
  • pg_hba.confの設定を追加
$ sudo vim /var/lib/pgsql/10/data/pg_hba.conf

# 下記を他の設定より上に追加
local   all             postgres                                md5
host    all             postgres        127.0.0.1/32            md5
host    all             postgres        ::1/128                 md5

(追記後はこんな感じ)

# TYPE  DATABASE        USER            ADDRESS                 METHOD

local   all             postgres                                md5
host    all             postgres        127.0.0.1/32            md5
host    all             postgres        ::1/128                 md5
# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            ident
host    replication     all             ::1/128                 ident
  • 設定反映のためにPostgreSQLをリスタート
$ sudo systemctl restart postgresql-10
  • postgresqlユーザ以外からパスワード認証で接続できることを確認
psql -U postgres -h localhost -W

Visual Studio Codeでリモートサーバのファイルを編集する

今回使ったのはこちらのRemote VSCode marketplace.visualstudio.com

今回の環境

  • ローカル
linux mint 18.1
Visual Studio Code 1.16.1
Remote VSCode 1.1.0
  • リモート
ubuntu 16.04
rmate 1.0.0 (shell script版)

ローカルの設定

Remote VSCodeのインストール

  1. Visual Studio CodeでCtrl-pを押し、ext install remote-vscodeと入力後、Enter f:id:memo-pad:20171008210225p:plain

  2. 拡張機能の検索結果が表示されるので、Remote VSCodeをインストール f:id:memo-pad:20171008210229p:plain

  3. 拡張機能を再読み込みさせRemote VSCodeを有効化 f:id:memo-pad:20171008210232p:plain

Remote VSCodeの設定変更

  1. 「ファイル」-「基本設定」-「設定」からユーザ設定を開く f:id:memo-pad:20171008210235p:plain

  2. ユーザ設定のRemote VSCode Configurationが下記のような値になっているので、remote.onstartuptrueに変更する f:id:memo-pad:20171008210238p:plain f:id:memo-pad:20171008210240p:plain

Remote VSCode用のsshトンネルを作成

  1. 端末でリモートサーバとのssh tunnelを作成する
ssh -R 52698:127.0.0.1:52698 [リモートサーバのユーザ名]@[リモートサーバのホスト]

リモートの設定

今回はruby版ではなく、shell script版を利用する github.com

rmateのインストール

  1. rmateをダウンロードし、実行権限を付与
sudo wget -O /usr/local/bin/rmate https://raw.github.com/aurora/rmate/v1.0.0/rmate
sudo chmod a+x /usr/local/bin/rmate
  • 補足:最新版を入れるなら下記コマンド
sudo wget -O /usr/local/bin/rmate https://raw.github.com/aurora/rmate/master/rmate

rmateの実行

  1. リモートサーバで下記コマンドを実行すると、ローカルのVisual Studio Codeで指定したファイルが表示される
rmate -p 52698 [編集したいファイル名]
  • 注意
    • リモートサーバとのsshトンネルが切れていると失敗します
    • ローカル側でVisual Studio Codeを事前に立ち上げておかないと失敗します

更新の同期方法

ローカルでの更新内容をリモートに同期

  1. Visual Studio Codeで更新したファイルを保存するだけ

リモートでの更新内容をローカルに同期

  1. リモートのファイルを編集するときと同じ
rmate -p 52698 [更新したファイル名]

slackcatでconfigが読み込めない時

いつも通り~/.config/slackcat/configにconfigファイルを配置しても下記エラーが出て読み込めない。

slackcat missing config file at <configのパス名>
use --configure to create

コードを読んでみる

xdgの有無でconfig読む先が変わるようだ

参考:https://github.com/vektorlab/slackcat/blob/v1.3/config.go#L97-L105

configのパスの挙動

具体的にはこんな感じになる(xdgの有無は環境変数にXDG_で始まるものがあるかで判別してるっぽい)

  • xdgがない:$HOME/.slackcatに配置
  • xdgがある:
    • 環境変数にXDG_CONFIG_HOMEがある:$XDG_CONFIG_HOME/slackcat/config
    • 環境変数にXDG_CONFIG_HOMEがない:$HOME/.config/slackcat/config

オチ

そして、ここまで調べてManualにちゃんと書いてあることに気づく

参考:https://github.com/vektorlab/slackcat/blob/v1.3/docs/configuration-guide.md#default-path

If your environment specifies an XDG Base Directory, slackcat will use the configuration file at ~/.config/slackcat/config; otherwise, will fallback to ~/.slackcat

しかも、最初のエラーメッセージで<configのパス名>を表示してくれているので、そこに配置すれば良いだけだったりする

Docker内のNode.jsで作成したhttpサーバにアクセスできない

最近Docker上でNode.jsを動かして遊んでます。

遊んでる際に、Docker内のnodeで作ったhttpサーバにアクセスできないという問題があったのでメモ。

今回利用したファイル

  • test.js(ただ単にHelloWorldを返すだけのもの)
var http = require('http');
var server = http.createServer();

server.on('request', function(req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write('Hello World!!');
  res.end();
})

server.listen(1234, '127.0.0.1');
  • Dockerfile.node(nodeの実行環境作って、test.jsを動かしているだけ)
FROM centos:centos7
MAINTAINER memo

# package install
RUN yum update -y && \
 yum install -y vim && \
 yum clean all

# node install
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash && \
 export NVM_DIR="$HOME/.nvm" && \
 [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" && \
 nvm install v8.0.0


ENV PATH=/root/.nvm/versions/node/v8.0.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ADD test.js /root/test.js
EXPOSE 1234
CMD ["node", "/root/test.js"]

実際に行った手順

  • docker buildでDocker Imageを作成
$ sudo docker build --tag="centos7/node:v1.0" --file="/home/dockerroot/Dockerfile.node" .
  • 作成したImageからコンテナ起動
$ sudo docker run -d centos7/node:v1.1
  • 作成したアプリにアクセス
$ curl localhost:1234
curl: (7) Failed to connect to localhost port 1234: Connection refused

……つながらない

ここから試行錯誤

  • 試しにコンテナ内でcurlしてみる
$ sudo docker run -it centos7/node:v1.1 bash
# cd
# node test.js &
# curl localhost:1234
Hello World!!

いけた!!

  • ポートが設定されてないのかなとdocker ps をみてもportsに1234は設定されている……
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
d38253600f9b        centos7/node:v1.1   "node /root/test.js"   2 minutes ago       Up 2 minutes        1234/tcp            happy_khorana

もしかしたら、DockerfileのEXPOSE 1234の設定だけではポートマッピングが不十分なのか??

  • ポートマッピングをちゃんと指定してコンテナを走らせてみる
$ sudo docker run -p 1234:1234 -d centos7/node:v1.1
  • 作成したアプリにアクセス
$ curl localhost:1234
curl: (52) Empty reply from server

今度はポート自体はちゃんと設定されているっぽい。

ただ、ちゃんとhttpサーバからのresponseが返ってきてない??

  • よくわからないけど、試しにtest.jsのserver.listenのIPを0.0.0.0に変更してみる
server.listen(1234, '127.0.0.1');
↓

server.listen(1234, '0.0.0.0');
  • 再度アプリにアクセス
$ curl localhost:1234
Hello World!!

お!いけた!

やったことまとめ

  • server.listenのIPアドレスを0.0.0.0にした
  • docker runでコンテナ作成するときに-pオプションでポートを指定した

ただ、やり方的にこれが正しいかどうか、Node.jsもDockerも勉強中なのでわからない……

今後、触っていってわかったことがあったら追記していきます。

phpのcodegolf Tips

先日、身内でCodegolfをやったので、その時に学んだショートコーディングの知識をメモ

Codegolfというのは如何に文字数を少なくコードを記述するかを競う競技です。
コードゴルフ - Wikipedia

それではTipsのメモを書いていきます。

出力に改行を出したいときには\nは使わない

例えばこんなコード

echo "test\n";

こう書けば1文字少なくできます(改行分は1文字扱いのため2文字削減にはならない)

echo "test
";

関数にエイリアスがないかを確認する

例えば配列を結合して文字列にしたいときに下記のようにimplodeを使いますよね?

implode($array);

実はimplodeにはjoinというエイリアスが設定されているので、下記のように変更可能です。

join($array);

これだけで3文字分削減です。

ちなみにphpエイリアスhttp://php.net/manual/ja/aliases.phpに載っています。

foreachのas前後のスペースを削る

例えば通常だと下記のようにforeachを記述すると思います。

foreach($a as $b){}

しかし、実は下記のようにasと$bがくっついていても問題ありません。

foreach($a as$b){}

また、先頭が配列形式だったり、カッコがある場合はこんな風にくっつけても問題ないです。

foreach($a[0]as$b){}
foreach(explode(',',$a)as$b){}

要するにちゃんとパースしてくれそうな形式ならas前後にスペースはいらないということですね。

可変変数を使う

可変変数の詳しい説明はこちらPHP: 可変変数 - Manual

例えばa,b,cという文字が出現する回数を数える場合、普通ならこんな感じにかけます。

for(;$i=fgetc(STDIN);){++$a[$i];}
foreach(str_split("abc")as$v){echo $a[$v];}

ここで可変変数を使うとこうかけたりします。

for(;$i=fgetc(STDIN);){++$$i;}
foreach(str_split("abc")as$v){echo $$v;}

可変変数は使い方によっては結構文字数減らせるので面白いです。

echoする際には""をのぞける場合もある

例えば下記のようなコードは、

echo "test";

このように書き直すことができます。

echo test;

これは、phpの未定義の定数を使用した際の挙動を利用したものです。

詳しくはこちらPHP: 構文 - Manual

可変関数を使う

可変変数の次は可変関数です。

こちらは複数回同じ関数を使う際に有効になります。

可変関数の詳しい説明はこちらPHP: 可変関数 - Manual

例えばこんな感じで同じ関数を使用するとき

echo implode($a);
echo implode($b);
echo implode($c);
echo implode($d);
echo implode($e);

可変関数を使うと結構文字数を削減できます。

$i=implode;
echo $i($a);
echo $i($b);
echo $i($c);
echo $i($d);
echo $i($e);

ただ、実際は同じ関数使う部分は極力一か所にまとめたりするので、可変関数は使う機会が限られるかもしれません。

phpのショートタグを使う

通常php

<?php echo "test";

というコードは、

<?="test";

というように書くことができます。

一番最初にforなどの制御構造が来てしまう場合は使うのは難しいですが、使える状況だと結構削れます。

終わりに

他にも色々あった気がするのですが、今のところぱっと思い出せるのがこれくらいなので、思い出し次第適宜追記していきたいと思います。

codegolfをやってみると、今まで知らなかった言語の仕様なども知れるので、初めて触る言語の勉強にもちょうどいいと思います。

ということで、一緒にcodegolfやりましょう

rubyの勉強始めました

個人的に気になった特徴

  • 末尾にセミコロン(;)が不要

文字出力(print, puts, p)

  • Objectを文字列として出力する
    • print
    • puts
      • 改行が付与される
    • p
      • デバッグ用に使われる
      • オブジェクトの形式を含め表示

# コード
array = ['test1','test2','test3']

print array
puts array
p array

# 出力結果
test1test2test3test1
test2
test3
["test1", "test2", "test3"]
  • 上記のようにputsでは配列の要素1つ1つに対して改行が付与されていることがわかる
    • ハッシュに対しては特に要素毎の改行はされなかった

配列

定義

array = ['test1','test2','test3']

# コード
array = ['test1','test2','test3']
p array[0]     # 0番目、つまりtest1
p array[-1]    # 後ろから1番目、つまりtest3
## 要素の呼び出しは範囲でも可能
p array[0..2]  # 0から2まで
p array[0...2] # 0から1まで(2を含まない)

# 出力結果
"test1"
"test3"
["test1", "test2", "test3"]
["test1", "test2"]

ハッシュ

定義

hash = {"test1" => 10, "test2" => 20, "test3" => 30}

キーにシンボルというものを使って、下記のように表記することも可能(文字列キーよりアクセスが早い)

hash_symbol = {:test1 => 10, :test2 => 20, :test3 => 30}

また、シンボルは次の様に省略して記述可能(ruby1.9からサポート)

hash_symbol2 = {test1: 10, test2: 20, test3: 30}

# code
hash = {"test1" => 10, "test2" => 20, "test3" => 30}
p hash
hash_symbol = {:test1 => 10, :test2 => 20, :test3 => 30}
p hash_symbol
hash_symbol2 = {test1: 10, test2: 20, test3: 30}
p hash_symbol2

# 出力結果
{"test1"=>10, "test2"=>20, "test3"=>30}
{:test1=>10, :test2=>20, :test3=>30}
{:test1=>10, :test2=>20, :test3=>30}
  • ruby2.2.4でpで出力すると省略して記述したものも、通常のシンボルでの表記で出力された