OmniAICreator/Qiita-1.07M huggingface dataset:
[tcsh] RHEL7でcshの数字の扱いが変わった


# 目的

- 知人に「RHEL6とRHEL7では、cshの前ゼロ付きの数字の扱いが違う」と聞きました
- RHEL6 では `@` コマンドで、前ゼロ付きの数字は（当然）８進数として扱われます
- RHEL7 では前ゼロ付きでも１０進数で扱われるようになったらしい
- 「RHELクローン」といわれる CentOS 7 で動作を確認してみました
- （個人的には csh は、あまり使わないんだけどね）

# CentOS 7 で確認

## 環境

| 名前 | バージョン |
|:--|:--|
| CentOS | 7.1.1503 |
| tcsh | 6.18.01 |
| bash | 4.2.46 |
| expr | 8.22 |

## 確認結果

とりあえず、実行してみました。

```shell-session
$ csh
$ set prompt="% "
% @ var = 014 - 04
% echo $var
10
% @ var = 14 - 4
% echo $var
10
```

確かに、前ゼロ付きでも10進数になっていますね。

マニュアル `man csh` を確認すると `parseoctal` というシェル変数が追加されていて、何か値を設定すると今まで通り8進数で扱えるみたいです。

```shell-session
% set parseoctal=true
% @ var = 014 - 04
% echo $var
8
% unset parseoctal
% @ var = 014 - 04
% echo $var
10
% exit
```

ここでは `true` に設定していますが、設定値は何でもよさそうです。
（ちなみにパーミッションやumask などは、このシェル変数に関係なく今まで通り8進数で指定可能ですね。当たり前ですが）

念のため、bash と expr についても確認してみました。

```shell-session
$ echo $((014-04))
8
$ echo $((14-4))
10
$ expr 014 - 04
10
$ expr 14 - 4
10
$
```

# CentOS6で確認

CentOS6 でも試してみることにします。

## 環境

| 名前 | バージョン |
|:--|:--|
| CentOS | 6.7 |
| tcsh | 6.17.00 |
| bash | 4.1.2 |
| expr | 8.4 |

## 環境準備

でも、これだけのためにインストールするのは面倒なので、最近流行の Docker で試してみたいと思います。

とりあえず Docker をインストール。

```shell-session
$ sudo yum -y install docker
$ sudo systemctl start docker.service
$ sudo systemctl enable docker.service
```

## 確認結果

Docker のコンテナとして、CentOS6 を実行します。

```shell-session
$ sudo docker run -it centos:6 /bin/sh
（略）
sh-4.1# yum -y install tcsh
（略）
sh-4.1# cat /etc/centos-release
CentOS release 6.7 (Final)
sh-4.1# csh --version
tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-unknown-linux) options wide,nls,dl,al,kan,sm,rh,color,filec
sh-4.1# csh
[root@133911c01bd7 /bin]# @ var = 014 - 04
[root@133911c01bd7 /bin]# echo $var
8
[root@133911c01bd7 /bin]# @ var = 14 - 4
[root@133911c01bd7 /bin]# echo $var
10
[root@133911c01bd7 /bin]# exit
```

確かに CentOS 6.7 では、前ゼロ付きは8進数で扱っていますね。
念のため、他のケースも確認しましたが CentOS 7.1 と同じですね。

```shell-session
sh-4.1# echo $((014-04))
8
sh-4.1# echo $((14-4))
10
sh-4.1# expr 014 - 04
10
sh-4.1# expr 14 - 4
10
sh-4.1# exit
```

## 後始末

とりあえず、コンテナは削除しておきます。

```shell-session
$ sudo docker rm $(sudo docker ps -aq)
```

Docker イメージはまだ使うかもしれないので、もう少し残しておこう。

# まとめ

RHEL6とRHEL7というよりは、tcsh の 6.17.00 と 6.18.01 で挙動が変わっているんですかね。

とりあえず、ゼロ付きの数字を8進数と10進数のどちらで扱うかのまとめ。

| コマンド | RHEL6, CentOS6 | RHEL7, CentOS7 |
|:--:|:--:|:--:|
| tcsh | 8進数 | **10進数** [^1] |
| bash | 8進数 | 8進数 |
| expr | 10進数 | 10進数 |

[^1]: シェル変数parseoctalに何か値を設定すれば8進数として解釈する
iOS9 で、アプリ独自の設定(Settings.bundle)ができない場合への対応

iOS9で Settings.bundle, Root.plist を使った設定を持っているアプリを更新すると、
設定で、設定できなくなります。

とりあえずの対応方法は、"設定”アプリを強制終了して、再起動することです。
めっちゃ悩んだのですが、これで解決です。アップデートした後にはまります。

以下に情報がありました。みんな悩んでました。明らかに iOSのバグです。（iOS9.2.1 でも治ってません。またハマってしまった。）
https://forums.developer.apple.com/thread/9853
DrupalのViewsで作られるSQLを確認する(パラメータバインド済み)


##前提条件
Develモジュールをインストールし、有効化すること。
https://www.drupal.org/project/devel

## 3行コードを書く

画面上部にSQLが出力される。

`````php
function MODULENAME_views_pre_execute(&$view) {
  dpq($view->build_info['query']);
}
`````

## 特定のViewのSQLのみ確認したい
そんな時には if文でviewの名前を指定する。

`````php
function MODULENAME_views_pre_execute(&$view) {
  if ($view->name == '[Viewの名前を書く]') {
    dpq($view->build_info['query']);
  }
}
`````

##おわりに

