OmniAICreator/Qiita-1.07M huggingface dataset:
CakePHP3で自作アプリを作ってみた part1 〜イントロ〜

大学時代にバーテンダーサークルだったこともあり、シェイカーを最近もらいましたww  
でもいざカクテルを作ろうとしても暗記してないため、結局ネットいきますよね。。。

ということでDIY的にカクテルを検索できるサイトを作成したので少しずつ解説していきたいと思います。

ブツはこちら公開済み。
https://cocktail-com.herokuapp.com/

データ登録が間に合わなかったので悪しからず。。。
少しづつ登録します。

## 公開予定はおそらくこんな感じ ＊2018/3/5変更
* part1 ←今回
 * どんなやつが？
 * 目的
 * アプリの概要
 * 使用技術
 * 稼働サマリ
* part2
 * CakePHP3のインストール
 * heroku初期設定 ←変更しました
 * config設定
 * herokuでHello World!! ←変更しました
* part3
 * 検索機能
* part4
 * 登録機能
 * 編集機能
* part5
 * 画像アップロード
* part6
 * 削除機能 ←変更しました
 * ログイン
 * 認証、認可
* part7
 * キャッシュ設定

**CakePHP3で自作アプリを作ってみた シリーズ**
として7回に渡って記載していくつもりです。

---

## どんなやつが？
作者のプロフィールやスキルセット、経歴はこんな感じ。

~~ 新卒SE約5年 ~~

* javaプログラマ約2年
 * SIerで主に業務システムを構築
* PM, PL, 上流工程約3年
 * web企業お客さんに運用保守エンハンスのSEチームを構成して稼働。
 * この間プログラムは仕事でほとんど組むことなし

~~ 転職WEBエンジニア約4ヶ月 ~~

* phpプログラマ約4ヶ月
 * web広告企業で修行中
 * 業務ではsilexを使用
* 副業解禁のためフリーランスに片足を突っ込み、ベンチャー企業から仕事を受注し、プログラマを担当

## 目的
自作アプリを作成する目的をブレストで羅列する

1. 金儲け
 * アフィリエイト
 * 売ったり会社にしたり
2. 自己学習
 * 使ったことない技術を使う
 * 仕事でなかなかできない部分を作れる
 * 広く全体を担当できる
3. 実績作り
 * 転職や仕事を受けるための実力の証明
4. 自分で使う用
 * 今あるサービスでは要件を満たしていない、または使いにくい

ざっとこんな感じではないかと。
この中から自分の中での目的を定める。
ここがブレるとタダ時間をロスしたり、途中で飽きてしまったりするため大切。

自分の場合は「3 > 2 > 4」って感じです。
つまり、実績を作るのをメインにして、ついでに自分も使えて勉強もしちゃおうってことです。そのまんまですね。  

## アプリの概要
オーソドックスな検索サイト。対象はカクテル。
検索にはログイン不要。登録、編集、削除にはログイン必要。というようなもの。

機能は当たり前のものを。

* メインサイト
 * 検索
 * 登録
 * 編集
 * 削除
* カクテル材料管理サイト
 * 登録
 * 編集
 * 削除
* 双方へのログイン、ログアウト
* スマフォへのレスポンシブ対応

ログインはメインサイトに対して行って、
管理サイトはログインしている場合のみ使えるサブメニュー的な位置づけです。

以下イメージ図。
<img width="739" alt="スクリーンショット 2018-03-04 13.16.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/200408/bf309332-d606-3c04-fa43-e7943755aa33.png">

## 使用技術
* CakePHP3
* jQuery
* Bootstrap
* heroku
 * memcached(キャッシュ)
 * PostgreSQL(DB)
 * NewRelic(パフォーマンス監視)
* AWS
 * S3(画像配信用ストレージ)

PHPを最近初めてsymfony系は学習済みなので、今回は評判が好調と聞いているCakePHP3を勉強のために選定。
Laravelもやりたいがおそらく次回。

他は馴染み(自分はそこまで馴染んでないが)のjQueryやBootstrap、
インフラ構築は目的ではないので簡単にアプリを公開できるherokuを選定しました。

アプリとして画像もアップしたかったのでS3で。
CloudFrontも入れたかったのですが、おそらくアクセス多いわけでないので一旦なしで進めました。

## 稼働サマリ
完成までのサマリ的なものを記載するとこんな感じです。 
今回は初CakePHPということで書き方を調査しながら書いたため時間を要した。
実際には100hくらいでできるのかなーって感覚でした。  

* 期間約2ヶ月
* 稼働150h
 * 平日2-5h
 * 休日 -8h

---

 とりあえずpart1はこの辺まで、
 次回は

* CakePHP3のインストール
* heroku初期設定 ←変更しました
* config設定
* herokuでHello World!! ←変更しました

 あたりを解説しようと思います！
ゲームのマスタデータ管理ツール


# 概要
- マスタデータを使ったゲームを開発するための補助ツールです
- 個人で開発しているゲーム向けに作ったものであるため、使用する場合は各プロジェクトに合わせて修正が必要です
- プランナーの意見をもとに、エンジニアとプランナー双方にとって幸せになるマスタ管理ツールを目指しました

# ファイル本体
https://github.com/Yunomigit/MasterDataCreate

# 機能
- 他のマスタデータのコピーを同期することができます
- 全体のマスタと更新するマスタを別々に管理することができます

# 基本的な使い方
1. updateカラムに更新タイミングとなる名称を記入します
2. 保存時に区分単位でExcelを新たに自動作成することができます
3. 自動作成する区分が新規の場合は、「新規作成データ」の中に入るので、適時そのフォルダを管理用マスタデータフォルダに移動します
4. 既に区分内容のマスタフォルダが「管理用マスタデータ」の中にある場合は、そちらのデータを上書きします

# 同期について
- マスタ名＋(copyというシートを作成します
- MasterBaseのExcelの内容を更新します
- 上記2つを行うと、Excelを開いたタイミングでcopyシートの内容がメイン側の内容と同一になります（自動で毎回最新版コピーが作られます）

# 補助機能
- memoと名前の入ったシートは、メモ用として使えます。マスタデータの自動作成から除外されます
- memo)と入ったカラム及びupdate_nameと入ったカラムはマスタデータの自動作成時に自動で列削除されます
- 2行目の各カラムコメントはマスタデータの自動作成時に自動で列削除されます

# 改変について
- Alt＋F11キーを押すとVBAエディタが開きます。適時改変してご利用下さい
ディレクトリの変更監視方法メモ (Java、Kotlin)

JavaのWatchServiceの使い方、軽い気持ちで始めたら予想外に嵌ったのでメモ。コードはKotlinですがJavaでもやることは同じかと。

```kotlin
class Watcher private constructor(
        val path: Path,
        val listener: (e: WatchEvent<Path>, target: Path) -> Unit
) : AutoCloseable {

    private val executor = Executors.newSingleThreadExecutor()
    private val watchService = path.fileSystem.newWatchService()

    init {
        val watchKey = path.register(watchService, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY)

        executor.submit {
            while (true) {
                val key = watchService.take()
                assert(watchKey == key, { "一つのキーしか登録しないので、必ず一致するはず" })

                for (e in watchKey.pollEvents()) {
                    @Suppress("UNCHECKED_CAST")  // WatchKeyのイベントが上記である場合、常にPathであることは保証されている
                    listener(
                            e as WatchEvent<Path>,
                            path.resolve(e.context())
                    )
                }
                val valid = watchKey.reset()
                if (!valid) throw RuntimeException("普通は起こらないはず")
            }
        }
    }

    override fun close() {
        executor.shutdownNow()
        executor.awaitTermination(1, TimeUnit.SECONDS)  // この値は適当
        watchService.close()
    }

    companion object {
        fun watch(
                path: Path,
                listener: (e: WatchEvent<Path>, target: Path) -> Unit
        ): Watcher {
            return Watcher(path, listener)
        }
    }

}
```

## ポイント

