ためすう

less で zip、gzip を開く

2018-08-04

目的

例えば、ログがローテートされて gzip 形式で保存されているファイルの確認をしたい時

ファイルを展開せずに確認する方法です。

実験

gzip のファイルを見る

$ vim test.txt

下記を入力します

test
test1
test222

test.txt.gz に圧縮します

$ gzip test.txt
方法1. less で見る
$ less test.txt.gz
方法2. gzcatで見る
$ gzcat test.txt.gz

zip のファイルを見る

$ vim ziptest.txt

下記を入力します

ziptest
ziptest1
ziptest222

zip ファイルを作ります

$ zip ziptest.txt.zip ziptest.txt
  adding: ziptest.txt (deflated 32%)
方法1. less で見る

zip ファイルの中身を確認することができました。

$ less ziptest.txt.zip

Archive:  ziptest.txt.zip
Zip file size: 191 bytes, number of entries: 1
-rw-rw-r--  3.0 unx       28 tx defN 18-Mar-03 15:35 ziptest.txt
1 file, 28 bytes uncompressed, 19 bytes compressed:  32.1%

php でファイルパスを検索する

2018-08-04

目的

アップロードされたファイルが見えないファイルかどうかを判別する時に

php の標準の関数を利用して、ファイルのパスで行うようにしました。

その時に使用する basename と dirname の挙動について調べてみます。

ちなみに

Windows では、スラッシュ(/) とバックスラッシュ () の両方がディレクトリ区切り文字として使われます。 その他の環境ではスラッシュ(/)になります。

やってみる

$ vim test.php
<?php

$files = [
    'p_dir1/p_dir2',
    'p_dir1/p_dir2/test.jpg',
    'test2.jpg',
];

foreach ($files as $v) {
    echo $v . "\n";
    echo "dirname: " . dirname($v) . "\n";
    echo "basename: " . basename($v) . "\n";
    echo "\n";
}

実行結果

$ php test.php
p_dir1/p_dir2
dirname: p_dir1
basename: p_dir2

p_dir1/p_dir2/test.jpg
dirname: p_dir1/p_dir2
basename: test.jpg

test2.jpg
dirname: .
basename: test2.jpg

参考URL

php でファイル操作する方法

2018-07-29

目的

大量のデータをバッチで処理する時に

最後まで処理した id をファイルに記録しておく必要がありました。

その時にファイル操作が必要だったので、挙動を確認します。

やってみる

position.txt に最後に処理した id を記憶します。

まずは、手動で作っておきます。

position.txt

100

php_file.php

<?php

// 最後に処理した id を取得します
$file_path = './position.txt';
$a = file($file_path);
var_dump($a);

$b = file_get_contents($file_path);
var_dump($b);

// id: 101 を処理
// id: 102 を処理
// ...
// id: 999 を処理

// 最後に処理した id を記録します
$c = file_put_contents($file_path, 999);
$c2 = file($file_path);
var_dump($c2);

実行結果

$ php php_file.php
array(1) {
  [0]=>
  string(4) "100
"
}
string(4) "100
"
array(1) {
  [0]=>
  string(3) "999"
}

参考URL

rbenv を使ってみる

2018-07-29

目的

ruby のバージョンを任意のタイミングで切り替えることができるようにします。

今回、rbenv を利用します。

方法

利用する ruby を指定します

$ brew upgrade ruby-build

インストールできる ruby を確認します

$ rbenv install --list

今回 ruby の 2.2.7 をインストールしたいので下記のように指定します

$ rbenv install 2.2.7

バージョンを確認します

$ rbenv versions

参考

公開鍵認証で ssh 接続する

2018-07-28

目的

レンタルサーバーを借りているのですが、

ssh 接続する時にパスワードを都度入力しています。

今回、 公開鍵認証でパスワードを入力せずに ssh 接続するできるようにします。

方法

鍵の生成

ローカル PC で秘密鍵、公開鍵を作成します。

$ cd ~/.ssh
$ ssh-keygen -t rsa -f hogehoge

ここで生成された hogehoge.pub が公開鍵です。

公開鍵をレンタルサーバーに転送

scp コマンドなどを駆使して先ほど作成した hogehoge.pub (公開鍵) を

レンタルサーバーに転送します。

公開鍵をレンタルサーバーに登録

$ touch ~/.ssh/authorized_keys
$ cat hogehoge.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

パーミッションは 600 にするのが良いようなので、今回指定します。

(なぜ 600 なのかは別の機会に…)

これで ssh 接続する時にパスワードが不要になります。

終わりに

ssh-keygen で鍵を作成する時に色々と強度があるようです。

参考

brew コマンドが動かなくなっていた件