dpq() は第2引数にTRUEを指定すると[SQLを文字列として返却](https://api.drupal.org/api/devel/devel.module/function/dpq/7)してくれる。
なので、独自のデバッグモジュールやログの整形には重宝しそう。
Zshの設定管理フレームワークPreztoのModuleの使い方

Zshの設定管理フレームワークPreztoのModuleの使い方について

## <i class="fa fa-cubes" style="font-size:1em;"></i> Modules
1. ./modules 以下をみると何を利用可能かわかります。詳細は各ModuleのREADME.mdで確認できます
2. 必要なモジュールを ~/.zpreztorc に設定することでターミナルの起動時に読み込まれます

```
# environment Module と terminal Module を利用する際の設定例
zstyle ':prezto:load' pmodule 'environment' 'terminal'
```

### <i class="fa fa-folder" style="font-size:1em;"></i> Directory Module の例
```
# directory Module を利用する際の設定例
zstyle ':prezto:load' pmodule 'directory'
```

[Directory Module のREADME.md](https://github.com/sorin-ionescu/prezto/tree/master/modules/directory) で機能を確認

![directory_module_readme.png](https://qiita-image-store.s3.amazonaws.com/0/43480/fa584ce7-c013-3f8b-88e9-4d2aced146ef.png)

* AUTO_CD 機能で cd なしでディレクトリ移動が可能に
* AUTO_PUSHD 機能で移動時にはpushdされている
* etc

などの機能があるようです。
早速試してみます。

![directory_module_demo.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/7efd6f3c-ef97-e56c-3669-a10a679d100d.gif)

ディレクトリ名だけで移動し、pushdによって移動したディレクトリがpushされていることがわかります。

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Prezto - GitHub](https://github.com/sorin-ionescu/prezto)
Bluemix Watson Text to Speechで日本語を喋らせる

WatsonのText to Speechで日本語を喋ってもらいました。

先日試した時は日本語喋れなかったと思うのですが、TOPページの公開日が2015/11/17となっているのを発見！ voicesを確認してみると・・・。
http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/text-to-speech/api/v1/#get-voices

```
$ curl -u "{username}":"{password}" "https://stream.watsonplatform.net/text-to-speech/api/v1/voices"

{
   "voices": [
      {
         "url": "https://stream.watsonplatform.net/text-to-speech/api/v1/voices/ja-JP_EmiVoice",
         "gender": "female",
         "name": "ja-JP_EmiVoice",
         "language": "ja-JP",
         "description": "Japanese language, female.  Higher-quality uncompressed Emi voice."
      },
      :(以下省略)
```
日本語が喋れるようになってました♪  **ja-JP_EmiVoice**
ちなみにデモページやドキュメントには未だ日本語が喋れる記述はありません。

早速日本語を喋ってもらいましょう。text=こんにちは、ワトソン博士
http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/text-to-speech/api/v1/#synthesize

```
$ curl -u "{username}":"{password}" -o "aaa.ogg" "https://stream.watsonplatform.net/text-to-speech/api/v1/synthesize?voice=ja-JP_EmiVoice&text=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%81%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3%E5%8D%9A%E5%A3%AB%22"

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24670    0 24670    0     0  10335      0 --:--:--  0:00:02 --:--:-- 10335
```
生成されたaaa.oggを聞くと「こんにちは　わとそん　はくし」と言いました♪ :smile:
rake assets:precompile が通らなくて失った6時間

初デプロイしようとcapistrano叩いたらasset:precompileでコケてた悔しみを記事にしました。

## 結論:デフォルトで生成される「application.css」が原因
結論から言うと、railsをnewしたときにデフォルトで生成されてるapplication.cssが原因でした。

```ruby:config/initializers/assets.rb
Rails.application.config.assets.precompile += %w( guest.css admin.css )
```

configにあるassetの設定には上記のように、precompileの対象として、guest(一般ユーザ画面)とadmin(管理画面)を指定していたので、develop環境でのsassは特にエラーを吐くこともなく、正常に動いていたので気づかなかったのですが、
railsをnewしたときにデフォルトで生成されるapplication.cssは、指定しなくてもprecompileの対象となっているようで

```css:app/assets/stylesheets/application.css
*= require_tree .
*= require_self
```

`require_tree .` があるせいで、sassの各種変数などがundefinedとしてエラーになり、デプロイがコケていました。
application.cssを削除すると、 `rake assets:precompile` が動きました。
JSCSでドハマリした。

##序文
ATOMにLinter-jscsプラグインいれて使っていたらエラーが消えません。

どうしたら良いのかと悩んだ結果、海外のStackoverFlowにその答えがありましたがいまいち要領を得ません、

そこで、Googlegroupで議論されていた内容を見ました。

結論から言うと、これはJSCSのバグです。Airbnbの仕様で書くと、一番最後の閉じカッコのところのコンマを探してしまい、当然最後のカッコの前にはカンマなんていらないので、書かないわけですから、エラーがずっと消えません。

##解決方法
どうやったら解決するのかというと、以下のとおりです。
###前提条件：プラグインにlinter-jscsインストール済み

**Atom起動**
↓
**FinderのATOMボタンをクリック**
↓
**環境設定をクリック**
↓
**Packagesを選択**
↓
**検索でlinter-jscsを表示する**
↓
**Settingsボタンをクリック**
↓
**SettingsカテゴリのPresetを見る**
↓
**デフォルトがAirbnbなので、googleなどにする。**
（ほかでも消えるが、googleで試した結果消えたので）

とAirbnbが悪いのがわかったので、とりあえず他のを試せばいいかなと思いました。

※僕は現在AngularJsとMatelialDesignとか全部Google縛りでやっているので、だいたい全部Googleに依存しようかなと。

##最後に
AtomやJSのBABEL系は最新なので、自分が間違っていると疑うのもいいが、バグの可能性も疑ったほうが良い。あとは海外のフォーラムを読んで見るのも手だ。スタックオーバーフローが分かりづらければ他のコミュニティも役に立つだろう。

参考:JSCS Dev <Missing comma before closing bracket>
    (https://groups.google.com/forum/#!topic/jscs-dev/askMtn30wCg)
Raspberry Piに最新のArch Linuxをインストールする

#どうでもいい雑感と前置き
##今更Raspberry Piを触りたくなった
以前購入して、すぐに飽きてしまった（というかそもそも目的なく購入していた）ため埃をかぶっていたRaspberry Piですが、ちょっとアイディアが湧いたので使ってみるかという気になりました。
##あれ、公式からArch消えてるのん？
[OS配布ページ](https://www.raspberrypi.org/downloads/)に行ってみたはいいものの、Archが無い・・・。もしやRaspberry Pi 2から非対応になってしまった？それでイメージファイルも消えてしまった？とか考えつついろいろ調べてみたら、[一応ミラーリンクは生きてる様子](http://www.club.kyutech.ac.jp/~opamp/iso/archlinux-arm/ArchLinuxARM-2014.06-rpi.img)。これをWin32diskimager使ってSDカードに書き込んで起動するが・・・
##なんだか挙動が変なの
とりあえずパッケージアップグレードするかーと`#pacman -Syu`を実行しrebootしました。
するとssh接続が効かなくなりました。
？？？と思いながらHDMIとキーボードをひっつけて起動すると、 
`Calling CRDA to update world regulatory domain`
という謎の出力が起動後しばらく連呼されるという非常に鬱陶しい状態になっていました。
そしてssh接続できない状態は治らない・・・。
#最新OS以外に用はねえ
いろいろ調べた結果、最新版のArch LinuxをRaspberry Piに入れてる方が散見されたので、まあさっきの問題は最新にすれば解決するんじゃねという結論に達しました。
しかし、下記参照にあるようにArch公式とか複数の方がやり方を紹介してくれているのですが、この方法ではどうも上手く行かず困っていたところ、自動化スクリプトを作ってらっしゃる方がいて、それを利用させてもらうことでうまくいきました。

#本筋
##環境
ノートPC(XPS13 2015 early)
Ubuntu入ったUSBメモリ（Sandiskのごついやつ）
SDカード（一応フォーマット済み）
##手順
刺さったSDカードがどこに認識されてるかを探します。
ターミナルから`$df -h`やら、`$fdisk -l`やらと打ってみたり、ubuntuとかについてるディスクユーティリティからsdaとかsdbとかmmcblk0とかの文字を探してください。
私の環境では`/dev/mmcblk0`にありました。

次に、自動化ツールをダウンロードして、中身のinstall.shをちょびっと改変します（p加えるだけ）。mmcblkではなくsdXにSDカードが存在した場合はこの手順は不要です。
*14,15行目*

```
BOOT_PARTITION_PATH=${SDCARD_PATH}p1
ROOT_PARTITION_PATH=${SDCARD_PATH}p2
```
また、諸事情があり固定IPの設定をしてほしくなかったので、その辺りの設定をしていた114~133行目の先頭に#を入れてコメントアウトしました。
あとは、install.shにmmcblk0の引数と適当なネットワーク（どうせ設定されないので）の引数を入れて実行するとあら不思議。Arch Linuxのインストールが完了します。

#うーん
スクリプトの中身覗いた限り、手順自体はほぼ他のリンクのやり方と同じで、唯一ふたつ目のパーティションのファイルシステムがf2fsと指定されていることが違いだけど、なにがダメなのかさっぱりわからん。そもそもファイルシステムのことをきちんと理解していない。


#参照
1.[Raspberry Pi向けArch Linux ARMインストールの自動化(一部)](http://morinezumiiii.hatenablog.com/entry/2015/07/28/002657)
2.[Raspberry Pi | Arch Linux ARM](http://archlinuxarm.org/platforms/armv6/raspberry-pi)
3.[ArchLinuxをRaspberryPiにインストール](http://divide-et-impera.org/archives/1872)
4.[Raspberry PiにArch Linuxをインストールする](http://www.nspl.co.jp/blog/archlinux_installation)
Fragment の追加や削除をやりやすい PagerAdapter を作りました

# FragmentStatePagerAdapter の欠点

Android Support Library に含まれている [FragmentStatePagerAdapter](http://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html) は ViewPager を用いたナビゲーションを実装する上でよく利用されるAPIです。

Fragment に bind したいデータのコレクションを管理させて、 Fragment のインスタンスを作らせるパターンが多いのではないでしょうか。

しかしそんな FragmentStatePagerAdapter ですが、任意の位置の Fragment を削除が難しい問題がありました。

[ググると](https://www.google.co.jp/search?sourceid=chrome-psyapi2&ion=1&espv=2&ie=UTF-8&q=fragmentstatepageradapter%20%E5%89%8A%E9%99%A4&oq=fragmentstatepageradapter%20%E5%89%8A%E9%99%A4&aqs=chrome..69i57.4831j0j7) 色々情報が出てきますが、わりとよく見つけられたのが以下のパターン。

```java
public int getItemPosition (Object object) {
    return PagerAdapter.POSITION_NONE;
}
```

確かにこうしておけば、 `PagerAdapter#notifyDataSetChanged()` を呼んだときに表示されている Fragment が消えてくれるますが、この方法ではキャッシュされている Fragment が全て破棄されるため Fragment の再生成や描画で割りと処理が重たくなってしまいました。

この問題に対応をするため、今回あらたなライブラリを作りました。

[numa08/dynamicfragmentpageradapter](https://github.com/numa08/dynamicfragmentpageradapter)

# 使い方

リポジトリの中のサンプルも見て頂きたいのですが、まずは依存関係を追加します。

```gradle
compile 'net.numa08:dynamicfragmentpageradapter:0.6'
```

次にアダプターの実装を行ないます。 v4-support 向けの `.support.DynamicFragmentStatePagerAdapter` と、普通の Fragment 向けの `DynamicFragmentStatePagerAdapter` があります。

```java

public class HeikeFragmentAdapter extends DynamicFragmentStatePagerAdapter {

    // bind したいデータのコレクション
    private final List<Heike> heikeList;

    public HeikeFragmentAdapter(FragmentManager fm, List<Heike> heikeList) {
        super(fm);
        this.heikeList = heikeList;
    }

    // Fragment のインスタンスの生成
    // 作られた Fragment は勝手にキャッシュされるので、何も考えずにインスタンスを作ればおｋ
    @Override
    public Fragment getItem(int position) {
        return HeikeFragment.newInstance(heikeList.get(position));
    }

    // タブとかと併用する場合はタイトルを返すと良い
    @Override
    public CharSequence getPageTitle(int position) {
        return heikeList.get(position).getName();
    }

    @Override
    public int getCount() {
        return heikeList.size();
    }

    // revemoItem では指定された position のデータを消してあげる
    @Override
    public void removeItem(int position) {
        heikeList.remove(position);
        super.removeItem(position);
    }
}
```

Fragment を削除するには、


```java
final int position = mainPager.getCurrentItem();
adapter.removeItem(position);
```

な感じで `removeItem` を呼んで下さい。 `notifyDataSetChanged` は不要です。

こういう感じで、真ん中のタブだけを削除するUIの実装が可能になります。

![](https://i.gyazo.com/2a888d35ba409768ac39fd456f60f295.gif)

## 今後の展開

FragmentStatePagerAdapter 相当の物はできたので次は FragmentPagerAdapter 相当のやつを作りますね。
perl で QR コード

`Imager::QRCode`

## install

```
$ cpanm Imager::QRCode
```

環境によっては、`sudo` 必要

## サンプルコードを動かそうとして。

```
$ perldoc Imager::QRCode | grep -A 13 SYNOPSIS | grep -v SYNOPSIS > test.pl
$ cat test.pl
        use Imager::QRCode;

        my $qrcode = Imager::QRCode->new(
            size          => 2,
            margin        => 2,
            version       => 1,
            level         => 'M',
            casesensitive => 1,
            lightcolor    => Imager::Color->new(255, 255, 255),
            darkcolor     => Imager::Color->new(0, 0, 0),
        );
        my $img = $qrcode->plot("blah blah");
        $img->write(file => "qrcode.gif");
$ perl test.pl
```

あれ？　`qrcode.gif` が生成されない、、、と思ったら ↓ のエラー。 @yosemite[^1]

[^1]: 他の yosemite でもダメだった。 

```
$ grep gif .cpanm/build.log
Warning (mostly harmless): No library found for -lgif
GIF: Test code failed: Can't link/include 'gif_lib.h', 'stdio.h', 'errno.h', 'string.h', 'gif'
t/200-file/220-nogif.t .......... ok
```
ちょっとググったら gif のライブラリが、homebrew にあるらしいので、

### giflib のインストール

```
$ brew install giflib
$ find /PATH/TO/homebrew -name gif_lib.h 
/PATH/TO/homebrew/Cellar/giflib/4.2.3/include/gif_lib.h    
/PATH/TO/homebrew/include/gif_lib.h 
```

して

```
$ cpanm -reinstall Imager::QRCode
```

したら、`build.log` のエラーは消えた。

しかし、`$ perl test.pl` しても、`qrcode.gif` は生成されない。エラーも吐かない。
                      
ウィンドウズでの[このチケット](https://rt.cpan.org/Public/Bug/Display.html?id=90785)と関係があるのかないのか、、、ほっとこか[^2]。
[^2]: たかだか、`gif` が使えない程度で、他のライブラリを検討する程の情熱もない。

### てんで


```
$ perl -i -pe 's/gif/png/' test.pl 
```
して

```
$ perl test.pl                     
```

して、 `qrcode.png` が出来るの確認。 


### で、

先日の [`BARCODE.pm`](http://qiita.com/bunzaemon/items/cac46f46c57000259054) を use して文字列付きの連番 QR コードを出力


```
$ cat test.pl
use strict;
use warnings;
use autodie ;
use Getopt::Long ;
use Imager::QRCode;
use BARCODE ;

my $string = q{test} ;
my $index = 0 ;
my $range = 20 ;
GetOptions (
    "string=s" => \$string,
    "start=i" => \$index,
    "range=i" => \$range,
) ;

$index -- if $index != 0 ;

my $qrcode = Imager::QRCode->new(
	margin        => 1,
	casesensitive => 1,
	mode => '8-bit',
	lightcolor    => Imager::Color->new(255, 255, 255),
	darkcolor     => Imager::Color->new(0, 0, 0),
);

my $obj  = BARCODE->new( $index ) ;
open my $out, q{>}, q{./index.html} ;
print $out <<EOF ;
<!doctype html>
<html>
<body>
<table>
EOF


for ( 0 .. ( $range - 1) ){
    $obj->add ;
    print $out "<tr>\n" ;
    print $out "<td>\n" ;
    my $str = $string . $obj->{barcode} ;
    my $img = $qrcode->plot($str);
    $img->write(file => "./${str}.png");
    print $out qq{<td>${str}</td>} ;
    print $out qq{<td><img src="./${str}.png" alt="${str}" width="60" height="60"></td>} ;
    print $out "\n</td>\n" ;
    print $out qq{<tr height="30"></tr>\n} ;
}

print $out <<EOF ;
</table>
</body>
EOF

close $out ;

$ perl test.pl -str TEST -sta 1 -r 4
```
オブジェクトの中身のHashをselectしつつ全体を返したい

## やりたいこと

```rb:input
{:one=>1, :two=>{:foo=>"foofoo", :bar=>"barbar", :hoge=>"hogehoge", :moge=> "mogemoge"}}
```

`:two` の中身の `:foo` および `:bar` 以外を切り落とした全体のHash、すなわち

```rb:output
{:one=>1, :two=>{:foo=>"foofoo", :bar=>"barbar"}}
```

を得たい。なるべくスマートに

## 案1

`input[:two]` に対して [Hash#select!](http://ruby-doc.org/core-2.2.3/Hash.html#method-i-select-21) を使う。

```rb:案1
def solve(input)
  input[:two].select! { |key, _| %i(foo bar).include? key }
  input
end
```

お、おう・・・
よく読めば分かるのですが、もう少し簡単になりませんかね？

## 案2

ActiveSupportを導入し、[Hash#slice!](http://api.rubyonrails.org/classes/Hash.html#method-i-slice-21) を使う。

```rb:案2
def solve(input)
  input[:two].slice!(:foo, :bar)
  input
end
```

条件のブロックが消せました。これでもよいのですが `input` が 2回出現していて冗長に思えます。

## 案3

[Object#tap](http://ruby-doc.org/core-2.2.3/Object.html#method-i-tap) を使い、ブロック内で書き換える。

```rb:案3
def solve(input)
  input.tap { |i| i[:two].slice!(:foo, :bar) }
end
```

1行になりました。しかしブロック内で破壊的変更を行っているので、実行結果が想像しにくいです。個人的には案2のほうがベターかと思います。

## 案x

ほかによい書き方はないですかね・・・(コメントいただければ追記します)
ソースコードをカラー印刷するTip (Mac)


Macで、ソースコードを印刷したい時に裏技があります。たまたま気づきました。言語もけっこう何でもいけます。

## 目的
ソースコードをカラーで印刷すること。
さらに、Pagesの中にいれたい。

## 必要なもの
Xcode
Keynote
Pages

## 手順
####<span style="color:red">ポイントは、コピペ時に、Keynoteを経由することです！</span>

1. Xcodeでソースファイルを開く → Swiftだけでなく、PythonとかCとかでもいい感じにハイライトされます
2. すべて選択( ⌘ + A )、コピー( ⌘ + C )
3. Keynoteを開く
4. どこでもいいからボックスに貼り付け( ⌘ + V ) → なんと色が残ったまま！
5. すべて選択、コピー
6. Pagesを開いて貼り付け → これでも色が残っている！！
7. 適当に整えて、そのまま印刷すればok

Pagesに貼り付ける時、テキストボックスを作成してから貼り付ければ、表示もそれっぽくなります。


## Pagesに直接貼り付けてもだめなのに・・・
Xcodeでソースファイルを開くと、ハイライトされます。

これを印刷しようとすると、何故か白黒になります。スクショとるのも荒れるしいじれないしで嫌です。
Keynoteを経由せずにPagesに直接貼り付けても、Atomなどのエディタで開いたものをコピペしても、普通のtextになります。

なぜこのような仕様なのか、謎です。
Tahoe-LAFS とは何か?




* Tahoe-LAFSは、フリーでオープンな非中央集権型のクラウドストレージシステム
* Tahoe Least-Authority File Store の略
* P2Pの分散型ファイルシステム



## スペック

* 最初のリリース: 2007/05/02
* Pythonで書かれている
* OS: クロスプラットフォーム
* ライセンス: GNU GPL 2+ とその他


## 公式サイト

* [Tahoe-LAFS](https://www.tahoe-lafs.org/trac/tahoe-lafs)


## Wikipediaの説明

[Tahoe-LAFS - Wikipedia, the free encyclopedia](https://en.wikipedia.org/wiki/Tahoe-LAFS)


## GitHub

* [Tahoe-LAFS](https://github.com/tahoe-lafs)
wicket_pdf導入時にAWS EC2でwkhtmltopdfがエラーになったときの対応

wkhtmltopdf-binary-edgeを使うようにという情報がよくあるのですが、これは同梱されてるバイナリがUbuntu,OSX用なのでEC2にデプロイするとエラーになる。

wkhtmltopdf-binary-amlがAmazonLinux対応版なので、コイツを使うとEC2上でも動作しました。
https://github.com/insphire/wkhtmltopdf-binary-aml

```
# Gemfile
# ダメな奴
gem 'wicked_pdf'
gem 'wkhtmltopdf-binary-edge'
```

```
# こういうエラーが出る
An exception occurred: 'Error: Failed to execute:
["/home/appuser/hoge/shared/bundle/ruby/2.1.0/bin/wkhtmltopdf", "-q", "--encoding", "UTF-8", "--javascript-delay", "5000", "--margin-top", "0", "--margin-bottom", "0", "--margin-left", "0", "--margin-right", "0", "file:////tmp/wicked_pdf20151118-29615-r2ey25.html", "/tmp/wicked_pdf_generated_file20151118-29615-14wgdtb.pdf"]
Error: PDF could not be generated!
Command Error: /home/appuser/hoge/shared/bundle/ruby/2.1.0/gems/wkhtmltopdf-binary-edge-0.12.2.1/libexec/wkhtmltopdf-linux-amd64: error while loading shared libraries: libjpeg.so.8: cannot open shared object file: No such file or directory
' on '/home/appuser/hoge/shared/bundle/ruby/2.1.0/bundler/gems/wicked_pdf-69350a2735e8/lib/wicked_pdf.rb:62:in `rescue in pdf_from_string''
```

```
# Gemfile
# EC2対応
gem 'wicket_pdf'
gem 'wkhtmltopdf-binary-aml', git: 'https://github.com/insphire/wkhtmltopdf-binary-aml'
```

```
【2016/07/14現在】
wkhtmltopdf-binary-0.12.3がリリースされており、当問題は解消されているようです。
但し、日本語が正しく表示されない問題は継続して存在するため、環境に応じたフォントの導入作業は
必要です。
```

参考：
http://qiita.com/s-mori/items/00aef46e6a10499f8254
ChromeでClickOnceを起動したい

NAAPIが無効になってChromeのClickOnce用拡張が根こそぎダメになってましたが

https://chrome.google.com/webstore/detail/windows-remix-clickonce-h/dgpgholdldjjbcmpeckiephjigdpikan

これ、できてました。
NativeMessage使ってるみたいです。
ProvisioningProfileはcupertino(+spaceship)を使って管理

iOSアプリ開発では開発以外のところで色々と面倒なことがあります。

その課題の1つが端末が増えた時の対応で、作業内容は以下になります。

 - 1) 新しい端末のUDIDをAppleDevCenterに登録
 - 2) ProvisioningProfileを更新。
 - 3) 更新したファイルを自身のマシンやJenkinsのマシンに設置。

上記を手動でやるのは非常に面倒です。
そこで、上記の作業を[cupertino](https://github.com/nomad/cupertino)で自動化します。

## 自動化方法
### 1) 端末の登録
本来は以下で出来るはずなのだけど、現状出来ていない。

```
ios devices:add "Name"=UDID -u "userid" -p "password"
```
[issue](https://github.com/nomad/cupertino/issues/220)に書かれているが、修正されていない模様。
仕方がないので、issueに書いてあるfastlaneの[spaceship](https://github.com/fastlane/spaceship)を利用する。

```rb
require 'spaceship'
Spaceship.login("user", "password")
Spaceship.device.create!(name: "NAME", udid: "UDID")
```

### 2) Provisioning Profileの更新
端末を登録したら、以下のコマンドで端末を登録したいProvisioning Profiles名と端末の情報を指定してProvisioningProfileを更新する。

```
iOS profiles:manage:devices:add ProvisioningProfileName "Name"=UDID -u "userid" -p "password"
```


### 3) Provisioning Profileのダウンロード
設定が全て終わったProvisioning Profileをダウンロードし、ファイルを上書きする。

 - 全てをダウンロードする場合

```
ios profiles:download:all -u "userid" -p "password" > /dev/null 2>&1
```

 - 指定してダウンロードする場合

```
ios profiles:download ProvisioningProfile Name -u "userid" -p "password" > /dev/null 2>&1
```

ダウンロードが出来たら、ファイルを上書きすればOK

```
mv *.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/
```

## メモ
誰でも更新ができるようにJenkinsでjobを作る場合のメモを書いておく。

 - パスワードについては、```環境変数としてパスワードをインジェクト```を使ったりすると値が見えなくなるので良い。
 - 3)はJenkinsのjobがはしる全てのマシンで更新をかける必要があるので「マルチ構成プロジェクトのビルド」を利用するのが良い。
js setTimeout ネスト避ける

    setTimeout(function() {
      // 処理
      setTimeout(function() {
        // 処理
        setTimeout(function() {
          // 見た目がキモいので避けたい
        }, 200);
      }, 100);
    }, 300);

キモい。
毎回待ち時間が違うsetTimeoutを連続で呼びたいのですが...。

ライブラリなし、ES5で動くコードでもっと綺麗にしたいです。
てことでこんなコード書いてみました。

    var TimerSetter = function(){
          this.waitMsec = 0;
        };
    TimerSetter.prototype = {
      wait: function(func, msec) {
        this.waitMsec += msec;
        setTimeout(func, this.waitMsec);
        return this;
      }
    };

    // .....
    var time = new TimerSetter();
    time.wait(function () {
          // 処理
        }, 200)
        .wait(function () {
          // 処理
        }, 100)
        .wait(function () {
          // 処理
        }, 300)

コード量が増えるのと、実際に実行している内容が変わってるんだけど（全てのsetTimeoutをほぼ同時に実行している）特に問題は起きてません。

でもなんか良くない気もします。

このコードどうでしょうか。
CentOSでyum updateが何度やっても失敗する場合の対処方法

キータの記事が一番最初に出てこないので書きますが、yum update掛けて失敗する場合は、rpmパッケージのDBが重複している場合があります。

##エラーメッセージ
 "エラー: Trying to remove "yum", which is protected
 問題を回避するために --skip-broken を用いることができません"

 "Found X pre-existing rpmdb problem(s), 'yum check' output follows:"

 "XXXX は XXX の複製です"

 "XXX 次の要求が不足ています"

##問題点は何か？
 yumをやったのにRPMがコンフリクトしていることが問題です。

##解決方法
 RPMのDBを空っぽにして、もう一回yum updateしましょう。

##詳細手順
XXXはエラーを吐いた任意のファイル名です。詳細なバージョンの数字は入れず文字列だけ指定しましょう。
1.```rpm -e --nodeps --allmatches --justdb XXX ```
2.```rpm -q XXX```
3.上記1,2を繰り返えす。もしくは```XXX```を```**```にしてワイルドカードで全部消す。危険だけど。
3.```rpm --rebuilddb```
　DBを再構築する。
4.```yum update```
 もう一回アップデートを掛ける。
5.```rpm -qa | grep XXX```
　該当アプリケーションがちゃんと1個だけ入っているのか確認する。

これで、上手くいきます。今時CentOS使う人は少ない（Debian系が多いだろうから）ので、こういう問題にぶち当たる人は少ないと思いますが、ログっておくのが良いなと思いました。
Raspberry Piにルーター設備なしで接続する

Raspberry Pi2(以下ラズパイ)をルーター設備なしで接続する方法です。

# 有線を固定IPにしているラズパイとMacを直結通信する
例えばラズパイが192.168.1.5で固定していたとします。Macのシステム環境設定>ネットワーク>EthernetをIP固定で図のように192.168.1.1とし、LANケーブルを直結すると、ping 192.168.1.5が通るようになるようです。
ここでssh等で侵入すれば/etc/network/interfaceを書き換えてもう一度dhcpに戻すこともできました。

- ちなみにクロスケーブルは不要でストレートケーブルでOKでした。
- Mac側の末尾が192.168.1."1"でなければいけない理由もない気はしますが、とりあえず自分は1で作業しました。
- ルーターという項目は何も書かなくてOKでした。サブネットマスクも不要だったのかも。

![20151118_direct.png](https://qiita-image-store.s3.amazonaws.com/0/56846/fe6abda1-5c84-4364-327a-11b6e459326c.png)

# 有線をDHCPにしているラズパイとMacをEthernetで直結し、Mac側のWi-Fiをブリッジして外界に出る
Macのシステム環境設定>共有から次の設定でインターネット共有をします。

- 共有する接続経路: Wi-Fi
- 相手のコンピュータが使用するポート: Ethernet
- インターネット共有: チェックする

![20151118_share.png](https://qiita-image-store.s3.amazonaws.com/0/56846/236353a9-1488-2bfc-9520-70dc317ab7c0.png)

すると、ラズパイとMacをEthernetで直結すると、おそらくラズパイが192.168.2.2として見れるようになるはずです。しかもsshでラズパイに入ってそこから外界に出ることができます。これはMacのWi-Fiをブリッジしていることになります。

ちなみにDHCPにしなければいけない理由は、Macでこの共有という機能を使うと勝手に「自分が192.168.2.1, 相手は192.168.2.2~254のDHCP」という状態になるからです。つまり複数台を接続しないならばクライアント側は192.168.2.2〜254を決め打った固定IPでもよいはず…。この辺りは[こちらの先輩の記事](http://qiita.com/honeniq/items/7e825ca6414c39374484)を参考にしました。ちなみに未確認ですが[Windowsで同じようなことをやると192.168.0.0/24になるそうで](http://nightyknight.hatenablog.com/entry/2013/09/23/012018)。

## 共有できないとき(1)
共有が正しく有効になった場合、Mac側で```ifconfig | grep bridge```とすると、bridge100という(仮想)デバイスができるようですが、これが出ないケースがあります。これがないとDHCPサーバーとして動かないようで、ラズパイが接続してきてくれません。

このケースでは、共有する経路(上の例ではWi-Fi)がきちんと外界につながっているかを確認してみてください。ラズパイと接続するだけなら外界がつながっている必要はないと思うのですが、実際には必要になるようです。

- Macを再起動しないとだめなケースもあったような気がします。
- bootpdというプロセスをkillする必要があるケースもあるそうです。[こちらに情報がありましたが私は未確認です！](http://forums.macrumors.com/threads/mavericks-wont-allow-internet-sharing.1669902/)

## 共有できないとき(2)
既に共有できているところからラズパイをrebootしたら、そのあと数分待ってもラズパイ(192.168.2.2)に接続できないケースがありました。このラズパイはavahiでraspberrypi.localも名乗っているのですが、それもだめ。この場合はMac側のEthernetケーブルを一度抜き差ししたら10秒程度で再接続できるようになりました。

## 共有できないとき(3)
正確には、共有ができても外に出られないケースがありました。これはラズパイに配布したMacのEthernet接続部分に何もDNSサーバーがセットされていないときに起こります(共有時にIPアドレスとかの設定は見ないのに、DNSサーバーは見てるらしい)。これを8.8.8.8などに設定すれば外に出られるようになりました。[こちらに情報を参考にしています](https://galem.wordpress.com/2014/10/14/configuring-the-raspberry-pi-to-share-a-macs-internet-connection/)。

![20151119_dns.png](https://qiita-image-store.s3.amazonaws.com/0/56846/44a4e444-56c4-5466-0feb-608b16791f1c.png)
Raspberry Piが頻繁に起動しないSDカードを起動させる

自分のケースでの結論: SDカードを一度抜く。

# 経緯
Raspberry Pi2 (以下ラズパイ)で、reboot後にほぼ100%起動しないSDカードに当たりました。ディスプレイをつないで見てみると、起動途中で/devが見えないとかkernel panicとかnot foundとか怖い文字がでて操作不能です。というわけでfsckするために普通のLinuxマシンにSDカードを移してfsck -fvとかするのですが無傷(しかも一瞬で終わる)。まじかぁと思ってラズパイに指し直して一応程度の気持ちで起動を試みるとあっさり起動  （ ゜Д゜）

その後どういうケースでは起動するorしないというのを調査しました。以下のような結果でした。

- reboot直後: ×
- shutdown後にUSB給電を外し、30秒ほどって起動: ×
- shutdown後にUSB給電を外し、SDカードも外した状態で一回起動。当然起動しないのでUSB給電をぶったもう一度切り、SDカードを挿し直して起動: ○
- shutdown後にUSB給電を外し、SDカードを一瞬抜き挿しして起動: ○

電源的な問題でしょうか。ラズパイに数十秒も持つ電池とかコンデンサがあるようには見えないのですが…

## そのSDカードは
たまたまだと信じていますが、TranscendのTS16GUSDU1E。[こちらの検証結果リスト](http://elinux.org/RPi_SD_cards)では2/3がOK判定ですね。
Gitで重いリポジトリをcloneするとき

WordPressの中規模サイトをGitで管理していて、
ファイル容量を圧迫していたので一旦削除したのですが、
今回また修正の必要が出てきてSourceTreeでクローンしようとしたら、

```
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree fetch origin 
remote: warning: suboptimal pack - out of memory        
error: pack-objects died of signal 9
error: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: aborting due to possible repository corruption on the remote side.
fatal: protocol error: bad pack header
Completed with errors, see above
```

と行き詰まってしまいました。

こんなときは多分SourceTreeではどうにもならず、

```
git clone --depth 1 http://example.com/fuga.git
git fetch --depth 10
git fetch --depth 100 # 値は調整しつつ
git fetch --unshallow # 最後に全部落とす このオプションは最新のgitでないとない
```

とやっていくことで完全に落とせました。
今回はdepthを100から50〜100刻みで調整して、500ぐらいまで上げたら
unshallowが成功しました。
クローンしたGitリポジトリの容量を調べたら約10GBありました。
重いー。


こちらの記事を元に補足しました。
[gitで重いリポジトリをcloneするとき - webネタ](http://r-h.hatenablog.com/entry/2013/12/07/093423)
CakePHP2 findについて


CakePHP2のfindメソッドの解説になります。

findとは
--
CakePHPフレームワークで使用できるDBの検索、取得を行うメソッドです。
SQLを書かずに簡単にデータの取得が出来ます。

サンプルコード
--

```Cakebook2より
find(
'all',
[
    'conditions' => ['Model.field' => $thisValue], //検索条件の配列
    'recursive'  => 1, //int
    'fields'     => ['Model.field1', 'DISTINCT Model.field2'], //フィールド名の配列
    'order'      => ['Model.created', 'Model.field3 DESC'], //並び順を文字列または配列で指定
    'group'      => ['Model.field'], //GROUP BYのフィールド
    'limit'      => n, //int
    'page'       => n, //int
    'offset'     => n, //int
    'callbacks'  => true //falseの他に'before'、'after'を指定できます
]);
```

解説
--

find([string], [array]);

###第1引数:(string)
* **all**
	* 配列を返す
* **first**
	* 一行のみ返す
* **list**
	* インデックス付きの配列を返す→formのセレクトに使うと便利
* **count**
	* 整数を返す
* **neighbors**
	* 前後の行を返す
* **threaded**
	* 入れ子になった配列を返します

###第2引数:(array)
* **conditions：(array)検索条件**
	['Model.id' => '1'],//idが1
	['Model.id >' => '1'],//idが1より大きい
	　

* **recursive:(int)取得範囲の設定**
	-1 Group のデータだけを取得します。join しません。(最速
0 Group のデータとそのドメインを取得します。
1 １つの Group とそのドメインとそれに関連した User を取得します。(defalt
2 １つの Group とそのドメインとそれに関連した User と各 User に関連した Article を取得します。
　
* **fields:(array)取得する列選択**
	fieldsを指定しないと全てのフィールドが取得される
	DISTINCT:重複した行をまとめる
　
* **order:(array)並び順**
	DESC:降順
	ASC :昇順
	　
* **group:(array) =GROUP BY@SQL**
	指定したカラム名の値が同じものが同じグループとなります。
	複数のカラムを指定した場合は、値の組み合わせが同じものでグループ化されます。
	　
* **limit:(int)取得数制限**
 　
* **page:(int)取得するページ番号（limitと併用**
　
* **offset:(int)データの取得開始位置を指定**
　
* **callbacks:(int)コールバックを実行するか**
	save前後、varidate前後等設定可能


参考
--
cake公式
http://book.cakephp.org/2.0/ja/models/model-attributes.html

callbacks について
http://book.cakephp.org/2.0/ja/models/callback-methods.html

CakePHP2 findまとめ
http://cakephp.popotoo.com/db/221/

GroupBy
http://www.dbonline.jp/sqlite/select/index14.html

ちなみに
CakePHP3だとこんな感じ
http://qiita.com/kozo/items/87dc9f725e71dd742468
わざわざTensorFlowの機械学習で$\sqrt{2}$を計算する


わざわざ機械学習で計算してみる。もちろん`tf.pow(2., 0.5)`でできるが、powを使わずにする。

# 概要
$\sqrt{2}$は$x^2-2=0$の解で正のものだから、$x^2-2$の絶対値が最小になるところを探す。（$-\sqrt{2}$になる可能性が残るが、気にしないことにする。）

しかし、絶対値の関数$|x|$は肝心の$x=0$で微分ができないので、$(x^2-2)^2$を損失関数として利用する。TensorFlowといえど、数式の選択などはきちんと考えないといけないようです。

あとは、適当にOptimizerを用意して、学習させる。

# 詳細
次のようにする。

```python
# coding: utf-8
import tensorflow as tf
import math
ans = math.sqrt(2.) # 結果との比較用

x = tf.Variable(1.)
loss = (x*x-2)*(x*x-2)
# loss = tf.abs(x*x-2) # これは上手くいかない
opt = tf.train.GradientDescentOptimizer(0.1)
train = opt.minimize(loss)

init = tf.initialize_all_variables()

with tf.Session() as sess:
	sess.run(init)
	for i in xrange(100):
		sess.run(train)
		result = sess.run(x)
		print result, result - ans

```


機械学習では、勾配を計算しその方向へ変数の値を更新するが、上のコードでわかるように、自力で微分をすることなく済んでいる。optが自動で微分してくれている。
SlackのRTMを受け取るためのあれこれ

まだ、OAuthをアプリ側で完結させる方法を調べてないのでそれ以外の部分でメモ書き


### 認証
まず、
https://api.slack.com/docs/oauth
の通りに認証する

#### ID
https://api.slack.com/applications
から、アプリケーションを登録する。
RedirectURIは、OAuth認証をするためのパラメータを返すのに利用するので1つ以上登録する必要がある

登録が完了するとClientIDとClientSecretが生成される。

#### 認証情報の送信
https://slack.com/oauth/authorize
にGETでアクセスする。

client_id : アプリケーション登録で取得したID
scope : アプリケーションにどんなことをしてもいいかの権限
https://api.slack.com/docs/oauth-scopes に権限リストがある

**RTMを利用する場合、scope=clientを設定しておかないとscopeが足りないというエラーが出る**

`https://slack.com/oauth/authorize?client_id=[client_id]&scope=client`



特殊scopeのadminは、いろいろやれるので使うことはほとんどなさそう。
使うとしても、個人的に動かしているアプリか公式アプリくらいでしか使い道なさそうな気がする。

identify : Allows applications to confirm your identity.
client: Allows applications to connect to slack as a client, and post messages on behalf of the user.
admin: Allows applications to perform administrative actions, requires the authed user is an admin. ​

認証情報とアクセス範囲の画面が出るので、そこでAuthorizeボタンを押すとcodeがついた形でRedirectURIへリダイレクトされる

`https://[redirect URI]/?code=[code]&state=`
ブラウザの場合、URL欄に表示される

#### アクセストークンの取得
https://slack.com/api/oauth.access にGETでアクセスする
client_id : アプリケーション登録で取得したID
client_secret : アプリケーション登録で取得したシークレットトークン
code : 認証情報送信後のリダイレクトURLについてきたコード(?code=?????の形で送信される)

JSON形式でaccess_tokenなどが返ってくるので、あとはこのトークンでアクセスをする
トークンはユーザーごとに生成される。生成されているユーザーを確認するには
https://api.slack.com/applications/[ClientID]
に一覧があるので、そこで見る。一度生成したらRevokeするまでは存在し続けるらしい。

`https://slack.com/api/oauth.access?client_id=[client_id]&client_secret=[client_secret]&code=[code]`

### RTMサーバーへの接続
認証が終わったら、
https://slack.com/api/rtm.start
へアクセスする。

token :　oauth.accessからもらったアクセストークン

JSONでサーバーの情報、チャンネルの情報などが返ってくるので、このデータは別で保存するなりする。

**rtm:streamが許可されていないというエラーが出た場合は、最初のscope設定にclientを指定して再度認証すること。**

url で指定されている wss: で始まるURLがWebSocketServerのURL。
有効期限が30秒くらいと短いので、間に合わなかったときは、さいどrtm.startから始めないとダメ。

接続したら、サーバーから type: hello が送られてくる。

受信したJSONを解析して type: message のみ拾っていけば、発言内容を使って処理するのは問題なくできそう。
問題は認証部分の簡略化。手作業でやるのはちょっとめんどくさい。

## 実装memo
### gem
https://github.com/shokai/websocket-client-simple
橋本商会さんのwebsocket-client-simple(http://shokai.org/blog/archives/7223)
他にもライブラリはあるようなのですが、これが一番わかりやすかったので。
### JSON parseエラーについて
受信した内容によって、たまにJSON parseエラーが出ることがある。
原因は何かで改行コードだけが送られてくることらしい。
>   next if msg.data.strip == ""

1行受信処理に追加するだけで、以後エラーがでなくなった
【Rails】Dateクラスチートシート : 時系列順


# Dateオブジェクトの取り方(時系列)

## 去年

```ruby
Date.today.prev_year
Date.today - 1.year

#=> Tue, 18 Nov 2014
```


## 昨月

```ruby
Date.today.prev_month
Date.today - 1.month

#=> Sun, 18 Oct 2015
```



## 昨日

```ruby
Date.yesterday
Date.today - 1

#=> Tue, 17 Nov 2015
```

## 今日


```ruby
Date.today
Date.current

#=> Wed, 18 Nov 2015
```

## 明日

```ruby
Date.tomorrow
Date.today + 1 

#=> Thu, 19 Nov 2015
```


## 来月

```ruby
Date.today.next_month
Date.today + 1.month

#=> Fri, 18 Dec 2015
```


## 来年

```ruby
Date.today.next_year
Date.today + 1.year

#=> Fri, 18 Nov 2016
```


## 特定の日付

```ruby 
Date.new(1987, 8, 20)
Date.parse('1987-8-20')

#=> Thu, 20 Aug 1987
```



# Dateオブジェクトのメンバーを取得する。

↓オブジェクト

```ruby
d = Date.parse('2014-01-01')

#=> Mon, 21 Apr 2014
```

## 何年？

```ruby

d.year 

#=>2014
```


## 何月？

```ruby 
d.month

#=>4
```


## 何日？

```ruby
d.day

#=>21
```

## 何曜日？

```ruby
d.wday

#=>1
```

数字と曜日の対応表

```ruby
{ 
  sun: 0,
  mon: 1,
  tue: 2,
  wed: 3,
  thu: 4,
  fri: 5,
  sat: 6
}
```




# strftime(Dateオブジェクトの整形)　

[引用：strftime を憶えられない](http://qiita.com/annyamonnya/items/97c5cb0cfa414b3592d7)

![Kobito.zGi1Yu.png](https://qiita-image-store.s3.amazonaws.com/0/71616/6e070961-7062-cfe9-8520-e4213f528734.png "Kobito.zGi1Yu.png")


## eg) strftime

```ruby
d.new(2016,12,24)

d.strftime('%Y/%m/%d')
#=> "2014/04/21"

d.strftime('%Y年%m月%d日(%a)')
#=> "2014年04月21日(Mon)"
```
Redisでzset型のデータをコピーする



# 概要

Redisにランキングデータとかをzsetで格納してたのですが、そのランキングデータを使って諸々テストしたくなりまして。
とはいえ、zsetをコピーする術が[commands](http://redis.io/commands)探してもなかった。かなしい。

そんな中で以下のようなエントリを見つけて、サクッとスクリプト書いたらコピーできちゃったお話です。
[RedisのLuaスクリプティング機能について « Rest Term](http://rest-term.com/archives/3038/)


# Redisでlua script書ける

`EVAL`ってコマンドを使うと書けるらしい。

```bash:bash
# 127.0.0.1:6379 にredis-serverがいるとして
redis-cli
```

```bash:redis-cli
127.0.0.1:6379> EVAL "return 'Hello, world!'" 0
#=> "Hello, world!"
```

[これ](http://redis.io/commands/eval)を読むと、引数も拾える。

```bash:redis-cli
127.0.0.1:6379> EVAL "return {KEYS[1], KEYS[2], ARGV[1], ARGV[2]}" 2 key1 key2 1 2
#=> 1) "key1"
#=> 2) "key2"
#=> 3) "1"
#=> 4) "2"

127.0.0.1:6379> EVAL "return {KEYS[1], KEYS[2], ARGV[1], ARGV[2]}" 2 key1 key2
#=> 1) "key1"
#=> 2) "key2"

127.0.0.1:6379> EVAL "return {KEYS[1], KEYS[2], ARGV[1], ARGV[2]}" 2 key1
#=> (error) ERR Number of keys can't be greater than number of args
```

## `SCRIPT LOAD`でscriptを登録しておける

`SCRIPT LOAD`と`EVALSHA`を使えば諸々捗りそう。
（redis-serverが落ちなければ発行されたhashkeyは残るっぽい）

```bash:redis-cli
127.0.0.1:6379> SCRIPT LOAD "return {KEYS[1], KEYS[2], ARGV[1], ARGV[2]}"
#=> "c0d2d6f81be75d67523d7c8ac69a932fbe1aa4e2"

127.0.0.1:6379> EVALSHA c0d2d6f81be75d67523d7c8ac69a932fbe1aa4e2 2 key1 key2
#=> 1) "key1"
#=> 2) "key2"

127.0.0.1:6379> exit
```

```bash:redis-cli
127.0.0.1:6379> EVALSHA c0d2d6f81be75d67523d7c8ac69a932fbe1aa4e2 2 key1 key2 1 2
#=> 1) "key1"
#=> 2) "key2"
#=> 3) "1"
#=> 4) "2"
```


# zsetをコピーするスクリプト

というわけで、[この辺](http://stackoverflow.com/questions/14297671/copy-a-redis-sorted-set-to-a-set)を参考に本題のスクリプト書いてみた。

とりあえずサンプルとしてコピー元データを作っとく。

```bash:redis-cli
127.0.0.1:6379> ZADD key1 10 1
#=> (integer) 1
127.0.0.1:6379> ZADD key1 20 2
#=> (integer) 1
127.0.0.1:6379> ZADD key1 50 3
#=> (integer) 1
127.0.0.1:6379> ZADD key1 100 4
#=> (integer) 1
127.0.0.1:6379> ZADD key1 30 5
#=> (integer) 1
127.0.0.1:6379> ZADD key1 1 6
#=> (integer) 1

127.0.0.1:6379> ZRANGE key1 0 -1
#=> 1) "6"
#=> 2) "1"
#=> 3) "2"
#=> 4) "5"
#=> 5) "3"
#=> 6) "4"
```

で、こんなかんじでスクリプト走らせると...

```bash:redis-cli
127.0.0.1:6379> EVAL "for i,v in ipairs(redis.call('zrange', KEYS[1], 0, -1)) do redis.call('zadd', KEYS[2], redis.call('zscore', KEYS[1], v), v) end" 2 key1 key2
#=> (nil)

127.0.0.1:6379> ZRANGE key2 0 -1
#=> 1) "6"
#=> 2) "1"
#=> 3) "2"
#=> 4) "5"
#=> 5) "3"
#=> 6) "4"

# ちゃんと`score`もコピーできてるで
127.0.0.1:6379> ZSCORE key2 6
#=> "1"
127.0.0.1:6379> ZSCORE key2 4
#=> "100"
```

というかんじになります。便利！


# おわりに

別の言語でscript書いて実行させてもよいのだけど、カジュアルに実行できるので割と便利かな、という感想です。以上！


# 参考

- [EVAL – Redis](http://redis.io/commands/eval)
- [RedisのLuaスクリプティング機能について « Rest Term](http://rest-term.com/archives/3038/)
- [Copy a redis sorted set to a set - Stack Overflow](http://stackoverflow.com/questions/14297671/copy-a-redis-sorted-set-to-a-set)
【iOS】UIImageViewでクロスフィードのようなアニメーションを実装したかった

おはこんばんちわ。
ドーモ。窓際エンジニア=デス

この度は、クロスフィードアニメーション作ってよと言われたので実装してみた。
クロスフィードは複数の画像をフィードして表示する

## 実行例
こんな感じ
![cross_fade.gif](https://qiita-image-store.s3.amazonaws.com/0/75536/a5e78715-66fc-515a-ec8c-d4ae32af29f9.gif)


## 問題
* コマ送りならUIViewの `animationImages` が使えるけど、フィードまで出来ない
* フィードさせたい画像は動的に増やしたいという要望

## 解決策
* タイマーを使って一定間隔で１枚づつ画像をフィードさせる

## 実装してみた

### CrossFade.swift
```swift
import Foundation
import UIKit

class CrossFadeView: UIView {
    var animationView: UIImageView!
    var countNum = 0
    var images: Array<UIImage> = []
    var timer: NSTimer?
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        animationView = UIImageView.init(frame: frame)
        self.addSubview(animationView)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func startCrossFade(duration: Float) {
        timer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval.init(duration), target: self, selector: Selector("crossFade"), userInfo: nil, repeats: true)
    }
    
    func stopCrossFade() {
        if timer?.valid == true {
            timer?.invalidate()
        }
        timer = nil
    }
    
    func addImage(image: UIImage) {
        images.append(image)
    }
    
    func crossFade() {
        guard images.count > 0 else {
            return
        }
        
        let nextImage = images[countNum % images.count]
        let trans = CATransition.init()
        trans.duration = 1.0
        trans.type = kCATransitionFade
        animationView.layer.addAnimation(trans, forKey: nil)
        animationView.image = nextImage
        countNum++
    }
}
```

### 呼び出し側
```swift
import UIKit

class ViewController: UIViewController {
    var crossFadeView: CrossFadeView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        crossFadeView = CrossFadeView.init(frame: CGRectMake(40, 100, 200, 200))
        crossFadeView.addImage(UIImage(named: "sample1")!)
        crossFadeView.addImage(UIImage(named: "sample2")!)
        self.view.addSubview(crossFadeView)
    }
    
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        crossFadeView.startCrossFade(2.0)
    }
    
    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
        crossFadeView.stopCrossFade()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
```

### クロスフィードさせたい画像を配列で管理しておく
表示したい画像をArrayで管理しておくと便利

`2015/ 11/18追記`
> 画像はサイズが大きいので、配列へ追加する場合は注意が必要です。
メモリを多く占有します。

### Timerで繰り返しフィードさせる
一定間隔である関数を呼ぶとき、NSTimerの `scheduledTimerWithTimeInterval` が便利

### Fadeのアニメーション
`CATransition` でFadeのアニメーションが用意されてる、便利

## まとめ
便利！最高！
【WordPress】プラグインを使用せず検索フォームにカテゴリーやタグを追加する

ウィジェットなどで表示する記事検索フォームにプラグインを使わずカテゴリーやタグも検索できるようにする方法です。
たぶん色々と既出かもしれませんが、自分で書くことも大事だと思うので、備忘録も兼ねて投稿します。

以下functions.phpに直接コピペで使えます。バージョン4.3.1で動作確認しました。

```php
/* 検索フォーム生成 */
function my_search_form( $form ) {

  $form = '<form role="search" method="get" id="searchform" class="searchform" action="' . home_url( '/' ) . '" >';

  // 投稿タイプ
  $form .= '<input type="hidden" name="post_type" value="post" />';

  // キーワード
  $form .= '<div><input type="text" value="' . get_search_query() . '" name="s" id="s" placeholder="キーワード" /></div>';

  // カテゴリー
  $form .= '<div>' . wp_dropdown_categories( 'echo=0&show_option_all=カテゴリー選択' ) . '</div>';

  // タグ
  $tags_query = ( isset( $_GET['tag'] ) && is_array( $_GET['tag'] ) ) ? $_GET['tag'] : array();
  $form .= '<div>';
  foreach (get_tags() as $tag) {
    $form .= '<label style="display: inline-block;"><input type="checkbox" name="tag[]" value="' . esc_attr( $tag->slug ) . '" ' . checked( in_array( $tag->slug , $tags_query), true, false ). ' />' . $tag->name . '</label> ';
  }
  $form .= '</div>';

  $form .= '<input type="submit" value="検索" id="searchsubmit" />';
  $form .= '</form>';

  return $form;
}
add_filter( 'get_search_form', 'my_search_form' );

/* 検索リクエストクエリー整形 */
function custom_parse_request( $query ) {
  if ( isset( $_GET['tag'] ) && is_array( $_GET['tag'] ) ) {
    // タグ検索は配列だとエラーになるので文字列に変更する
    $query->query_vars['tag'] = implode( ',', $_GET['tag'] );
  }
  return $query;
}
add_action( 'parse_request', 'custom_parse_request' );

/* 検索タイトル変更 */
function custom_title( $title, $sep ) {
  if ( is_search() ) {
    $title = '検索';
    if ( !empty( $sep ) ) {
      $title .= ' ' . $sep . ' ';
    }
  }
  return $title;
}
add_filter( 'wp_title', 'custom_title', 10, 2 );
```

Twenty Tenだとlabelが非表示になっているので、インライン指定で強制的に表示させてます。
この辺はテーマの仕様に応じて変更が必要になりますね。

検索タイトルはそのままだとキーワード未入力の場合タイトルが「  | 検索結果:  | サイトタイトル」って感じで変になってしまうので「検索 | サイトタイトル」となるようにしています。
LibreNMSを触ってみる

cactiの引っ越し先候補としてLibreNMSなるものを見つけた。

#LibreNMSとは
Observium(http://www.observium.org/) のcommunity-based forkらしい(https://github.com/librenms/librenms)

#Observiumじゃダメなの？
Observiumはalert通知が有料なので

#インストール
公式の手順(http://docs.librenms.org/Installation/Installation-(Debian-Ubuntu)/) 通りに進める。
「Manual vs. web installer」のセクションでweb installerを選んだ。
無事終わったと思ったら、登録した機器にポーリングしてない。

#トラブルシュート
- ディレクトリ「rrd」を777に
- cronをCLIで設定

でとりあえず動いた。
インストールはwebUIじゃなくてCLIで進めたほうが良さそう。
Rails の radio_button のエラーがとても出しにくい

## 問題点

+ 以下の様な物を準備した時に、`field_with_errors`の`div`が各`radio_button`に書かれてしまう

+ new.html.slim

```rb
form_for @gessy0129 do |f|
  - Gessy0129.statuses.each do |key, val|
    = f.radio_button :status, key
    label for="gessy0129_status_#{key}"
      = t("activerecord.gessy0129.status.#{key}")
```

+ app/model/gessy0129.rb

```rb
  enum status: {
    open:  1,
    close: 2,
    deny:  3
  }

  validates :status,
    presence: true
```

+ 通常時のHTML

```html
<form action="/gessy0129">
  <input type="radio" value="open" name="gessy0129[status]" id="gessy0129_status_open" />
  <label for="gessy0129_status_close">有効</label>
  <input type="radio" value="close" name="gessy0129[status]" id="gessy0129_status_close" />
  <label for="gessy0129_status_open">無効</label>
  <input type="radio" value="deny" name="gessy0129[status]" id="gessy0129_status_deny" />
  <label for="gessy0129_status_deny">拒否</label>
</form>
```

+ エラー時のHTML

```html
<form action="/gessy0129">
  <div class="field_with_errors">
    <input type="radio" value="open" name="gessy0129[status]" id="gessy0129_status_open" />
  </div>
  <label for="gessy0129_status_close">有効</label>
  <div class="field_with_errors">
    <input type="radio" value="close" name="gessy0129[status]" id="gessy0129_status_close" />
  </div>
  <label for="gessy0129_status_open">無効</label>
  <div class="field_with_errors">
    <input type="radio" value="deny" name="gessy0129[status]" id="gessy0129_status_deny" />
  </div>
  <label for="gessy0129_status_deny">拒否</label>
</form>
```

## 解決案

+ ググったら以下の二択っぽい空気

1. `config/application.rb` の`config.action_view.field_error_proc` で`field_with_errors`を無かったことにする
2. `config/application.rb` の`config.action_view.field_error_proc` の`html_tag`で分岐

ただ、

+ 全部消すのは影響デカイのでなし
+ `html_tag`での分岐は正規表現書くのが面倒

という理由により別方策を検討してみました

## 検討結果

`hidden`の時に`field_with_errors` が出てないのに着目
`actionview/lib/action_view/helpers/active_model_helper.rb`

の制御をモンキー・パンチすればいいんじゃね！？

## 解決済みプログラム

+ `config/initializers/action_view_helpers.rb`

```rb
module ActionView
  module Helpers
    module ActiveModelInstanceTag
      def tag_generate_errors?(options)
        (options['type'] != 'hidden' && options['type'] != 'radio')
      end
    end
  end
end
```

## 最後に

+ より良い解決策あれば教えて下さい
【Swift】Pythonでのall, anyをSwiftで。

2017/10/04 - Swift4に変更。（`BooleanType`がなくなった。）

# この記事について
Pythonにあるような、`all`, `any`をSwiftで実装してみました。

# コード

```swift

extension Sequence where Element == Bool {

    var any: Bool {
        return reduce(false) { $0 || $1 }
    }
    
    var all: Bool {
        return reduce(true) { $0 && $1 }
    }
    
    
    // -- 参考記事との比較として
    
    var one: Bool {
        return filter { $0 }.count == 1
    }
    
    var none: Bool {
        return !any
    }
}
```

`func`版

```swift

extension Sequence where Element == Bool {

    func any() -> Bool {
        return reduce(false) { $0 || $1 }
    }

    func all() -> Bool {
        return reduce(true) { $0 && $1 }
    }


    // -- 参考記事との比較として

    func one() -> Bool {
        return filter { $0 }.count == 1
    }

    func none() -> Bool {
        return !any()
    }
}
```

# 使い方

```swift


let boolArray = [true, false, false]
let boolArray2 = [true, true, true]


print(boolArray.any) // true
print(boolArray.all) // false

print(boolArray2.any) // true
print(boolArray2.all) // true
```


# 追記

@mono0926 さんからコメントをいただきました。
判定条件を指定できるようになります。

```swift

extension Sequence {

    func any(f: ((Element) -> Bool)) -> Bool {
        return reduce(false) { $0 || f($1) }
    }

    func all(f: ((Element) -> Bool)) -> Bool {
        return reduce(true) { $0 && f($1) }
    }

}

struct Mono {
    let name: String
    init(name: String) {
        self.name = name
    }
}

// 以下、nameが空文字のものが存在するか、nameが全て空文字かを判定
let monos = [Mono(name: ""), Mono(name: "foo")]
print(monos.any { $0.name.isEmpty }) // -> true
print(monos.all { $0.name.isEmpty }) // -> false

let monos2 = [Mono(name: ""), Mono(name: "")]
print(monos2.any { $0.name.isEmpty }) // -> true
print(monos2.all { $0.name.isEmpty }) // -> true
```


# 参考

[Swiftのreduceで集合の条件確認用関数を書いた](http://qiita.com/to4iki/items/f7beaf55262be6e8d27f)
[Functional Snippet #5: Reduce · objc.io](https://www.objc.io/blog/2014/11/03/functional-snippet-5-reduce/)
iOSでwebViewを使わないTwitterログインを実装する

アプリでログインする時に毎回Twitterのログイン・パスワードを入力するのは面倒です。 
iOSの場合端末でアカウントを設定していることが殆どだと思うので、その場合はログイン情報入力なしでログインを行うことができます。 
TwitterKitでもauthTokenSecretは取れるのですが、サーバーサイドでの認証でエラーになってしまうため、STTwitterで取得しなおしています。 
※↑Twitterのキーとシークレットが間違っていただけでした。(追記)

## 使うもの
### iOSクライアント
* TwitterKit
* (Fabric)←使っている前提です

### サーバーサイド
* kertz/twitteroauth

## 実装
### iOS(objective-c)
twitterのセットアップは下記を参照します。 
http://dev.classmethod.jp/smartphone/ios-fabric-sign-in-with-twitter/

twitterのキーとシークレットを書き換える

```Info.plist
<key>APIKey</key>
<string>hogehoge</string>
<key>Kits</key>
<array>
    <dict>
        <key>KitInfo</key>
        <dict/>
        <key>KitName</key>
        <string>Crashlytics</string>
    </dict>
    <dict>
        <key>KitInfo</key>
        <dict>
            <key>consumerKey</key>
            <string>サーバーサイドで使っているものに書き換える</string>
            <key>consumerSecret</key>
            <string>サーバーサイドで使っているものに書き換える</string>
        </dict>
        <key>KitName</key>
        <string>Twitter</string>
     </dict>
</array>
```
```objectivec:ログイン画面.h
@property (weak, nonatomic) IBOutlet TWTRLogInButton *twitterLoginButton;
```

```objectivec:ログイン画面.m
- (void)viewDidLoad
{
    [super viewDidLoad];
	
	[_twitterLoginButton setLogInCompletion:^(TWTRSession * _Nullable session, NSError * _Nullable error) {
        [hud hide:YES];
        if (!error) {
            [self finishedTwitterLogin];
        } else {
            // error
        }
    }];
}
```


### サーバーサイド(PHP)
クライアントから取得したtokenとsecretを元にユーザー情報を取得します。 
TWからのレスポンスは下記参照。 
https://dev.twitter.com/rest/reference/get/account/verify_credentials

```php:ツイッター認証.php
public function auth()
{
	$oauth_token = Input::get('oauth_token');                                                                                                                                                             	              
	$oauth_token_secret = Input::get('oauth_token_secret');
	// エラー処理が必要
	$connection = new TwitterOAuth('twitter-app-key', 'twitter-secret', $oauth_token, $oauth_token_secret);
	$twitter_user = $connection->get($connection->host . 'account/verify_credentials.json');

	// $twitter_user->id, $twitter_user->name, $twitter_user->profile_imageなどを使用する
}
```
SidekiqでQueueが空になってからSidekiq Workerを終了する

# これは何か？

SidekiqでQueueが空になってからSidekiq Workerを終了する簡単な方法。Sidekiqをdaemon化してinit scriptなどで開始、終了するような場合に使える。

利用例としては、EC2のLocalにRedisを持ってSidekiqを使用するときなどに、タスクが蒸発することを防ぐことができる。

# 前提知識

* ```kill -TERM```とは何かを理解している。

# やり方

Sidekiqにタスクを投げる側（概ねRails等）を止めてから

```
$ rails runner 'puts Sidekiq::Queue.new.size'
```

をすると、Queueに残っているタスク数が帰ってくる。なので、上記が0になってから

```
$ kill -TERM [Sidekiq PID]
```

する。TIMEOUTして```kill -9```してしまわないようにだけ注意する。

もちろん```sidekiqctl```を使ってもいい。upstart等であれば、stopの時に投げられるのはTERMなので、pre-stop等で待ってあげると良い。

# 展望

実行時間が長いタスクをローカルのSidekiqに置いておくと全然シャットダウンされなかったり、Task executerによってはタイムアウトしてkillされちゃうので、別途Redisを立てておいてタスクを転送したりしたほうが良いかもね。

# まとめ

ほら、簡単でしょ？