OmniAICreator/Qiita-1.07M huggingface dataset:
99 PSiE [Problem 4]

# はじめに
[Ninety-nine Problems, Solved in Elm](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/) を毎日さわることで､Elm に親しもうという『日記』です｡詳細は [99 PSiE [Problem 1]](https://qiita.com/seahal/items/36f176d68991231ee80a) をご覧ください｡

# 問題
Elm provides the function List.length. See if you can implement it yourself.
(引用元: [Problem 4](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/p/p04.html))

# 成果物
```elm
import Html

main : Html.Html a
main =
    Html.text
        <| case test of
            0 ->
                "Your implementation passed all tests."
            1 ->
                "Your implementation failed one test."
            x ->
                "Your implementation failed " ++ (Debug.toString x) ++ " tests."


test : Int
test =
    List.length
        <| List.filter ((==) False)
            [ countElements____ (List.range 1 4000) == 4000
            , countElements____ [ 1 ] == 1
            , countElements____ [] == 0
            , countElements____ [ 'a', 'b', 'c' ] == 3
            ]

-- My solution 1.
ce num list =
    case list of
        x::xs -> ce (num + 1) xs
        [] -> num
countElements list = ce 0 list

-- My solution 2.
countElements_ list = List.foldl (\a b -> b + 1) 0 list

-- My solution 3.
countElements__ list = List.map (\x -> 1) list
                     |> List.sum

-- Their Solution 1.
countElements___ list =
    let
        cs_ ys num =
            case ys of
                [] -> num
                (x::xs) -> cs_ xs (num + 1)
    in
        cs_ list 0

-- Their Solution 2.
countElements____ list =
    case list of
        [] -> 0
        (x::xs) -> 1 + countElements____ xs
```

# 正解
=> [Problem 4 Solutions](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/s/s04.html) 

# コメント
正直に申せば､これを一番最初にとかせるべき問題なのではないか､と思った｡とはいえ､勉強にはなった｡具体的に申せば､関数が2つないと解けそうにないような問題に対しては let ~ in で束縛をかければ関数を減らせるということ､別に引数に数値を入れなくても返り値を数値にすればシンプルな再帰でカウントできるということ｡ ...精進せねば｡
#1 OpenScope MZ【softAP, I2C, SPI機能の付加】

最近、ビッグデータ解析やIoTという言葉がもてはやされ、多くの注目を浴びていますが、実際の現場ではビッグデータ解析するためのデータがそもそも存在しないことが多々あります。

一般的にはソフト屋さんとハード屋さんは分断されていて、コミュニケーションは活発ではありませんし、またソフト屋さんといわゆるデータサイエンティストと呼ばれる人たちが分断されていることもあります。

そのような中で「どのような測定系で、どのようにデータをどのように取得するか」ということをまで含めて考えることが出来るシステム屋さんは余り見受けられず、開発の遅れがあちこちで生じているのが現状かなと思います。

ゼロからハードとソフトを用意するのは難しく、時間も費用もかかってしまいます。（というかシステムの仕様書を作るのだけで下手すると3－4人の人員が必要になるかも）。それでも、やっぱりハードウェアもアジャイルで作りたいですよね。


そんな中、アメリカではオープンソースのプロジェクトとして私が勝手に「これは最強だと」思っているデバイスがクラウドファンディングで資金調達し、すでに製品化されています。改造自由のオープンソースの最大6.25MS/sでサンプリング可能なワイヤレスオシロスコープ（2CH同時のロギング可能）...！！

https://reference.digilentinc.com/learn/instrumentation/tutorials/openscope-mz/getting-started
![OSMZ_Box.png](https://qiita-image-store.s3.amazonaws.com/0/359111/864a7c28-8d15-b7eb-b6f1-393fedb237c1.png)

OpenScopeMZは信号発生器としても使用できるため、疑似的にサイン信号を発生させ、OpenScopeMZ自信で測定した結果。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/359111/0e575a75-44e5-0650-33ba-58dc287e607b.png)


オープンソースなので改造は自由にできるのですが、本家のプログラムのままではおそらく使い勝手が悪いだろうなと思うところがあり（I2CやSPIも使いたいし、WiFiもsoftAPで動作させたい。）、ここではプログラムコードを理解しつつ、I2C・SPIのセンサーも動作させることができるようにソースの改造を行うことを目的にします。目標としては3月末までに書き上げる予定です。

なお、間違っているところ部分や、理解が遅れているだろうという記述が見受けられましたら、ご指摘いただけると幸いに存じます。



OpenScopeMZ自体の記述は以下に詳しいので下記サイトをご参照ください。
「コンパクトで安価！ IoT開発に便利なオシロスコープボード」（https://www.rs-online.com/designspark/perfect-scope-for-iot-node-development-open-for-business-jp）
rails チェックボックスを自動的に作る　collection_check_boxes

#初めに
collection_check_boxesというとても便利なものがあると知ったので使ってみました。

例えばカテゴリを選択する際に既に登録されているカテゴリからチェックボックスで選択する場合に使える


#使い方

collection_check_boxesについてはrails guidesで

> objectが属するクラスのmethodの既存の戻り値をコレクションにしたcheck_boxタグを返します。

だそうです。



使い方としては

```erb
<%= collection_check_boxes(:article, :tag_ids, Tag.all, :id, :name) do |tag| %>

  <%= tag.label do %>
    <%= tag.check_box %>
    <%= tag.text %>
  <% end %>

<% end %>

```

みたいな感じで使えます。


これで既存のタグのチェックボックスが作られます。

#実際に使ってみる

まず

```

rails new qiita_collection_check_boxes

rails g model article title
rails g model tag name
rails g model article_tags article:references tag:references
rails db:migrate

rails g controller articles 
```

みたいにする

rails routes.rbを

```ruby 
resources :articles 
```

として

articles_controllerを

```ruby 
class ArticlesController < ApplicationController
  def index
    @articles = Article.all 
  end

  def new 
    @article = Article.new 
  end 

  def create 
    @article = Article.new(article_params)
    if @article.save 
      redirect_to articles_path 
    else 
      render :new 
    end 
  end 

  private 

  def article_params 
    params.require(:article).permit(:title, tag_ids: [])
  end   
end
```

こんな感じにする。

ここで重要なのがストロングパラメータの

```
tag_ids: []
```

のところ

いまいち仕組みが分かっていないんですがcollection_check_boxesでtag_idsを取得してそれが複数の可能性があるから配列にしています。

ただなんでこれで自動的に中間テーブルの作成を行ってくれるのかはわかりません。

ですがとりあえずこれで中間テーブルまで自動的に作成されます。

 
 
 
modelファイルはこんな感じ

```ruby:article_tag.rb 
class ArticleTag < ApplicationRecord
  belongs_to :article
  belongs_to :tag
end

```

 
 
 
```ruby:article.rb 
class Article < ApplicationRecord
    has_many :article_tags
    has_many :tags, through: :article_tags
end
```

 
 
 
```ruby:tag.rb 

class Tag < ApplicationRecord
    has_many :article_tags
    has_many :articles, through: :article_tags 
end
```

 
 
 
これでOK

後はviewを作るのみ

　

```erb:new.html.erb 
<%= form_with model: @article, local: true do |f| %>
    <%= f.label :title %>
    <%= f.text_field :title %>

    <%= collection_check_boxes(:article, :tag_ids, Tag.all, :id, :name) do |tag| %>
        <%= tag.label do %>
            <%= tag.check_box %>
            <%= tag.text %>
        <% end %>
    <% end %>
    <%= f.submit %>
<% end %>
```


collection_check_boxesは

> objectが属するクラスのmethodの既存の戻り値をコレクションにしたcheck_boxタグを返します。

ということでしたが

Tag.allをしてその一つ一つのid,nameというメソッドの戻り値を取得しています。

tag.labelの中にtag.textと書いていますがこれがtag.nameではうまく動きません。

このあたりもいまいち仕組みが分かってません。

ですがこれで実行すると

![collection.png](https://qiita-image-store.s3.amazonaws.com/0/207921/dd8a60e3-0192-959f-66ee-f2f49d302545.png)


こんな感じで既存のタグが出てきてくれます。


おわり:sunny:
エンディアン is 何

エンディアンについて猿でも分かる記事を書きたいな〜と思いました。(無理)

#エンディアンとは(Wiki調べ)

>エンディアン（英: endianness）は、複数のバイトなどを並べる順序の種類である。一般的な用語による表現ではバイトオーダ（英: byte order）、ないしそれを一部訳して日本語ではバイト順とも言う。

#噛み砕いて説明
2進数や16進数に拒絶反応を示す方のために10進数で説明します。

エンディアンとは、だいたい「複数桁の数をどう書くか」ということだ。（バイトオーダにおいては複数バイトの数の話になるので、ちょっと違うけど、感覚はそんな感じ。）
##ビッグエンディアン

我々が普段から使ってるやつ。
大きい桁から順番に書くから「ビッグ」エンディアン。
例えば、「せん にひゃく さんじゅう よん」という数字を「1234」と書く。

昔のMacintoshなりメガドライブなりのCPUや、MIDIデータはこっち。

##リトルエンディアン

ビッグエンディアンの逆。
現在コンピュータ界では主流。
小さい桁から順番に書くから「リトル」エンディアン。

例えば、「せん にひゃく さんじゅう よん」という数字を「4321」と書く。

Intel x86とかはこっち。ビッグエンディアンよりも高速だからだ。

##ミドルエンディアン

上2つを組み合わせたようなやつ。
自分はまだ実環境では見たことがない。

例えば、「せん にひゃく さんじゅう よん」という数字を「2143」と書く。

往年のミニコンピュータの名機、PDP-11などはこれ。（私は21世紀生まれなんで知りませんけどね）

##バイエンディアン
シチュエーションによってビッグエンディアンとリトルエンディアンを切り替えられるもの。
でも実際は性能上の問題からリトルエンディアンを使うことがほとんど。

Androidスマホ、GBA、DS(ARM)や、Nintendo64、PlayStation(MIPS)はこれ。でもビッグエンディアンで動かしてるのは見たことがない。

#バイトオーダ以外のエンディアン

##ビットオーダ

通信の世界では「ビットオーダ」もある。シリアル通信（RS232CやUSB）では、1バイトのデータ(0101の並び)を下位ビットから送るか上位ビットから送るかということも問題になってくる。（大抵は規格で決まっていて、処理するのも専用デバイスだし、これに関して意識することは通信技術者以外ではまずない。）

##ワードオーダ
複数ワードにまたがるデータ（数バイトをまとめて1ワードとして扱っている感じのとき。）

UTF16における文字列の並びとかの話だが、ビッグエンディアン以外見たことがない。（「これは猫です」を英語にしたときにリトルエンディアンだと「.tac a si sihT」になるけどこうする利点はまずないし。）
【Python】アプリケーションを起動し、キーボード入力する

#使用場面
コマンドプロンプト系のアプリケーションを起動し、毎回同じ入力をして、出力を得ている操作を自動化します。

#準備

pyautogui の モジュールをインストール

```ruby:qiita.rb
> pip install pyautogui
```

#実行例

メモ帳を開いて、文章を入力します。
同じ要領で、コマンドプロンプト系のアプリケーションを操作する想定です。
アプリケーション起動までの待ち時間を設定しています。

```ruby:qiita.rb

import subprocess
import time
import pyautogui

subprocess.Popen('C:/Windows/notepad.exe')

time.sleep(1) #1秒ウエイト

pyautogui.typewrite('Hello World!')
pyautogui.typewrite(['enter'])

pyautogui.typewrite(['enter'])
pyautogui.typewrite('Hello World!')

time.sleep(1) #1秒ウエイト

print('end')


```
99 PSiE [Problem 3]

# はじめに
[Ninety-nine Problems, Solved in Elm](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/) を毎日さわることで､Elm に親しもうという『日記』です｡詳細は [99 PSiE [Problem 1]](https://qiita.com/seahal/items/36f176d68991231ee80a) をご覧ください｡

# 問題
Implement the function penultimate to find the next to last element of a list. 
(引用元: [Problem 3](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/p/p03.html))

# 成果物
```elm
elementAt : List a -> Int -> Maybe a
elementAt xs n =
    let
        validInput = (n >= 1) && (List.length xs >= n) && (List.length xs >= 1)
    in
        case (validInput, n) of
            (True, 1) -> List.head xs
            (True, _) -> List.drop (n - 1) xs |> List.head
            (_, _) -> Nothing

-- Answer check
main : Html.Html a
main = --(elementAt [1,2,3,4] 1) |> Debug.toString |> Html.text
    Html.text <|
        case test of
            0 ->
                "Your implementation passed all tests."
            1 ->
                "Your implementation failed one test."
            x ->
                "Your implementation failed " ++ (Debug.toString x) ++ " tests."


test : Int
test =
    List.length <|
        List.filter ((==) False)
            [ elementAt_ [ 1, 2, 3, 4 ] 2 == Just 2
            , elementAt_ [ 1 ] 2 == Nothing
            , elementAt_ [ 1 ] 1 == Just 1
            , elementAt_ [] 2 == Nothing
            , elementAt_ [] (-1) == Nothing
            , elementAt_ [] 0 == Nothing
            , elementAt_ [ 1, 2, 3, 4 ] (-1) == Nothing
            , elementAt_ [ 1, 2, 3, 4 ] 0 == Nothing
            , elementAt_ [ 'a', 'b', 'c' ] 2 == Just 'b'
            ]
```

# 正解
=> [Problem 3 Solutions](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/s/s03.html) 

# コメント
もともと Ruby 言語のひとなので､入力値の妥当性を確認してから分岐させてみたけど､正答例を見る感じだと､不要みたいだ｡これが Haskell をはじめとした､静的純関数型言語の自信の源なのだろうか｡
Laravel tinkerコマンドでメール送信する

Laravelのartisanコマンドのtinkerコマンドでメール送信する方法。
（事前に、Laravelの環境設定 .envファイルに、smtpサーバの設定が必要です。）


プロジェクトディレクトリの中で、次のartisanコマンドを実行すると、tinkerの対話型シェルが立ち上がる。

```
php artisan tinker
```

以下記述を実行して、nullが返れば送信完了。

```php
>>> Mail::raw('メール本文', function($message) { $message->to('mail@example.com')->subject('メールタイトル'); });
```

### 参考

https://laravel10.wordpress.com/2015/02/22/%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%AE%E7%92%B0%E5%A2%83%E8%A8%AD%E5%AE%9A/
Spark環境構築

# Sparkのインストール
Sparkの最新版([2018/10までの最新バージョン](http://ftp.riken.jp/net/apache/spark/spark-2.4.0/))をダウンロードします。

```bash
$ cd /usr/local/opt 
$ wget https://dist.apache.org/repos/dist/release/spark/spark-2.4.0/spark-2.4.0-bin-hadoop2.7.tgz
$ tar -zxf spark-2.4.0-bin-hadoop2.7.tgz
ln -s spark-2.4.0-bin-hadoop2.7 spark
```
# Sparkの環境変数
Sparkの環境変数は、個人の好む環境変数設定ファイルに設定すれば良いですが、こちらはユーザー自身のbash_profileに設定しておりました。
bash_profileとは、ログインシェルがbashの状態でログインしたときに読み込まれる設定ファイルです。

```bash
# 「~/.bash_profile」に以下を追加する
export SPARK_HOME="/usr/local/opt/spark"
export PATH="$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH"
# 有効にする
source ~/.bash_profile
```

# Sparkを動かしてみる
spark-shellコマンドを実行して見て、Sparkの環境が正常に高築されているかどうかを確認しましょう。

```bash
$　spark-shell
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.4.0
      /_/
Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_191)
Type in expressions to have them evaluated.
Type :help for more information.</font>
scala> println("hello spark!")
hello spark!
```
99 PSiE [Problem 2]

# はじめに
[Ninety-nine Problems, Solved in Elm](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/) を毎日さわることで､Elm に親しもうという『日記』です｡詳細は [99 PSiE [Problem 1]](https://qiita.com/seahal/items/36f176d68991231ee80a) をご覧ください｡

# 問題
Implement the function penultimate to find the next to last element of a list.

# 成果物
```elm
import Html
import Browser

main = Html.text
       <| Debug.toString
       <| penultimate_ [1,2,3,4]

-- Here is my solution.
penultimate : List a -> Maybe a
penultimate list =
    let
        reversedList = List.reverse list
    in
        case reversedList of
            x::y::ys -> Just y
            _ -> Nothing
```
# 正解
=> [Problem 2 Solutions](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/s/s02.html) 

# コメント
よくよくみたら､ユニットテスト(もどき)があるのですね｡気が付きませんでした｡次は気をつけます｡
Railsチュートリアル2章 学習ログ


###続きです

Railsチュートリアル1章 学習ログ
https://qiita.com/KoDoKu77/items/12c1e7197ba69044b1aa

###Scaffoldでなんやかんや

micropostsモデルを作った後でビューを確認していたら、変なフィールドができてしまいました。

![スクリーンショット 2019-02-11 15.01.03.png](https://qiita-image-store.s3.amazonaws.com/0/83177/91a3d04b-2b20-57f9-a765-cf1086e42c2f.png)


```ruby:schema.rb
  create_table "microposts", force: :cascade do |t|
    t.text "content"
    t.string "user_id"
    t.string "integer"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
```

integer型を指定したつもりが、intergerというカラムを作ってしまっています...
どうやら、scaffoldで間違った引数を与えてしまったようです。

```bash
rails g scaffold Micropost content:text user_id: integer
```

空白一つ開けちゃってますね...
マイグレーションファイルを作って、間違った部分を修正します。

```bash
$ rails g migration change_microposts_column
```

```ruby:xxxxx_change_microposts_column.rb
class ChangeMicropostsColumn < ActiveRecord::Migration[5.1]
  def change
    change_column(:microposts, :user_id, integer)
    remove_column(:microposts, :integer)
  end
end
```
user_idカラムの型をinteger型へ変更し、
integerというカラムを削除します。

```bash
$ rails db:migrate
```

マイグレーションを実行して、テーブルを変更します。

```ruby:schema.rb
  create_table "microposts", force: :cascade do |t|
    t.text "content"
    t.integer "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
```

上手くいきました。
その他、各ビューを修正。

###Herokuへデプロイ

https://guarded-fortress-38244.herokuapp.com/
こんな個人開発は失敗する

# この記事の内容を一言で
**個人開発での失敗は今後の成功の基となる**

## はじめに
勉強やインターンの合間を使って2~3ヶ月間、家計簿アプリの作成をしていた。
しかし、知識不足や作業方法が悪いことで中断。
何故、成功しなかったのかを主観で分析を行う。

## 引き起こされた失敗
**次に行うべき作業がわからなくなった**

## 失敗したアプリ
URL: https://myself-calculator.herokuapp.com/
Github: https://github.com/kaibara/calculator


## 失敗した原因
### 1.手探りでの作業
このアプリの開発に着手した時、何も決めずに作業していた。

**「手探りで作業を進めていって、必要なことがでてきたらその時調べればいいや」**


これが大きな間違いだった。
全体の作業を意識していなかったため、アプリ全体にとって本当に必要な機能が何か理解できていない。
このような状態で調査をしても、余計な情報が入ってくるばかりでどんどん時間がかかる。
その上、作成していたファイルを上書きしなければならなかったり、ファイル構成が変更されたりする。

つまり、余計な作業にかける時間が増え、全体を通してみると不必要であった作業を何度も行っていた。

その結果、次の2つが引き起こされた。
**・ファイル構成が複雑になることでファイルごとの役割がわからなくなる**
**・次に行うべき作業が判断できなくなる**

作業をしていても自分の考えがまとまらず、行動できていない状況に気づき、失敗したことを実感させられた。

### 2.システムを意識していない機能開発
機能にしか注目しておらず、システム全体を見れていなかった。
機能単体で見れば必要に思えることでも、ユーザーとしては使わない機能だったり、機能と機能の組み合わせによってコード全体が複雑になったりしてしまった。

もし、このやり方で開発できたとしても、メンテナンスが面倒になったり、新しい機能の追加がしづらくなったりしていたことが容易に想定できる。
また、システムは使い切りではなく、一定の期間は使用する。
今はどうにか開発できていても、いつかは失敗していただろう。

## 失敗から学ぶ
自分はこの失敗によって、最初に全体を設計することの重要性を確認できた。
今後も個人開発を行っていく予定だが、その際は以下のフローで行っていく。

### 1. 作りたいアプリを考える
着想は大切

### 2. A4の紙にアプリのデザインを書き出す
今回の個人開発で行ったが、かなり良い方法だと実感した。
デザインを考えるだけでなく、必要な機能や機能ごとの連携を想像しやすい。
その上、無駄な機能は排除できるため、今後の設計や作業が洗練されていく。
紙に書くことは自分の考えをまとめられるので、他の作業にも使用していきたい。

### 3. アプリの作成に必要な機能をまとめる
必要な機能がわかったら、それをまとめていく。
どうすればそれを実現できるのか、似たような種類の機能はどれか。
このようなことを考えておくことで、今後の工程をラクにできると考える。

### 4. 3でまとめた機能を実現するために使えるサービスがないか調べる
ログイン機能などであれば`Firebase`が使用できるし、データベースも同様だ。
自分でできるようにすることも必要だが、使えるものは使ったほうが良い。
サービスだけでなくパッケージなども調査して、作業にかかる負担を軽減する。
そして、その分、システムの質を高めていけば良い。

### 5. 機能を実装するコードがどのようなものになるか考える、調べる
公式のドキュメントやProps、今まで開発してきた人の体験談と記事を参考にコードを想定する。
3と同じ様に、似たような種類のコードをまとめて作業するのが最も効率の良い方法だろう。

### 6. 作業工程を考える
機能の実装、似たようなコードなど、まとめて行える作業はまとめて行う。
機能ごとではなく、システム全体を意識してまとめて行える作業を行い、エラーや複雑なファイル構成の原因を避ける。

### 7. 実際にコードを書く
助長なコードは書かず、管理がしやすいようにコードを書いていく。


## 失敗した感想
失敗はしたが正直、そこまで悔しさなどはない。
失敗を判断したときも、**「あ、失敗したわ」**と思っただけだった。
開発できなかったことは残念であるが、勉強できたこと、理解できたことが多くある。
これからのプログラミングや個人開発でこの経験が活きると確信している。
家計簿アプリの開発という点で見れば失敗だが、自分の人生においてこの経験をできたことが嬉しい。

## 個人開発で失敗したときは
まずは、原因を特定することが大切だ。
失敗したことに挫けていたり、問題から逃げいていたりしたら、今回の経験が無駄になる。
これまでの工程を振り返って何が良かったのか、何が悪かったのかを見つめ直す。
そうすれば自然と、今後に活かせることが見えてくる。
どのような経験も行かせるためにも、自己分析をする癖は身につけておきたい。

## まとめ
**失敗だろうと今後の人生に活かす**

個人開発であれば失敗したって構わないし、失敗することのほうが大切ではないだろうか。
成功すれば自己肯定感に繋がるが、それで終わってしまうことも考えられる。
失敗することで、自分の現状を見つめられるだけでなく、活かせる経験も多い。

失敗してもスグに立ち上がれる上手な転び方を身につけて、これからも個人開発で失敗しまくろう。
99 PSiE [Problem 1]

# はじめに
[Ninety-nine Problems, Solved in Elm](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/)というコンテンツが世の中にはあるらしい｡ Elm の勉強をしようと思っても､なかなか参考にできるものは日英を問わず数が少ない｡そこで Qiita という場所で､アウトプットをして､第三者に添削してもらおうと思い立ち､投稿することにした｡

# おことわり
- 上記のコンテンツは Elm 0.19.0 用に書かれたものではない｡この記事の執筆者が『副作用』を無視し､かつ改変したものを記述している｡そのため原著作者の想定したものと異なるものを書いている可能性がある｡
- もともとはブログに書こうと思っていたのだが､個人的に Jekyll + Markdown が生理的に受け付けなくなったので､Qiita で書くことにした｡というわけでこの記事は自分のホームページが再開したなら､そちらの方に移行する可能性があるので､予めご了承いただきたい｡

# 当方の環境について
```shell
$ uname -msr 
> Darwin 18.2.0 x86_64
$ elm --version
> 0.19.0
```

# 問題
Write a function last that returns the last element of a list. An empty list doesn't have a last element, therefore last must return a Maybe.

# 成果物
```elm

last : List a -> Maybe a
last xs =
    let
        sample = last_ xs
    in
        case sample of
            [] -> Nothing
            _ -> List.head sample

last_ : List a -> List a
last_ xs =
    case xs of
        (y::ys) -> if List.length ys == 0 then [y] else last_ ys
        [] -> []
```
# 正解
=> [Problem 1 Solutions](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/s/s01.html) 

# コメント
関数を2つに分けて解くというダサいことをしてしまった｡あんまり Elm の case 文を理解していないようだ｡猛省せねば｡
iOSアプリのデバッグ方法まとめ

# とりあえずprintしてみる
基本ですね。

```swift
print(anyVariant) //変数の中身が見たいとき
print(type(of: anyVariant)) //変数の型が知りたい
```
中身が見たいときでなくても、そのロジック通ってるか見たいときにも使えます。
原始的なデバッグ法です。
あまりお行儀はよくない扱いみたいで、次に紹介するブレイクポイントを仕込むほうがまっとうなやり方でしょう。

# ブレイクポイントを仕込む
Xcodeの機能で、ブレイクポイントというものがあります。
使い方は簡単です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/333454/f6582ba4-1298-030f-9f26-9446893ac808.png)
↑この例では、１５行目にブレイクポイントを仕込んでいます。
行番号をクリックすると、その行にブレイクポイントが設定されます。
画像だと１５行の番号が青くなってますね。

作成したプログラム動かすと、そのブレイクポイントに来たときに実行が一時停止して、
その時点の変数についての情報が見れます。

便利なんですが、アプリの動作を一度止めてしまうのは、利点でもあり、欠点でもあります。
たとえば電卓アプリをつくっていて、シミュレータで各ボタンを押したときの変数の状態を見たいときに、
ボタン１つ押すたびに動作が止まってしまうと、いちいち解除してやらないといけないので、めんどくさいです。

# sleepを入れたい
デバッグ方法とはちょっと逸れるかもしれませんが、sleep入れたいときないですか？
そういうときはこれで止まります。

```swift:処理がx秒止まる
Thread.sleep(forTimeInterval: 3.00) //3秒Wait
```
ただこのThreadのsleepを使うと、プログラムの処理が全停止します。
たとえばサーバから重いデータをダウンロードするときに、
一旦sleepで待たせて、ダウンロードを完了させて、後続処理につなぎたい、
という風なときは、sleep中はダウンロード処理も止まるので、その用途には使えません。
そんなときは下記で止めるといけました。

```swift:x秒止まる（実行中の処理は動作）
RunLoop.current.run(until: Date.init(timeIntervalSinceNow: 3.0))
```
ElasticTranscoder VS MediaConvert


# 要件
1.ユーザーが動画をアップロードする
2.動画をHLSにエンコードする
3.HLSの動画を配信する

# どちらを使うか？

AWSを用いた動画のエンコードをする時はどっちかを使うことになります。
MediaConvertはElasticTranscoderより幅広い種類のエンコードを対応しており超高画質の動画に対応するとかじゃない限り料金も安いです。
動画の結合や音声の差し替えなど高度な編集も可能です。
エンコードの処理時間も短縮されていますので基本的にはMediaConvertを選ぶべき。
AWSも推奨しています。

ただし、お互いできることできないことがあるので慎重選びましょう。
この記事が参考になると幸いです。

## 料金(2019/02/12)
どれくらいの高画質にエンコードするかにもよりますが参考
### ElasticTranscoder
0.034USD
### MediaConvert
0.0212USD

詳細はこちら
https://aws.amazon.com/jp/elastictranscoder/pricing/
https://aws.amazon.com/jp/mediaconvert/pricing/

## できないこと
全てではないですが自分が気になったとこ
### ElasticTranscoder
・高度な動画の結合などの高度な編集
・H.265に対応していない
※H.265とは従来のH.264とくらべて圧縮率が2倍になっているので動画ファイルのサイズも大幅に削減されます、8Kにも対応しており今後の応用が期待されている
・エンコード結果はSNSにしか通知できない

### MediaConvert
・動画ファイルの暗号化のキーにKMSを利用できない
・動画の自動回転
・WebM動画の作成
・アニメーションGIFの作成

## UI、管理しやすさ
### ElasticTranscoder
シンプル
英語
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145645/2702d796-7882-7922-6790-379224fc48b1.png)

### MediaConvert
ぱっと見でわかると思うがElasticTranscoderより大分使いやすい
また、設定をテンプレートとして保存できるので管理もしやすい
![image.png](https://qiita-image-store.s3.amazonaws.com/0/145645/a5d68262-194d-b09d-9e2e-88de5eec13bf.png)

## MediaConvertの弱み

~~MediaConvertは動画の自動回転ができません~~
~~これがきつかったです。~~

~~スマホで縦に撮影した動画はエンコード後に必ず横向きになります。
私のサービスとしてはこれは結構致命的でした。
参考
https://blog.shibayan.jp/entry/20140708/1404775800~~

~~解決方法としては動画をエンコードする前にffmpegかなんかで動画を縦向きにすりゃいんですが、動画の変換処理をサーバサイドで行うとなると負荷がつらい。
クライアント側でもできなくはないですが動画ファイルが大きいとブラウザが停止します。~~

~~よって私たちは途中で方針変換し、結局 ElasticTranscoderを使うことにしました。
AWSにも問い合わせたのですがMediaConvertへの自動変換実装予定はまだないそうです(2019/02/12)。~~

MediaConvertも縦横の自動回転設定ができるようになりました。

### 余談
ElasticTranscoderを利用しつつ、自動回転がMediaConvertに機能実装されたら乗り換えりゃいいや
と思ってたのですが、動画の暗号化のやりかたが両者では大分異なるので、ElasticTranscoderで暗号化した動画はMediaConvertでは復号できなさそうです。
よって、、一度サービスでElasticTransocderを選んでしまうとそれは片道切符になります。（動画暗号化する場合に限り）

MediaConvertの利点数多くみながらも、ElasticTranscoderを選ばざるを得ない状況はつらいもんがありました。

おわり。


# 参考サイト
https://aws.amazon.com/jp/elastictranscoder/pricing/
https://aws.amazon.com/jp/mediaconvert/pricing/
https://blog.shibayan.jp/entry/20140708/1404775800
私は分析官。MySQLが嫌い。

三連休最終日。
休日出勤をして、ちょっとした集計をしようと思っただけなのに。
MySQLを通じて嫌な思いをしたので、書きなぐる、、、

# 何をしたかったか
`User`の[年齢]情報の統計を確認したかった。
※ 実際には年齢の集計ではないが、安全のために

正規分布しておらず、むしろロングテールなのが今回のデータの特徴で、
代表値として平均を使うのは危険で、中央値を集計したかった。

# 準備
とりあえずこんな感じで一時テーブルを作った。
年齢が例だと冗長だけど、実際には重い処理だったので、必要だった。

```SQL
drop temporary table if exists user_age
;
create temporary table user_age
select
	user_id
	, age
from
	user
;
```

# 平均、合計、カウント
かんたんである

```sql
select
  avg(age) average
  , count(distinct user_id) count
  , sum(age) sum 
from user_age
;
```

# 中央値の集計でイラッとした
本件データは100万レコードをゆうに超えており、Excelにうつしてmedian()するわけにもいかない。
そもそも、SQLの世界から飛び出てしまうのは、分析の再現性や、ポータビリティの観点から好ましくない。
というわけで、今回はいやいやMySQL内での完結を試みたのである。

## イラッと①：MySQLには`median()`がない。
medianを出すには、わざわざこんな書き方をしないといけない

```sql
select avg(distinct age) median
from(
  select t1.age
  from
    user_age t1
    , user_age t2  
  group by t1.age
  having
    sum(case when t2.age>= t1.age then 1 else 0 end) >= count(*) / 2 
    and sum(case when t2.age <= t1.age then 1 else 0 end) >= count(*) / 2 
  )tmp
;
```

可読性が終わっている。
どんな操作をしているか、全く読者に伝わらない。
どういうふうにコメントすればいいのだろうか。解説サイトのURLでも貼るか。

## イラッと②：一時テーブルを複数回参照できない
上記コードは動かない。`mysql can't reopen table`って怒られた。
いやいやいや、なんでダメなの、、、
したがって、先のコードに、

```sql
drop temporary table if exists ua_copy
;
create temporary table ua_copy
select * from user_age
;
```

というおまけがつき最終的な出来上がりは、

```sql
drop temporary table if exists ua_copy
;
create temporary table ua_copy
select * from user_age
;
select avg(distinct age) median
from(
  select t1.age
  from
    user_age t1
    , ua_copy t2  
  group by t1.age
  having
    sum(case when t2.age>= t1.age then 1 else 0 end) >= count(*) / 2 
    and sum(case when t2.age <= t1.age then 1 else 0 end) >= count(*) / 2 
  )tmp
;
```

## イラッと③：遅い
なお、この記事書いてずいぶん時間がたつが、まだ実行が終わっていない。
もちろん、数百万行のcross joinをしているのが悪いわけだが、それにしてもしかしひどい。
100万行以下だったら、SQLでmedian求めずに、Excelで`median()`できたのに…
言い換えると、実質MySQLでmedianは求めるのは常に筋悪である、というのが所感である。

# 最後に
MySQL以外の環境に詳しくはない。
もしかしたらPostgreSQLでも同じこと起きるのかもしれない。
MySQLの名指しで叩くのはアンフェアかもしれない。

分析専業でもないので、何か知識不足で拙いことをしているのかもしれない。
しかし、数百人規模のIT企業の非エンジニアで1,2のSQLスキルを持っている。

私はデータ分析文化を育むには、一定数、ビジネス職がSQLを叩く必要があると思っている。
データ分析に興味を持ってくれた人が、こんなmedian一つで、躓いてほしくない。

技術選定にあたっては、そういった、データ分析環境のことも考えてもらえると嬉しい。
もしくは、積極的にBigQueryなどモダンな環境にレプリしてくれると嬉しい。
SASなどを入れるとUIの力で解決するのかもしれないが、どうなのだろうか。
Dockerコンテナとボリュームを圧縮ファイルにバックアップする

## はじめに
`AWS ECS`などのマネージド環境ではなくて、自前で`Docker`（および`docker-compose`）を運用している場合のバックアップの取得方法について、自分自身のメモのために残しておきます。

## 環境
例えば、以下のように`wordpress`と`mysql`コンテナを`docker-compose`で管理しているとします。

```yml
version: '3.2'
services:
  wordpress:
    image: wordpress
    restart: always
    ports:
      - 80:80
  mysql:
    image: mysql:5.7
    restart: always
    volumes:
      - /var/lib/mysql
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    ports:
      - 3306:3306
```

そして、以下のようなディレクトリ構造をもっているとします。

- `backup`: `Docker`コンテナとボリュームのバックアップが格納される
- `bin`: バックアップ用のスクリプトが配置されている

```bash
$ tree -d -L 3
.
├── app
├── backup
│   ├── containers
│   │   └── YYYY-MM-DD
│   └── volumes
│       └── YYYY-MM-DD
├── bin
...
```

## ボリュームのバックアップ
最終的に以下のようなスクリプトになりました。
バックアップをとるために、`docker`の公式ドキュメント[^1]では`ubuntu`コンテナを使っていますが、`tar`コマンドを使えればいいので、より軽量な`alpine`コンテナを使うようにしました。

```bash
#!/usr/bin/env bash
# bin/backup_volumes.sh

CURRENT_DIRECTORY=$(dirname "$0")
BACKUP_DIR="backup/volumes"

cd "$CURRENT_DIRECTORY"/../

LOCAL_BACKUP_PATH="$(pwd)/$BACKUP_DIR/$(date '+%Y-%m-%d')"

rm -rf "$LOCAL_BACKUP_PATH"
mkdir -p "$LOCAL_BACKUP_PATH"

CONTAINER_PREFIX=$(basename $(pwd))

docker run --rm --volumes-from $(docker ps -q -f name="$CONTAINER_PREFIX"_mysql) -v "$LOCAL_BACKUP_PATH":/backup alpine tar cvf /backup/mysql_volumes.tar /var/lib/mysql
docker run --rm --volumes-from $(docker ps -q -f name="$CONTAINER_PREFIX"_wordpress) -v "$LOCAL_BACKUP_PATH":/backup alpine tar cvf /backup/wordpress_volumes.tar /var/www/html

```

`bin/backup_volumes.sh`を実行すると、`backup/volumes/YYYY-MM-DD`配下にバックアップファイルが作成されます。

```bash
$ bin/backup_volumes.sh
$ ls backup/volumes/YYYY-MM-DD
mysql_volumes.tar     wordpress_volumes.tar
```

## コンテナのバックアップ
最終的に以下のようなスクリプトになりました。
ほぼほぼ、`Docker`の公式ドキュメント[^2]のとおりとなりました。

```bash
#!/usr/bin/env bash
# bin/backup_containers.sh

CURRENT_DIRECTORY=$(dirname "$0")
BACKUP_DIR="backup/containers"

cd "$CURRENT_DIRECTORY"/../

LOCAL_BACKUP_PATH="$(pwd)/$BACKUP_DIR/$(date '+%Y-%m-%d')"

rm -rf "$LOCAL_BACKUP_PATH"
mkdir -p "$LOCAL_BACKUP_PATH"

CONTAINER_PREFIX=$(basename $(pwd))

docker export $(docker ps -q -f name="$CONTAINER_PREFIX"_mysql) > "$LOCAL_BACKUP_PATH/mysql_container.tar"
docker export $(docker ps -q -f name="$CONTAINER_PREFIX"_wordpress) > "$LOCAL_BACKUP_PATH/wordpress_container.tar"

```

`bin/backup_containers.sh`を実行すると、`backup/containers/YYYY-MM-DD`配下にバックアップファイルが作成されます。

```bash
$ bin/backup_containers.sh
$ ls backup/volumes/YYYY-MM-DD
mysql_container.tar     wordpress_container.tar
```

## おわりに
これで、`mysql`データベースと`wordpress`のソースコード、設定ファイル、プラグイン、添付ファイルをバックアップすることができました。
できれば、マネージドな`Docker`環境を使いたいところですが、仕方なく自分で運用する場合は、もしもの事態に備えてバックアップをとるようにしておきましょう。
ではでは。

[^1]: [Use volumes | Docker Documentation #backup-a-container](https://docs.docker.com/storage/volumes/#backup-a-container)
[^2]: [docker export | Docker Documentation](https://docs.docker.com/engine/reference/commandline/export/)
VS code のPythonデバッグ機能でinput()を使う方法

Visual studio codeのデバッグ機能が便利でよく使っているが、pythonでinput()処理のところでうまく機能しなかったので、そのための対処法。 
多くの場合は以下の記事のようにデバッグのConfigurationを変えてexternal terminalを使えば解決するが、自分の環境ではexternal terminalを使える用にするまでに作業が必要だったのでそちらも記録する。
https://qiita.com/kawarayu/items/f736778cec04cb2ba3a9



ということで以下の2部構成。たぶん2番めはWindowsのみ必要になると思う。

1. VS codeのデバッグexternal terminalの使用によりinput()を使えるようにする
2. VS codeでexternal terminalを使える用にする方法

## 1. VS codeのデバッグでexternal terminalの使用によりinput()を使えるようにする
input()が含まれるPythonコードをデバッグするためにはDEBUGのconfiguration(写真)をPython: Terminal(External)に変更する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190972/9c332fa3-e0fa-0166-a8ca-746516870298.png)
Python: Terminal(External)がない場合はAdd Configurationから足すことができる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190972/a886c8c7-8c93-7056-9a8d-1103c63f439f.png)

参考
https://qiita.com/kawarayu/items/f736778cec04cb2ba3a9




## 2. VS codeでexternal terminalを使える用にする方法
### 問題
1に書いたとおり設定を変えることでExternal terminalは立ち上がったが入力ができなかった。
いろいろと調べたところ問題は以下の2つだった。 
**a. pythonw.exeを使用している**
**b. powershellを使用している**

### 解決方法
**a. pythonw.exeを使用している**
pythonの実行ファイルとしてpythonw.exeを使用していたのでこれをpython.exeに変更する。
File→Preferences→Settingsから設定ウィンドウを開き"Python Path"を検索
pythonw.exeをpython.exeに変更
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190972/bd63c16d-9efb-8837-3e92-77c12c032b30.png)


**b. powershellを使用している**
powershellを使用していることにより?```conda activate base ```が上手く実行されていなかった。
使うshellをcmd.exeにすることにより解決できた。
1と同様設定画面を開き"Shell"を検索。
cmd.exeに変更した。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190972/ac8f47e1-c660-b771-d8c4-c6a31176e01c.png)

参考
https://github.com/Microsoft/vscode/issues/60436

----

以上により無事にExternal Terminalで入力を行うことができるようになり、input()が含まれるコードのデバッグもできるようになった。
Keycloak を日本語にすると SPDY_PROTOCOL_ERROR が出る

## KeycloakのUIを日本語にするとエラーが出る

* [Keycloakを冗長構成で動かしてみる](https://qiita.com/yoonis/items/4f4a9df0f6f8e858bd4a) を参考にAWSにセットアップ
* EC2 + RDS + ALB の構成
* UI言語を日本語やトルコ語にすると `SPDY_PROTOCOL_ERROR` が出る
* localhostでは動く
* バージョンは `4.8.3.Final`

## 原因

* localhost起動のサーバヘッダを確認
* `P3P` ヘッダが文字化けしている
![image.png](https://qiita-image-store.s3.amazonaws.com/0/54984/1a80ad6f-f86c-0a2e-7cbf-67d99763db9a.png)

## 対策

* `P3P` ヘッダを出力するところで適切にエンコードすべきではある
* 暫定対策として日本語での出力を止める
* [messages_ja.properties](https://github.com/keycloak/keycloak/blob/master/themes/src/main/resources-community/theme/base/login/messages/messages_ja.properties#L294)

### before

```
p3pPolicy=CP="これはP3Pポリシーではありません！"
```

### after

```
p3pPolicy=CP="This is not a P3P policy!"
```
UITableView の区切り線をカラフルにしたい！

# こんな感じにしたい！

<img width="389" alt="colorful_separator2.png" src="https://qiita-image-store.s3.amazonaws.com/0/194192/43c4779a-bedd-7ac2-3a0a-19a97646a46b.png">



# すべての区切り線が同じ色で良い場合

全部同じで良い場合には、`tableView.separatorColor` で対応できます。
例えば、下記の例では、区切り線は赤色になります。

```swift:swift
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.separatorColor = .red
    }
```

ではそれぞれのセルで異なる色にするにはどうすれば良いか… :thinking: 

# カスタムセルでやる！

実際のところ、カスタムセルでも区切り線の色を個別に変えることはできなそうです :sob: 
なので、自分で区切り線 (っぽい `UIview`) を作ることで対応します。

下記のように、セルの下部に区切り線に見えるような `UIView` を配置し、区切り線に見せかけます。

```swift:swift
class CustomTableViewCell: UITableViewCell {
    // 区切り線に見せかける view
    private let separator: UIView = {
        let view = UIView()
        return view
    }()

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        contentView.addSubview(separator)
        // contentView の最下部に高さの値を小さくして配置することで、区切り線に見せかける
        separator.translatesAutoresizingMaskIntoConstraints = false
        separator.heightAnchor.constraint(equalToConstant: 1).isActive = true
        separator.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
        separator.leadingAnchor.constraint(equalTo: contentView.leadingAnchor).isActive = true
        separator.trailingAnchor.constraint(equalTo: contentView.trailingAnchor).isActive = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func setColor(color: UIColor) {
        separator.backgroundColor = color
    }
}
```

あとは、`TableViewController` 内で…。

`tableView` の区切り線を非表示にする (`tableView.separatorStyle = .none`)。

```swift:swift
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(CustomTableViewCell.self, forCellReuseIdentifier: "CustomTableViewCell")
        tableView.separatorStyle = .none
    }
```

カスタムセルを使うようにする。

```swift:swift
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell") as! CustomTableViewCell
        cell.textLabel?.text = String(indexPath.row + 1)
        cell.setColor(color: colors[indexPath.row]) // 好きな色を設定する
        return cell
    }
```

これで、あたかもカラフルな区切り線ができたかのように見せることができます！


# 終わりに

今回の例のように区切り線をカスタマイズしたいという要望は少ないかもしれません。
ですが、どうしてもそういうデザインにしたいけれども、提供されているプロパティでは対処できない時には、
自分でそう見えるように工夫するという選択肢が頭の中にあると、解決に一歩近づけるのかなと思っています。
Node.jsからSesame API v3 を使う

# 実行環境

MacBookAir Mid2012 Sierra。

```
$ node -v
v10.15.0
```

# requestのインストール

```

$npm install request
```
# tokenの取得

https://docs.candyhouse.co/#obtain-your-api-key の手順をにしたがってtokenを取得。

1. https://my.candyhouse.co/ からCandy House Dash Boardにログイン。
1. サイドバーの"API Settings"を選択。アクセスにはVerification codeが必要なので、"SEND CODE"を押して、登録されたemailで受け取ります。受け取ったVerification codeを入力して、"CONFIRM"をクリックします。
1. Verifiation Codeを入力するとAPI settingにアクセスできます。"ADD"をクリックして、新しいAPI Keyを取得します。
1. このAPI Keyをコピーしておきます。このAPI Keyはrefreshやlogoutすると全体がみえたくなります。そのためどこかにコピーしておくのを忘れないでください。
![20190211_ScreenShot_CandyHouse.png](https://qiita-image-store.s3.amazonaws.com/0/350094/189c3f24-e8b7-3493-6deb-fdb39784a315.png)

# device idの取得

以下のコードで一番目にあるdevice idを取得します。
[[your_token]]には上で取得したtokenを入力してください。

```testSesame.js
var request = require('request');

const token_sesame = '[[your_token]]';

var options_device = {
  uri: 'https://api.candyhouse.co/public/sesames',
  method: 'GET',
  headers: {
    'Authorization': token_sesame,
  },
  json: true
};

let device_id = "";

request.get(options_device, function(error, response, body){
  if ( response ){
    if (response.statusCode == 200) {
      device_id = body[0].device_id;
      console.log(device_id);
    }
  }
});
```

実行結果です。

```
$ node testSesame.js
cxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
```
Docker上のCentOS7にsqoopをインストールしたい

## 要約

* hadoopは特に使わないがとにかくsqoopだけ使いたい需要があり、CentOS7にインストールしたので手順の記録を残す。
* 結論としてはCDH5でインストールしたら出来た。
* 正しい手順なのか全く確証は無い。

## 環境

* ubuntu 18.04上にCentOS7のdocker imageを入れて環境を構築する。
* インストールにはCDH5を使う。

## 手順

CentOS7にsqoopがインストールされたDockerfileを作成していく。

### OSの指定とか

とりあえずbase imageの指定, workdirの指定, wgetのインストールを行う。

```dockerfile
FROM centos:centos7

WORKDIR /work
RUN yum install -y wget
```

### CDH5の設定

* これを参考に設定を行う:
 https://www.cloudera.com/documentation/enterprise/5-14-x/topics/cdh_ig_cdh5_install.html

```dockerfile
RUN wget https://archive.cloudera.com/cdh5/redhat/7/x86_64/cdh/cloudera-cdh5.repo
RUN mv cloudera-cdh5.repo /etc/yum.repos.d/

RUN yum clean all
```

CDH5のインストール手順を読むと、引き続きこれらの作業を行うように書かれているが、やらなくてもsqoopは動いたのでコメントアウトしておく。

```dockerfile
# RUN rpm --import https://archive.cloudera.com/cdh5/redhat/7/x86_64/cdh/RPM-GPG-KEY-cloudera

# RUN yum install -y hadoop-yarn-resourcemanager
# RUN yum install -y hadoop-0.20-mapreduce-jobtracker
# RUN yum install -y hadoop-lzo
```

### sqoopのインストール

* 引き続き、この手順に従ってsqoopをインストールしていく: https://www.cloudera.com/documentation/enterprise/5-14-x/topics/cdh_ig_sqoop_installation.html

まずOracle-jdkをインストールしてくるように指定されているがインストールが面倒だったのでとりあえずopen-jdkをインストールしてみる。

```dockerfile
# install jdk
RUN yum install -y java-1.7.0-openjdk java-1.7.0-openjdk-devel
```

そしてsqoopのインストール

```dockerfile
RUN yum install -y sqoop
```

## 動かしてみる

docker-compose.yamlを書いてdocker imageを起動。

```yaml:docker-compose.yaml
version: '2.3'
services:
  sqoop-test:
    build: .
```

sqoopを動かしてみる。

```bash
$ sudo docker-compose run sqoop-test /bin/bash
[root@e69d1a841985 work]# sqoop help
Warning: /usr/lib/sqoop/../hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: /usr/lib/sqoop/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /usr/lib/sqoop/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
19/02/11 05:43:03 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6-cdh5.16.1
usage: sqoop COMMAND [ARGS]

Available commands:
  codegen            Generate code to interact with database records
  create-hive-table  Import a table definition into Hive
  eval               Evaluate a SQL statement and display the results
  export             Export an HDFS directory to a database table
  help               List available commands
  import             Import a table from a database to HDFS
  import-all-tables  Import tables from a database to HDFS
  import-mainframe   Import datasets from a mainframe server to HDFS
  job                Work with saved jobs
  list-databases     List available databases on a server
  list-tables        List available tables in a database
  merge              Merge results of incremental imports
  metastore          Run a standalone Sqoop metastore
  version            Display version information

See 'sqoop help COMMAND' for information on a specific command.
```

とりあえず動いた.(完)
【python】openpyxlを使ったエクセルの範囲コピー

pythonでエクセルを扱えるopenpyxlを使って、範囲コピーを行う関数を作りました。結合済みのセル、書式のコピーまで対応してます。
コピー先に結合されたセルがある場合はうまくいきません。
その場合は、コピー先のセルの結合を解除するように改造してください。

```Python
#セルの範囲コピー
#sheet ワークシート
#min_col 範囲コピーの最小列番号
#min_row 範囲コピーの最小行番号
#max_col 範囲コピーの最大列番号
#max_row 範囲コピーの最大行番号
#shift_col コピー先の列のオフセット
#shift_row コピー先の行のオフセット

def RangeCopyCell( sheet, min_col, min_row, max_col, max_row, shift_col, shift_row ):
	#コピー元の結合されたセルの結合を解除していく。
	merged_cells = copy.deepcopy(sheet.merged_cells);
	for merged_cell in merged_cells :
		if merged_cell.min_row >= min_row \
			and merged_cell.min_col >= min_col \
			and merged_cell.max_row <= max_row \
			and merged_cell.max_col <= max_col :
				#結合を解除していく。
				sheet.unmerge_cells(merged_cell.coord);

	#全セルをコピー
	for col in range( min_col, max_col+1):
		for row in range( min_row, max_row+1):
			fmt = "{min_col}{min_row}"
			#コピー元のコードを作成。
			copySrcCoord = fmt.format(
				min_col = get_column_letter(col),
				min_row = row );

			#コピー先のコードを作成。
			copyDstCoord = fmt.format(
				min_col = get_column_letter(col + shift_col),
				min_row = row + shift_row );
			#コピー先に値をコピー。
			if type(sheet[copySrcCoord]) != MergedCell :
				sheet[copyDstCoord].value = sheet[copySrcCoord].value;
				#書式があったら、書式もコピー。
				if sheet[copySrcCoord].has_style :
					sheet[copyDstCoord]._style = sheet[copySrcCoord]._style;

	#結合解除したセルを再結合していく。
	for merged_cell in merged_cells :
		if merged_cell.min_row >= min_row \
			and merged_cell.min_col >= min_col \
			and merged_cell.max_row <= max_row \
			and merged_cell.max_col <= max_col :
				#結合していく。
				sheet.merge_cells(merged_cell.coord);
				#コピー先のセルの結合範囲情報を作成する。
				newCellRange = copy.copy(merged_cell);
				#コピー先のセルの結合範囲情報をずらす。ここではshiftRow分ずらしている。
				newCellRange.shift(shift_col, shift_row);
				sheet.merge_cells(newCellRange.coord);
	return 0;

#サンプルコード
#ブックを開く。
book = px.load_workbook('demo.xlsx');
sheet = book.get_sheet_by_name("Sheet1");
#セルの範囲コピーを実行。
#[1,1]～[10,20]までの範囲のセルをコピー。
#コピー先は12行(shift_row)シフトした場所です。
RangeCopyCell( 
	sheet = newSheet, 
	min_col = 1,
	min_row = 1, 
	max_col = 10, 
	max_row = 20, 
	shift_col = 0, 
	shift_row = 12 
);
```
Pythonista3でインフラエンジニアリング5選


最近になってiOSのショートカットがなんとも直感的で気持ちよくないという理由でiOSアプリのPythonista3に課金した。で、普段のルーチンの自動化というより、インフラの現場でのテストツールとして便利じゃん？と思ったので幾つかメモ。

# スクレイピング

先行して[Pythonista3でブラウザで開いているURLのタイトルを取得する](https://qiita.com/usop4/items/c439dd42ac043f410d45)を書いたが、Beautiful Soapが[Extras](http://omz-software.com/pythonista/docs/ios/index.html)としてPythonistaに入ってるので、楽にWebコンテンツの確認ができる。

今、見たらRequestsもPythonistaに入ってるので、接続確認ぐらいだったら、こっちが簡単だろう。

http://omz-software.com/pythonista/docs/ios/requests.html

```py
import requests
url = 'http://barcelona.sakura.ne.jp/'
r = requests.get(url)
print(r.text)
```

# paramikoでサーバにSSHで接続

ParamikoもPythonistaで標準で入っている。さくらインターネットの500円プランで試したが、問題なく使える。余談だが、`getpass()`は入力値が見えなくなる関数のはずだが、Pythonista環境では`Warning: Password input may be echoed.`と表示され、丸見えになっててしまう。

http://omz-software.com/pythonista/docs/ios/paramiko.html

```py
import paramiko
from getpass import getpass
import sys, time
password = getpass('password:')

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(
    'example.com',22,'username',password
)
_, stdout, stderr = client.exec_command('pwd')
print(stdout.read())
client.close()
```

paramikoはパスワードではなく公開鍵認証にも対応しているが、こちらはうまくいかなかった。もしPythonista環境で成功した人がいたらコメント欄で教えていただけたら嬉しい。

# AWSのインスタンスを操作

Pythonistaは[StaSh](https://forum.omz-software.com/topic/1919/stash-shell-like-an-expert-in-pythonista)という3rd partyを使ってpip installできて、これを使うと色々なライブラリもPythonistaで動かせる。（もちろん動いてくれないライブラリもある）

で、AWSを操作できるboto3も使える。とりあえずインスタンスのstartとstopは動いた。これ以外にもCloudWatch、S3、SES、SQSが操作できるらしいが、主に管理系でPythonista3から触るようなものじゃないかもしれない。

https://boto3.amazonaws.com/v1/documentation/api/latest/index.html

```py
import boto3
instances = ['i-0000']
ec2 = boto3.client('ec2',
    aws_access_key_id='xxxx',
    aws_secret_access_key='xxxx' ,
    region_name='ap-northeast-1'
)
ec2.start_instances(InstanceIds=instances)
```

# shodan

インフラエンジニアといえばPingとか飛ばせれば便利だが、Pythonでもroot権限がないと使えないものはPythonistaでは使えない。そんな場合に、リアルタイムな情報ではないがShodanのAPIを使ってみるという手がある。これもStaShでshodanをインストールすればPythonistaから利用できる。

https://shodan.readthedocs.io/en/latest/tutorial.html

```py
import shodan
import pprint

print('''
example:
  net:1.1.1.1/32
  raspberry pi
''')
query = input()
api = shodan.Shodan('{API KEY}')
result = api.search(query)
for service in result['matches']:
  pprint.pprint(service)
```

# メール送信

最後に地味に便利だったのがメール送信。AWSのSESを使ってアラートを外部にメールする設定をしようとしたのだが、確認のためだけにファイアウォールに穴を開けるのも面倒だったのでPythonistaから試したら、さっと動作確認できた。

```py
import smtplib
from email.mime.text import MIMEText

fromaddr = 'test@example.com'
toaddr = 'test@example.com'
msg = MIMEText('Hello')
msg['Subject'] = 'test'
msg['From'] = fromaddr
msg['To'] = toaddr

s = smtplib.SMTP('example.com',587)
s.ehlo()
s.starttls()
s.ehlo()
s.login('user','password')
s.sendmail(fromaddr,toaddr,msg.as_string())
s.quit()
```
FlutterでFadeInImageのplaceholderが出ないとき

```
                child: FadeInImage.assetNetwork( // 出る
                    fit: BoxFit.cover,
                    placeholder: 'assets/images/sample/placeholder.png',
                    image: this.video.comedian.imageUrl,
                ),
                child: FadeInImage( // 出ない
                    fit: BoxFit.cover,
                    placeholder: AssetImage('assets/images/sample/placeholder.png'),
                    image: NetworkImage(this.video.comedian.imageUrl),
                ),

```

image側でnetworkimage使っちゃうと出ない件。
SageMakerでModuleNotFoundError: No module named 'cv2'に対応する

SageMakerのノートブックインスタンスでopencvを使おうとすると、
ModuleNotFoundError: No module named 'cv2'　のエラーがでてしまい使えません。
使えるようにする方法をいくつか試してみました。
どうしてこの手順で使えるようになるか細かい事は、説明できないところもあり省いています。

#環境

- anacondaの環境は、conda_tensorflow_p36です。
- notebookのインスタンスは、ml.t2.mediumです。

#方法1 - AWS Consoleのjupyterから入れる

この方法が今のところ最善と思っています。
下画面のように、インストールする環境を選択し、必要なライブラリをチェックしてインストールできます。

![Screen Shot 2019-02-11 at 13.04.27.png](https://qiita-image-store.s3.amazonaws.com/0/80590/6da71cc6-7a07-7896-1f95-cef614b00f0b.png)

実行すると、数分後にエラーが表示されます。
「Error Installing Packages
An error occurred while installing packages.
Unexpected end of JSON input」
しかし、インストールは完了しているようなので、この状態でノートブックからimportします。

``` 
import cv2
```

このときライブラリのバージョンが違うエラーが出るので、下記のように実行してOSにインストールされているバージョンを参照するようにします。

!を付けることで、ノートブックから実行することができます。

``` 
!mv /home/ec2-user/anaconda3/envs/tensorflow_p36/lib/libgomp.so.1.0.0 /home/ec2-user/anaconda3/envs/tensorflow_p36/lib/libgomp.so.1.0.0.bk
!ln -s /usr/lib64/libgomp.so.1 /home/ec2-user/anaconda3/envs/tensorflow_p36/lib/libgomp.so.1.0.0
```

これで無事使えることができました。




#方法2 - ターミナルからconda installで入れる

jupyterのターミナルからanacondaのコマンドでインストールすることができます。
ただし、この方法ではインストールに3時間以上かかったため、あまりオススメできません。

``` 
conda install -n tensorflow_p36 -c conda-forge opencv
```

方法1と同様に、バージョン違いによるエラーが出るので、OSに入っているバージョンの方を参照させます。

``` 
!mv /home/ec2-user/anaconda3/envs/tensorflow_p36/lib/libgomp.so.1.0.0 /home/ec2-user/anaconda3/envs/tensorflow_p36/lib/libgomp.so.1.0.0.bk
!ln -s /usr/lib64/libgomp.so.1 /home/ec2-user/anaconda3/envs/tensorflow_p36/lib/libgomp.so.1.0.0
```

これで無事使えることができました。



#課題
どちらの方法も使えるのようにはなるのですが、インスタンスを停止すると次起動するときは、もう一度インストールし直しになります。
方法1だと、そこまで時間はかからないとはいえ少し面倒です。
SageMakerでopencv使う事ってまれなのでしょうか。。
[PowerApps Tip's]曜日に関する注意点と文字列置換

記事投稿時点（2019/2/11）の仕様なので、今後VerUpにより改善されると思われますが・・・。おや？ってなったので投稿しておきます。
#Now() → 年/月/日(曜日)ってしたいでしょ？
日付のデータを画面表示する際、曜日まで含んだ形式にしたい場合があると思います。そんな時に利用するのが「Text関数」です。

■参考URL
　[PowerApps の Text 関数](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-text)

> ddd	省略形で曜日を表示します (Sun ～ Sat)。
> dddd	完全な名前で曜日を表示します (Sunday ～ Saturday)。

なるほど。では、日～月、みたいな省略形は”ddd”かな？と思いますよね？
※ちなみに、C#使いの方は”yyyy/**MM**/dd”ってしちゃうと思うのですが、上記参考URLの公式でプレースホルダーをよくご確認ください。色々と方言の違いがあります注意です。


#日本語環境におけるText関数の曜日
さて、どうなるか？画面を確認ください。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/215892/21ac3014-2079-8ece-cac2-6999f4041347.png)

####①の箇所 m/dd(dddd)

```Label.Text
Text(Now(), "[$-ja-JP] m/dd(dddd)", "ja-JP" )
```

####②の箇所 m/dd(ddd)

```Label.Text
Text(Now(), "[$-ja-JP] m/dd(ddd)", "ja-JP" )
```

***”dddd”でも、”ddd”でも、”月曜日”となってしまいます。
”月”とはなりません。***
どうやら現状の仕様では、日本語環境における曜日については、省略された形式は表示されないようです。では、③のように省略した形式にしたい場合は、どうすればよいか？

####③の箇所 ”曜日”の文字列をブランク("")で置換

```Label.Text
Substitute(Text(Now(), "[$-ja-JP] m/dd(ddd)", "ja-JP" ),"曜日","")
```

対策としては以上です。念のため、関数を重ねているので解説しておきます。

#解説
③の式は、”ddd”で指定した省略された形式（でも、日本語環境だと省略されてこない）を指定したText関数の結果を、さらにSubstitute関数で”曜日”という文字列をブランク("")で文字列置換しています。

これにより、現時点の仕様で”〇曜日”となってしまっても、”〇”（日～土）と表示されます。また、”ddd”を指定しておくことにより、将来的に日本語環境でも省略形になるよう更新が入った場合でも、出力される結果は変わらないハズです。なので、修正をし忘れても大丈夫。（きっとねｗ）

ここでもC#使いは、C#のReplace関数を思い浮かべるかと思いますが、それに該当する機能がPowerAppsではSubstitute関数です。PowerApps の Replace関数C#と挙動が異なりますのでご注意ください。（自分は今でもなれなくて、アレ？ってなるｗ）

■参考URL
　[PowerApps の Replace および Substitute 関数](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-replace-substitute)

#まとめ
- 日付型のデータから曜日が取得したい場合はText関数で"dddd"、または"ddd"
- "ddd"が省略型 (Sun ～ Sat)
- "dddd"が完全な名前 (Sunday ～ Saturday)
- 日本語(ja-JP)の場合、"ddd"でも"dddd"でも結果が同じ”〇曜日”になる
- "曜日"の文字列が不要な場合は、文字列置換「Substitute関数」を活用

やーしかし、”月曜日”の省略型は”月”だと思うじゃん？まさかね、不具あ・・・じゃない仕様だとは思わないじゃん？みたいな気持ちになりましたとさ。

VerUpで当記事の動きは改善されると思います。どちらかというと、文字列置換をすぐ「Replace」で書いて、アレ？ってなるので、その備忘録も兼ねたネタでした。いや、ほんとね。PowerApps の 関数は、C#で準備されてるモノと同音異義語みたいな感じで、動作やらが異なるポイントが多いですね。関数のDocsをチャンと確認して、実際に動作をチェックしないと、どーしようもないトコでハマりかねないですね（苦笑

それでは、皆さま、素晴らしい Power Platform Life を！
Ruby にも関数言語ではやりの |> と <| がほしいよ!

```ruby
class Object
  define_method :'|>' do |*args|
    send *args
  end

  define_method :'<|' do |arg1, *args|
    arg1.send self, *args
  end
end

# 本当は 'abc' |> upcase と書きたい
p 'abc'.method('|>').call :upcase   # => "ABC"
p :downcase.method('<|').call 'XYZ' # => "xyz"
```

Ruby は演算子の新規作成が無理なんで、こんなまどろっこしい方法で呼び出している。確か Jekyll の Liquid ってシステムでパイプを使ったリダイレクト？を実現していた記憶があるが、まり使い勝手が良いとはいえなかった。それに Liquid のやり方を Object で実装すると､SOLID の O と L であるオープン・クローズドの原則とリスコフの置換原則を破るので､あんまり行儀の良い方法ではないとは思うしね｡

えー、そんなことはともかくそれで、次期 Ruby には搭載されてもいいと思うのですが、コア開発の皆様、2.6 で関数合成を導入したのだから、ここはひとつ、2.7 では |>, <| があると、クリスマスが楽しみになるんで、よろしくおねがいいたします。

かしこ
PiBakeryの固定IPアドレス設定ブロックを自作する

# Raspberry Pi に固定IPアドレスを振りたい

[.NetCoreをRaspberry Pi上のdockerでパッと動かすPiBakeryレシピ](https://qiita.com/mochimo/items/4566e854fab2eacfdcfe)で`Run Command`を使って固定IPアドレスをRaspberry Piに振った。

* 固定IPはRaspberryPiをセットアップする時に簡単に指定できた方がいい
* `Run Command`はちょっと「生」すぎる

ということで、[Contributing Blocks to PiBakery](https://www.pibakery.org/docs/contribute.html)に従って固定IPアドレスを振るためのブロック`[staticip_setup]`を作成してみた。[作ったものはこちら。](https://github.com/mochimochiki/PiBakeryScripts/tree/master/pibakery-blocks/staticip_setup)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/101002/9a8809ae-c70a-8929-1601-416312534a47.png)

# 手順

## 1. シェルスクリプトを作成する

Raspberry Piに固定IPアドレスを振るためのスクリプトを作成する。ブロックから設定したい項目は引数にしておく。

```bash:staticip_setup.sh
# interface名(wi-fiならwlan0、LANケーブルならeth0)
echo "interface $1" >> /etc/dhcpcd.conf
# IPアドレスの設定
echo "  static ip_address=$2" >> /etc/dhcpcd.conf
# デフォルトゲートウェイの設定
echo "  static routers=$3" >> /etc/dhcpcd.conf
# DNSサーバーの設定
echo "  static domain_name_servers=$4" >> /etc/dhcpcd.conf
```

## 2. ブロックを定義するjsonファイルを作成する

`staticip_setup.json`ファイルを作る。プロパティについては[Contributing Blocks to PiBakery](https://www.pibakery.org/docs/contribute.html)を参考に。

`name`プロパティはjsonファイル名と同じにしておく。

```json
"name": "staticip_setup",
```

`text`プロパティにはブロックに表示したいテキストを設定。`%d`で引数を埋め込む

```json
"text": "Setup Static IP\\nType: %1\\nIP address with subnet mask: %2\\nDefault gate way: %3\\nDNS server: %4",
```

`script`プロパティは先程作ったスクリプトを指定

```json
"script": "staticip_setup.sh"
```

スクリプトで`$1-$4`の引数を必要としているので、`args`にはそれぞれに対応する4つのオブジェクトを用意する。

```json
"args": [
	{
        "type": "menu",
        "options": ["eth0", "wlan0"]
	},
	{
		"type": "text",
		"default": "192.168.1.1/24",
		"maxLength":18
    },
    {
		"type": "text",
		"default": "192.168.1.1",
		"maxLength":15
    },
    {
		"type": "text",
		"default": "192.168.1.1",
		"maxLength":15
	}
]
```

残りのプロパティはこんな感じに。この設定自体にはnetworkへの接続は不要なので`network:false`で良い。

```json
"network": false,
"continue": true,
"type": "network",
"category":"network",
"supportedOperatingSystems": [
	"raspbian-pibakery.img",
	"raspbian-lite-pibakery.img"
],
"shortDescription":"Set static IP address to ethernet(eth0) or wifi(wlan0).",
"longDescription":"Set static IP address to ethernet(eth0) or wifi(wlan0)."
```

## 3. PiBakery下に配置し、info.jsonを追記

1. PiBakery本体下の`pibakery-blocks`ディレクトリ（`C:\Program Files (x86)\PiBakery\resources\app\pibakery-blocks`など）にjsonファイル名と同じ名称のフォルダ`staticip_setup`を作成
2. 作成した2つのファイルを上記フォルダ下にコピー
3. `pibakery-blocks/info.json`の`loadOrder`プロパティの要素に`staticip_setup`を追記

以上で完成。PiBakeryを開いたら`Network`カテゴリに今回作成したstaticip_setupが出てくるようになる。