2018-07-22

目的

brew コマンドでインストールしようとしたところエラーが発生しました。

どうにかして使えるようにした時の記録です。

発生したエラー

tmux を利用しようと思い、インストールしてみたところ下記のエラーが発生しました。

$ brew install tmux
==> Installing dependencies for tmux: makedepend, libevent
==> Installing tmux dependency: makedepend
==> Downloading http://xorg.freedesktop.org/releases/individual/util/makedepend-1.0.5.tar.bz2
Already downloaded: /Library/Caches/Homebrew/makedepend-1.0.5.tar.bz2
==> Downloading http://xorg.freedesktop.org/releases/individual/proto/xproto-7.0.25.tar.bz2
Already downloaded: /Library/Caches/Homebrew/makedepend--xproto-7.0.25.tar.bz2
==> ./configure --disable-silent-rules --prefix=/private/tmp/makedepend20180701-31856-1cid5cf/makedepend-1.0.5/xproto
checking for suffix of executables...
checking whether we are cross compiling... configure: error: in `/private/tmp/makedepend--xproto20180701-31856-1md6eg2/xproto-7.0.25':
configure: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
See `config.log' for more details

READ THIS: https://git.io/brew-troubleshooting

/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/net/http.rb:921:in `connect': Failed to connect to: https://api.github.com/search/issues?q=makedepend+repo:Homebrew/homebrew+in:title+state:open&per_page=100 (GitHub::Error)
SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: tlsv1 alert protocol version
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/net/http.rb:921:in `block in connect'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/timeout.rb:52:in `timeout'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/net/http.rb:921:in `connect'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/net/http.rb:862:in `do_start'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/net/http.rb:851:in `start'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/open-uri.rb:313:in `open_http'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/open-uri.rb:709:in `buffer_open'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/open-uri.rb:210:in `block in open_loop'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/open-uri.rb:208:in `catch'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/open-uri.rb:208:in `open_loop'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/open-uri.rb:149:in `open_uri'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/open-uri.rb:689:in `open'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/open-uri.rb:30:in `open'
	from /usr/local/Library/Homebrew/utils.rb:354:in `open'
	from /usr/local/Library/Homebrew/utils.rb:384:in `issues_matching'
	from /usr/local/Library/Homebrew/utils.rb:412:in `issues_for_formula'
	from /usr/local/Library/Homebrew/exceptions.rb:145:in `fetch_issues'
	from /usr/local/Library/Homebrew/exceptions.rb:141:in `issues'
	from /usr/local/Library/Homebrew/exceptions.rb:184:in `dump'
	from /usr/local/Library/brew.rb:162:in `rescue in <main>'
	from /usr/local/Library/brew.rb:65:in `<main>'

brew が古くなったのかと思い、brew の update を試みました。

$ brew update
warning: unable to unlink .yardopts: Permission denied
warning: unable to unlink CONTRIBUTING.md: Permission denied
warning: unable to unlink SUPPORTERS.md: Permission denied
fatal: cannot create directory at '.github': Permission denied
Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master

$ sudo brew update
Password:
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- mach (LoadError)
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /usr/local/Library/Homebrew/extend/pathname.rb:2:in `<top (required)>'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /usr/local/Library/Homebrew/global.rb:3:in `<top (required)>'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /usr/local/Library/brew.rb:15:in `<main>'

解決するためにやったこと

困り果てていたところ、同じ問題に遭遇している人が解決策を書いていくれていました。

/usr/local のパーミッション の修正

$ ls -la /usr/local
total 96
drwxr-xr-x  23 root      wheel    782 11  4  2017 .
$ sudo chown $(whoami):admin /usr/local
$ ls -la /usr/local
total 96
drwxr-xr-x  23 hogehoge  admin    782 11  4  2017 .

Homebrew を更新

$ cd /usr/local/Library/Homebrew

$ git pull -q origin refs/heads/master:refs/remotes/origin/master

これで brew update が使えるようになりました。

$ brew update

参考

jekyll でシンタックスハイライトを導入する

2018-07-22

目的

jekyll でシンタックスハイライトを導入します。

方法

Gem ファイルに rouge を記載する

gem "rouge"

_config.yml に highlighter を設定する

highlighter: rouge

syntax.scss を作成して、読み込む

$ rougify style monokai > syntax.css

自分は、 _includes/head.html cssを読み込む行を追加しました。

php のコードをシンタックスハイライトしてみる

<?php

echo 'test';

参考

jekyll で検索を実装する方法- lunr の日本語対応

2018-07-21

目的

jekyll で検索機能を実装するため、全文検索エンジンの lunr.js を導入する方法を調べました。

しかし、日本語での検索の対応に対応していなかったため、