* 監視は`ExecutorService`を使い別スレッドで行う。`WatchService.take()`は変更が検知されるまでブロックするため。`poll()`ならブロックせず`null`を返すが、いずれにしても別スレッドで行ったほうが都合がいい。
* `WatchKey.pollEvents()`はワイルドカード型の`WatchEvent`のリストを返す。しかし`WatchEvent.context()`は[ドキュメント](https://docs.oracle.com/javase/jp/9/docs/api/java/nio/file/WatchEvent.html#context--)で、イベントが`ENTRY_CREATE`, `ENTRY_DELETE`, `ENTRY_MODIFY`のいずれかである限り、常に`Path`を返すことを保証している。要するに必ず`Path`になるので、無条件にキャストして問題ない。
* `WatchEvent.context()`が返す`Path`は、監視しているディレクトリからの相対パスで返される。従って返される`Path`をそのまま使おうとすると、カレントディレクトリを基準に当該ファイルを探そうとする。そのため(監視ディレクトリがカレントでない限り)ファイルが見つからず、例外が発生する。この動作はかなり非直感的でしかも不便なため、リスナーには別途、監視対象ディレクトリの`Path`を基準に解決した`Path`を返している。
* `WatchKey.reset()`で監視を再開する。戻り値はリセットに成功したかを表すが、[ドキュメント](https://docs.oracle.com/javase/jp/9/docs/api/java/nio/file/WatchKey.html)を読む限り実質的に`isValid()`とほぼ同様な模様。キーが有効である条件は

    > 1. そのcancelメソッドの呼出しによって明示的に取り消される
    > 2. そのオブジェクトにアクセスできなくなったために暗黙的に取り消される
    > 3. 監視サービスを閉じることで取り消される

    ということで、今回のコードでは通常起こらない……はず。
* ファイルを作成などした後、`WatchService.take()`が値を返すまではかなりの時間がある(自分の環境では5秒ほど)。遅い。


## 改善案

* コールバックの実行は別スレッドへ
* 参照がなくなった時自動`close()`を試みる
* 監視を行うスレッドは各`Watcher`で共通にする?


## 所感

使いづらい...
Cloud Days / Alexa Dayにみるクラウドベースのサービスのいま

2月20日・21日と、日経BP主催の大型ITイベント Cloud Days 東京 2018が開催されました。Cloud Days / IoT Japan / Security 2018 / ビジネスAI 2018との共催というクラウドをベースにしたITの最新動向をみることのできるイベントです。各種セミナーも開催されましたが、その中でクラウドサービスとして世界シェア3位にあたり「Alibaba Cloud」の仕組みや先進的な事例を紹介してくれた講演のレポート記事をピックアップして紹介します。
また、2月12日には神戸の三宮で「Alexa Day 2018」が開催されました。スマートスピーカAmazon Echoなどに搭載されているAmazonの自然言語エンジン”Alexa”。AmazonのユーザグループであるJAWS-UGの神戸の人たちを中心とした有志による主催のイベントです。Alexaの大型イベントがまだ開催されていないこともあり、首都圏からも多くの人が足を運んだようです。Alexaの事例紹介としてNRIやパルコの方からの講演もあり、有志によるイベントとは思えない規模のイベントになったようです。オンラインメディアの記事からピックアップして紹介します。

※下記サイトからの転載。ビッグデータ・AIなどに関するトピックを毎週取り上げています。
[TechCrowd: https://www.techcrowd.jp/related/](https://www.techcrowd.jp/related/)


#[クラウドこそセキュリティーに高い信頼性　「ビッグデータ時代」を支えるAlibaba Cloud] (https://www.j-cast.com/trend/2018/02/23321947.html?p=all)

オンラインニュースのJ-CASTのCloud Days講演レポートです。Alibaba Cloudの仕組みや先進的な事例を紹介した、SBクラウド・プロダクト技術部のソリューションアーキテクト、奥山朋氏の講演をレポートしています。日本では2016年12月から、SBクラウド（本社・東京）がAlibaba Cloudの国内データセンター運用やサービスのローカライズ、日本語サポートの提供を行っています。

アリババグループは、電子商取引をはじめ物流、動画などのエンターテインメント、金融サービス「Alipay」と幅広い分野をカバーする中国の代表的なIT企業です。アリババグループが提供するクラウドサービスが「Alibaba Cloud」。中国市場でのシェアはアマゾンの「AWS」やマイクロソフトの「Azure」といったクラウドサービスを抑え首位、世界シェアでも3位になるようです。

中国でAlibaba Cloudが顧客から求められる理由に、セキュリティーの堅牢さがあるとのこと。現在、中国では、外部からパスワードを不正に割り出そうとする「パスワードクラック」は、毎日約2億回発生。ウェブサイトへの攻撃が毎日約2000万回、さらに、複数のコンピューターから相手サーバーに過剰な負荷を与えてサービス停止に追い込む「DDos攻撃」は同約1000回起きているとのこと。

中国ではおよそ4割の企業がAlibaba Cloudを利用しているとのことですが、その理由として、中国では自社で重要なデータを大量に持つことが危険なためクラウドに置くという考え方が一般的なようです。
日本も順次そのような考え方が一般的になっていくのでしょうか。


#[この熱気こそニュース！聖地神戸で「Alexa Day 2018」なう] (http://ascii.jp/elem/000/001/630/1630481/)

ASCII.jpの中のJAWS-UGコーナ、JAWS-UG on ascii.jpに掲載された“Alexa Day 2018”のレポート記事です。

2018年2月11日、神戸のスペースアルファ三宮にてAlexaの開発者向けのイベント「Alexa Day 2018」が開催。登録者で350名、チケットも売り切れた大人気イベントとなった様子を伝えています。Alexa Day 2018を主催したのは、日本上陸以前からAlexaの開発やノウハウを勉強会で重ねてきたJAWS-UG神戸を中心とした有志。

朝から始まったイベントはみずほ銀行やパルコ、TOKAIなどの豪華なユーザー事例やAlexaスキルの技術情報を紹介するセッショントラックが2つのほか、「親子で楽しむロボット工作＆Alexaスキル開発ワークショップ」も開催された。また、会場の入り口ではAlexaスキルの開発を手がけるクラスメソッドやハンズラボ、TOKAIなどがアトラクションとしてブースを展示。

LT形式によるAlexaのスキルコンテスト、Alexaを含めたIoT、AI、サーバーレスなどのテクノロジーにエンジニアはどう対応していくかを語り合うパネルディスカッションも行なわたようです。


#[なぜEchoを店頭に置くのか？パルコがAlexaに行き着くまでの道] (http://ascii.jp/elem/000/001/630/1630668/)

JAWS on ASCII.jpに掲載された、Alexa Day 2018でのパルコ林氏の講演レポートです。「Alexaによる店頭接客プロジェクトがなぜ生まれたのか」。コミュニケーション手段の変化やテナント側の人手不足といった課題を解消するため、テクノロジーで接客を拡張する必要性があったようです。

林さんはもともとは店舗のマーケティング担当でAWSの導入を進めた経験をもち、いまはグループICT戦略室の担当。林氏が中心となって手がけてきたパルコのAWS導入は多岐にわたり、店舗のWebやスマホアプリをはじめ、デジタルサイネージへのデータ供給、カメラや温度などのセンサーデータの活用、データ分析などマーケティング施策などにもAWSを利用しているとのこと。

今回の講演で紹介してくれたのは、PARCOの店舗案内に特化したAlexaスキルの開発に関して。Alexaの日本語対応を同時に発表され、現時点では池袋PARCOのショップやレストラン、取り扱い商品、周辺施設について音声で検索できる。今後、店頭にEchoを設定できるようにして、音声で問い合わせてもらうだけではなく、タブレット型のサイネージと連携して、マップでお客様を誘導できるようにしたいとのこと。


#[Alexa Day 2018 のロボワークショップに参加してきましたよ] (https://gatespace.jp/2018/02/14/alexa-day-2018-workshop/)

Alexa Day 2018のロボットワークショップに親子で参加された方のブログです。
Alexa Day 2018の会場の様子や、ロボットワークショップの様子などリアルに描かれています。
AWS Cloud9でyapfを使ってPythonコードを自動整形する

# AWS Cloud9にyapfを導入

AWS Cloud9ではCustom Code Formatterを設定できるので
ファイル保存時にyapfを実行し、
Pythonコードをフォーマットするようにしたいと思います

## yapfとは

yapf( https://github.com/google/yapf )とは
Pythonのコードフォーマッターで、
次の例のようにコードを綺麗にフォーマットしてくれます


フォーマット前

```py
x = {  'a':37,'b':42,

'c':927}

y = 'hello ''world'
z = 'hello '+'world'
a = 'hello {}'.format('world')
class foo  (     object  ):
  def f    (self   ):
    return       37*-+2
  def g(self, x,y=42):
      return y
def f  (   a ) :
  return      37+-+a[42-x :  y**3]
```

フォーマット後

```py
x = {'a': 37, 'b': 42, 'c': 927}

y = 'hello ' 'world'
z = 'hello ' + 'world'
a = 'hello {}'.format('world')


class foo(object):
    def f(self):
        return 37 * -+2

    def g(self, x, y=42):
        return y


def f(a):
    return 37 + -+a[42 - x:y**3]
```


コマンドだと下記のように実行します

```
$ yapf -i sample.py
```


# 設定手順

## yapfをインストール

```
sudo pip install yapf
```

## Custom Code Formatterの設定
AWS Cloud9の「Preferences」の「Python Support」の中に
「Custom Code Formatter」の欄があるので、

```
yapf -i "$file"
```
と書きます

![スクリーンショット 2018-03-04 12.24.43.png](https://qiita-image-store.s3.amazonaws.com/0/210767/855a7a8b-b7c9-c15d-df6a-f893595a5dfe.png)

以上で設定完了です。
コードを保存すると、自動でフォーマットしてくれます。

# フォーマットスタイルのカスタマイズ

フォーマットスタイルはデフォルトではpep8になっていますが、
好みに合わせてカスタマイズできます

詳細はこちらにあります
https://github.com/google/yapf
iOSアプリの段階リリースは複数バージョンに渡って継続させることが出来る

iOSアプリのリリース時に段階リリース機能を使っている方が多いと思いますが、段階リリース中にそのまま次のバージョンを段階リリースした時の挙動を記しておきます。

すでにバージョン1.0が通常リリース済みである前提で、あるバージョン(バージョン2.0とします)を段階リリース中に次のバージョン(バージョン3.0とします)を段階リリースすると、バージョン2.0の段階リリースが自動的に解除されてベースバージョンとなり、バージョン3.0の段階リリースが有効になるとばかり思ってました。

しかし実際はバージョン2.0もバージョン3.0も並行して段階リリースが継続してる模様です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224279/2247275e-2948-6b4a-66af-7d773528a15b.png)

これはDAUに置けるバージョンごとのシェアの分布ですが、ここで例に挙げたバージョン1.0が73.5%、バージョン2.0が10.3%、バージョン3.0が7.0%と、段階リリースが並行して継続されてることが、この数値から見て取れます。

今回は特殊なケースでリリースが重なったので、副産物としてこのような動作検証が出来た形になりましたが、あまり段階リリース中にさらに上乗せする形で段階リリースをすることは稀だと思います。

しかし、似たような状況に直面した方の一助となれば幸いです。
AWS上でWordpPressの環境を構築してみる

## 〇目的 ##
・最近Qiitaにいろいろと書いているが、完全な駄文などを書き散らかす環境も一つ欲しいなと思った次第。
せっかくなので、WordPress環境を構築してみようかと。

## 〇印象 ##
- 始めるまで

Linuxのインスタンスを作成して、そこにインストールするのかな？と思ってた。
※なんでLinux環境かというとAWSの無料枠を使いたかったから。

こんな感じの構成でしっかりと構築するようなイメージ
https://aws.amazon.com/jp/getting-started/projects/build-wordpress-website/


- ちょっと調べた結果

本家のチュートリアル
https://aws.amazon.com/jp/getting-started/tutorials/launch-a-wordpress-website/
https://aws.amazon.com/jp/getting-started/tutorials/get-a-domain/

あれ？これってかなり簡単そうなのでは？

## 〇環境構築開始 ##
チュートリアルの通りに進めてみる。
以下ポイント：チュートリアルに記載されていることも含む

- AMI：WordPress Certified by Bitnami
- インスタンス：t2.micro
- ストレージ：10G
- 削除保護にチェックを追加
- セキュリティグループ：SSH、HTTP、カスタム TCP ルール(HTTPS)
※チュートリアルでは未設定だが、マイIPのみにしておく。
→マイIPを選択すると勝手に自環境の設定をしてくれるので楽チンでありがたい。
※当たり前だが、ここで制限を入れたらそのIP以外からはサイトも確認できない。

- Tag：[Name]/[WordPress_01]
- キーペアは作成
※チュートリアルだと無しでと記載されているが、念のため作成しておく。

こんな感じでStep1,2終了。
Hello world!が表示されているのを確認。
ちんたらやってたのにここまでで30分ほど。あっという間。


## 〇設定変更 ##
- システムログを取得して、PASSを確認
- 管理サイトにログイン
- メアド設定
- 言語設定
- タイムゾーン設定

とりあえずなので、ドメインは登録しないでおく。お金かかるし。

これでとりあえずは出来上がり。簡単だったな。
ここまでで1時間弱。

## 〇ここから先 ##
WordpPressについての設定とかは以下を参考にそのうち設定しよう。
たぶんこっから先はこだわりだすと時間がかかるんだろうなと思われる。

・初期設定系
https://jisedai-lab.com/wordpress-setting/
https://jisedai-lab.com/blog-writing/

・デザイン/テンプレート
https://ferret-plus.com/3804

・Qiitaの記事をWordPress側に反映
https://qiita.com/icchi_h/items/2f8494ed4684a673a0c0
https://qiita.com/ka215/items/5112a76df0426a5b0af1
https://it-tantou.com/361/
webapi入門（仕組みやら使い方やら）

# この記事の目的

webapiを使ったアプリケーションを作るにあたってどのwebapiでも共通している基本的な流れをまとめてみた。

# webapiを使うサービスに登録

URLなどを登録し、このサイトからのapiのアクセスを許してねという登録をする。

# apikey、apiシークレットの取得

id,passのようなもので登録すると発行される。

# 取得

基本的にはapiにリクエストを登録したサービスから送り、XMLやJSON形式で出力されて返信がくるのでそれをサービス上に表示する。
CentOS7 新規インターフェイス認識

# 背景
今回Vmware上に構築したCentOS7が乗る仮想マシンへインターフェイスを追加した。
その際、設定ファイル等の作成が必要となった為、ここに記す

# 環境
OS : CentOS7.4 64bit

# 手順
インターフェイスを追加した際、マシン上では認識されているがNetworkManagerには登録されていない為認識されない。
NetworkManagerに追加したインターフェイスを認識させる為、設定ファイル等を作成する。

## 認識されているインターフェイスの確認
 \#nmcli d
>デバイス  タイプ    状態      接続
>[既存インターフェイス]    ethernet  接続済み  [既存　インターフェイス名]
>[新規インターフェイス]    ethernet  接続中（IP 設定を取得中）  有線接続 1

## 新規インターフェイスの認識設定
 \# nmcli c add type ethernet ifname [新規インターフェイス] con-name [新規インターフェイス名]

上記により新規インターフェイスがNetworkManagerに登録された。
DockerとRe:VIEWで本を書くメモ

本を書きたくなる日が来るとして，本の書き方をググったところ，Re:VIEWがヒットしたのでメモ．

- https://github.com/kmuto/review

gemで必要なアプリをインストールしたり，texliveが新し目である必要が合ったりするので，Dockerでcleanな環境を作りたい．

ぐぐったところ，あった．

- https://github.com/vvakame/docker-review


これを使えばいい気もするが，全てを把握するという意味で，これを参考にして自分でもやってみた．

```dockerfile:Dockerfile
FROM ubuntu:18.04

RUN apt update

# for tex
ENV DEBIAN_FRONTEND noninteractive
RUN apt install -y texlive-latex-extra texlive-fonts-recommended texlive-lang-japanese fonts-lmodern

# for review
RUN apt install -y rbenv ruby-build ruby-dev
RUN gem install review review-peg --no-rdoc --no-ri

# for noto font
RUN apt install -y fonts-noto-cjk fonts-noto-cjk-extra
RUN apt install -y git
RUN git clone https://github.com/vvakame/docker-review.git
RUN mv docker-review/noto /usr/share/texlive/texmf-dist/fonts/map/dvipdfmx/ptex-fontmaps/
RUN rm -rf docker-review
RUN mktexlsr && kanji-config-updmap-sys noto

CMD ["/bin/bash"]
```

noto fontsはGoogleの人たちが "no more tofu"という意味で作ったフォント．tofuというのは文字化けしたときの白い四角□のことらしい．

- https://www.google.com/get/noto/

## 使い方

1. docker imageを作る
    - ``sudo docker build ./ -t my_review``
    - または
    - ``sudo docker pull eisoku9618/kuroiwa_dockefiles_for_review``
       - https://hub.docker.com/r/eisoku9618/kuroiwa_dockefiles_for_review/
2. Re:VIEWの作業フォルダを作る
    - ``sudo docker run --rm -it -v `pwd`:/ eisoku9618/kuroiwa_dockefiles_for_review /bin/bash``
    - ``review-init my_book``
3. pdfに変換する
    - ``sudo docker run --rm -v `pwd`/my_book:/tmp eisoku9618/kuroiwa_dockefiles_for_review /bin/sh -c "cd /tmp && review-pdfmaker config.yml"``

これをgitで管理してCIすれば良さそう

## 編集方法

普通にemacsで編集していくが，こまめに保存してこまめに成果物を見たい．
調べてみたらshellで解決する作戦が合って，
それをワンライナーにした

- http://mizti.hatenablog.com/entry/2013/01/27/204343

```bash:oneliner
fname="my_book/hoge.re"; last=`ls --full-time $fname | awk '{print $7}'`; while true; do sleep 1; current=`ls --full-time $fname | awk '{print $7}'`; if [ $last != $current ] ; then echo ""; echo "updated: $current"; last=$current; sudo docker run --rm -v `pwd`/my_book:/tmp eisoku9618/kuroiwa_dockefiles_for_review /bin/sh -c "cd /tmp && review-pdfmaker config.yml"; fi; done
```
CData Software ハンズオン（CData API Server で作成したWebAPIにBIツール(PowerBI)からアクセス）

# 使用する製品

- [CData API Server](https://www.cdata.com/jp/apiserver/)
- [Microsoft Power BI Desktop](https://powerbi.microsoft.com/ja-jp/desktop/)
- [MySQL Community Edition](https://www.mysql.com/jp/products/community/)

# 前提

下記の手順を実施してブラウザからCData API Serverにアクセス出来る事。

[CData Software ハンズオン（RDBからWebAPIをポイント＆クリックで作成 編）](https://qiita.com/drafts/c664570c9d4732a57fac)

# 動作イメージ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/09653a10-22f0-895f-84c1-2f6ffce4e647.png)


# 手順

PowerBI Desktopを開いて「データの取得」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/830e2742-ad6a-d6b9-04d5-189fef576749.png)

「データの取得」ダイアログが表示されるので「その他」の「ODataフィード」を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/c44dc09e-8d7e-7f50-9ce3-a2c6d93f8caf.png)

ODataフィードのURLが求められますのでCData API ServerのサービスディレクトリエンドポイントのURL （例： http://localhost:8387/api.rsc )  をセットして「OK」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/09655342-607e-0b32-4870-2efc58b207c3.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/73677070-ed4e-90e7-c92f-5fad8ea38daa.png)

認証クレデンシャルを求めるダイアログが表示されるので、「基本」タブを選択して、CData API Server側で作成したユーザ名とAuthトークンをユーザー名とパスワードにセットして「接続」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/25332180-35a1-a7c7-140e-b9855dc6be01.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/ce58bd9c-56da-bc7e-7971-31c8b504212e.png)

ナビゲーターダイアログが表示されます。左側のリスト内のテーブルにチェックを入れると右側にプレビューが表示されます。「読み込み」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/50ddf99d-5311-ef94-ba4e-3507bb575922.png)

データの取り込み処理が完了したら、「視覚化」の中から「テーブル」をクリックして、表示するフィールドを選択してみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/3c85e556-48e8-fe51-5330-559dd52109ef.png)

# まとめ

PowerBIからMySQLに格納されているデータに対してHTTPリクエストによるWebAPI経由でアクセスすることにできました。これにより、MySQLへの接続ポートが解放することなくHTTP/HTTPSのアクセスポートのみでPowerBIなどのクライアントツールからMySQLのデータにアクセスすることが出来るようになります。
俺言語 その14

#概要

俺言語をやってみた。
avrにアセンブラで実装してみた。
ループから抜けてみた。

#環境

avr studio 4
attiny85 1mhz
tera term
usb-serial

#写真
![image](https://qiita-image-store.s3.amazonaws.com/0/18104/07554501-b13a-8348-47bc-878dfe35bc0d.png)


#バグ
下のサンプルは、コマンドプロンプトに、戻ってこない。

対策

PB0が、シリアル入力なので、行番号を探し始めたら、割り込みを受け付けて、キー入力あれば、フラグを立てる。
フラグが、立てば、コマンドプロンプトに戻るを実装した。


#サンプルコード
無限ループ

```
10 r=6
20 o=2
30 @=1
40 o=6
50 @=1
60 #=20
```

以上。
Bitcoinをさくっと開発するためのJSON神パッケージを作ったよ

**はじめに**

本記事はGo言語でJSON-RPCライブラリを開発したものをまとめ、以下の内容を取り上げています。

- どのようにBitcoinアプリケーションを開発するか
- このパッケージで何ができるか
- どのようにこのパッケージを使うか
- このパッケージに貢献するにはどうしたらいいか

ソースコードは[こちら](https://github.com/KeisukeYamashita/go-btcrpc)です。

## 要約
- めちゃ使いやすいパッケージだよ
- 世の中のほとんどのブロックチェーン開発はAPI叩くゲームだよ
- 誰でもできるよ、簡単
- 汎用的なJSON-RPCのラッパーだよ



**動機**
**単純にいろんなものを検索しましたが、直感的に使うことのできるパッケージがほとんどなかったらです。**
既存のJSON-RPCのパッケージだと汎用性がある分、ベーシック認証や他のメタ情報をつけるのに以下のように冗長になっていまいます。

```
// クライアントを作成するコード
// ベーシック認証用のコード
// 送信
// ...
```

あとの使い方で紹介しますが**めちゃめちゃ使いやすくなっています。**
このような面で、WalletやWebサービスなどいろんな人に開発していただきたいので書きました。

## どのようにBitcoinアプリケーションを開発するか
Bitcoin開発にはノードとクライアントが必要になり、それらはJSON-RPCで通信をします。
以下のような構図です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/153320/cb9fdb44-5a2f-1c15-70d0-4aa32772a619.png)

また、ブロックチェーン開発といえど、何も気にすることはありません。
**Bitcoinには公式APIがあるのでサーバーを叩くだけで使えます。**

ほとんどブロックチェーンはこれらを使ったサービスであり、本質的には何もブロックチェーンではないです。
また確かに暗号は使われていますが、実際にエンジニアはライブラリを使ってアドレス生成や公開鍵暗号方式などを使えるので**Webサービスと何も変わらないので安心してください**。

実際に「ブロックチェーン開発」といえるようなものは、実際に独自通貨を作っている人だけです。

## このパッケージで何ができるか
このパッケージでは2018/02/20段階では以下のことができます。

- Addressを生成すること
- Transactionを取得したり、デコードすること
- Blockの情報を取得する

今後も精力的に開発は進めていって、Bitcoin開発が民主化することを目指しています。

## どのようにこのパッケージを使うか
**めちゃめちゃ簡単です**

```go
package main

import (
  "github.com/KeisukeYamashita/go-btcrpc"
)

func main() {
	basicAuth := &BasicAuth{
		Username: os.Getenv("USERNAME"),
		Password: os.Getenv("PASSWORD"),
	}
	c := NewRPCClient(os.Getenv("BTCD_ENDPOINT"), basicAuth)
	address := "my88QLpf2RYYDdNMmDwYvfx6TFc6NXaELa" //sample
	balance := c.GetBalance(address)
	print(balance) // 0.13514 BTC
}
```

たったこれだけです！！！

コード解説をします。
ベーシック認証を通るよう設定して、JSON-RPCクライアントを初期化します。

```go
     basicAuth := &BasicAuth{
		Username: os.Getenv("USERNAME"),
		Password: os.Getenv("PASSWORD"),
	}
	c := NewRPCClient(os.Getenv("BTCD_ENDPOINT"), basicAuth)
```

そしてメソッドを叩きます。戻り値として結果が返ってきます。

```go
address := "my88QLpf2RYYDdNMmDwYvfx6TFc6NXaELa"
balance := c.GetBalance(address)

// c.<メソッド名>で用意されています。今回は残高取得という主要コマンドを叩いています。今後全機能対応予定
```

それだけです。
これで誰でも簡単に開発を始めることができます。神。

## このパッケージに貢献するにはどうしたらいいか
これから色んなメソッドを追加していき、最終的には完全なBitcoinパッケージになればいいなと思います。

開発者はPull RequestやIssueを出してくださると対応いたします。
より良いパッケージにしてきたいです。
今後はEthereum、Ripple, Nem, Liskの順番で出だしていきます。

最後までありがとうございました！

ソースコードは[こちら](https://github.com/KeisukeYamashita/go-btcrpc)です。
SOQLのチートシート

#SOQLのチートシート
SOQLでよく使うやつの覚書。
またSQLでは普通にできるけどSOQLでできないことも記載。

## SOQL

### 全件表示
```sql
SELECT Id,Name,LastModifiedDate
FROM Account
ORDER BY LastModifiedDate desc
```

### 5件だけ表示（Limit)
```sql
SELECT Id,Name,LastModifiedDate
FROM Account
LIMIT 5 
```

### 5件だけ表示（Offset)
```sql
SELECT Id,Name,LastModifiedDate
FROM Account
OFFSET  5 
```
### 完全一致検索(=)
```sql
SELECT Id,Name,LastModifiedDate
FROM Account
WHERE name = '田中太郎' Order by Name
```
### あいまい検索(like)
```sql
SELECT Id,Name,LastModifiedDate
FROM Account
WHERE name like '%太郎%' Order by Name
```
### 複数条件の検索(and)
```sql
SELECT Id,Name,NumberOfEmployees
FROM Account
WHERE name like '%太郎%' and NumberOfEmployees > 10 Order by Name
```
### 同じ項目での複数条件検索(in)
```sql
SELECT Id,Name,NumberOfEmployees
FROM Account
WHERE name in ('田中太郎','鈴木花子')
```
### 日付検索(<,>)
```sql
SELECT Id,Name,CreatedDate 
FROM Account
WHERE CreatedDate >= 2005-10-08T00:00:00Z AND CreatedDate <= 2018-02-08T00:00:00Z
```
* TODAY,THIS_WEEK,NEXT_MONTHの予約語もある

https://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_dateformats.htm

### 件数カウント(COUNT)
```sql
SELECT COUNT(Id)
FROM Account
```
### 重複除外の件数カウント（COUNT_DISTINCT）
```sql
SELECT COUNT_DISTINCT(Name)
FROM Account
```
### 最小・最大（MIN、MAX）
```sql
SELECT MIN(NumberOfEmployees)
FROM Account
---
SELECT MAX(NumberOfEmployees)
FROM Account
```
### SalesforceのId検索
```sql
SELECT Id,Name,LastModifiedDate
FROM Account
WHERE Id = '0017F00000Uxxxx' 
```
* 結果が**17桁**のIdで帰ってくる

## SQLではできるけど、SOQLでできないこと

### アスタリスク
```sql
SELECT *
FROM Account
ORDER BY Name
```
### Order Byの列数指定
```sql
SELECT Id,Name,LastModifiedDate
FROM Account
ORDER BY 1 desc
```
#### 対応方法：項目を指定してあげる

### テーブルに別名使えるが、項目には使えない
```sql
SELECT a.Id , a.Name as nm
FROM Account As a
Order by LastModifiedDate desc
```

### Between検索
```sql
SELECT Id,Name,CreatedDate 
FROM Account
WHERE CreatedDate between 2005-10-08T00:00:00Z AND  2018-02-08T00:00:00Z
```
#### 対応方法：<,>で代用する

### 空白検索（IS NULL)
```sql
SELECT Id,Name,LastModifiedDate
FROM Account
WHERE NumberOfEmployees IS NULL 
```
#### 対応方法：以下のように指定する

```sql
SELECT Id,Name,NumberOfEmployees
FROM Account
WHERE NumberOfEmployees = null
```

### UpdateとDelete文
#### 対応方法：Apexを使う
tmuxとかの仮想端末で複数の画面間でBashのコマンド履歴を共有すると同じ履歴が何度も記録されてしまう問題を解決する

[この記事は自サイトとのクロスポストです](http://piro.sakura.ne.jp/latest/blosxom/webtech/2018-03-04_history-nodup-with-tmux.htm)。

[まんがでわかるLinux シス管系女子](http://amzn.to/2HYzodY)の74ページで、仮想端末（本編中ではtmux）の使用時に複数の画面間でコマンド履歴が共有されない問題の解決策として、`~/.bashrc`にこういう記述を追加すると良いという話を書きました。

```bash
function share_history {
  # 最後に実行したコマンドを履歴ファイルに追記
  history -a
  # メモリ上のコマンド履歴を消去
  history -c
  # 履歴ファイルからメモリへコマンド履歴を読み込む
  history -r
}
# 上記の一連の処理を、プロンプト表示前に（＝何かコマンドを実行することに）実行する
PROMPT_COMMAND='share_history'
# bashのプロセスを終了する時に、メモリ上の履歴を履歴ファイルに追記する、という動作を停止する
# （history -aによって代替されるため）
shopt -u histappend
```

ところが、これを使用していると*コマンド履歴に同じ項目がどんどん溜まっていく*という問題が起こるようになります。自分の場合だと、`git commit -p`してから`git push`するとか、その前に`git pull`するとかいう操作が多く、コミットの粒度も細かくするようにしているので、コマンド履歴があっという間にこれらのコマンド列で埋まってしまいます。

Ubuntuの場合だと`~/.bashrc`には最初から`HISTCONTROL=ignoreboth`という記述がありますが、この指定は「直前のコマンド列と同じコマンド列の実行時にはコマンド履歴を残さない」という物です[^ignoreboth]。似た指定で`HISTCONTROL=erasedups`という指定もあり、こちらは直前のコマンド列に限らずコマンド履歴全体の中で重複を排除する物です。しかしどちらを指定しても、上記の設定と組み合わせると期待通りの結果を得られません。何故なのでしょうか。

[^ignoreboth]: 正確には、これは`HISTCONTROL=ignorespace:ignoredups`の省略形で、重複を記録しないという動作は`ignoredups`の効果です。

これは、`HISTCONTROL`の指定が一体何に対して作用するのかという事を考えると分かります。[GNUのbash](https://www.gnu.org/software/bash/)のバージョン4.4.18のソースコードを見てみると、`ignoreboth`や`erasedups`はどちらもメモリ上のコマンド履歴に対して、新しい項目を追加する時にメンテナンスを実行するようになっています。しかし、上記の設定を使用している場合、せっかくそのようにメンテナンスしたコマンド履歴は`history -c`で消去されてしまって、その後、重複を含んだままの履歴ファイルから`history -r`で履歴を読み込み直しています。これでは`ignoreboth`も`erasedups`も全く効果を得られなくて当たり前です。

ではどうすればよいかという話なのですが、とりあえずの解決策としてはこういう方法があります。

```bash
function share_history {
  history -a
  tac ~/.bash_history | awk '!a[$0]++' | tac > ~/.bash_history.tmp
  [ -f ~/.bash_history.tmp ] &&
    mv ~/.bash_history{.tmp,} &&
    history -c &&
    history -r
}
PROMPT_COMMAND='share_history'
shopt -u histappend
```

`tac`コマンドというのは、`cat`の逆で最後の行から最初の行に向かってファイルの内容を出力するコマンドです。これを使ってファイルを逆順出力してから、[重複行の最初の1行目を残して残りを削除](https://qiita.com/arcizan/items/9cf19cd982fa65f87546)して、それをまた逆順にして出力し直した後、出力結果で`~/.bash_history`を置き換えています（1行の中でそのままリダイレクトでファイルを置換しようとすると元ファイルが消えてしまうので要注意！）。`[ -f ~/.bash_history.tmp ]` で一時ファイルがちゃんと作成されていることを確認して（何らかのエラーで一時ファイルが作成されなかった場合、そのまま続行するとコマンド履歴が消失して終わりになってしまいます！）、`history -c`でメモリ上のコマンド履歴を消去して`history -r`で読み込み直すようにするわけです。

これにより、*同じコマンド列を何度も実行しても最新の1つだけが履歴に残るようになります*。やりましたね！

もっとスマートなやり方もあるんだろうとは思いますが[^zsh]、自分がパッと思いつく解決策はこういう物でした、ということで主に[シス管系女子](http://system-admin-girl.com/)読者の方向けの3年越しのフォローアップ記事として公開しておきます。

## 余談：`tac`の代用

`tac`はGNU coreutilsのコマンドの一つなのですが、macOSなどのBSD系の環境だとコマンドが存在しません。そのため[`tail -r`で代替する必要があります](https://qiita.com/b4b4r07/items/e465efe0b020407bdd44)。

[WindowsでのFirefoxのビルド](https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions/Windows_Prerequisites)に使用するMozillaBuildだと、`tac`も`tail -r`もどちらも使えません。このような環境では、[`sed`での代替実装](http://d.hatena.ne.jp/eel3/20131014/1381684451)を使って以下のように`tac`コマンドの代わりの関数を定義しておくとよいでしょう。

```bash
function tac {
  exec sed '1!G;h;$!d' ${@+"$@"}
}
```


[^zsh]: 例えば、BashではなくZshを使えば最初からこういう挙動になっているそうです。
javaScript ダイアログを出して、確認をさせてからイベントを開始させる方法

よく使うけど、いつも書き方を忘れてしまうので、書き残しときます。
これ系のはよくいろんなサイトに記載があるけど、結構複雑だったり思ってたりするのと違う場合が多いので、簡単にかける方法を書き残しときます。

この機能はクリックでデリート機能とか付けた時に、確認機能をつけたい場合にhtml上でjavascriptをちょこっと追記するだけで簡単に確認機能がつけられます。
下のサンプル画像みたく、確認ダイアログがでて、「OK」を押さないと処理が走らない機能です。
質問文言は変更可能です。

<img width="531" alt="スクリーンショット_2018_03_04_11_20.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/188645/fefbc420-76a6-4ca0-ed00-f42dd6316c2d.jpeg">

やり方は、htmlタグに一行足すだけ。
`onclick="return confirm('質問内容');"`

```サンプル.html
<a href="./order?mode=chflg&amp;id=1234&amp;flg=0" onclick="return confirm('変更しますか？');">変更</a>
```

使い方はいろいろです。
簡単な記述なので、見た目はかっこ悪いですが使い勝手がいいのが特徴です。
windows にてStatic　Routeを設定した際の覚え書き

# 背景
自宅のインフラ環境として、私的利用用　と開発環境用　二つの分断されたネットワークがある。
開発環境にて作業する際は、開発環境用の踏み台へRDPしている。
今回、踏み台用サーバがお亡くなりになり、開発環境へ接続出来ない様になってしまった。
その為、一時的に私的利用用端末へ作業時のみ開発環境へ対し通信可能にする事となった。
今回は、USBにて拡張NICを接続し有線にて開発環境へ接続する様にした。

# 環境
OS : Windows7 64bit Home Premiam


# 手順
## インターフェイス番号の取得
今回　開発環境用NWへ接続するインターフェイスはUSBにて接続する拡張NICのみとしたい為、
開発環境NWへの通信用インターフェイスをルーティングにて指定する必要がある。
Linuxのインターフェイス名(eth0とかens192とかとか)みたいに名前を識別子にしていると楽なんだが、、、
windowsの場合、インターフェイス名とは別にInterFace Indexで番号管理している。
でInterface Indexとインターフェイス名だが同じテーブルでは管理されていないみたいなので、、、
MACアドレスを確認→InterfaceIndexという手順を踏まなければならない。

###　MACアドレスの確認
　　>ipconfig /all
　　出力結果より、対象ネットワーク接続＞物理アドレスを確認

### InterfaceIndexを取得
　　> route print
   出力結果、[インターフェイス一覧]よりMACアドレスに紐付くInterfaceIndexを取得

## Static　routeの設定
前項により通信に利用するインターフェイスの識別子が解った。
あとは下記構文に当てはめてStatic　routeを指定する。

 # 構文
　> route add [ネットワーク] mask [ネットワークマスク] [ゲートウェイ] if [InterfaceIndex]

上記によりStatic Routeの指定は完了しました。
今回は、再起動した時は消してしまいたいので、永続性は持たせてないですが
永続性を持たせるならばroute addコマンドに[-p]オプションを指定すれば良いです。
コマンドラインでDVDリッピング (mkvファイル作成まで)


### 0. 環境/必要なコマンド
macosx / ffmpeg、dvdbackup

### 1. dvdを挿入
USBのDVDドライバを使いました。

### 2. dvdのマウント場所を確認する
`diskutil list`

```
$ diskutil  list
/dev/disk0 (internal):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                         251.0 GB   disk0
   1:                        EFI EFI                     314.6 MB   disk0s1
   2:                 Apple_APFS Container disk1         250.7 GB   disk0s2

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +250.7 GB   disk1
                                 Physical Store disk0s2
   1:                APFS Volume Macintosh HD            137.3 GB   disk1s1
   2:                APFS Volume Preboot                 21.2 MB    disk1s2
   3:                APFS Volume Recovery                506.6 MB   disk1s3
   4:                APFS Volume VM                      4.3 GB     disk1s4

/dev/disk2 :
 <この辺にDVD_VIODEOの項目が現れる>

```

### 3. DVDをダンプ

`dvdbackup -o <保存場所> -n <保存名> -M -I <DVDデバイス>`

- `<DVDデバイス>`はステップ２で確認した場所に相当します。上の例だと`/dev/disk2`となります。
- `<保存場所>/<保存名>`に.VOBファイルなどが出力されていきます。
- 時間がかかるので気長に待つ。VTS_1*なども出力されるけど、本編はVTS_0*.VOB

###4.  本編のVOBファイルを結合
`cat VTS_0*.VOB > movie.mpg`

- コマンド実行前に`<保存場所>`に移動してください。

###5.  mkvに変換
`ffmpeg -fflags +genpts -i movie.mpg -c:v copy -c:a copy -c:s copy movie.mkv`


###6. 参考
- https://archlinux-blogger.blogspot.jp/2015/09/linuxcddvd.html
- https://stackoverflow.com/questions/19200790/converting-dvd-image-with-subtitles-to-mkv-using-avconv
私のコードリーディング術

# はじめに

私はプログラムを書くよりも読む方が好きです。最近になって「プログラムは文学だ。作者の心情がそこに表れている」と思うようになりました。

というわけでいろんなソフトウェアを読んできたわけですが、代表的なものとしては以下があります。

- C言語
  - CRuby（1.9初期）
  - mruby（2012年当時）
  - CPython（3.5.1、3.6.3）
- Ruby
  - Ruby on Rails（1.2.3）
  - Mastodon（1.3.2）
- Python
  - Django（1.10.5）

読んだソフトウェアの読解記事は[個人サイト](http://www.dzeta.jp/~junjis/code_reading/index.php?FrontPage)に上げています。10年近く前に読んですでに過去の遺物（失礼）なものもありますが。

さて、そんな感じに多くのソフトウェアを読んできたわけですが、どうやって読んできたか（ツール、方法）を紹介していきたいと思います。

# コードリーディングのツール

まずは読む際のツールです。
なおOSはWindowsです。以下で説明しているEmacsとgrepはgnupackを利用しています。

## Emacs

複数のファイルを素早く切り替えられる、ファイルを開くときにディレクトリ内に他にどんなファイルがあるか確認しやすい、インクリメンタルサーチ、必要に応じて画面を2つに分割できる（同じファイルの別の部分が見たい）ということでコードを読む際にはほぼEmacsを使っています。多分、Vimでも同じことはできるのだと思いますが昔からEmacs使ってるのでEmacsで読んでます。

後述するように物書きには使ってません。

## grep

「あれ？この関数どこに書かれているの？」と思ったときの最強ツール。grep -r
etagsとか便利なものがあると思うのですがあまり使ったことないので探すときにはgrepしてます。grep最強。

## Chrome

標準関数だったり、使われてるパッケージだったりをググるときに使っています。最近だと使っているパッケージのソースをgithubで見たりもしてます。

## サクラエディタ

読んでわかったことの読解記事はサクラエディタで書いてます。まあこれもサクラエディタでなくてもいいのですが昔から使っているので。1ファイルの分割表示（まとめを書く際の振り返り用）、タブ（大きめのソフトウェアで記事を分割したときの前記事参照用）は必須です。

読むエディタと分けているのはソースを見ながら書くためです。Alt-Tab使えばウィンドウを切り替えるのは苦にならないので。

# コードリーディングの方法

当然と言えば当然ですがmainにあたる部分から読んでいきます。その際、そのソフトウェアの典型的な利用方法（コマンドラインオプション）を設定し（言語処理系の場合は食わせるプログラムも）、それに沿ってプログラムがどのように動いているか考えながら読みます。デバッガなどで動的に追っかけることはまずしません。

ソースコードの半分以上はオプションが指定されたときの処理、エラーが発生した場合の処理です[要出典]。そういうものは初めに読むときは「あーオプション処理してんなー」とは眺めますがそれ以上は深入りしません。「このオプションの場合はこう動いて・・・」と考えながら読むのはなかなか大変です。このテクニックは昔[RHG](http://i.loveruby.net/ja/rhg/book/)を読んで覚えました。

慣れは必要ですが多くのソースコードを読むと（というかソフトウェア工学がわかってくると）「こういうプログラムならこういう手順が行われているだろう」とわかってきます。そうすると、その推論に沿って読み進めることができるようになります。例えば、言語処理系であれば構文解析→コード生成→コード実行のような流れになります。

後、著名なオープンソースソフトウェア級のソースコードであれば関数名がちゃんとしているので関数の中身に行かなくても大体何をしているかがわかります。「うーむ、これは重要じゃなさそうだしパス」としてもそんなには外れません。

# 言語別読むテクニック

## C

完全に個人的な読み方ですが、ヘッダファイルは必要になるまで見ません。つまり、先に構造体にどんなメンバがいるかは確認しません。プログラムをmainから追いかけていって実際にそのメンバに何が代入されているか、どう使われているかを見ることでどういう構造体であるのかを把握しています。

## Python

Pythonコードを読む際にいいのは「そのファイルに出てきている名前（関数名、変数名）は必ずそのファイル内に存在している」ということです。謎の名前がありそれは実は別ファイルで定義されているグローバル変数だったということはありません。

また、モジュールについてもディレクトリの構造と一致しているので次のファイルを開くときに迷うことありません。

## Ruby

昔のころのRubyは必要なものはrequireしてたのでわかりやすかったのですがRailsがconst_missingからの自動読み込みという秘儀を編み出したせいでなかなか読むのが大変です。まあそれについてはクラス名とファイル名が対応付いているので大体わかります。

ここにgemが絡んでくるとさらにめんどくさいです。特にRailsの場合は複数のgemに別れているので「このクラスはどこに書かれているんだ」ということになります。
こういうときはそう、伝家の宝刀「grep -r」です。grep最強。

# ひどいコードの読み方

さてここまではオープンソースソフトウェア、それも世界的に有名なオープンソースソフトウェアについてどう読んでいけばいいか説明してきました。初めに「プログラムは文学だ」とお話ししたのを覚えていますか？そう、メジャーなオープンソースソフトウェアは例えていうなら名著と言われるような文学作品です。

もちろん作品の中にはそうではないものもあります。プログラムに話を戻すと「小学生が書いたのかこれ」というようなク○コードです。私もそのようなプログラムはそこそこ見てきたのでどのようにしてそれを読んだかを最後に説明します。

## とりあえず全部流し読む

プログラムを構成しているファイルを全部開き、意味を考えるのは頭の片隅に押し込んでざーっと一通り読みます。どんな関数やクラスがあるのか、この作者（プログラマ）はどのような感じのプログラムを書くのかなどの傾向を把握します。

## ひどいことを楽しむ

「なんだこのひどいプログラムは・・・（憂鬱）」ではなく、「なんだこのひどいプログラムは！（歓喜）」と思いながら読みましょう。気の持ちようというわけではないですが陰鬱な気持ちで物事に取り組むよりも楽しんでやる方が効率が上がります。声に出して「ク○コードだな～、ヒャッハー！！」というのもいいでしょう（周りにおかしな人と思われないように気をつけて）

繰り返しになりますがプログラムは文学です。ひどい作品の中にも作者（プログラマ）の気持ち（書いたときの心境）が込められておりそれを読み解くのはなかなか楽しいものです。
※個人差があります
Tinkercad > オブジェクト間の距離を知る > ルーラーで2つの位置をそれぞれ見る

ブラウザ動作するAutoDeskのTinkercad。

### 関連

- [Tinkercad > Download > レーザカット用にダウンロード > .SVGファイル | カットしてもらった](https://qiita.com/7of9/items/75d6a302362ec34a5fc3)
    - ギア画像 @ [カットしてもらった](https://qiita.com/7of9/items/75d6a302362ec34a5fc3#%E3%82%AB%E3%83%83%E3%83%88%E3%81%97%E3%81%A6%E3%82%82%E3%82%89%E3%81%A3%E3%81%9F)

### ギアを回してみたい

上記にてカットしてもらったギアがある。
メートルギアは回転軸がないため、以下の作業が必要となる。

1. 中心に回転軸をあける
2. 回転する棒を用意する
    - 料理用竹串
    - 穴径を合わす
3. 回転する棒を設置するテストベンチ（板）を用意する
4. テストベンチに回転棒付きギアを設置する
5. 高さ方向の調整を行う
6. 回す


### 別案

ギアの外形にあうような穴をあけておくと、その穴の中でギアを動かすことができるのでは。

1. ギアの外形にあうように穴をあける x 2
2. ギアを穴の中に置く
    - 高さ調整は不要
3. 回す

ギアと平面間の摩擦は起きる。

上記の穴をあけるには、ギア間の距離をきちんと設計する必要がある。
Tinkercadにおいてギアを置いてみて、その距離を調べる。


### 本題: オブジェクト間の距離を知る。

ルーラーを配置して、２つのギアを順番に見ていく。
ルーラー原点との距離を見れば良い。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/93a97294-2ecb-06d3-78ac-d1cb25b0e486.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e9168b4b-f23f-2a75-eeba-c89aadbb8cf3.png)

ギア間の距離は40 - 21 = 19 mm。

ギア１の左下をルーラーの原点に合わせると、ギア２の位置確認がより簡単になるだろう。


所持しているインパクトドライバ用に直径20mmの穴をあけるビットは所持していないということに気づいた。

### 余談

ギアで思い出した。
70歳くらいの時計職人のドキュメンタリーを見たのは2011年ころ。
その職人の「どうせ世界は変わらないさ」という言葉が印象的で、以下のような文章を書いた。

[「どうせ世界は変わらないさ」@ はてな匿名ダイアリー ](https://anond.hatelabo.jp/20131130080526)

> 時計を作っていくなかで、どうしてもうまく行かないことがある。その時に「どうせ世界は変わらないさ」と言って、熱中しすぎることを抑止して、冷静な頭で新しい発想を促しているように感じた。

匿名で書いたので、変なことを書いている。

最近、2005年くらいの詰め込み式になっているのは、少しペースダウンした方がいいかもしれない。
第12回 Selenium談話会 in Slackのまとめ

## はじめに
* Selenium談話会について
    * https://selenium-danwakai.connpass.com/ を参照ください
* 2018/03/02 21:00〜 Slackで実施
    * 最低半年に一度開催しています
* 今回はテーマは決めずに、各々が持っている悩み、相談したいことなどを持ち寄って議論する形式で進めました

## 議題と内容
### ① Windowsでは要素検索ができるがMacではできない
* 環境 : Windows 8.1 / Mac HighSiera(Safari)
* 製品を評価する上で両方のブラウザでのテストが必須
* テストをそれぞれ走らせるとWindowsは要素検索+クリックできるが、Macでは要素の検索で失敗している
* => Safariは敷居が高いかもしれないので、まずはChromeで試してみてうまく行けばSafariに挑むのが良いかもしれない
    * Chromeが一番安定している
* => [docker-selenium](https://github.com/SeleniumHQ/docker-selenium)を利用すると環境構築のハードルが下がるし、手っ取り早く作れる

### ② うまく動かない時のアプローチ(問題の切り分け)はどのようにしているのか？
* 待機処理をはさむ
    * 要素取得ができないときなど解析に役立つことがある
* スクリーンショットを撮る
    * `page.save_screenshot('ss.png')` のようなワンラーナー書くだけで状況が把握できる
* ログやエラーメッセージを読む
    * Chromedriverはシステムプロパティに設定書くとverboseのログが吐ける
        * ブラウザの中で何が起きているか見ると要素になぜ手が届かないか追えそう
    * Wire protocolレベルでコマンドのやり取りをみる

### ③ Seleniumあるある 〜 こういうコケ方することあるよね >_< 〜
* デスクトップ環境だと動くのにXvfbな環境だけ転ける
* ブラウザがそもそも起動しない
    * パス等の問題
* ブラウザは起きるけどTimeout
    * ブラウザとdriverのバージョンが噛み合ってない

### ④ ページオブジェクトパターンでテスト設計するとき、ヘッダなどの共通部分はどう扱うのが良いのか？
* ページオブジェクトパターンの学習向け/提示用途で使えると思ってデモを書いてみた
    * https://github.com/RustyNail/page_object_pattern_demo
* それぞれのページに書くと冗長なコードになるのでどう扱うか悩んでいる
* => 共通部分をクラスに切り出して、そのクラスのインスタンスをページオブジェクトのメンバーに持つのが良いのでは

### ⑤ MacでBASIC認証が突破できない
* => この[Qiita記事](https://qiita.com/nobutnk/items/2086144d853d198dd762)を参考にして突破した経験あります
    * ちなみにWindowsでは認証画面が出たら手動でログインできたが、Macでは手動入力すると怒られた
* => Seleniumのprofileに設定すればうまくいくのではないか
* => Squidなどを使ってproxyを立てるというアプローチもありかも
    * [mac上にHTTPプロキシを立てることで認証プロキシの認証をスキップする](https://qiita.com/mtakayuki/items/6869fa4760afc9a659e9)

### ⑥ ブラウザのセッションをprofileに残しておいてテストする度の認証を削減する
* [selenium webdriverで任意のchrome profileを作成し、ログイン情報などを記憶させる](http://katsulog.tech/create-an-arbitrary-chrome-profile-with-selenium-webdriver-and-store-login-information-etc/)
    * クッキーの保存期間にはログインは不要になる
* 他にも http://katsulog.tech/ に面白いブログ記事を書かれている

## 宣伝
* [Selenium Conference 2019 Tokyoに関するアンケート](https://docs.google.com/forms/d/e/1FAIpQLSfvQDzJ4wiBdFv5InkW_jeRZ36Qx5VWchuA-Tho4oUWRmmzHw/viewform) のご協力よろしくお願いします
Docker上でmacOS(HighSierra, Mojave)が動く夢を見た

[Docker Hub](https://hub.docker.com/r/syuchan1005/osx-kvm/)
[Github (syuchan1005/osx-kvm)](https://github.com/syuchan1005/OSX-KVM)

# はじめに
CIでiOS Appビルドするためだけにmac起動してたり，XamarinでStoryboardいじるためだけにmac起動しているのが嫌になったのでdocker上で動かせばいいじゃないと思った次第

インストールのISOを作るためにmacは必要です。悪しからず

# 構築
とりあえずKVM上でmacOSを動かす試みをしている[OSX-KVM - Github](https://github.com/kholia/OSX-KVM)を利用する。
~~READMEの手順に従うと`apt`を使うしかないのでdockerのベースイメージは`ubuntu:bionic`を利用する。~~

> 2018/08/30追記
Alpine linux化しました。 イメージサイズが1.6GBから25MBになりました。(gzip時

上記踏まえDockerfileを記述する

```dockerfile
FROM alpine:edge

MAINTAINER syuchan1005 <syuchan.dev@gmail.com>

ENV QEMU_AUDIO_DRV=none \
    CORE=2 \
    MEMORY=3G \
    KEYBOARD=en-us \
    CLOVER=1 \
    INSTALLER=1

EXPOSE 5900
VOLUME /data

COPY start.sh /OSX/

RUN chmod 775 /OSX/start.sh \
	&& apk add --no-cache git qemu-system-x86_64 qemu-img \
	&& cd / && git clone https://github.com/kholia/OSX-KVM.git && cd /OSX-KVM \
    && git checkout -b test cfd120dd3092fb38a89544785b2a97bc93668b44 \
    && cp /OSX-KVM/OVMF_CODE.fd /OSX-KVM/OVMF_VARS-1024x768.fd /OSX-KVM/Mojave/Clover.qcow2 /OSX-KVM/boot-macOS-Mojave.sh /OSX \
    && cd /OSX && rm -rf /OSX-KVM && apk del --purge git

WORKDIR /OSX

ENTRYPOINT ["./start.sh"]
```

[Dockerfile](https://github.com/syuchan1005/OSX-KVM/blob/master/Dockerfile)

ちなみにすでにDocker Hubにあげてあります. [Docker Hub - (syuchan1005/osx-kvm)](https://hub.docker.com/r/syuchan1005/osx-kvm/)

# コンテナの構築
今回はすでに構築済みのイメージ[Docker Hub - (syuchan1005/osx-kvm)](https://hub.docker.com/r/syuchan1005/osx-kvm/)を利用する
[ここ(OSX-KVM)](https://github.com/kholia/OSX-KVM/blob/master/HighSierra/README.md#preparation-steps-on-your-current-macos-installation)を参考にHighSierraのインストールISOを作成し，ファイルを配置する(今回は`/macOS`に保存したとする)
また、ファイル名は`macOS.iso`でなければならない。

```
docker run -d --name macOS --device /dev/kvm:/dev/kvm -p 5900:5900 \
-v /macOS:/data syuchan1005/osx-kvm
```
を実行しポート5900に対してVNCを接続する

言語選択後, Terminalを開き

```bash
diskutil list # 128GBぐらいのdiskを確認する
diskutil eraseDisk JHFS+ macOS disk0 # 確認したdiskに変更すること
```

を実行後，通常通りインストールすることでmacOSを利用できるようになる。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">docker上でmacOS Mojave Betaが動く夢を見た <a href="https://t.co/Pe13Crgxre">pic.twitter.com/Pe13Crgxre</a></p>&mdash; しゅう (@syu_chan_1005) <a href="https://twitter.com/syu_chan_1005/status/1035078405354532864?ref_src=twsrc%5Etfw">2018年8月30日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# おわりに
~~予想以上に書くことがなかった。~~
快適なmac生活を！
馬鹿の一つ覚え: CGI

#### 入力フォームで入力文字数を制限
```HTML
<input type="text" name="data" size="64" maxlength="4096" value="data">
```
この例では4096文字までに制限。

#### Perlでデータ量制限
```Perl
use CGI;
$CGI::POST_MAX = 1024 * 1024;
my $query = new CGI;
```
この例では1 MBに制限。

#### Pythonでデータ量制限
```Python
import cgi
cgi.maxlen = 1024 * 1024
data = cgi.FieldStorage()
```
この例では1 MBに制限。

#### /tmp/に書き込めない
CentOS 7に組み込まれていたhttpdでCGIを作っていたら、/tmp/に書き込めなかった。
何らかの設定でそうなっているらしい。
原因を探れば設定を変更することは可能だろうが、データの書き出しに/tmp/は使わなければいい。
java.lang.ClassNotFoundException: javax.xml.bind.JAXBException と来た時の対応

Java 9　にアップデートして、

```java
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582) ~[na:na]
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185) ~[na:na]
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496) ~[na:na]
```
と来た時は、jaxb-apiを依存関係に加えてやりましょう。
gradle なら、

```groovy
compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'
```

Mavenなら

```xml
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
```

バージョンはその時の最新がおすすめです。

# 理由
Java 9 から、[一部J2EEのクラスがJDKからデフォルトでは参照できなくなった](https://docs.oracle.com/javase/9/migrate/toc.htm#JSMIG-GUID-F640FA9D-FB66-4D85-AD2B-D931174C09A3)ことが原因です。

Javaの起動オプションでも対応できますが、今後のことを考えると、ビルドシステムへ依存性を記載しておいたほうがいいでしょう。
Youtube APIを使って、気になるチャンネルから最新動画を取得するJSを作ってみた。


youtubeでお気に入りのチャンネルから最新情報を引っ張ってくるJSを作成してみました。
youtubeからデータを引っ張ってくるのは比較的楽ですが、一番厄介なんのはそのチャンネルの情報までのURLを作ることが厄介かもしれません。

##先ずは全体図
jQueryのajaxでいつものように引っ張って来て、あとは、動画のIDとタイトルを抜き出し、埋め込み用のHTMLに入れるだけです。

```youtube.js
//************ Get Youtube latest movie **********/
    function ajaxDataYoutube(){
      return $.ajax({
                type: 'GET',
                url: 'https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=[表示件数]&playlistId=[チャンネルID]&key=[アクセスKey]',
                dataType: 'json',
                error: function() {
                    //error func
                    $('#yt-list').append('<li>Youtubeのデータが取得できませんでした。<\/li>');
                }
        })
    }
      ajaxDataYoutube().done(function(jsondataYt){
        var ytID = jsondataYt.items[0].snippet.resourceId.videoId
        var ytTitle = jsondataYt.items[0].snippet.title
        var YtHtml = '<iframe width="369" height="207" src="https://www.youtube.com/embed/'+ ytID +'?controls=0&amp;showinfo=0" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen><\/iframe><h4>'+ ytTitle +'<\/h4>'
        $('#yt-list').append(YtHtml);
      });
```

###アクセスのためのURL

冒頭で話した厄介な点がこちらのURLを作成する部分です。
何が厄介かというと、チャンネルIDを取得するのと、自分のアクセスキーを作るところだと思います。

```youtube.js
'https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=[表示件数]&playlistId=[チャンネルID]&key=[アクセスKey]
```
URLを解説していきます。

####チャンネルを引っ張ってくる
先ずは、無難にチャンネルを引っ張ってくる先の指定です。

```youtube.js
https://www.googleapis.com/youtube/v3/playlistItems
```
これで、PlayListItemsで指定することができます。

詳しくはこちら
[
YouTube:YouTube Data API (v3):
PlaylistItems](https://developers.google.com/youtube/v3/docs/playlistItems?hl=ja)

#### Part=snippet と maxResults
Partは引っ張ってくるチャンネルのプロパティを設定している部分だと認識してもらえれば良いと思います。詳しくは[こちら](https://developers.google.com/youtube/v3/docs/channels/list?hl=ja#try-it)になります。
maxResultsは取得する数を示します。

#### playlistId
こちらで引っ張ってくるチャンネルを指定します。
チャンネルIDは以下のように引っ張ってきたいチャンネルのURLから確認することができます。

```URL
https://www.youtube.com/channel/[チャンネルID]
```

#### アクセスキー
APIへのアクセスキーは自分でgoogleアカウントに登録し、さらにgoogleのAPIを設定する画面からyoutubeのAPIを取得することができます。

[YouTube APIとは：Data API v3を使って動画情報を取得してみた。](http://www.d2c-smile.com/201611018039)

これで、欲しいチャンネルから最新の動画を取得して表示させることができます。
log4cppをCentOSにインストールする

## 環境
CentOS Linux release 7.4.1708 (Core)

## ダウンロード

### cmake
https://cmake.org/files/v3.11/cmake-3.11.0-rc2-Linux-x86_64.tar.gz

### log4cpp
https://sourceforge.net/projects/log4cpp/files/log4cpp-1.1.x%20(new)/log4cpp-1.1/log4cpp-1.1.3.tar.gz/download


## インストール
### cmake
tar xvfa /tmp/cmake-3.11.0-rc2-Linux-x86_64.tar.gz

log4cppのmakeに使用するcmakeは以下にあります。

``` :cmake
cmake-3.11.0-rc2-Linux-x86_64/bin/cmake
```

### log4cpp
tar xvfa /tmp/log4cpp-1.1.3.tar.gz

cd log4cpp
../cmake-3.11.0-rc2-Linux-x86_64/bin/cmake .
./configure
make
make check
make install

``` 
make install で/usr/localにヘッダー、ライブラリファイルがインストールされる。

/usr/local/include/log4cpp/*.hh
/usr/local/share/aclocal/log4cpp.m4
/usr/local/bin/log4cpp-config
/usr/local/lib/liblog4cpp.la
/usr/local/lib/liblog4cpp.a
/usr/local/lib/liblog4cpp.so.5.0.6
/usr/local/lib/liblog4cpp.so.5
/usr/local/lib/liblog4cpp.so
/usr/local/lib/pkgconfig/log4cpp.pc
```

``` :テストコード
log4cpp/tests
```
Redmine Viewcustomize アイテムをユーザー毎に有効・無効できる様にする

# やったこと

Redmineの個人設定ページに、有効・無効を選択するリストを設置して、この内容によって、Viewcustomizeの処理を分岐する様にしました。

<img width="433" alt="個人設定.png" src="https://qiita-image-store.s3.amazonaws.com/0/150778/874b2769-26a4-e724-b471-1426fea284bc.png">

# 背景

Viewcustomizeで色々とユーザーの要望に答えて盛り込むのですが、使い方が人それぞれで、賛否両論というか、一部の人から『やめてくれ』ってクレームが出てきて、毎回凹んでいました。
ユーザー毎に有効・無効を切り換え出来たらと思い、検討しました。

下記は、ViewCustomizePluginのVer1.2.0からViewCustomize.contextが追加されて、ユーザー情報が参照出来る様になったので、取り消しました。
~~（余計な処理（※１）が入るので、クレームが来たものだけにしています。）~~

~~※１：個人設定ページを取得する時間が増えてしまいます。
　（Ajaxの非同期通信なので、体感的には増えた感じはしないかもしれませんが…）~~

# やり方

## ユーザーのカスタムフィールドを追加

『管理』>『カスタムフィールド』>『新しいカスタムフィールド』>『真偽値』でユーザーのカスタムフィールドを追加します。

・デフォルト値：はい 又は いいえ
・表示：ドロップダウンリスト
・編集可能：☑

<img width="893" alt="ユーザーのカスタムフィールド.png" src="https://qiita-image-store.s3.amazonaws.com/0/150778/62b01276-455b-4be0-1ac9-f27597f4070e.png">

## Viewcustomizeで分岐を追加

ViewCustomize.contextからユーザーのカスタムフィールドを参照して、
選択内容によって、処理を分岐します。（ログを置いたところ）

### ViewCustomizePlugin Ver1.2.0以上の場合

```JavaScript
$(function()
{
  if (ViewCustomize.context.user.customFields[0].value == "1")
  {
    console.log("はい　が選択されている");
  }
  else
  {
    console.log("いいえ　が選択されている");
  }
});
```

### ViewCustomizePlugin Ver1.2.0未満の場合

個人設定ページを取得して、そこにあるカスタムフィールドの選択内容によって、処理を分岐します。（ログを置いたところ）

Redmine Ver3.3.3, Ver3.4.3 

```JavaScript
$(function()
{
  $.get('/my/account')
  .then(
    /* 個人設定ページからカスタムフィールドの選択内容を取得 */
    (html) => {
      return $('select#user_custom_field_values_26 > option[selected="selected"]', $(html)).val();
    }
  )
  .then(
    (selected_value) => {
      /* オプション有効の場合 */
      if (selected_value == "1")
      {
        console.log("はい　が選択されている");
      }
      else
      {
        console.log("いいえ　が選択されている");
      }
    }
  );
});
```

又は、こちら。 (Redmine Ver3.3.2)

```JavaScript
$(function()
{
  $.get('http://localhost/redmine/my/account',function(data)
  {
    var selected_value = $('select#user_custom_field_values_26 > option[selected="selected"]', $(data)).val();
    if (selected_value == "1")
    {
      console.log("はい　が選択されている");
    }
    else
    {
      console.log("いいえ　が選択されている");
    }
  },"html");
});
```
関数の中身とヘルプを同時にすぐ見たい(felp me!)

2018/3/2の第68回TokyoRに参加してきました。
その懇親会でniszetさんとigjitさんとお話し、関数のヘルプ見る時`?関数`という書き方は面倒だよねという話をしました。
できたら`関数?`という書き方をしたいけど多分無理だよね、という話をしていました。
無理ゲーと思いつつ、RStduioなら左右のペーンを利用してヘルプと同時に関数のソースも見たいと要望は募るばかり。
そんなfunction help略してfelpパッケージに挑戦しようという話になりました。

#雛形

関数のヘルプを見るには`help`、ソースを見るには`print.function`を用います。
後者は所謂総称的関数`print`のmethodの一つ(S3 generic)です。
これらを組合せればヘルプとソースを同時に見るfelp関数を作れるはず。
出来上がったのが以下。

```r
felp <- function(x, ...) {
  base::print(help(deparse(substitute(x)), ...))
  base::print.function(x, ...)
}
```

このfelp関数を用い、

```r
felp(help)
```

とすれば、`help`のソースとヘルプを同時に見る事ができます。

ポイントは4点。

- `felp(x)`のxを非標準評価する
    - `help(x)`とすると、`x`という名前の関数のヘルプを探してしまう。
    - `help(deparse(substitute(x)))`ならOK
- `help`を明示的に`print`する
    - `help`を`print`の中に入れないと、ヘルプは表示されずソースコードしか見れません。
    - これはRにおいては関数内で実行された結果の内、自動に`print`されるのは最後に実行された行のみだからです。
- `print.function`は`base::print.function`とし、出自を明らかにする
    - 雛形段階では重要ではありません。
    - 最終的に`print.function`を新たに定義してマスクし、`関数`と打つだけでヘルプとソースを見るための布石です。
- `...`を使うことで、`help`や`print.function`に引数を適宜パスする
    - これにより、`felp(select, package = 'MASS')`といった具合にどのパッケージの関数についてヘルプを見たいか、選択できるようになります。
    - ただし、雛形段階ではソースを表示する関数がどのパッケージ由来かを選ぶことができません(最も近い環境のものが選ばれる)。

#発展させたいが……！

さて、`print.function <- felp`とすると、`help`と入力するだけで、`help`のヘルプとソースが呼び出されるようになりそうです。
しかし、実際にはこれはうまく行きません。

> No documentation for ‘x’ in specified packages and libraries:
you could try ‘??x’

という文字列の後に`help`のソースが表示され、ヘルプが表示されないのです。
~~その原因には心当たりがあります。~~**2018/03/03 13:13 以下は勘違いでした。原因は根深そうです。`print(x = help)`はちゃんと動きます。もっと問題は根深そうです。yutanihilationさん、ご指摘ありがとうございます。**

S3 genericを利用しているため、`help`を入力した時、実行されているコードは以下です。

```r
print(x = help)
```

この時`help`はfunctionですので、適したmethodとして`print.function`を呼び出し、その引数`x`に`x`を与えます。

```r
print.function(x = x)
```

結果、現在の実装では、`deparse(substitute(x))`の部分が`"x"`を返します。
しかしながら、`x`だなんて~~関数は定義されてい~~**topicは**ないよと怒られるわけです。
仕様の壁にぶちあたった気がしますが、うまい回避法があれば、ご提案下さい。

2018/03/03 11:25
helpの第一引数はtopicなので、「`x`だなんて関数は定義されていない」というのは実態に即していないとの指摘をyutanihilationさんから頂き、「topicはない」に修正しました。
ご指摘ありがとうございます。
CSVをExcelで文字化けさせずに編集するもう一つの方法

こんにちは。10分で生産的なミーティングができるWeb会議ツール[minmeeting](https://minmeeting.jp/)を開発している伊勢川です。

<a title="minmeeting - 10分で生産的なミーティングができる会議ツール" href="https://minmeeting.jp/" target="_blank"><img width="100px" src="https://qiita-image-store.s3.amazonaws.com/0/199506/32e65577-a5bb-2c3b-4d30-4690c3c5ce0f.png" /></a>

本日は若干マニアックだけど誰もが一度はハマったことがある、ExcelでCSVを扱う際の文字化け問題を解消するもう一つの方法を紹介します。

DBUnitを用いてテストをしている場合、CSVでデータを作るのが便利です。データが少ないうちはテキストエディタで十分なのですが、テストケースが増えてくるとExcelのオートフィルや関数の機能を使ってデータを作りたくなってきます。

ところがExcelを使うと、データの中に日本語が入っていると文字化けしてしまいます。また、関数を使った瞬間に拡張子をxlsxに変えろとか、つれないことを言ってきます。WindowsではBOMをつければ開けますが、Macでは文字コードまで変えなければならず、だんだん面倒くさくなってきます。

最近気づいたのですが、このような問題はGoogle Spreadsheetが全て解決していたようです。

Google Spreadsheetの左上のファイルメニューからCSVで出力を選ぶと、CSVファイルに変換してくれます。

<img width="845" alt="スクリーンショット 2018-03-04 8.50.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/199506/a9a1e681-a6ca-5ebf-e878-5b85dce0d37c.png">

また、関数が入っていても、値として出力してくれます。

<img width="327" alt="スクリーンショット 2018-03-04 8.54.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/199506/d0244e90-bb74-aa9e-f5dc-664738062747.png">

例えば上記のように関数の入ったSpreadsheetをCSVファイルとして出力すると、下記のようにちゃんと値を出力してくれます。また、デフォルトでUTF-8のCRLFで出力してくれます。

<img width="1130" alt="スクリーンショット 2018-03-04 9.04.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/199506/3923ec71-59ca-d29e-4b73-d6afb9af0433.png">

こんなに簡単にExcelの文字化け問題とおさらばする方法があったとは知りませんでした。

どうしてもExcelと格闘したい人は、下記の記事もぜひご参考にしてください。

「[CSVファイルをMac/WindowsのExcelで開けるように変換する](https://qiita.com/Akira-Isegawa/items/1d538cefd0f7a6100f04)」