OmniAICreator/Qiita-1.07M huggingface dataset:
【MAMP】htaccessを有効にする方法


MAMPの/conf/apache/httpd.confの中を修正する

```
<Directory>
  Options Indexes FollowSymLinks
  AllowOverride All
</Directory>
```

特定のディレクトリのみに適用させる場合

```
<Directory "/ディレクトリのパス">
  AllowOverride All
</Directory>
```

すべてのディレクトリに適用させると不具合がでそうなので、使用するディレクトリにだけ適用させたほうがよさそう
【CSS】FontAwesomeをcssのbefore/afterで使う方法


FontAwesomeをhtmlではなく、cssのbefore/afterに記述するときは、以下のに記述すると使える。

```style.css
li a:before {
  content: "\f105";
  font-family: FontAwesome;
}
```

font-familyでFontAwesomeを指定しないと使用できないので、注意。
【CSS】Bootstrapでブレークポイントを変更する方法


cssファイルを使用する場合は、@mediaの記述部分を直接編集することで変更かのです。
Sassの場合はbootstrapを読み込む前に以下の変数を上書きすることで変更できる

````style.scss
$screen-sm-min: 319px; 
$screen-md-min: 569px; 
@import "_bootstrap";
````
【WordPress】 管理画面にメニューを追加する方法


管理画面に独自のメニューを追加できる関数
管理画面で好きなようにいじりたいときに便利

```php:functions.php
add_menu_page('ページタイトル', 'メニュータイトル', '権限', 'メニュースラッグ', '呼び出し関数', 'アイコンURL', '表示位置');
```