下記を使い対応します。

導入

github のデモのファイルを参考にしながらセッティングしました。

ライブラリの設置

ライブラリの下記のファイルを配置します。

  • lunr.stemmer.support.js
  • tinyseg.js
  • lunr.ja.js

言語設定

ライブラリを読み込んだら次は

どの言語を利用するかの設定をします。

下記のようにしました。

window.idx = lunr(function () {
  this.field('id');
  this.field('title', { boost: 10 });
  this.field('author');
  this.field('category');

  // この行を追加しました
  this.use(lunr.ja)

  var that = this;
  $.each(result, function(i, value) {
    var row = $.extend({ "id": i }, value)
    that.add(row);
  });
});

日本語で検索できるようになりました。

jekyll で検索を実装する方法- lunr を使う

2018-07-16

目的

jekyll で検索機能を実装するため、全文検索エンジンの lunr.js を導入する方法を調べました。

確認バージョン

  • jekyll (3.5.2)
  • lunr.js (2.2.1)

導入

チュートリアルサイトを参考に lunr を使おうとしたのですが 検索 - Jekyll Tipsに書いてあるコードそのままでは動きませんでした。

search_data.json ファイルの作成

ここはチュートリアル通りです。

---
layout: null
---
{
  {% raw >}}
  {% for post in site.posts >}}

    "{{ post.url | slugify }}": {
      "title": "{{ post.title | xml_escape }}",
      "url": " {{ post.url | xml_escape }}",
      "author": "{{ post.author | xml_escape }}",
      "category": "{{ post.category | xml_escape }}"
    }
    {% unless forloop.last >}},{% endunless >}}
  {% endfor >}}
  {% endraw >}}
}

search.html ファイルの作成

ここはチュートリアル通りです。

---
layout: default
---

<form action="get" id="site_search">
  <label for="search_box">Search</label><input type="text" id="search_box">
  <input type="submit" value="search">
</form>

<ul id="results"></ul>
<script src="https://unpkg.com/lunr/lunr.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="/js/search.js"></script>

/js/search.js ファイルの作成

lurn.js で検索の元となるデータを lunr に渡すところと

検索結果を表示するところを修正しました。

全体は下記のようになります。

jQuery(function() {
  // Download the data from the JSON file we generated
  var data = $.getJSON('/search_data.json');
  var result = [];
  data.then(function(response) {
    result = response;

    window.idx = lunr(function () {
      this.field('id');
      this.field('title', { boost: 10 });
      this.field('author');
      this.field('category');

      var that = this;
      $.each(result, function(i, value) {
        var row = $.extend({ "id": i }, value)
        that.add(row);
      });
    });
  });


  // Event when the form is submitted
  $("#site_search").on('submit', function(event){
      event.preventDefault();
      var query = $("#search_box").val(); // Get the value for the text field
      var results = idx.search(query); // Get lunr to perform a search

      // 検索結果の表示
      display_search_results(results); // Hand the results off to be displayed
  });

  function display_search_results(results) {
    var $search_results = $("#search_results");

    // Are there any results?
    if (results.length) {
      $search_results.empty(); // Clear any old results

      // Iterate over the results
      results.forEach(function(value) {
        var item = result[value.ref];

        // Build a snippet of HTML for this result
        var appendString = '<li><a href="' + item.url + '">' + item.title + '</a></li>';

        // Add it to the results
        $search_results.append(appendString);
      });
    } else {
      $search_results.html('<li>No results found</li>');
    }
  }
});

これから

検索の質を高める

日本語での検索、本文の検索について対応していきたいと思います。

下記を使えばできそうです。

データ量が増えるとパフォーマンスが落ちそう

検索の元となっている json データは jekyll に投稿している全記事となるため

当然、記事の投稿数が増えれば json のデータも増えます。

初期読み込み時に json ファイルのデータをダウンロードしているので

パフォーマンスが悪くなる可能性があります。

Web API 化はどうだろうか

パフォーマンスに対応するため、Web API 化する方法を思いつきましたが

検索結果をサーバー側で生成して、表示という作りになりそうでした。

それだと、 lunr.js を使う意味があまりないかもしれません。

参考

yum のリポジトリについて

2018-07-15

背景

yum について知りたかったので調べてみました。

yum とは

パッケージのインストール・アップグレード・検索・管理を行うコマンドです。

remi リポジトリ使いたい

$ wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# rpm -Uvh remi-release-6.rpm

remi リポジトリの設定ファイルは下記です。

/etc/yum.repos.d/remi.repo

yum コマンドの実行時に remi のリポジトリのインストールは下記で行います。

$ yum --enablerepo=remi list

参考URL