| オプション | 意味 |
|:----|:----|
| ページタイトル | 表示するページのtitle|
| メニュータイトル | メニューに表示される |
| 権限 | ユーザーごとのアクセス権 |
| スラッグ| 管理するスラッグ |
| 呼び出し関数 | 呼び出す関数 |
| アイコンURL | アイコンのURL |
| 表示位置 | いろいろ選べる  [WordPress管理画面メニューの任意の位置にセパレーターを設置する。](http://firegoby.jp/archives/3831) |

呼び出し関数の中で、表示したい内容を記述すれば、追加したメニューに反映されます。



- [ADD_MENU_PAGE()](http://sozai.wi-wi.jp/wordpress/add_menu_page.html)



## 追記
普通にadd_menu_pageを読んでもエラーになってしまうので、アクションフックを使用します。

```php:functions.php
//管理画面に優先度メニューを追加
function mt_add_pages() {
	add_menu_page( 'page_title', 'menu_title', 'edit_themes', __FILE__, 'priority_edit', '', 8);
}
add_action('admin_menu', 'mt_add_pages');
```


## サブメニューの追加方法
サブメニューを追加したい場合は、`add_submenu_page`を使います。
<a href="https://wpdocs.osdn.jp/%E7%AE%A1%E7%90%86%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%AE%E8%BF%BD%E5%8A%A0#add_submenu_page_.E3.81.AE.E4.BD.BF.E7.94.A8" target="_blank">管理メニューの追加 / add_submenu_page の使用</a>

__add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function);__

```functions.php
function add_sub_menu() {
	add_submenu_page('edit.php?post_type=wiki', 'Options', 'Options', 'manage_options', 'wiki-options', array(&$this, 'options_page') );
}
add_action( 'admin_menu', 'add_sub_menu' );
```

第一引数に親メニューのスラッグ名を設定します。設定できる値は以下。

| $parent_slug | 値 |
|:-----------|:------------|
| ダッシュボード用 | index.php |
| 投稿用 | post-new.php |
| メディア用 | upload.php |
| 固定ページ用 | edit.php?post_type=page |
| コメント用 | edit-comments.php |
| カスタム投稿タイプ用 | edit.php?post_type=your_post_type |
| 外観用 | themes.php |
| プラグイン用 | plugins.php |
| ユーザ用 | users.php |
| ツール用 | tools.php |
| 設定用 | options-general.php |
CentOS7のMySQL(MariaDB)が起動できない


#概要
CentOS7が出たので喜んでインストールするとMySQLは無いわiptablesはfirewalldに置き換わってるわでテンヤワンヤしました。
今回はその中でも、CentOS7でMySQLの代わりとして新たに導入されたMariaDBを起動する際にコケたのでそのメモを・・・

#原因
MySQLのシステムフォルダ`/var/lib/mysql`の所有者がrootになっていました。
そこで`chown -R mysql:mysql /var/lib/mysql`を実行して所有者を直しました。
まさかインストール時にrootになるとは思ってないから、特定するまでにすごい時間がかかったorz

#個人的メモ

##データフォルダを変更した場合
データフォルダを変更した際は、所有者、ラベルを変更すること。
またテーブルインストールも実行


```bash
#データフォルダのラベル変更
root# semanage fcontext -a -t mysqld_db_t "/mysql(/.*)?"
root# restorecon -R -v /mysql

#テーブル準備
root# mysql_install_db

#データフォルダの所有者変更
root# chown mysql:mysql -R /mysql
```

##起動できない場合
何故か起動できない事があります。
その場合は以下を試す。

```bash
#データベースのテーブルを強制作成
root# mysqld_safe --skip-grant-tables
root# mysql_upgrade

#mariadb起動
root# systemctl start mariadb 

#データベースのアカウントなど初期化
root# mysql_secure_installation
```
【WordPress】投稿テーブルに列を追加する方法


functions.phpにコードを追加

```functions.php
function list_add_pri($column){
  //必要ないテーブルを削除
  unset($column['comments']);

  //テーブルの追加
  $column += array("key" => "val");
  return $column;
}
add_filter("manage_edit-post_columns","list_add_pri");
```

見出しが追加されるので、追加された列に値を入れる

```functions.php
function list_val_pri($op){
  echo '追加した列に入れる値を入力';
}
add_filter("manage_post_posts_custom_column","list_val_pri");
```
【WordPress】スラッグ名からIDを取得する方法


すぐに忘れてしまうのでメモ。
スラッグからIDを取得したいときに使える。

##固定ページ
```php:hoge.php
$get_page_id = get_page_by_path("sulg_name");
$get_page_id = $get_page_id->ID;
```

##カテゴリー
```php:hoge.php
$cat_id = get_category_by_slug("sulg_name");
$cat_id = $cat_id->cat_ID;
```

カスタムタクソノミーは上記の記述では取得できないので、 `get_term_by()` を使う。

```
$term    = get_term_by('slug', 'slug_name', 'custom_taxonomy')
$term_id = $term->term_id;
```

## タグ
```
$tag    = get_tags(array('slug' => 'slug_name'));
$tag_id = $tag[0]->term_id;
```

##投稿
```php:hoge.php
$post_id = get_posts("name=sulg_name");
$post_id = $post_id[0]->ID;
```

※ 追記（16/02/08）
投稿もget_page_by_pathを使って取得出来るとの指摘を頂きました。

```php:hoge.php
$post_id = get_page_by_path("sulg_name", "OBJECT", "post");
$post_id = $post_id->ID;
```
【WordPress】他のブログ記事をRSSで取得する


WordPressにRSSを取得する```fetch_feed```という関数があるので、これを使う。
こんな感じ

```php:hoge.php
<?php
	include_once(ABSPATH . WPINC . '/feed.php');
	$rss_url = array(
	  'RSS_url'
	);

	$rss = fetch_feed($rss_url);
	if (!is_wp_error($rss)){
	  $maxitems = $rss->get_item_quantity(5);
	  $rss_items = $rss->get_items(0, $maxitems);
	}

	foreach($rss_items as $key => $value){
	  $first_img = '';
	  if ( preg_match( '/<img.+?src=[\'"]([^\'"]+?)[\'"].*?>/msi', $value->get_content(), $matches ) ) {
	    $first_img = $matches[1];
	  }

	  echo '
	  <li style="margin-bottom: 20px;">
	    <img src="'.esc_attr( $first_img ).'" width="100" height="100">
	    <a href="'.$value->get_permalink().'" target="_blank">'.$value->get_title().'</a>
	  </li>
	  ';
	}
?>
```

取得件数を変えるには```get_item_quantity(5)```の数字を変更する

- [外部複数ブログのRSS情報をWordPress上で表示する](http://blog.quall.net/opensource/755/)
- [WordPressでRSSフィードを取得するwp_rssやfetch_rssが非推奨だった件](http://mypacecreator.net/blog/archives/1296)
- [関数リファレンス/fetch feed](http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/fetch_feed)
-[WordperssでRSSフィードを取得、表示まで](http://www.iptk-lab.com/blog/wordperss%E3%81%A7rss%E3%83%95%E3%82%A3%E3%83%BC%E3%83%89%E3%82%92%E5%8F%96%E5%BE%97%E3%80%81%E8%A1%A8%E7%A4%BA%E3%81%BE%E3%81%A7/)
- [【Wordpress】複眼RSS卒業、Fetch_feedにサムネイルをつける](http://nonohara-ss.seesaa.net/article/366800198.html)
【jQuery】IE8でinputのchangeが効かないときの対処法


IEは本当にやっかいだ。
以下の方法で解決できたので、よかった。

##HTML

```index.html
<ul class="radio">
  <li><label><input type="radio" name="bloodtype" value="A" checked />A</label></li>
  <li><label><input type="radio" name="bloodtype" value="B" />B</label></li>
  <li><label><input type="radio" name="bloodtype" value="O" />O</label></li>
  <li><label><input type="radio" name="bloodtype" value="AB" />AB</label></li>
</ul>
```

##jQuery

```jquery.js
$(".radio").change(function(){
	$(".radio label").removeClass("radio-checked");
	$(this).parent("label").addClass("radio-checked");
});

//IE8用
$(".radio input").closest("label").on("click", function(e){
	var input = $(this).find("input");
	if(! input.prop("checked")){
	  input.prop("checked", true).trigger("change");
	}
});
```


- [ラジオボタンでグラフィカルなトグルボタンを作ってみる
](http://blog.mach3.jp/2012/07/31/graphical-togglebutton-by-radio-input.html)
Git の Commit Author と Commiter を変更する

Git のコミットには、Author と Commiter の2つが存在します。
例えば、いつもと違う PC を使ったときに、.gitconfig の設定が違うと、コミットに意図しないメールアドレス・ユーザー名が入ったりします。

Git で見るとこんな感じ

```shell-session
$ git log -1 --pretty=full
commit befdbcd2389373088fe3e83d9c0d401a9de7717d
Author: hogehoge <dummy@example.com>
Commit: fugafuga <test@example.com>

    add test.txt
```

GitHub 上では、コミットに表示される、いつもの自分のアイコンが表示されなくなるので、ちょっと気になります。

そこですでにコミットしてしまった、コミットの Author と Commiter を変更する方法についてまとめます。

# Commiter 変更方法
リポジトリ直下の.gitconfigの設定を追加します。

```shell-session
git config --local user.name sea_mountain
git config --local user.email valid_email@example.com
```

更新したい情報を .gitconfig に設定した後に、--amend で情報を変更します。

```shell-session
git commit --amend
```

# Author 変更方法
上記の Commiter 変更方法では、Author は変更されないので、下記のように、--author オプションを追加してコミットし直します。
 
```shell-session
$ git commit --amend --author="sea_mountain <dummy_email_address@example.com>"
$ git rebase --continue
# 変更されたか確認
$ git log --pretty=full
# すでにプッシュしてしまっているなら、-f が必要になる
$ git push origin hoge
```

# 過去のコミットをすべて変更したいとき
過去のコミットにおける Commiter と Author をすべて変更する方法も有ります。
ただし、push しているコミットの場合は force push が必要になるので注意です。

以下例です。Author と Commiter の指定を書き換えて使って下さい。

```shell-session
$ git filter-branch -f --env-filter "GIT_AUTHOR_NAME='sea_mountain'; GIT_AUTHOR_EMAIL='valid_email@example.com'; GIT_COMMITTER_NAME='sea_mountain'; GIT_COMMITTER_EMAIL='valid_email@example.com';" HEAD 
```
Excel VBA 奮闘記 オブジェクト階層とモジュール

#オブジェクト階層とモジュール

##モジュール

　Excel VBAにおけるモジュールがなんなのかよくわからない。
プログラミング・パラダイムも不明である。
クラスを定義することは可能だがオブジェクト指向ではなく、手続きと関数をスタックする方法によっているように思える。
あまり気にする必要もないだろう。

どうやら各Sheetを1つのファイルと見なしてよいようだ。
Sheetオブジェクトの宣言する場所で宣言したPrivate オブジェクトはファイル・スコープとなる。
Publicで宣言したものは事実上のグローバル・スコープのようだが、Excel VBAにグローバル・スコープがあるのかどうかは不明。

![vba_mod.PNG](https://qiita-image-store.s3.amazonaws.com/0/36817/e1e8c6c1-1540-dcb1-f24c-1a90ba978529.png)

##オブジェクト階層

オブジェクトの階層構造があるようだ。
上から Application.WorkBooks.WorkSheets となる。

![obj.PNG](https://qiita-image-store.s3.amazonaws.com/0/36817/5ab8e822-752c-f84e-62dc-b54d77097e3c.png)

Application は いわゆるウィンドウ。
WorkBooks は ウィンドウ内のクライアント領域にある子ウィンドウ
WorkSheets は 子ウィンドウ内の各シート

と、対応させて考えてよい。

##一意のセルのを選択

シート1のA1セルを選択
Sheet1.Cells(1, 1).Select

　見ての通り オブジェクト.(ドット) の形式で各オブジェクトにアクセスできる。
ただ、.(ドット)はヘルプ・ドキュメントに演算子の項目になく、なにものなのか不明である。
気にしてはいけない。

　コンテクスチュアルなキーワードとして "Me" が利用できる。
Cファミリーの言語ではthisキーワードやthisポインタとして馴染みのものだ。名称は「Me」を取った様子。
当然、Meがどのオブジェクトを指すかはコンテクスチュアルに決定する。

Me.Cells(1, 1).Select

更にこのMeも省略できる。

Cells(1, 1).Select

匿名オブジェクトのようにコンパイラ側が自動的にオブジェクトを提供してくれているのだろう。
詳細は気にしてはいけない。
Excel VBA 奮闘記　データ型

#データ型

Excel 2010 64bit版

データ型の詳細についてはExcel付属のヘルプドキュメント、またはMSDNを参照のこと。
F1キーでヘルプ、F2キーでオブジェクト・ブラウザが閲覧可能。

![date_type.PNG](https://qiita-image-store.s3.amazonaws.com/0/36817/ebfc151e-032e-f14d-e2ce-f7b9eb34e9ef.png)

Microsoft Office の開発
http://msdn.microsoft.com/ja-jp/library/office/bb726434(v=office.12).aspx

64bit版のデータ型一覧。

ブール型 (Boolean)
バイト型 (Byte)
通貨型 (Currency)
日付型 (Date)
10 進型 (Decimal)
倍精度浮動小数点数型 (Double)
整数型 (Integer)
長整数型 (Long)
LongLong データ型
LongPtr データ型
オブジェクト型 (Object)
単精度浮動小数点数型 (Single)
文字列型 (String)
ユーザー定義型
バリアント型 (Variant)

　幾つか興味深いものを取り上げる。

・通貨型は固定小数点を内部表現に用いる。
・10進数型の変数を宣言することは出来ない。

数値定数として表現した場合、まず10進数型と推論されバリアント型に格納できる。
10進数 1/9 や 1/10 は2進数で表現出来ないため、適宜バリアント型を利用するのがいいだろう。

##宣言および、定義。

Dim ステートメント

Dimステートメントはオブジェクトの宣言と定義を行う。

違いを明瞭にするためユーザー定義型を宣言、定義する例を示す。

```vbnet
Private Type person
    age As Integer
    name As String
End Type

Private Sub t()
    Dim who As person
    who.age = 20
    who.name = "Taro"
    
    Debug.Print who.age & " " & who.name
End Sub
```

　Type ～ End Type の内部でDimを付けて宣言・定義を行おうとするとエラーになる。
おそらく型宣言のみを行い、定義は行わない。
次の Sub t() 内ではDim ステートメントによって person型のメモリ割り当てを行っているのだろう。

　スクリプト(マクロ)の多くがそうだが、型制約にあまり期待してはならない。
曖昧ではあるが柔軟さを活かすべきだろう。実行時に型を知る方法は用意されているのでそちらを上手く使おう。
TypeName( exp ) と VarType( exp ) 関数が用意されている。前者の戻り型は文字列、後者は数値定数である。
xargs -n 1 って関数型言語の map みたいだなと思った

今まで↓のように for で回していたんですが

```bash
# [git] 'tmp-' で始まるブランチを全て削除
for branch in $(git branch --list "tmp-*" | cut -b 3-); do
    git branch -D $branch
done
```

`xargs -n 1` を使うと↓のように関数型言語の map みたいな感じで書けます。

```bash
# [git] 'tmp-' で始まるブランチを全て削除
git branch --list "tmp-*" | cut -b 3- | xargs -n 1 git branch -D
```

`xargs` は何も指定しない場合、与えたコマンドの一番最後に引数を追加して呼び出すのですが、コマンドの一番最後以外の場所に引数を指定したい時もあります。そのような場合は `-I` オプションを使って置換文字列を指定するとよいです。上の例を `-I` を使って書き直すと以下のようになります。（置換文字列には `{}` を指定しました）

```bash
# [git] 'tmp-' で始まるブランチを全て削除
git branch --list "tmp-*" | cut -b 3- | xargs -n 1 -I{} git branch -D {}
```

また、`-P` オプションをつけるとコマンドの並列実行ができます。重いコマンドをたくさん走らせるときには便利かもしれません。

```bash
# カレントディレクトリにあるファイルをそれぞれ gzip 圧縮する (4並列)
ls | xargs -n 1 -P 4 gzip -v
```
ボックス要素の表示位置を移動するアニメーションがカクつく


ボックス要素の表示位置をcssを利用して移動させるアニメーションを作成した際、Androidのchromeで表示がカクつく問題がありました。  
この解決策について調べてみました。

## アンチパターン

divで定義したボックスの表示位置を移動するアニメーションを作成する場合。  

もともと、cssでボタンが押されたときにあるdiv要素の位置を変えるようなものを下みたいな方法で実装していました。 

`.menu`というdiv要素をあらかじめ`left:-240px`で定義。  
メニューボタンが押されたら、動かしたいdiv要素に`.menu-open`クラスを追加する。  
ということで、以下のようなcssを定義しました。（一部抜粋）

```css
.menu {
      position: fixed;
      left: -240px;

      transition: all 0.4s;
}

.menu-open {
      left: 0px;
}
```

これを、実際に動かしたところ、PCやiphoneで動かす分には問題なかったのですが、androidのchromeで動かした場合に、アニメーションがカクついて表示される問題がありました。

## 解決策

いろいろ調べたところ、cssには表示位置を移動させるためのtransformsという仕様があって、この **transformプロパティを使用する** とカクつき問題が解消することがわかりました。  
さらに、PCのブラウザとかで見た動きもよりなめらかになります。

```css
.menu {
  position: fixed;
  left: -240px;

  transition: all 0.4s;
}

.menu-open {
  -webkit-transform: translate(240px, 0);
          transform: translate(240px, 0);
}
```

## おわりに

以下のブログエントリにレスポンシブなメニューの作り方についてまとめてあるので、興味ある方は参照ください。

[レスポンシブなサイドメニューを表示させる](http://mid0111.hatenablog.com/entry/2014/07/11/232846)
PopClip拡張で選択範囲をコメントブロックで囲む

![block_commentout.gif](https://qiita-image-store.s3.amazonaws.com/0/8920/b264a011-454d-1c09-8608-2839dc20e35f.gif)

MacOSXのPopClip拡張です。

ダウンロードはこちらから。
http://fukuyama.co/block-commentout-popclip-extension

ブロックコメントのショートカットがなくて設定もできないエディタには有用だと思います。
Ansibleのget_urlはdestをファイル名にしてsha256sumを指定するのがお勧め

# Ansibleのget_urlのdestとsha256sum

[get_urlモジュールのマニュアル](http://docs.ansible.com/get_url_module.html)の `dest` の説明によると、 `dest` にはファイル名かディレクトリ名を指定可能ですが、ディレクトリを指定するとファイルが毎回ダウンロードされるとのことです。

また `sha256sum` という属性が用意されていて、これを指定しておけばダウンロード後にチェックサムを計算して整合性をチェックしてくれます。

ということで `get_url` モジュールを使う際は `dest` はファイル名にして `sha256` を指定するのがお勧めです。

# MySQLのクライアント用rpmをミラーサイトからダウンロードしてインストールする例

上記を踏まえて、 [Ansibleのyumにwith_itemsを指定するときの落とし穴と回避策 - Qiita](http://qiita.com/hnakamur/private/f8d8ceec3d0e8c4c3a86) の例を改善すると以下のようになります。

```yml:cent65-mysql.yml
- hosts: cent65
  user: vagrant
  sudo: yes
  vars:
    mysql_download_base_url: http://ftp.iij.ad.jp/pub/db/mysql/Downloads/MySQL-5.6
    mysql_download_dest_dir: /usr/local/src
    mysql_common_rpms:
      - filename: MySQL-shared-5.6.19-1.el6.x86_64.rpm
        sha256sum: d1b1ccc81d11cb25fbf4e885080e572aea51e503a033047849e1490730cc8a81
      - filename: MySQL-shared-compat-5.6.19-1.el6.x86_64.rpm
        sha256sum: 2356f10f3255303118578a3ab163340b468a6de7520625c3687018a5ce7c57a8
      - filename: MySQL-client-5.6.19-1.el6.x86_64.rpm
        sha256sum: c851d9257ef65422256f85195af407ea6a69cc84cc0a1c164fb8c1cbe975a5f0
      - filename: MySQL-devel-5.6.19-1.el6.x86_64.rpm
        sha256sum: f0027bccdf0fe676f9c445bc9ca5b793e04b299fc643c04cf95281e6a6341025
  tasks:
    - file: path={{ mysql_download_dest_dir }} state=directory
    - get_url: >
        url={{ mysql_download_base_url }}/{{ item.filename }}
        dest={{ mysql_download_dest_dir }}/{{ item.filename }}
        sha256sum={{ item.sha256sum }}
      with_items: mysql_common_rpms
    - yum: name="{{ mysql_download_dest_dir }}/{{ item.filename }}" state=present
      with_items: mysql_common_rpms
```
leiningenからH2 Databaseを起動するプラグインを作りました

H2 Databaseを使ってデータベースアプリケーションを作るときに、サーバーモードでH2 Databaseを起動するのが少々面倒だったので、leiningenのプラグインを作りました。

# 使い方
* project.cljにプラグインを追加。

```clj
  :plugins [[jkugiya/h2-tools "0.1.0-SNAPSHOT"]]
```

* project.cljにH2 Databaseを起動するためのパラメータを追加

```clj
  :h2-tools {
    web: {
      :allow-others? false ;; -webAllowOthers
      :daemon? true ;; -webDaemon
      :port 8082;; -webPort
      :ssl? false ;; -webSSL
    }
    tcp: {
      :allow-others? false ;; -tcpAllowOthers
      :daemon? true ;; -tcpDaemon
      :port 9092 ;; -tcpPort
      :ssl? false ;; -tcpSSL
      :password "passpass" ;; -tcpPassword
      :shutdown "tcp://localhost" ;; -tcpShutdown
      :shutdown-force? true ;; -tcpShutdownForce
    }
    pg: {
      :allow-others? false ;; -pgAllowOthers
      :daemon? true ;; -pgDaemon
      :port 5435 ;; -pgPort
    }
    ftp: {
      :port 7070 ;; -ftpPort
      :dir "/home/ftp" ;; -ftpDir
      :write "write-user" ;; -ftpWrite
      :write-password "write-p@ss" ;; -ftpWritePassword
      :read "read-user" ;; -ftpRead
      :task? false ;; -ftpTask
    }
    :trace? false ;; -trace
    :if-exists? ;; -IfExists
    :base-dir "/path/to/database" ;; -baseDir
    :key ["from" "to"] ;; -key
    :properties "~" ;; -properties
  }
```
* 色々パラメータがありますが、取り敢えず以下で動作します。

```clj
  :h2-tools {
     :web {:port 8082}
     :tcp {:port 9092}
     :base-dir "/path/to/database"
  }
```

* H2 Databaseの起動

```
$ lein h2-tools server
```

バックグラウンドで動くわけではないので、他のleinコマンドを実行するためにはコンソールを別に動かす必要があります。
diredをより便利にするツール群 dired-hacks

# はじめに
dired-hacksというツール群がある．

https://github.com/Fuco1/dired-hacks

diredの機能を強化し，より便利にするelisp群というわけである．
詳細は上記ページのREADMEやソースを読み、自分で試せばすぐに分かるわけだが，
以下，備忘録を兼ねてメモを残しておく．
私自身全てを試したわけでもないが，使って便利だ・おもしろいと感じたものを紹介する．

ちなみにソースの一部はMELPAからインストール可能な状態である．

# 紹介
##dired-filter.el
diredバッファをフィルタリングする．
以下のようにキーバインドが用意されている (`dired-filter-map`参照)．

| キーバインド  | 説明  |
|:------------:|:----|
| `/ n` | 名前でフィルタリング (`dired-filter-by-name`)|
| `/ r` | 正規表現でフィルタリング (`dired-filter-by-regexp`)|
| `/ .` | 拡張子でフィルタリング (`dired-filter-by-extension`)|
| `/ h` | ドットで始まるファイルを隠す (`dired-filter-by-dot-files`)|
| `/ o` | `dired-omit-mode`によるフィルタリング (`dired-filter-by-omit`)|
| `/ e` | 説明がめんどくさいので割愛 (`dired-filter-by-predicate`)|
| `/ f` | ファイルだけ表示 (`dired-filter-by-file`)|
| `/ d` | ディレクトリだけ表示 (`dired-filter-by-directory`)|
| `/ m` | メジャーモードでフィルタリング (`dired-filter-by-mode`)|

上記以外にもキーバインドが用意されている（マーク用など）．

フィルタリングの結果はスタックされる．
例えば，ファイル名でフィルタをかけた後、さらにメジャーモードでフィルタをかける、といった具合である．
スタック構造を持っているので、ポップすることでフィルタリング結果を戻すことも可能である．
またフィルタリングの結果は保存することができる．

##dired-narrow.el
diredバッファにおいて，インクリメンタルにナローイングを実行する．
正規表現を用いてナローイングする機能もある．
絞り込んだ後はマークするなり中身を開くなりと，利用価値は高い．

##dired-subtree.el
diredバッファ上でサブディレクトリを展開する機能を提供．
とにかくdemoを見れば意味がはっきりするだろう．
https://www.youtube.com/watch?v=z26b8HKFsNE
diredデフォルトでは`i`を押すことでサブディレクトリを展開するが，
別ディレクトリとしてdiredバッファの下側に中身が表示される．

##dired-ranger.el
dired上で「クリップボード」を介してコピーや移動を実行する．
「複数の」diredバッファ上でマークしたファイルをクリップボードにストアし，
それをtargetのdiredバッファ上でペーストするのが基本である．
（クリップボードがスタックのような構造になっているのがミソ）

すでにtargetのdiredバッファを開いているならバッファ切り替えでいいわけであり，
diredデフォルトのコピー機能の中でtargetディレクトリへのパスをいちいち選択するよりも速い．
`dired-dwim-target`の利用で十分こと足りる人もいるだろうが，これはさらにそれを強化している．

##dired-open.el
dired上で各種ファイルを開く際，拡張子に応じて開くためのプログラムを「いい感じに」調整してくれる．
カスタマイズ次第でさらに化けるだろう．

#おわりに
本稿ではdired-hacks内の一部を紹介した．
今後の関連ツールの発展と共に，diredの価値はさらに高まるだろう．
diredは大変便利なので是非多くの人が利用することを期待する．
(古い記事です！)CentOS7に最新版のDockerをインストール


* [docker | Package Info | Community build server](http://cbs.centos.org/koji/packageinfo?packageID=30)から最新版のrpmをインストール。


# 以下古い記事

# Docker v1.1.0のrpmを作った

@comuttさんの[Docker v1.1.0 の rpm を作る - Qiita](http://qiita.com/comutt/items/025f0ecace149cababd8)を元に自分もやってみた。

# 最新版のrpm作り方

```bash:CentOS6用の場合
docker run -it tukiyo3/centos6-ja-rpmbuildenv /bin/bash
```

```bash:CentOS7用の場合
docker run -it tukiyo3/centos7-ja-rpmbuildenv /bin/bash
```

```bash:dockerのrpmbuild手順
cd /rpmbuild/
git pull
git branch -r
git checkout -b v1.1.0 origin/v1.1.0
rpmbuild -bb SPECS/docker-io.spec
find . | grep rpm$
```

/rpmbuild/RPMS/x86_64/docker-io-1.1.0-1.el?.x86_64.rpm が生成される。

# CentOS7のrpm biuld環境作り方

```bash:CentOS7の場合
yum install -y git tar gcc
yum install -y \
 rpmdevtools \
 glibc-static pandoc device-mapper-devel \
 golang-github-godbus-dbus-devel \
 golang-googlecode-sqlite-devel \
 golang-googlecode-net-devel \
 golang-github-gorilla-context-devel \
 golang-github-gorilla-mux-devel \
 golang-github-kr-pty-devel \
 golang-github-kr-pty-devel \
 golang-github-coreos-go-systemd-devel
rpm -Uvh ftp://fr2.rpmfind.net/linux/fedora/linux/development/rawhide/x86_64/os/Packages/g/golang-github-syndtr-gocapability-devel-0-0.7.git3c85049.fc21.noarch.rpm
yum clean all
```

```bash:
rpmdev-setuptree
cd /
rm -rf /rpmbuild
git clone https://github.com/comutt/docker-SRPM.git rpmbuild
cd rpmbuild
git pull
git branch -r
git checkout -b v1.1.0 origin/v1.1.0
rpmbuild -bb SPECS/docker-io.spec
```

* /rpmbuild/RPMS/x86_64/docker-io-1.1.0-1.el7.centos.x86_64.rpm が生成される。
全裸改善：形態素解析器 kagome に go-bindata を使ったらビルド時間とバイナリのサイズが劇的に改善，『全裸で形態素解析スクリプト』もビルドでこけなくなるはず！

# 概要
形態素解析器に辞書を同梱するために，辞書構造を go のソースコードに変換して埋め込んでいたのですが，ビルド時間が15〜30分，バイナリサイズも105MBとちょっと問題がありました．そこで，辞書データを一度ファイルに落として，go-bindata を利用してコードに埋め込むことで，ビルド時間も数秒，バイナリサイズも16MBと劇的に改善されました．

# 変更点

* gob を利用して辞書データをファイルに出力
* go-bindata で出力された辞書をソースコード化
* 初期化時に辞書データをinit関数でロード

修正差分：https://github.com/ikawaha/kagome/pull/2/files

# ソース＆インストール

https://github.com/ikawaha/kagome/

```
% go get github.com/ikawaha/kagome/...
```

# うれしいこと

* これまでビルド時間が長すぎて drone.io とか travis-ci とかでテスト回そうとするとテストする前にビルドで失敗してしまっていたのがパスできそう
* [すぎゃーん](http://d.hatena.ne.jp/sugyan/) さんのGoで[全裸『全裸で形態素解析をするスクリプト』](http://d.hatena.ne.jp/sugyan/20140710/1404999022)がビルドでこけなくなる（と思う）．全力で全裸！
 
# gob についてのメモ

[gob](http://golang.org/pkg/encoding/gob/) は go のデータをシリアライズしたりするのに利用できる package です．特に何も考えることなく任意のデータをバイト列に落とし込めるのですが，構造体に private なメンバーがあるとちょっと面倒です．今回は面倒だったので，private なメンバーを public にして対応してしまいました．この辺のやりかたを近いうちにまとめておきたい．忘れないうちに・・・．

* gob http://golang.org/pkg/encoding/gob/

# 関連
* [go-bindata でコンパイル時にリソースを埋め込んじゃおう！](http://qiita.com/ikawaha/items/c02d84cfd00f8f442500)
Macで文字化けしているファイルの文字コードを変更する

受け取った txt ファイルが文字化けてるー！！そんな時

nkf コマンドを使いましょう。
Mac では Homebrew を使うとインストールできます。

## インストール方法
```shell-session
$ brew install nkf
```

## 実行方法
例えば、文字化けしている hoge.txt を UTF-8 で表示させるとき

```shell-session
$ nkf -w hoge.txt
```

オプションで文字コードの指定を変更できる。以下参照。

```shell-session
$ nkf --help
Usage:  nkf -[flags] [--] [in file] .. [out file for -O flag]
 j/s/e/w  Specify output encoding ISO-2022-JP, Shift_JIS, EUC-JP
          UTF options is -w[8[0],{16,32}[{B,L}[0]]]
 J/S/E/W  Specify input encoding ISO-2022-JP, Shift_JIS, EUC-JP
          UTF option is -W[8,[16,32][B,L]]
 m[BQSN0] MIME decode [B:base64,Q:quoted,S:strict,N:nonstrict,0:no decode]
 M[BQ]    MIME encode [B:base64 Q:quoted]
 f/F      Folding: -f60 or -f or -f60-10 (fold margin 10) F preserve nl
 Z[0-4]   Default/0: Convert JISX0208 Alphabet to ASCII
          1: Kankaku to one space  2: to two spaces  3: HTML Entity
          4: JISX0208 Katakana to JISX0201 Katakana
 X,x      Convert Halfwidth Katakana to Fullwidth or preserve it
 O        Output to File (DEFAULT 'nkf.out')
 L[uwm]   Line mode u:LF w:CRLF m:CR (DEFAULT noconversion)
 --ic=<encoding>        Specify the input encoding
 --oc=<encoding>        Specify the output encoding
 --hiragana --katakana  Hiragana/Katakana Conversion
 --katakana-hiragana    Converts each other
 --{cap, url}-input     Convert hex after ':' or '%'
 --numchar-input        Convert Unicode Character Reference
 --fb-{skip, html, xml, perl, java, subchar}
                        Specify unassigned character's replacement
 --in-place[=SUF]       Overwrite original files
 --overwrite[=SUF]      Preserve timestamp of original files
 -g --guess             Guess the input code
 -v --version           Print the version
 --help/-V              Print this help / configuration
Network Kanji Filter Version 2.1.3 (2013-11-22)
Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa).
Copyright (C) 1996-2013, The nkf Project.
```

これで、文字コード変えて表示したり、元ファイルの文字コードを変えて保存したりできる。
Dockerでninix-ayaを動かそうとしている中での気付き（その3）

# 背景

パッケージ版のninix-ayaは無事Dockerfileと一部narファイルを用意することで、[Docker化](https://github.com/kjunichi/docker-ninix-aya)が行えた。

しかし、ninix-ayaの最新版をDocker化して動かすことがまだ実現出来ていない状態。

# ninix-ayaの最新リリース版に必要な環境

Python3.2だと動く模様。3.3だと作者の方が動かないと報告されていた。
Ubuntu14.04LTSはPython3.4。

そこで、pyenvの登場。


# pyenv入れる前に必要なあるパッケージ

これは、おそらく、dockerを使わずにフツーにUbuntuを仮想マシンに入れて使っていればおそらく遭遇することは無いとは思うが、以下のパッケージを入れずに、pyenv配下にpythonを入れていくとやり直しになるケースが多い模様

```
apt-get install -y libbz2-dev
```

## どんなエラーか

```
ImportError: No module named bz2
```

pipでは後から入れることは出来ないので、振り出しに戻される。

# Link

- [Python's bz2 module not compiled by default](http://stackoverflow.com/questions/812781/pythons-bz2-module-not-compiled-by-default)

# 関連投稿

- [Dockerでninix-ayaを動かそうとしている中での気付き（その１） - Qiita](https://qiita.com/kjunichi/items/920d332e328468b6c54d)
- [Dockerでninix-ayaを動かそうとしている中での気付き（その2） - Qiita](https://qiita.com/kjunichi/items/706939134ad95672781a)
bootstrap-sassとbreadcrubs_on_railsを組み込んだ時のバグ対応

下記のエラーが発生した時に自分がとった対策をメモしておきます。
なお、一度うまく動いたら下記のエラーを再現できなくなったため、原因が別にある可能性もあります。

###エラーの文言
````Routing error
undefined method `add_breadcrumb' for ApplicationController
````


###自分がとった対応
####Gemfileの順番を入れ替える
bootstrapの前にbreadcrumbsを記述しました

````rb:Gemfile
+ gem 'breadcrumbs_on_rails'
  gem 'bootstrap-sass'
  gem 'sass-rails',   '~> 3.2.3'
  gem 'autoprefixer-rails'
- gem 'breadcrumbs_on_rails'
````

####Gemfileを編集、サーバ再起動後に出た別のエラーに対応する
自分の場合は`couldn't find file twitter/bootstrap`と言われたので、下記の編集をしました。

````app/assets/javascripts/application.js
- //= require twitter/bootstrap
+ //= require bootstrap-sprockets
````

するとあら不思議、エラー無く`add_breadcrumb`が使えるようになりました。

以上、誰かの参考になれば幸いです。
原因の分かる方が居ましたら、教えていただきたいです。

参考
https://github.com/scambra/devise_invitable/issues/239
http://stackoverflow.com/questions/21807363/routing-error-undefined-method-add-breadcrumb-for-controllerclass
5 秒で Metaspace の OutOfMemoryError を出す方法

##実行
```bash
$ java -XX:MaxMetaspaceSize=1m -version
Error occurred during initialization of VM
OutOfMemoryError: Metaspace
```

##環境
Metaspace は JDK8 以降から。

```bash
$ java -version
openjdk version "1.8.0_05"
OpenJDK Runtime Environment (build 1.8.0_05-b13)
OpenJDK 64-Bit Server VM (build 25.5-b02, mixed mode)
```

##原因
単なる verify 漏れ

```bash
$ java -XX:MaxMetaspaceSize=1024 -version
Error occurred during initialization of VM
Too small initial Metaspace size
```

##おまけ
Xmxでも1mと1024は扱いが違う。

```bash
$ java -Xmx1m -version
openjdk version "1.8.0_05"
OpenJDK Runtime Environment (build 1.8.0_05-b13)
OpenJDK 64-Bit Server VM (build 25.5-b02, mixed mode)
$ java -Xmx1024 -version
Error occurred during initialization of VM
Too small initial heap
```
VagrantでMesos + Marathon + Deimos + Dockerを動かしてみました

最近Docker業界でMesosかなり注目を浴びてるようですが、ことらでも触ってみました。

基本的にオフィシャルサイトの通りやってました、問題なく動作できました。

環境のセットアップはGitHubに上げました、どぞご参考ください：

https://github.com/liubin0329/mesos-marathon-deimos-vagrant

手元にVagrantがインストール済みの方はそのまま`vagrant up`で動けるはずです。

無ければ`install.sh`通り手動でインストールもできます。

ただ一点だけを注意して欲しいのはジョブを起動するときのCPUとメモリ使用量の制限など自分の環境にあわせて調整しないとMarathonタスクが起動できないかもしれない。

感想：
少なくとも単一のサーバではインストールのは簡単
使用も簡単

期待しています。
cron で pyvenv 下の Python を実行させる

`source` とかじゃうまくいかなかったのでメモ  

`cd /home/my/project && /home/my/virtual/bin/python /home/my/project/manage.py > /tmp/cronlog.txt 2>&1`  
最後の `/tmp/cronlog.txt 2>&1` はエラーログの吐き出しです 

# cf.
- [http://stackoverflow.com/questions/3287038/cron-and-virtualenv](http://stackoverflow.com/questions/3287038/cron-and-virtualenv)
- [crontab -e は「絶対に」使ってはいけない - ろば電子が詰まっている](http://d.hatena.ne.jp/ozuma/20120711/1342014448)
マクロ more-labels: labels を分離して書こう

*macro* `more-labels (&KEY) DEFINITIONS &BODY BODY`

    labels の進化版。DEFINITIONS に普通のフォームだけでなくsymbolも使えます。
    symbol が `define-local-function` で定義したものだったら、
    そこにあるものをlabels文に挿入します。
    見つからなければエラー。

なお、冗長な `&key` は 後に機能を追加できるようにするためです。

*macro* `define-local-function (NAME ARGS &BODY BODY)`

    `defun` と同じ構文、しかし局所関数を定義、あとで more-labels 内で使えます。



賢いインライン展開をして欲しいけど、
インライン展開のためにマクロを使うのは賢くないなあと感じる人もいると思います。
あとやはりflet/labels を使うとプログラムが横に長くなるので。
また明らかに flet/labels よりいい点としては、
local-functionに分けることで単体テストが出来るようになること。

ま、需要があるのかわかりませんが、とりあえず簡単なマクロだったので作ってみました。

https://github.com/guicho271828/guicho-utilities
twitter API で update_with_media を成功させる

今回はこちらを使いました  

- [https://github.com/sixohsix/twitter/tree/master](https://github.com/sixohsix/twitter/tree/master)  

# Python 3.x のとき  
Python 3.x で `update_with_media( )` を行う場合は `api.py` に以下の修正が必要です。

```pycon
 bod.append('Content-Disposition: form-data; name="%s"' % mediafield)
+ bod.append('Content-Transfer-Encoding: base64')

- body = '\r\n'.join(bod)
+ body = '\r\n'.join(bod).encode('utf-8')
```
[https://github.com/sixohsix/twitter/issues/233](https://github.com/sixohsix/twitter/issues/233)  

また投稿するときにファイルを base64 で decode している場合は `data = base64.b64encode(f.read()).decode("utf8", "ignore")`  のような操作が必要でした  
ふつうの画像であれば必要ないかもしれません  # 未確認  

# 投稿する際のパラメータ  
メッセージのみの投稿の際はキーワード引数で出来たのですが `update_with_media( )` で同様のことを行ったときにエラーがでました  
この場合は辞書型で渡す必要がありました

```py3
params = {"media[]": data,
	      "status": msg
	     }
tw.statuses.update_with_media(**params)
```
dotfilsをGitHub管理したいけど.gitconfigには社内proxy情報が…ってときは


## 概要
gitのバージョンが1.7.10以降ならば、`.gitconfig`内で他のファイルを`include`できます。
ドットファイルを公開リポジトリで管理していても、社内プロキシ情報などだけは`include`先のファイルに記載しておくことで非公開にしておくことが可能です。
`include`で指定したファイルがなくても`C1083 error when it can't find a file.`なんてエラーはおきませんよ。


## はじめに

以下のような記事を書きました。

homeshickとgit submoduleコマンドでプラグインも含めたドットファイルを全て管理する
http://qiita.com/budougumi0617/items/07cd145af12c65dbe77c

でも、うちの会社proxy設定が必要なんです。`.gitconfig`に認証情報書いているんで公開できません。
でもgitならば解決できます！！！！

## `.gitconfig`で`include`して認証情報は公開しない
もう概要でほぼ全て書いてしまったので、具体的なファイルの書き方だけです。

GitHubに公開してもよい`.gitconfig`ファイル

```.gitconfig
[include]
    path = .gitconfig.local
[user]
    name = budougumi0617
    email = ないしょ@gmail.com
[color]
    ui = auto
[alias]
    br = branch
    co = checkout
    ci = commit
    st = status
    graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short
    list = log --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --date=short
    df = diff
[core]
    autoCRLF = false
[push]
	default = matching
```


GitHubに公開してはいけない`.gitconfig.local`ファイル

```.gitconfig.local
[http]
        proxy = http://foo:bar@proxy.example.com:8080
[https]
        proxy = http://foo:bar@proxy.example.com:8080
```

相対パスなので上記の記載の場合は`$HOME`に以下のように設置してあればよいでしょう。

```console
$  ls -a ~/.git*
/Users/budougumi0617/.gitconfig        /Users/budougumi0617/.gitignore_global
/Users/budougumi0617/.gitconfig.local
```


## 最後に

gitのバージョンが1.7.10未満だった場合はどんまいです！
pythonメモ proxy下でのpip、easy_install

##概要
ちょくちょくぐぐるので自分用メモです。
Proxy環境下での操作方法。

## easy_install

```bash
set HTTP_PROXY=http://proxy.hoge.jp:port
```
か

```bash
export HTTP_PROXY=http://user:password@proxy.hoge.jp:port/
```

の後に

```bash
easy install pkgname
```

## pip
```bash
 pip install pycrypto --proxy=user@proxy.hoge.jp:port
```

##備考
私の会社の環境では、proxy書いても書かなくても通ったり通らなかったりする。
なんでだろう？
atomに話題のフォントM+を入れてみた

はてぶでM+という最強フォントがあることを知って使ってみた
http://www.softantenna.com/wp/software/programming-font-m-plus/

エディターはatomを使ってて設定の方法を調べたのでメモ


- まずフォントをダウンロード

> http://mplus-fonts.sourceforge.jp/mplus-outline-fonts/download/index.html#download

- そのファイルを解凍する

`tar Jxvf mplus-TESTFLIGHT-058.tar.xz`

- atom側で設定する(atom -> Open your stylesheet)

```styles.less

@font-face {
  font-family: mplus;
  src: url('mplus-TESTFLIGHT-058/mplus-1p-regular.ttf');
}

.editor{
  font-family: mplus;
}

```


*注:
`mplus-TESTFLIGHT-058`フォルダ以下にはいろいろなフォントが入ってるのでお好みのものを(僕はmplus-1p-regular.ttfがお気に入りです)
Failed to get D-Bus connection: No connection to service manager.の対処

## 参考

* @yunano さんの [CentOS 7のDockerコンテナ内でsystemdを使ってサービスを起動する - Qiita](http://qiita.com/yunano/items/9637ee21a71eba197345) が詳しい
* [docker - nsenterでコンテナに接続するのに便利なコマンド - Qiita](http://qiita.com/tukiyo3/items/f574d16c7867f0361507)

# Failed to get D-Bus connection: No connection to service manager.

```bash:
bash-4.2# systemctl
Failed to get D-Bus connection: No connection to service manager.
```

# 対処方法

* 特権モードにする(--privileged)
* コンテナで起動されるコマンドは/sbin/initにする

```bash:
sudo docker run --privileged -d -p 80:80 --name httpd1 tukiyo3/centos-ja:7.0 /sbin/init
```

```bash:nsenterを使用してコンテナに入る。
sudo nsenter -t $(sudo docker inspect --format '{{.State.Pid}}' httpd1) -m -u -i -n -p /bin/sh
```

* これでsystemctlが使える。

# その他の方法

* [docker上のCentOS7でMariaDBを起動 - Qiita](http://qiita.com/tukiyo3/items/1208d0a7e833aa92f108)
gnome-terminal のフォントを一覧以外のフォントに変更

Ubuntu14.04 の gnome-terminal のフォントを変更したいんだけど
「編集」メニュー→「プロファイルの設定」メニュー→「全般」タブにある「フォント(F):」の
プルダウンメニューにインストールしたはずのフォントが出てこない。

``fc-list`` コマンド実行ではインストールされているフォントが確認できる。

ん〜。

https://forums.ubuntulinux.jp/viewtopic.php?pid=93634

ここに載っていた方法を参考にフォント設定を変更する。
Ricty for Powerlineフォントにしたい場合は以下のコマンドで。

```bash
gconftool-2 --get /apps/gnome-terminal/profiles/Default/font
gconftool-2 --set --type string /apps/gnome-terminal/profiles/Default/font "Ricty for Powerline 11"
```

1. まずは --get オプションで現在設定されているフォントを確認。ついでに書き換えるデータベースのパスがあっているかも確認できる。
1. GUIの設定画面の「フォント(F):」項目と一致しているはず。
値がないとか返されたらパスの指定が間違ってるっぽい。
1. おkだったら--getオプションを--setオプションに変更して必須となる--typeオプションでstringを指定する。
詳しくは--help-allで確認できる。
そんで最後に指定したいフォントを渡してあげる。

フォント指定には ``fc-list`` で取得できる値を指定する。
[ **フォントファイルパス: フォント名:スタイル** ]
このフォーマットで出力されているので、「 **フォント名[スペース]サイズ** 」で指定する。
VLゴシックをサイズ10で使いたいならば「 _VL ゴシック 10_ 」になる。
Golangの変数とか関数とか[基礎]

#環境
OS X : 10.9.3
Golang : 1.3
#変数
実際に変数を使ったサンプルから。

**20140713修正-変数の型の決定方法-**

```variable.go
package main

import (
    "fmt"
)

func main(){
    var num int = 1
	//変数の型は静的に推論される
    var str = "型は静的に推論"
    real := 1.23

    fmt.Println(num)
    fmt.Println(str)
    fmt.Println(real)
}
```
##実行結果

```
$ go run cariable.go
1
動的に型は決定
1.23
```
うまく出力されるようですね。ふむ。
変数宣言の方法がいくつかあるので紹介です。
##変数宣言

####基本型
`var 変数名 型 = 初期値`
####省略型
`var 変数名 = 初期値`
#### 省略型Second Edition
`変数名 := 初期値`

宣言方法の選択は可読性や理解性を考慮した上で自己責任でお願いします。
(推奨されているのはどれか知らないので教えてください)

***追記あり***

#関数
使ってみましょう、習うより慣れよ。

```func.go
package main

import (
	"fmt"
)

func add(x int, y int) int {
	return x + y
}

func sub(x, y int) int {
	return x - y
}

func addAndSub(x, y int) (int, int) {
	return x + y, x - y
}

func main() {
	fmt.Println(add(100, 200))
	fmt.Println(sub(100, 200))
	fmt.Println(addAndSub(100, 200))
}
```
##実行結果

```
$ go run func.go
300
-100
300 -100
```
てってれー。おkです。
##関数宣言
宣言の方法の一般形は以下です

```
func 関数名(仮引数名 型, ...) 返り値の型 {
  処理
  ...
}
```
また、Go言語では複数の返り血を浴びることができるようです。
###複数の返り値
これを「多値」というそうですが、さておき構文をば。

```
func 関数名(引数1 型1, ...) (型1, 型2, ..., 型n) {
    処理
    return 値1, 値2, ..., 値n
}
```
こんな感じでしょうか。

このほか、返り値に返り値を変数名で指定などもできるようですが、今回は割愛。機会があれば。

#おわりに
Golangの基礎の基礎をメモ。
制御文を今度は軽くまとめれれば。

間違いのご指摘などあればコメント等で教えていただけると幸いです。
#追記
###20140713
####変数宣言方法に関して
変数宣言には３種類あると記載しました。
**基本型**と **省略形**、 **省略形２**ですね。
それぞれの用途に関してコメントを頂いたので追記しておきます。

#####基本型
`var 変数名　型　= 初期値`
でしたね。
これは、もし初期値を宣言時に設定しない場合に用いられることが多いようです。例えば、
`var number int`
のように、必要な変数の宣言のみの場合です。
#####省略形
`var 変数名 = 初期値`
でしたね。
これは、主にパッケージ変数の宣言に用いるようです。
現在、私も勉強している最中なのでパッケージ変数を扱っておりませんが、そこで再び触れたいと思います。悔しいです。
#####省略形２
`変数名 := 初期値`
でしたね。
これが現在ソースコードで最も目にする宣言方法のようです。
多言語を学んだことのある人なら、この宣言、これで大丈夫か...と思ってしまうくらい楽ですね。魅力的です。
【WordPress】 is_mobile()でスマホとタブレットを分ける方法


is_mobileは、スマホとタブレットという判定をするので、タブレットはPCと同じがいいと言う場合に困る。

そんな時は、functions.phpに以下のコードを追記する。

```functions.php
function is_mobile() {
	$useragents = array(
		'iPhone',          // iPhone
		'iPod',            // iPod touch
		'^(?=.*Android)(?=.*Mobile)', // 1.5+ Android
		'dream',           // Pre 1.5 Android
		'CUPCAKE',         // 1.5+ Android
		'blackberry9500',  // Storm
		'blackberry9530',  // Storm
		'blackberry9520',  // Storm v2
		'blackberry9550',  // Storm v2
		'blackberry9800',  // Torch
		'webOS',           // Palm Pre Experimental
		'incognito',       // Other iPhone browser
		'webmate'          // Other iPhone browser
	);
	$pattern = '/'.implode('|', $useragents).'/i';
	return preg_match($pattern, $_SERVER['HTTP_USER_AGENT']);
}
```

これでis_homeがtureの時はスマホ、falseの時はタブレットとPCという別け方ができる。

```php
if(is_mobile()){
	//スマホの時
}else{
	//タブレット or PCの時
}
```
【WordPress】管理画面のヘッダーの編集方法


WordPressの案件では、管理画面のヘッダーにあるコメントとか、更新とかがいらない場合がある。```functions.php```でいらない部分は自由に消す事ができる。

```php:function.php
//更新・コメントの削除
function remove_admin_bar_menu() {
	global $wp_admin_bar;
	$wp_admin_bar->remove_menu('updates'); //更新
	$wp_admin_bar->remove_menu('comments'); //コメント 
	$wp_admin_bar->remove_menu('new-content'); //新規追加ボタン 
	$wp_admin_bar->remove_node('view-site'); //サイトを表示リンク
	$wp_admin_bar->remove_node('site-name'); //左上のサイト名
}
add_action( 'admin_bar_menu', 'remove_admin_bar_menu', 99 );
```

ちなみに対象の値が分からない場合は`var_dump()`をすると表示されるので分かる。

```php:function.php
function remove_admin_bar_menu() {
	var_dump($wp_admin_bar);
}
add_action( 'admin_bar_menu', 'remove_admin_bar_menu', 99 );
```


独自に新しく追加することもできる。

```php:function.php
//ヘッダーにメニューの追加
function header_add(){
	global $wp_admin_bar;

	$wp_admin_bar->add_menu( array(
		'id' => '任意のid名',
		'title' => '表示するタイトル',
		'href' => admin_url( 'リンク先(/wp-admin/以下のurlを記入)')
	));
}
add_action( 'wp_before_admin_bar_render', 'header_add', 1000 );
```


## よく使う使い方

あらかじめ固定ページに更新用ページを新規で作成し、スラッグ名を「custom-update」に設定する。

次に、functions.phpに下記を記述する。
`add_menu()`のhrefにスラッグ名が「custom-update」のページをのIDを指定する。こうすることで、サイトの引越しや更新用ページを一度削除してしまって、再度作成した際などにIDが変わってしまっても問題なく動作する。

```php:function.php
//ヘッダーにメニューの追加
function header_add(){
	global $wp_admin_bar;
	$get_page_id = get_page_by_path("custom-update");
	$get_page_id = $get_page_id->ID;

	$wp_admin_bar->add_menu( array(
		'id' => 'custom_update',
		'title' => '更新用',
		'href' => admin_url('post.php?post='.$get_page_id.'&action=edit')
	));
}
add_action( 'wp_before_admin_bar_render', 'header_add', 1000 );
```
CentOS6にTomcatをインストールするまでのメモ

## インストールできるJDKの確認

yum info jdkでは確認できないよう

```
yum search jdk
yum list | grep jdk
```

## JDKのインストール

```
sudo yum install -y java-1.7.0-openjdk-devel.i686
```

## Javaのバージョン確認

```
java -version
```

## tomcat6のインストール

```
sudo yum install -y tomcat6 tomcat6-webapps tomcat6-admin-webapps
```

## Tomcat6の起動

```
sudo service tomcat6 start
sudo /etc/rc.d/init.d/tomcat6 start
```

## Tomcat6の自動起動

```
sudo chkconfig tomcat6 on
```
VBAのコメントに記述したrubyスクリプトを実行する

以前に、[複数のExcelが起動しているときにrubyのWIN32OLEで特定のブックを操作する](http://qiita.com/bamchoh/items/682e9a68513a76cc4930)なんて記事や
[vbaさようなら、rubyこんにちは。](http://blogchof.blogspot.jp/2012/11/vbaruby.html)なんてブログを書いたんですが。今回、以下の記事にインスピレーションを受けて、新たな実行方法の模索をしました。

* [Excel VBAからDoxygenを用いてドキュメントを出力する](http://qiita.com/mima_ita/items/635d57cc277254900c6a)

上記記事中ではVBScriptを使用して、Excel VBAのソースコードをテキストファイルに出力し、そのファイルをDoxygenに読み込ませることでドキュメントの出力を行っています。

ということは、Excel VBAに記述したrubyスクリプトをテキストファイルに出力し、そのファイルをrubyに読み込ませることでスクリプトを実行できるようになるはず。

考え方としては、以下の流れ

* rubyスクリプト記述用シートを一枚用意し、マクロにコメント行としてrubyスクリプトを記述する。
* 別シートのマクロで記述用シートに記載したコメントを読出し、rubyスクリプトをファイルに落とす。
* Shellコマンドでruby スクリプトをrubyで実行する

以下サンプルマクロ

```vbnet:rubyスクリプト記述用シートのマクロ(Sheet1)
' puts 'Hello world'
' gets
```

```vbnet:標準モジュール(Module1)
Option Explicit

'* rubyスクリプトを抽出し実行する
Public Sub ExecuteRuby()
    Dim rbfile As String
    rbfile = "testfile.rb"
    Call CreateRubyFile(rbfile, "Sheet1")
    Call Shell("ruby " + rbfile, vbNormalFocus)
End Sub

'* rubyスクリプト用シートからスクリプトを抽出する
'* @param[in] rbfile    rubyスクリプトファイル名
'* @param[in] sheetname rubyスクリプト記述用シート名
'*
Private Sub CreateRubyFile(rbfile As String, sheetname As String)
    Dim fso
    Dim fo
    Dim cdm
    Dim codes
    Dim i
    
    Application.DisplayAlerts = False

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set fo = fso.CreateTextFile(rbfile, True)
    Set cdm = ThisWorkbook.VBProject.VBComponents(sheetname).CodeModule
    
    If cdm.CountOfLines > 0 Then
        codes = Split(cdm.lines(1, cdm.CountOfLines), vbCrLf)
        ' rubyスクリプト記述用シートから一行ずつファイルに落とす
        ' 行の初めがシングルクオテーションで始まっていると仮定して
        ' 動作する為、コメント行以外の記述があるとバグる
        For i = 0 To cdm.CountOfLines - 1
        fo.WriteLine (Mid(codes(i), 2, Len(codes(i))))
        Next i
    End If
    fo.WriteLine ""
    fo.Close

    Set cdm = Nothing
    Set fo = Nothing
    Set fso = Nothing
End Sub
```

CreateRubyFile() にrubyスクリプトファイル名とrubyスクリプト記載用シートを渡した後、rubyスクリプトファイル名でrubyを実行すれば実行できる。ただし、ファイルが正しく生成されているかどうかのチェックもなければ、rubyスクリプト記載用シートがおかしな記述の場合のエラーチェックもないので、使用するときは注意が必要。
スクリプトだけ翻訳しないブックマークレット


##概要 
Webページ上でGoogle翻訳を利用する前に使用する。

ページ上のcodeタグとpreタグで囲われたソースコードすべてにnotranslateクラスを付与する。
[stackoverflow](http://stackoverflow.com/)などで利用出来る。

**実行前**
> 
> ```html:code
> <code>echo 'Hello World'</code>
> ```
> 

**実行結果**
> 
> ```html:code
> <code class="notranslate">echo 'Hello World'</code>
> ```
>

**スクリプト**
> 
> ```js:Bookmarklet
> javascript:void(function(){!function(d,f,s){s=d.createElement("script");s.src="//j.mp/1bPoAXq";s.onload=function(){f(jQuery.noConflict(1))};d.body.appendChild(s)}(document,function($){t=$('code,pre').addClass('notranslate');console.log('translatesucess!!');})})()
>   
>```
>

**具体的な処理**
> 
> ```js:code
> jQuery(document).ready(function (jQuery) {
>
>    var code = $('code,pre').addClass('notranslate');
> 
>  });
>```
>

今後
-----------
* 複数指定した選択範囲だけ翻訳しないようにする。
* chrome Extensionにする。


参考
-----------

以下の記事を参考にさせて頂きました。


* [ブックマークレットで jQuery を使う魔法の 210 文字] (http://qiita.com/otchy/items/5c4f2e1b2a93ac200f1c) 
* [Bookmarklet作成備忘録](http://qiita.com/hirok73/items/329a628eaaa8cb4ece27)
* [Bookmarkletの作成方法(基礎)](http://bookmarklet.dohow.jp/createbookmarklet.shtml)
* [Qiitaのbookmarkletタグ](http://qiita.com/tags/bookmarklet)
VoltDB ストアドプロシージャと共に

VoltDBの特徴としてあげられるのは、
高速な処理や非同期に特化した機能もそうですが、
javaで実装されている点も、特徴の一つです。
NuoDBも同じ分類のNewSQLと呼ばれるものですが、
javaを普段から触っている方には比較的簡単に利用できると思います。

VoltDBはjava, C++, php, node.jsなど各言語で利用できる様に
クライアントが用意されているほか、
jsonでやり取りが出来るAPIを持っています。
そのAPIや各クライアントから簡単に利用するには、
ストアドプロシージャを理解する必要があります。

とは言ってもそこまで難しいものではありませんので、簡単に使ってみましょう。
**もちろんjavaで実装できますが、今回は定義だけでやってみましょう**

```sql:users.sql
CREATE TABLE users (
   user_id INTEGER UNIQUE NOT NULL,
   user_name VARCHAR(40) NOT NULL,
   created_at TIMESTAMP NOT NULL
);
```
テーブルをパーティション化

```sql
PARTITION TABLE users ON COLUMN user_id;
```

integer (TINYINT, SMALLINT, INTEGER, or BIGINT) 
string (VARCHAR)
が利用可能です

```sql
CREATE PROCEDURE addUser AS 
    INSERT INTO users VALUES (?, ?, CURRENT_TIMESTAMP);
PARTITION PROCEDURE addUser ON TABLE users COLUMN user_id;
```

続いてinsertのストアドプロシージャです。
API、または各言語のクライアントから実行するときに、
PHPですあれば、PDOが対応していないため、
phpから実行する場合は、直接SQLを@AdHocで発行するか、
ストアドプロシージャを利用します。

APIで利用する場合は、下記の様になります。

```php
http://localhost:8080/api/1.0/?Procedure=addUser&Parameters=["2", "hello"]
```

また全件SELECTも下記の様にすると、

```sql
CREATE PROCEDURE allUser AS SELECT * FROM users;
```

```php
http://localhost:8080/api/1.0/?Procedure=allUser
```

となります。

デフォルトで用意されているAPIもいくつかあります。
例えばシステムの情報を取得する場合は下記の様にします。

```php
http://localhost:8080/api/1.0/?Procedure=@SystemInformation
```

各クライアントから利用する場合もほぼ同様にして利用します。
クラスターなども簡単に出来ますので是非触ってみて下さい。
AngularJSでValidationをかけたインプット項目に、invalidになる値を初期値として入れると値が見えなくなる

どうも見えなくなるどころか、値が入っていないらしい。

バインドしたモデル自体は書き換えられていない。

```html:aj.valueMissing.html
<!DOCTYPE html>
<html lang="ja"><head><meta charset="utf-8" /></head>
<body>
<div ng-app="app" ng-controller="validCtrl">
<form name="form" novalidate>
  <input ng-model="default" ng-minlength="7" id="invalidDefault" name="default"/>{{ form.default.$error }}
  <p>default:{{ default }}</p>
  <p>invalidDefault.value:<span id="output"></span></p>
  <script>
    setInterval(function(){output.innerHTML = invalidDefault.value},5);
  </script>
</form>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.js"></script>
<script>
var app = angular.module('app', []);
app.controller('validCtrl',['$scope',function ($scope) {
  $scope.default = '123456';
  setTimeout(function(){$scope.default='78945677';$scope.$apply();},3000);
  setTimeout(function(){$scope.default='415647';$scope.$apply();},6000);
}]);
</script>
</body></html>
```

後からバインドしたモデルの変更を行った時も値を消されてしまう。

今は特に困ってないけど、解決方法がわからないとつらいシーンが訪れるかもしれない。
rubyで簡単に画像のリサイズ

Homebrewからimagemagickをインストール
``$ brew install imagemagick``

Gemfileに
``gem "rmagick", '~> 2.13.1', :require => 'RMagick'``
を追加

bundle インストールして
``bundle install --path vendor/bundle``

```
pry(main)> IMAGE_PATH = Rails.root + "app/assets/images/"
pry(main)> test = Magick::ImageList.new(IMAGE_PATH + "old.png")
pry(main)> test.resize(200, 400).write(IMAGE_PATH + "new.png")
```

old.pngを(200,400)にresizeしたnew.pngにできる。
続々・ C言語で文字列を逆にする 

#これまでのあらすじ
[前々回の日記](http://imadedede.hatenablog.com/entry/2014/07/06/011713)： Joel on Software を紙で読んでいた。その中の「[ゲリラ的雇用面接のすすめ](http://japanese.joelonsoftware.com/Articles/Interviewing.html)」にて出されていた試験例題「C言語の文字列をその場で逆にする」に挑戦した。
[前回の日記](http://imadedede.hatenablog.com/entry/2014/07/06/144916)：文字列長が INT 型の最大値に依存しなくなった。
今回の記事はその改善。

# C 言語で文字列を逆にする
```C:strrev.c
// 文字列を逆にする
// どうせなら string.h なしで
#include <stdio.h>

// 文字列を逆順にする
void strrev(char s[]){
	char temp = '\0';
	char *first = s;
	char *last = s;
	
	// 長さ0の文字列なら操作せず返す
	if(*first == '\0'){ return; }

	// 文字列の最後の文字のポインタを取得する
	while( *(last+1) != '\0'){ last++; }

	// 外側から逆にする
	while(first < last){
		temp = *first;
		*first = *last;
		*last = temp;
		
		// 一つずつ範囲を小さくする
		first++;
		last--;
	}
	return;
}

// a.out の後に続く文字列を操作する
int main(int argc, char* argv[]){
	char *s = argv[1];
	// 引数が足りないなら比較しない
	if(argc <= 1){ return 0; }

	// 操作前
	printf("Input: %s\n", s);
	// 文字列を逆にする
	strrev(s);
	// 操作後
	printf("Output: %s\n", s);
	return 0;
}
```
実行結果はこちら

```bash:
$ ./a.out a
Input: a
Output: a
$ ./a.out ab
Input: ab
Output: ba
$ ./a.out abc
Input: abc
Output: cba
$ ./a.out abcd
Input: abcd
Output: dcba
$ ./a.out what_a_wonderfull_world!
Input: what_a_wonderfull_world!
Output: !dlrow_llufrednow_a_tahw
```

# 前回からの改善点
ポインタ演算の比較を改善した。
完全一致を条件にするのではなく、大小を比較するようにした。
ポインタでもアドレスの大小を比較することはできる。同じ配列のどこかを指しているポインタ同士なら、その場所が配列上での前か後ろかで比較する。
（先頭からのオフセット値を比較している？）

とても基本的な改善。そもそも最初からこのように書いておけば、最初のバージョンのデバッグに30分近く取られることはなかった。
しかも当時、ぼんやりと、面倒くさいし == でいいや、とか考えていた気がする。
バグは油断したところにすかさず潜り込んでくる。
そんなことを感じました。おわり。

追記2014/07/12：
ループ途中の break 文を消した。動作は変わらず。
これもポインタでの大小比較ができるようになった恩恵。
AngularJSのモジュールとしてjQueryを使ったスムーズスクロールを作ってみた。

この方法だと、スムーズスクロールがどうやって実装されているかとか気にしないで、後ですげ替えられる。ハズ。

以下コード。

コピペで試しやすいように一つのファイルにまとめています。

```html:ajs.sscroll
<!DOCTYPE html>
<html lang="ja"><head><meta charset="utf-8" /></head>
<body>
<div ng-app="app" ng-controller="scrollCtrl">
<form name="form" novalidate>
  <h1 id="top">TOP</h1>
  <div>
    <ul>
      <li><a href="" ng-click="innerLink('name1')">name1</a></li>
      <li><a href="" ng-click="innerLink('id1')">id1</a></li>
      <li><a href="" ng-click="innerLink('name2')">name2</a></li>
      <li><a href="" ng-click="innerLink('id2')">id2</a></li>
    </ul>
  </div>
  <div>
    <p style="position:relative;top:1500px;"><a name="name1"></a>name1<a href="" ng-click="innerLink('top')">TOP</a></p>
    <p style="position:relative;top:2500px;"><span id="id1"></span>id1<a href="" ng-click="innerLink('top')">TOP</a></p>
    <p style="position:relative;top:3500px;"><a name="name2"></a>name1<a href="" ng-click="innerLink('top')">TOP</a></p>
    <p style="position:relative;top:4500px;"><span id="id2"></span>id2<a href="" ng-click="innerLink('top')">TOP</a></p>
  </div>
</form>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.js"></script>
<script>
(function(){
  
// jQuery required
var smoothScroll = function(elementOrName){
  var element = {'true':$('*[name='+elementOrName+'],'+
                          '#'+elementOrName).eq(0),
                 'false':elementOrName}[typeof elementOrName === 'string'];
  if(!element){
    return;
  }
  if(!element.offset){
    element = $(element);
  }
  if(!element.offset){
    return;
  }
  var top = Math.max(0, element.offset().top - ($(window).height()/8));
  $('html,body').
  animate(
    {'scrollTop': top},
    'slow'
  );
};

angular.module('commonUI',[])
.factory('uiUtils',[function(){
  return {
    smoothScroll:smoothScroll
  };
}])
;
})();

var app = angular.module('app', ['commonUI']);
app.controller('scrollCtrl',['$scope','uiUtils',function ($scope,uiUtils) {
  $scope.innerLink = uiUtils.smoothScroll;
}]);

</script>
</body></html>
```
Chrome Developer Toolsのパネルを横に表示させる方法

Chrome Developer Toolはパネルを下や外ではなく、
横に表示させることができます。

Chrome Developer Toolの閉じるボタンの横で長押しすると
横に広げるボタンが出てくるので
そこにマウスを動かすと切り替わります。

![場所](https://s3-ap-northeast-1.amazonaws.com/taizo-public/public/fe5c083d5f01fd135a8f4c235ec5aea8.gif)

小さいスクリーンでもすっきり見れて便利です。

![Screen Shot 0026-07-11 at 10.53.58 PM.png](https://qiita-image-store.s3.amazonaws.com/0/3163/02f68ec9-5e31-befc-61d2-52bf341d283a.png)