OmniAICreator/Qiita-1.07M huggingface dataset:
Flutterウィークリー #1

# Flutterウィークリーとは？
FlutterファンによるFlutterファンのためのニュースレター
https://flutterweekly.net/

この記事は#1の日本語訳です
https://mailchi.mp/72a0c9f91f31/flutter-weekly-1

※Google翻訳を使って自動翻訳を行っています。翻訳に問題がある箇所を発見しましたら編集リクエストを送っていただければ幸いです。


### 私の第一印象をFlutterリングする
https://blog.usejournal.com/flutter-ing-my-first-impressions-3b4aee6d363c

<img src="https://cdn-images-1.medium.com/max/1200/1*smBG6RA5DKzZOkk3lrvoHg.png" />
### YouTubeでのFlutterトークの収集
https://www.youtube.com/playlist?list=PL2F9wFnfMLb1ET-Pv50XL-2t2YrQDNapE

<img src="https://i.ytimg.com/vi/t8xdEO8LyL8/hqdefault.jpg?sqp=-oaymwEWCKgBEF5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLCe962ov5dYeXXZuY4FdPReTualuQ" />
### Flutter StreamBuilderを使用する
https://medium.com/@sidky/using-streambuilder-in-flutter-dcc2d89c2eae

<img src="https://cdn-images-1.medium.com/max/1200/1*bb-PJOlphSs5Z9OcSlvaaQ.gif" />
### Flutterランチャーアイコン
https://github.com/franzsilva/flutter_launcher_icons

<!-- <img src="https://avatars1.githubusercontent.com/u/35045612?s=400&v=4" /> -->
### Flutter付きのシンプルなJSON
https://flutter.institute/simple-json-with-flutter/

<img src="https://flutter.institute/content/images/2017/11/flutterinstitute.png" />
### Flutter hands on：ニュースアプリの構築
https://blog.geekyants.com/flutter-hands-on-building-a-news-app-fe233027185f

<img src="https://cdn-images-1.medium.com/max/1200/1*0NHFzUUMKOlX7aSFMjp1Dw.png" />
### FlutterのInheritedWidgetはアプリ状態を保持するのに適していますか？
https://medium.com/@chemamolins/is-flutters-inheritedwidget-a-good-fit-to-hold-app-state-2ec5b33d023e

<!-- <img src="https://cdn-images-1.medium.com/fit/c/120/120/1*XBwwjz721rBOLekx5VqEwg.jpeg" /> -->
Flutterウィークリー #2

# Flutterウィークリーとは？
FlutterファンによるFlutterファンのためのニュースレター
https://flutterweekly.net/

この記事は#2の日本語訳です
https://mailchi.mp/1b986f359f60/flutter-weekly-2

※Google翻訳を使って自動翻訳を行っています。翻訳に問題がある箇所を発見しましたら編集リクエストを送っていただければ幸いです。


### Firebase認証
https://flutter.institute/firebase-signin/

<img src="https://flutter.institute/content/images/2017/11/flutterinstitute.png" />
### ユーザーがFlutter戻るボタンまたは戻るナビゲーション矢印をタップしたことを知る方法
http://cogitas.net/know-user-tapped-back-button-back-navigation-arrow-flutter/

<img src="http://cogitas.net/blog/wp-content/uploads/2018/01/2018_01_12_11_07_35-169x300.gif" />
### Flutterを使用してモバイルアプリを構築する
https://medium.com/coding-your-dreams/using-flutter-to-build-mobile-apps-67dafb9a89a

<img src="https://cdn-images-1.medium.com/max/1200/1*FP8_X1HZdDYHydxhItIMlA.png" />
### ネイティブ・デベロッパーズ・Flutter
https://www.polidea.com/blog/native-developers-look-on-flutter/

<img src="https://www.polidea.com/static/FLUTTER_MEDIUM-52ecdccd8b9abd4b28b18cd50f84da10-0b95b.jpg" />
### Flutterハンズオン：ライブロケーション共有アプリケーションの構築
https://blog.geekyants.com/flutter-hands-on-building-a-live-location-sharing-app-14b67ef17404

<img src="https://cdn-images-1.medium.com/max/1200/1*SWZUx0tYJ6a8Ch64r98gJg.jpeg" />
### プロキシミティプラグイン
https://github.com/Samaritan1011001/proximity_plugin

<!-- <img src="https://avatars2.githubusercontent.com/u/10944487?s=400&v=4" /> -->
### Dartシールドユニオン
https://github.com/flutterconsortium/dart_sealed_unions

<!-- <img src="https://avatars1.githubusercontent.com/u/35045612?s=400&v=4" /> -->
Flutterウィークリー #3

# Flutterウィークリーとは？
FlutterファンによるFlutterファンのためのニュースレター
https://flutterweekly.net/

この記事は#3の日本語訳です
https://mailchi.mp/d8a3bca2ec5a/flutter-weekly-3

※Google翻訳を使って自動翻訳を行っています。翻訳に問題がある箇所を発見しましたら編集リクエストを送っていただければ幸いです。


### Dartカンファレンスロサンゼルス2018
https://events.dartlang.org/2018/dartconf/

<!-- <img src="https://events.dartlang.org/2018/images/dartconf-ogimg.jpg" /> -->
### Flutterビリング
https://github.com/VolodymyrLykhonis/flutter_billing

<!-- <img src="https://avatars1.githubusercontent.com/u/881338?s=400&v=4" /> -->
### Flutter 、飛行
https://goo.gl/RWH45j

<img src="https://lh6.googleusercontent.com/sa3ZRCfkxKPHEP9mUxjjQcYey6Xt9mEFLgCv3ResmM1b6F56KVnq059QArqYfQ5Fcst6ig=w1200-h630-p" />
### FlutterとFlux/ Reduxを使用したアニメーション管理
https://medium.com/flutter-io/animation-management-with-flutter-and-flux-redux-94729e6585fa

<img src="https://cdn-images-1.medium.com/max/1200/1*0gdFpYTSo_TTCqd-XVcvYw.gif" />
### これは、Googleの新しい携帯電話、タブレット、パソコンのオペレーティングシステムとは何かを最初に見ています
http://read.bi/2DnjOKj

<img src="https://amp.businessinsider.com/images/5a60cba928eecc67008b5930-1920-960.jpg" />
### Flutter Plugin v21をご利用いただけます -  NEW Flutter Inspectorの紹介
https://t.co/2S6Db5H5jB
Flutterウィークリー #4

# Flutterウィークリーとは？
FlutterファンによるFlutterファンのためのニュースレター
https://flutterweekly.net/

この記事は#4の日本語訳です
https://mailchi.mp/0f354520f720/flutter-weekly-4

※Google翻訳を使って自動翻訳を行っています。翻訳に問題がある箇所を発見しましたら編集リクエストを送っていただければ幸いです。

### React Native、 Flutter 、Xamarin：比較
https://www.novoda.com/blog/react-native-flutter-xamarin-a-comparison/

<img src="https://blog.novoda.com/content/images/2018/01/Illustration-twitter.png" />
### Flutterチュートリアル - ピザ注文アプリケーション
https://youtu.be/aK_K5p3zSQs

<img src="https://i.ytimg.com/vi/aK_K5p3zSQs/maxresdefault.jpg" />
### フルヴィーズ
https://github.com/dilpreet96/Fluvies

<!-- <img src="https://avatars1.githubusercontent.com/u/12071739?s=400&v=4" /> -->
### Dart強力モードでのJSONシリアル化
https://aloisdeniel.github.io//flutter-json-serialization/

<!-- <img src="https://aloisdeniel.github.io//images/halve.png" /> -->
### Flutter SDKチュートリアル - アニメーション
https://youtu.be/82PoFu7D48E

<img src="https://i.ytimg.com/vi/82PoFu7D48E/maxresdefault.jpg" />
### 画面
https://pub.dartlang.org/packages/screen

### Flutter Advanced Network Imageprovider
https://pub.dartlang.org/packages/flutter_advanced_networkimage
Flutterウィークリー #5

# Flutterウィークリーとは？
FlutterファンによるFlutterファンのためのニュースレター
https://flutterweekly.net/

この記事は#5の日本語訳です
https://mailchi.mp/cd576ba84599/flutter-weekly-5

※Google翻訳を使って自動翻訳を行っています。翻訳に問題がある箇所を発見しましたら編集リクエストを送っていただければ幸いです。


### ジオコーダー
https://pub.dartlang.org/packages/geocoder

<img src="https://pub.dartlang.org/static/img/dart-logo-400x400.png" />
### Flutter適応型マスター/ディテールレイアウトの実装
https://flutter.rocks/2018/01/28/implementing-adaptive-master-detail-layouts/

<img src="https://iirokrankka.com/images/implementing-master-detail-flow/twitter-card.png" />
### Quiznoob  - あなたが学んでいる間に稼ぐ
https://medium.com/@johnrcallahan/quiznoob-earn-while-you-learn-a31efb110a84

<img src="https://cdn-images-1.medium.com/max/1200/1*DDzx812lrQDpFEpxOKrFyA.jpeg" />
### 連絡先サービス
https://github.com/clovisnicolas/flutter_contacts

### Flutter Firebase AdMobのバナー広告を表示する方法
http://cogitas.net/show-firebase-admob-banner-ad-in-flutter/

<img src="http://cogitas.net/blog/wp-content/uploads/2018/01/firebasead_hiddenbottom-169x300.png" />
### Flutter Dart 2
https://flutter.institute/flutter-with-dart-2/

<img src="https://flutter.institute/content/images/2017/11/flutterinstitute.png" />
### ヒーローズコンパニオン
https://github.com/arranf/Heroes-Companion/
Flutterウィークリー #6

# Flutterウィークリーとは？
FlutterファンによるFlutterファンのためのニュースレター
https://flutterweekly.net/

この記事は#6の日本語訳です
https://mailchi.mp/7872d0c5e9f4/flutter-weekly-6

※Google翻訳を使って自動翻訳を行っています。翻訳に問題がある箇所を発見しましたら編集リクエストを送っていただければ幸いです。


### Fluttie
https://pub.dartlang.org/packages/fluttie

<img src="https://pub.dartlang.org/static/img/dart-logo-400x400.png" />
### Flutureは今すぐです！
https://medium.com/@lets4r/the-fluture-is-now-6040d7dcd9f3

<img src="https://cdn-images-1.medium.com/max/1200/1*K0Hq-0HWIb2fKPe3u5rtaQ.png" />
### flutter_twitter_login
https://pub.dartlang.org/packages/flutter_twitter_login

<img src="https://pub.dartlang.org/static/img/dart-logo-400x400.png" />
### Flutter FTW約トップ記事Flutter
https://blog.goposse.com/flutter-ftw-top-articles-about-flutter-fec6f365ef81

<img src="https://cdn-images-1.medium.com/max/1200/1*6yywkxrnfQi9biYj5ZHIqA.jpeg" />
### Flutter Androidランタイム許可フローを実装する方法
http://cogitas.net/android-runtime-permission-flow-flutter/

<img src="https://www.paypalobjects.com/en_GB/i/scr/pixel.gif" />
### Flutter - 簡単に始めることができます
https://medium.com/@westdabestdb/flutter-its-easy-to-get-started-995eb20c54a1

<img src="https://cdn-images-1.medium.com/max/1200/1*sXghI6muRZJus1f-nU6_Lw.png" />
Flutterウィークリー #7

# Flutterウィークリーとは？
FlutterファンによるFlutterファンのためのニュースレター
https://flutterweekly.net/

この記事は#7の日本語訳です
https://mailchi.mp/249b1c1820f1/flutter-weekly-7

※Google翻訳を使って自動翻訳を行っています。翻訳に問題がある箇所を発見しましたら編集リクエストを送っていただければ幸いです。


### Flutter 2：動的引き出しリスト、ステートフルウィジェット、フォームと検証
https://medium.com/@vemula.aravind336/flutter-2-dynamic-drawer-list-stateful-widgets-forms-and-validation-6389fc625d2e

<img src="https://cdn-images-1.medium.com/max/1200/1*VQ497zwrgek_7bvAaTxkDA.jpeg" />
### Flutter ：最初から一時間以内に簡単なアプリを作りました。そしてあなたはそれをどうやって行うこともできます。
https://medium.com/@norbertkozsir/flutter-how-i-built-a-simple-app-in-under-an-hour-from-scratch-and-how-you-can-do-it-too-6d8e7fe6c91b

<img src="https://cdn-images-1.medium.com/max/1200/1*ZAY34Q7xPN_OixoBRPtaAA.gif" />
### 惑星 - Flutter ：惑星詳細ページ
http://sergiandreplace.com/2018/02/planets-flutter-planet-detail-page/

### Flutter - あなたがそれを愛する理由5つ
https://hackernoon.com/flutter-5-reasons-why-you-may-love-it-55021fdbf1aa

<img src="https://cdn-images-1.medium.com/max/1200/1*gqBLqChWtWLq33DvWm6Nog.png" />
### Flutterカスタム読み込みアニメーションを実装する方法
http://cogitas.net/custom-loading-animation-flutter/

<img src="http://cogitas.net/blog/wp-content/uploads/2018/02/2018_03_17_11_45_42-169x300.gif" />
### Flutterの紹介
https://hackernoon.com/an-introduction-to-flutter-1363f1bbe324

<img src="https://cdn-images-1.medium.com/max/1200/0*zDD1y4figio4Q39e.png" />
### Flutter反応するアプリの状態
https://medium.com/@maksimrv/reactive-app-state-in-flutter-73f829bcf6a7

<img src="https://cdn-images-1.medium.com/max/1200/1*TFZQzyVAHLVXI_wNreokGA.png" />
Flutterウィークリー #8

# Flutterウィークリーとは？
FlutterファンによるFlutterファンのためのニュースレター
https://flutterweekly.net/

この記事は#8の日本語訳です
https://mailchi.mp/53c4e5a8de5a/flutter-weekly-8

※Google翻訳を使って自動翻訳を行っています。翻訳に問題がある箇所を発見しましたら編集リクエストを送っていただければ幸いです。


### Flutterの紹介
https://www.youtube.com/watch?v=fq4N0hgOWzU

<img src="https://i.ytimg.com/vi/fq4N0hgOWzU/maxresdefault.jpg" />
### Flutter新-今すぐ利用できるプラグインV22 Flutterツーリングリリース！
https://groups.google.com/forum/#!topic/flutter-dev/lKtTQ-45kc4


### Dart2を発表
https://medium.com/dartlang/announcing-dart-2-80ba01f43b6

<img src="https://cdn-images-1.medium.com/max/1200/1*E9T7YsI_ZU8gk4CewQg_QA.jpeg" />
### あなたの最初のFlutterアプリを書く
https://flutter.io/get-started/codelab/

<!-- <img src="https://flutter.io/get-started/codelab/images/step7-themes.png" /> -->
### Flutter ：Bookshelf App Part 2、パーソナルノートとデータベースの統合
https://medium.com/@norbertkozsir/flutter-bookshelf-app-part-2-personal-notes-and-database-integration-a3b47a84c57

<img src="https://cdn-images-1.medium.com/max/1200/1*-fXaFqOstQQiQyoD1Yk_gA.png" />
### チュートリアル：Staggered GridViewの作成
https://medium.com/@lets4r/flutorial-create-a-staggered-gridview-9c881a9b0b98

<img src="https://cdn-images-1.medium.com/max/1200/1*KTozbMEUjQY4864aNOCxsA.png" />
### Flutter IoとDartを使用したWhatsApp UIの構築
https://medium.com/@lalal_905/building-whatsapp-ui-with-flutter-io-and-dart-1bb1e83e7439

<img src="https://cdn-images-1.medium.com/max/1200/0*snDDDWRHFmkM5L5s.png" />
### channel_mock
https://pub.dartlang.org/packages/channel_mock

<img src="https://pub.dartlang.org/static/img/dart-logo-400x400.png" />
### 視差画像
https://github.com/pulyaevskiy/parallax-image

### menu_flutter
https://github.com/braulio94/menu_flutter
Spring FrameworkでJavaFXプログラミングを楽にしたかった

# 概要
　実のところN番煎じではありますが……と言うか[この記事](https://qiita.com/shibafu/items/b4c08597df010e95c99a)が無かった段階で試行錯誤していたのでベストプラクティスではないかも知れません。

# ポイント

## ComponentScanするクラスでの記述

```MainApp.java
/**
 * 起動用クラス
 * @author ysrken
 */
@ComponentScan
public class MainApp extends Application {
    private static ConfigurableApplicationContext context;
    
    /**
     * main関数
     * @param args コマンドライン引数
     * @throws Exception 実行時例外
     */
    public static void main(String[] args) throws Exception {
        // このcontextは今後使い回すので、あえて上記のようにstatic変数にした
    	context = new AnnotationConfigApplicationContext(MainApp.class);
        launch(args);
    }

    /**
     * JavaFXの起動処理
     * @param stage Stage情報
     * @throws Exception 実行時例外
     */
    public void start(Stage stage) throws Exception {
        // 無難に生成するが、getBeanしているのがポイント
        FXMLLoader loader = new FXMLLoader();
        loader.setControllerFactory(MainApp.getApplicationContext()::getBean);
        Parent rootNode = (Parent) loader.load(getClass().getResourceAsStream("/fxml/MainView.fxml"));
        Scene scene = new Scene(rootNode);
        stage.setScene(scene);

        mainStage.show();
    }
    
    /**
     * ApplicationContextを引き回すために使用
     * @return 共用するApplicationContext
     */
    public static ApplicationContext getApplicationContext() {
    	return context;
    }
    
    /**
     * JavaFXの終了処理
     * @throws Exception 実行時例外
     */
    @Override
    public void stop() throws Exception {
        context.close();
    }
}
```

　ここで重要なのは「`ConfigurableApplicationContext context`」の部分で、この変数を`getApplicationContext()`で他のウィンドウ生成時に利用します。
　つまり、`FXMLLoader`を利用する際、単に`new FXMLLoader()`とするだけではなく、`loader.setControllerFactory(MainApp.getApplicationContext()::getBean);`としてcontextをセットしておきます。こうすることで、Spring FrameworkのDIがウィンドウの`Controller`および`Model`にも及びます。

## Controllerでの記述

```Controller.java
@Component
//@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class Controller{
    /**
     * Model
     */
    @Autowired
    Model model;

    /**
     * 初期化
     */
    public void initialize() {
        ～～～
    }
}
```

　前述のようにcontextをセットしておくことにより、`@Autowired`するだけでModelが読み込まれます。当該ControllerおよびModelを複数個作成する予定がある場合は、`SCOPE_PROTOTYPE`指定をしているコメントアウトを外しましょう。

## Modelでの記述

```Model.java
@Component
//@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class Model{
    /**
     * 初期化
     */
    publicModel() {
        ～～～
    }
}
```

　Modelでも`@Autowired`が効くのは嬉しいですね。

# その他での記述

　DIしたいクラスにはだいたい`@Component`等が付いていると思いますが、上記Controller関係以外で、内部に`@Autowired`が使われているクラスのインスタンスを生成する際は次のように書きましょう。

```sample.java
@Component
public class SampleClass {
    /**
     * Model
     */
    @Autowired
    Hoge hoge;

    ～～～～～～
}

// OK
final SampleClass x = MainApp.getApplicationContext().getBean(SampleClass.class);
// NG
final SampleClass y = new SampleClass();
```

# 参考資料

- [SpringBeanをインジェクションするFXMLLoaderを自作する](http://d.hatena.ne.jp/tatsu-no-toshigo/20130503)
はじめてなelixir(2) パスワード生成器をちょっと高級にする

# はじめに

前回は [はじめてな elixir(1)](https://qiita.com/kikuyuta/items/ce9e41cbcd982bbdf462) として荒っぽいプログラムを書いてみました。サンプルとしてパスワード生成器を取り上げました。もう少し書いてみようと思います。

## 改良したところ

前回は、小文字、大文字、数字、特殊文字、をそれぞれ1文字は最低含むようにしました。今回はそれぞれの文字種別に最低文字数を指定できるような関数にしてみます。

# 丸一日かけて書いたプログラムがこれだ

```elixir:mkpwd3.ex
defmodule Password do
  def gen(len, l, u, n, s) do
    if len >= l + u + n + s do
      base_str()
        |> Enum.reduce("", & &2<>&1)
        |> random_stream()
        |> Stream.reject(&(&1 in ambiguous_chars()))
#        |> Stream.drop_while(&(&1 in ambiguous_chars())) # 初稿から修正した。こっちではいかんらしい。
        |> filter(len, l, u, n, s)
        |> to_string()
    else
      raise ArgumentError, message: "The length must equals to or be greater than the sum of the numbers of each letter types."
    end
  end

  def ambiguous_chars() do
    String.split("0oO1iIjJlL9qQ", "", trim: true)
  end

  def filter(str, len, l, u, n, s) do
    str_list = Enum.take(str, len)
    if (base_str()
      |> Enum.map(& Enum.count(str_list,
           fn s -> s in String.split(&1, "", trim: true) end))
      |> Enum.zip([l, u, n, s])
      |> Enum.map(fn({x, y}) -> x >= y end)
      |> Enum.all?)
    do
      str_list
    else
      filter(str, len, l, u, n, s)
    end
  end

  def random_stream(str) do
    Stream.unfold(nil, & {random_char(str), &1})
  end

  defp random_char(str) do
    Enum.random(String.split(str, "", trim: true))
  end

  def base_str() do
    str_lower = "abcdefghijklmnopqrstuvwxyz"
    str_upper = String.upcase(str_lower)
    str_number = Enum.to_list(0..9) |> Enum.map(& Integer.to_string(&1)) |> Enum.map_join(& &1)
    str_special = "-/"
#    str_special = "\#$%;,.?/"

    [ str_lower, str_upper, str_number, str_special ]
  end
end
```

## 実行結果の例

```
iex(40)> Password.gen(4,1,1,1,1)
"6u-M"
iex(41)> Password.gen(5,1,1,1,1)
"-nI1X"
iex(42)> Password.gen(5,2,1,1,1)
"r5/oE"
iex(43)> Password.gen(6,2,1,1,0)
"KDwK2f"
iex(44)> Password.gen(4,2,1,1,0)
"s7hI"
iex(45)> Password.gen(4,2,1,1,1)
** (ArgumentError) The length must equals to or be greater than the sum of the numbers of each letter types.
    mkpwd3.ex:11: Password.gen/5
```

# 考察（ちゅうか疑問だらけだけど）

- まだ記法にとまどう。
    - リスト、マップ、キーワードリスト…、の使い分けがまだ落ちてきてない。
- [0..9] とは書けるけど [0..] とは書けない。無限リストをニュルッと生成できないものか。
    - ちなみに ['a'..'z'] とも書けない。
- filter 関数は本当は unix コマンドの tee みたいにしたかった。
    - 合格したのを IO.puts で表示しつつパイプの後ろに出し続けるみたいな…
- あいかわらずパターンマッチはうまく使えない。if が多いのがそれを表している。
    - パイプライン構文とパターンマッチと相性が悪い気がしてる

次回は spawn 使って、パーツを別々のプロセスで動かしてみるのをやってみるつもりです。


# 参考文献

[プログラミングElixir] (https://www.amazon.co.jp/dp/4274219151/)
[Elixir v1.7.3] (https://hexdocs.pm/elixir/)
AIと今後の社会

2013年に公開されたスパイクジョーンズ監督・脚本の「her 世界でひとつの彼女」という映画がある。
私の中での技術革新、「シンギュラリティ」のイメージはこの映画のAIだ。

映画の中ではAIであるサマンサが主人公の色々な面でサポートしてくれ、
最終的には恋愛関係にまで発展し恋人となる所をも描かれている。
詳細は割愛するが、昨日だけを言えばサマンサは音声認識＋文章認識＆メール送信＋予定管理などなど、人と同等以上のアシスタントとしての機能を発揮できるAIだ。

現在の現実社会にはまだサマンサは登場していない。
近年では、AIアシスタントとしてAppleの「Siri」や、Googleの「Google Home」、
Lineの「Clova」、Microsoftの「Cortana」などなど出てきているが、
現在の技術レベルまではまだサマンサほどの言語認識能力や柔軟性を持った対応があるかというと、そこまでには至っていない。

私は、AI技術は今後もっと発展していくと考えているし、実際に革新は進んでいっていると考える。
車の自動運転もそうだが、インターネットで完結しているサービスのインターフェースは全てAIに置き換わっていくであろう。
郵便物の再配達や、ネットショッピング、メールの送受信や、ニュース、天気予報のチェック。
高齢者向けの「見守り」にも利用可能かもしれない。
高齢者の買い物はネットショッピングで家まで配送可能だし、言語認識能力が上がっていけば、話し相手としての対応も可能だし、その履歴が遠隔地の家族などが確認する事が出来れば、安心だ。

私は今後エンジニアとして、AI技術の革新の中心に近い場所へ身を置き、
AI技術を研究し、ゆくゆくはAIを使ったサービスの提供を目的としたプロジェクトを
立ち上げられればと考えている。

私の経験としてはAI技術はこれまでぼんやりとした興味だけだったが、今後の自分のキャリアや興味の方向を考えた時に、取り組みを始めようと思い立った。
AI技術はまだようやくPythonを学習し始めたところだが近いうちに少しずつ形にして公開していけたらと思う。
MacにAlfredをいれていろいろ設定する

# 環境
- macOS Sierra 10.12.6
- Alfred v3.7(無料版、　有料版もあるみたい)

# 入れかた
https://www.alfredapp.com/ からインストール。
App Storeから入れるとv1.2(古い)が入ってしまった。

# 使い方
- "⌥Space"で検索窓が起動
- 基本Spotlightぽくいろいろ検索してアクションできる
- 検索ソースとか追加できる
- "⌘,"で設定画面(検索窓が出ている状態で)

# 初期設定
## Spotlight検索のショートカットキーを解除(使わない場合)
システム環境設定 > キーボード > "ショートカット"タブ > Spotlight > チェックボックスのチェックを外す

## General
- Where you are: Japan
    - "Amazon hogehoge"で日本のAmazonに接続(設定しないとAmazon.com, googleとかも同様だと思う)

## Features
### Web Search
- いらないやつはチェック外す
- 使うやつはkeywordわかりやすくする
- 右下のAdd Custum　Searchで便利そうなやつ追加する
    - https://qiita.com/satoshi1335/items/19b9b6109d7fe297bfd2
    - https://qiita.com/elzup/items/0f227adb426a70731d80
    
### Web Bookmarks
- Google Chrome Bookmarksにチェック Chromeのブックマークを検索してくれる

### Dictionary
- Define a word を define → d　に。　よく使いそうなので短縮。
at coder beginner 013

A
高橋君はとても英語が苦手で、アルファベットもまだ覚えきれていません。
そこで、高橋君のために、入力として与えられたアルファベットが A から数えて何番目のアルファベットかを求めるプログラムを作成してください。
ただし、高橋君は 5 より大きい数を知らないので、与えられるアルファベットは A, B, C, D, E のいずれかです。また、A 自身は A から数えて 1 番目であるとします（0 番目ではありません）。
A－６４で1になる。あとは(int)(X-'A')+1

B
セキュリティ意識の高い高橋君はこの度、自分の家に新しい錠をつけることにしました。
この錠はダイヤルロック式で、1 桁の数字が表示されるディスプレイと、赤色と青色の 2 種類のボタンがついています。赤いボタンを押すとディスプレイに表示されている数が 1 増え、青いボタンを押すと 1 減ります。
ただし、ディスプレイの表示が 9 のときに赤いボタンを押すと 0 になり、ディスプレイの表示が 0 のときに青いボタンを押すと 9 になります。
いま、ディスプレイに表示されている数字は a で、この数字が b になった瞬間に錠が開きます。さて、錠を開けるためには最低何回はボタンを押す必要があるでしょうか？

```
#include <iostream>
#include<cstdlib>
using namespace std;
int main() {
	int a, b;
	cin >> a >> b;
	if (abs(a - b) > 5)
		cout << 10 - abs(a - b)<<endl;
	else
		cout << abs(a - b)<<endl;
	return 0;
}
```
absを使うには#include<cstdlib>をする。

C

```
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<list>
#include<cmath>
#include<map>
using namespace std;
using ll = long long;
const int INF = 1e9;
#define rep(i,n)for(int i=0;i<n;++i)
#define p pair<int,int>
int main() {
	ll N, H, A, B, C, D, E;
	cin >> N >> H;
	cin >> A >> B >> C >> D >> E;
	ll ans = 1e12;
	for (ll i = 0; i <= N; ++i) {
		ll y;
		ll cost;
		if (0 >= ((N - i)*E - H - B * i)) {
			y = 0;
		}
		else {
			y = ((N - i)*E - H - B * i) / (D + E) + 1;
		}
		cost = A * i + C * y;
		ans = min(ans, cost);
	}
	cout << ans << endl;
	return 0;
}
```
めちゃめちゃ時間食った
Jupyter Notebook のアンインストールができない

# Jupyter Notebook のアンインストール　ができない
参考
[How to uninstall jupyter - Stack Overflow](https://stackoverflow.com/questions/33052232/how-to-uninstall-jupyter) 
## 問題
[公式](http://jupyter.org/install)をもとに`pip`でJupyter Noteboookをインストールした。

```
$ python3 -m pip install --upgrade pip
$ python3 -m pip install jupyter
```
これのアンインストールができない。

## 目的

```
$ which jupyter notebook
```
で何も表示されない。

## 失敗例
autoremoveを使っても消えない。

```
$ pip install pip-autoremove
$ pip-autoremove jupyter
$ which jupyter
/Users/******/.pyenv/shims/Jupiter
```
この後、下記コマンドを試すも消えず。

```
$ pip uninstall jupyter
Uninstalling jupyter-1.0.0:
.
Successfully uninstalled jupyter-1.0.0

$ pip uninstall jupyter
Skipping jupyter as it is not installed.

$ which jupyter
/Users/****/.pyenv/shims/jupyter
```

## 成功例
下記コマンドでコアをアンインストールに指定することで、アンインストールできた。

```
$ pip uninstall jupyter_core 
Successfully uninstalled jupyter-core-4.4.0
$ which jupyter
何も無し
```

## 補足
`$ pip3 install jupyter ` の最後の行に`jupyter-core`がインストールされていることが確認できる。

```
Installing collected packages: jupyter, jupyter-core
Successfully installed jupyter-1.0.0 jupyter-core-4.4.0
```
at coder beginner 012

B
高橋君は、お風呂で湯船に浸かった秒数を数える習慣があります。
今日は、高橋君は湯船で N 秒まで数えました。
しかし、秒だと解りにくいので、何時間何分何秒、という形に直したいです。
秒数 N が与えられるので、 hh: mm :ss の形式に変換しなさい。

```
#include <iostream>
 
using namespace std;
 
 
int main() {
	int N;
	cin >> N;
	int a = N / 3600;
	int b = N % 3600;
	int c = b % 60;
	b /= 60;
 
	if (a<10) {
		cout << '0'<< a << ':';
	}
	else {
		cout << a << ":";
	}
	if (b<10) {
		cout << '0'<< b << ':';
	}
	else {
		cout << b << ':';
	}
	if (c<10) {
		cout << '0' << c << endl;
	}
	else {
		cout << c << endl;
	}
	return 0;
}
```
普通。
[Powershell]スクリプトの自パスを取得する(Batの%~dp0)

#結論

```powershell:powershell
$MyInvocation.MyCommand.Path
```

#例


C:\script\test.ps1自身のパスを取得

```powershell:test.ps1
$myPath = $MyInvocation.MyCommand.Path
echo $mypath
```
```powershell:実行結果
>C:\script\test.ps1
C:\script
```
PlayCanvasでUnderscore.jsを使う

わりと簡単に導入できました。
これでもうJavaScriptの配列操作で疲弊しない＼(^o^)／

# Underscore.jsの入手

まず、Underscore.jsのページに行って、Undersore.jsのコードを拾います。
https://underscorejs.org/

DevelopmentでもProduction(minifyされたもの)でもどちらも動くはずですので、問題がなければサイズの小さいProductionを使います。

ファイルをDLしてエディタで開くかブラウザ上でソースを表示して、全選択(Ctrl+A)してコピー(Ctrl+C)しておいてください。

# PlayCanvasに追加する

Underscore.jsのようなライブラリは、Rootにくっつけておくと良いかと思います。

HIERARCHYでRootを選択した後、ENTITYでAdd ScriptでUnderscore.js(.jsは省略可)を追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140718/3ef1c313-3beb-83af-0266-d9c086a9af1d.png)
ASSETSの中にUnderscore.jsが作成されるので、ダブルクリックしてファイルを編集します。

この作成されたファイルの*<font color="Red">最後尾(自動生成されたコードは消しません)</font>*で、
https://underscorejs.org/
より入手(Ctrl+C)したソースコードを貼り付け(Ctrl+V)ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140718/960a2758-7ea6-abcb-fd82-88960d24bd7c.png)
Productionから拾うとスクリプトエディタ上でエラーがでます。コード量を減らすために動作に問題がない命令終端の;を抜いたりとかしているので、構文的なエラーが表示されます。

実行時にエラーがでるわけではないので気にしなくて大丈夫ですが、どうしても気になるならDevelopmentバージョンを貼り付けてください。こちらは綺麗なコードなのでエラーは表示されません。
# 動作確認
適当にスクリプトを作って、Underscore.jsの機能を使ってみます。

```javascript
var Test = pc.createScript('test');

// initialize code called once per entity
Test.prototype.initialize = function() {
    this.data = [1, 2, 3, 2, 1, 2];

    console.log(_.uniq(this.data));  // Underscore.jsで重複削除
};

// update code called every frame
Test.prototype.update = function(dt) {
```

実行すると、ブラウザのデバッグ出力にconsole.logの結果が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140718/7320a3ef-fb72-62cc-430b-12f30196c069.png)
エラーも出ず、ちゃんとunique化されました。
LXD/LXCのwebui、LXDUI2.2をインストールしてみた

# これは何？
- LXDUIは、LXD/LXCをブラウザから操作できるアプリでOSSです。
- 公式サイトは「[GitHub - AdaptiveScale/lxdui: LXDUI is a web UI for the native Linux container technology LXD/LXC](
https://github.com/AdaptiveScale/lxdui)」です。
- Ubuntu18.04にインストールしました。
- 以下のようなことがブラウザから可能になります。
    - コンテナイメージのダウンロード
    - コンテナ作成、実行、停止、フリーズ、スナップショットなど
    - ブラウザからコンテナのシェル(terminal)起動
- LXD REST API を使っているので、LXDUI と lxcコマンドは併用できます。

- スクリーンイメージ
![LXDUIv2.2.gif](https://qiita-image-store.s3.amazonaws.com/0/275337/576869c0-d3b8-2f83-67ca-43b1d83dfa91.gif)

# インストール＆設定

```sh
# 関連パッケージインストール
sudo apt install python3-venv
sudo apt install python3-pip

# lxdui develop clone
git clone https://github.com/AdaptiveScale/lxdui.git -b develop
cd lxdui

# pythonの仮想環境作成
python3 -m venv mytestenv
source mytestenv/bin/activate

# lxdui インストール
pip3 install --upgrade pip
pip3 install .

# lxdui cli (ヘルプ表示されればOK)
lxdui

# adminのパスワード設定
lxdui init

deactivate
```

# 起動/停止

```sh
# 起動
(source ~/lxdui/mytestenv/bin/activate; lxdui start &)

# ブラウザよりLXDUIを表示。adminでログイン
http://127.0.0.1:15151

# 停止
(source ~/lxdui/mytestenv/bin/activate; lxdui stop)
```

# メモ
- 後で気が付いたのだが git clone したルートフォルダに Dockerfile がある。（動作は未確認）
Scheme でアナフォリックマクロ


先日、「[Gauche の Explicit-renaming でスレッドマクロ](https://qiita.com/murashit/items/fd54d41ec99263b6f0a9)」という表題で Scheme 関連の記事が投稿されていたのを読みました。 この元記事は Clojure にあるスレッドマクロを再現しようとする試みですが、引数を適用する箇所を自由にする拡張の部分が興味深いです。

このマクロは__アナフォリックマクロ__になっています。 アナフォリックマクロというのは特定の名前の束縛を暗黙に行うようなマクロのことです。

# `syntax-rules` でアナフォリックマクロ

アナフォリックマクロは `syntax-rules` で出来ない種類のマクロであると説明されることがしばしばあります。 しかし、少し回りくどい技巧を用いれば不可能ではありません。

実際に `syntax-rules` でやってみます。 ここでは R7RS の仕様に沿ってライブラリとして書きましたが、 `define-library` 構文を除けば R5RS にも R6RS にも合致するはずです。

```scheme
(define-library (threading-macro)
  (export % -> ->>)
  (import (scheme base))

  (begin
    (define-syntax % (syntax-rules ()))

    (define-syntax let1
      (syntax-rules ()
        ((_ var expr b0 b1 ...)
         (let ((var expr)) b0 b1 ...))))

    (define-syntax if-let1
      (syntax-rules ()
        ((_ var expr then)
         (let1 var expr (if var then)))
        ((_ var expr then alt)
         (let1 var expr (if var then alt)))))

    (define-syntax ->
      (syntax-rules ()
        ((_ cur) cur)
        ((_ cur (proc args ...) rest ...)
         (if-find-% (args ...) (args ...)
                    (cur (if-let1 next (proc args ...) (-> next rest ...) #f))
                    (if-let1 next (proc cur args ...) (-> next rest ...) #f)))
        ((_ cur proc rest ...)
         (if-let1 next (proc cur) (-> next rest ...) #f))))

    (define-syntax ->>
      (syntax-rules ()
        ((_ cur) cur)
        ((_ cur (proc args ...) rest ...)
         (if-find-% (args ...) (args ...)
                    (cur (if-let1 next (proc args ...) (->> next rest ...) #f))
                    (if-let1 next (proc args ... cur) (->> next rest ...) #f)))
        ((_ cur proc rest ...)
         (if-let1 next (proc cur) (->> next rest ...) #f))))

    (define-syntax if-find-%
      (syntax-rules (%)
        ((_ (x . xs) (y . ys) t f)
         (if-find-% x y
                    t
                    (if-find-% xs ys t f)))
        ((_ % x t f) (let1 x . t))
        ((_ x y t f) f)))

    ))
```

# 実行例

このように使うと……

```scheme
(import (scheme base)
        (scheme write)
        (threading-macro))

(write (->> 2 (list % 1)))
```

きちんと `(2 1)` という結果が表示されます。

# どうなってんの？

特定の名前の束縛を暗黙に作るのがアナフォリックマクロであると最初に説明しました。 逆に言えば、それが出来ないはずの `syntax-rules` では束縛される名前は陽に与えなければならないということです。

いや、 `%` は与えられているではないか！ というのが `syntax-rules` でアナフォリックマクロを作る考え方です。

```scheme
(->> 2
     (list % ;; ← ここに % は有るじゃん！
           1))
```

与えられたフォームの中から `%` を探してそれを出力に転写することでアナフォリックマクロが実現できるのです。

# 欠陥

とはいうものの、感覚的に不自然な挙動をする場合もあるので、汎用的なユーティリティとしてはあまりお勧めできるものではありません。

元記事で提示されているマクロと同程度ならば `syntax-rules` でも出来そうだと思ったことからやってみたという余興なので、あまり積極的に参考にしないでください。
at coder beginner 012

B
高橋君は、お風呂で湯船に浸かった秒数を数える習慣があります。
今日は、高橋君は湯船で N 秒まで数えました。
しかし、秒だと解りにくいので、何時間何分何秒、という形に直したいです。
秒数 N が与えられるので、 hh: mm :ss の形式に変換しなさい。

```
#include <iostream>
#include<string>
using namespace std;
int main() {
	int N;
	int a, b, c;
	cin >> N;
	a = N / 3600;
	b = N % 3600 / 60;
	c = N % 60;
	if (10 > a) {
		cout << 0 << a << ":";
	}
	else
		cout << a << ":";
	if (10 > b)
		cout << 0 << b << ":";
	else
		cout << b << ":";
	if (10 > c)
		cout << 0 << c << ":";
	else
		cout << c << endl;
	return 0;
}
```
普通。
Mac OS X に Docker & nginx + Laravel + MySQL 環境構築


# Laravel 

PHP を利用して composer install する

```
$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/composer
$ composer -V
```

laravel new するときにパッケージが古くてエラーになる場合があるので更新しておく

```
$ composer global update

```

Laravel のプロジェクトを作る
https://readouble.com/laravel/5.6/ja/installation.html

```
$ laravel new [project]
```

プロジェクト名のディレクトリが作成されてその中に Laravel がインストールされる

# Docker

nginx + MySQL (+ phpMyAdmin) の docker-compose.yml を作成する

作成したプロジェクトディレクトリをルートとしたサンプル

```:docker-compose.yml
version: '3'
services:
  web:
    image: nginx:1.13.5-alpine
    ports:
      - "80:80"
    depends_on:
      - app
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
      - ./:/var/www/html #laravel projectディレクトリ配下をマウント
  app:
    build: ./ #同じディレクトリの Dockerfile image:設定を使う
    env_file: .env
    depends_on:
      - db
    volumes:
      - ./:/var/www/html
  db:
    image: mysql:5.7.19
    env_file: .env
    environment:　#.env のDB設定を共有して構築
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_USER: ${DB_USERNAME}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
    ports:
      - "3306:3306"
    volumes:
      - db-data:/var/lib/mysql
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
      - "8080:80" #localhost:8080 で phpMyAdmin にアクセスできる
    links:
      - db:mysql

volumes:
  db-data: #DB の永続化
```


```:Dockerfile
FROM php:7.1.9-fpm-alpine #app サービスで使う php image:

RUN docker-php-ext-install pdo_mysql mysqli mbstring
```

## nginx の設定

services:web:volumes で指定したパスに作成する

プロジェクトディレクトリ直下のサンプル

```:default.conf
server {
    listen 80;
    server_name _;

    root  /var/www/html/public; #laravel index.php の場所は public 配下
    index index.php;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(\.+)$;
        fastcgi_pass app:9000; #サービス名と関連付ける
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
```

起動

```
$ docker-compose up -d
```
CpawCTFとknsCTFについて（今後追記あり）

問題と解法を簡単にメモします。（自分の見返し用）



CpawCTF


<level1>
Q1.[Misc] Test Problem：いれるだけ

Q6.[Crypto] Classical Cipher：シーザ暗号（３文字ずらし）

Q7.[Reversing] Can you execute ?：拡張子のわからないファイルを実行するには。権限変更。ELFファイルの実行のための仮想環境構築(Linux?)。writeup済

Q8.[Misc] Can you open this file ?：ファイル開くコマンド打って拡張子を調べ、そのアプリを使うだけ

Q9.[Web] HTML Page：デベロッパーツールでみつけるだけ

Q10.[Forensics] River：EXIF情報を読み取り、緯度と経度からこの川の場所を探す

Q11.[Network]pcap：WireSharkでパケットあけて探すだけ

Q12.[Crypto]HashHashHash!：[EN/DE]CryptoHash 　　のサイトを使用してSHA1をデコード

Q14.[PPC]並べ替えろ!：バブルソートのプログラムを頑張って書いた。あとでPythonで書いた方が断然楽なことを知った。ちーん



<level2>

Q13.[Stego]隠されたフラグ：モールス信号　Morse Code Translator by Various Words 　のサイトを使用してデコード

Q15.[Web] Redirect：デベロッパツールのNetworkタブの中から探してくる

Q16.[Network+Forensic]HTTP Traffic：見ていたページの復元はwiresharkを使用してファイル→オブジェクトをエクスポート→HTTPの順にクリック、ウィンドー中身すべて保存。network100.htmlをブラウザで開く。ボタンが押せないのはソースコードを確認し、エクスポートしたフォルダがパスの通りに並んでないから。フォルダ内を整理すれば終了

Q17.[Recon]Who am I ?：ggる。pallocさんのtwitter遡る。画面の写真からみつける。なんだこれ。

Q18.[Forensic]leaf in forest：ツールなんでもいいけど自分はHex Fiendを使用してlovelove!の文字を消す。大文字を読んで終了

Q19.[Misc]Image!：.zipと.sitの永久ループ。macじゃだめらしい。win環境で開くけど後回し

Q20.[Crypto]Block Cipher：ブロック暗号。cコンパイル、実行してみてコード読むやつ。writeup済

Q21.[Reversing]reversing easy!：これもelfファイルってかいてある。あとまわし。

Q22.[Web]Baby's SQLi - Stage 1-：基本的なSQL文(select * from palloc_home)入力してみればいける。

ちなみに-stage2-もあって、これはSQLインジェクション（1' or '1' = '1';--これも基本的なやつ）でいける。

knsCTF

Q1.Test Problem:いれるだけ

Q2.Easy Cypher:rot13

Q3.Clawring Chaos:ソースを表示。(ᒧᆞωᆞ).ᒧうー=-!!(/ᆞωᆞ/).にゃー, JavaScriptの難読化らしい。ソースをそのままファイルにして、console.log((ᒧᆞωᆞ).ᒧうー=-!!(/ᆞωᆞ/).にゃー ..)でくくって、サイドブラウザで開いてデベロッパーつーるで開く。consoleのタブ内、赤いところfunction()からあとをtexteditorに持ってきて、改行など見やすくする。プログラムを解読する。unicode ASCIIコードあたりの変換をする必要がある。writeup作成中
at coder beginner 011　dp

B
新米プログラマーであるあなたは、簡単な文字列操作を行うプログラムを作成する仕事を任されました。 名前が入力として与えられるので、正しいフォーマットに直すプログラムです。
正しい名前のフォーマットは、以下の通りです。
1 文字目は大文字アルファベット
2 文字目以降は小文字アルファベット
要件を満たすプログラムを作成してください。

```
#include <iostream>
#include<string>
using namespace std;
int main() {
	string s;
	cin >> s;
	for (char c = 'a'; c <= 'z'; c++) {
		if (s[0] == c) {
			s[0] += ('A' - 'a');
		}
	}
	for (int i = 1; i<s.size(); i++) {
		for (char c = 'A'; c <= 'Z'; c++) {
			if (s[i] == c) {
				s[i] += ('a' - 'A');
			}
		}
	}
	cout << s << endl;
}
```
"a"と"A"の差が32,ようするに大文字と小文字の差は32であるらしい。それさえ知ってればいける

C
あなたは、友人から、一人用のゲームを紹介されました。
最初に、数字 N が与えられます。 1 , 2 , 3 の中から好きな数字を選び、 与えられた数字に対し、引き算を行う、という処理を行うことできます。
この処理は 100 回まで行うことが可能であり、最終的に数字を 0 にすることが目標のゲームです。
しかし、計算途中でなってはいけないNG数字が 3 つ与えられており、 この数字に一時的にでもなってしまった瞬間、このゲームは失敗となります。 NG数字が N と同じ場合も失敗となります。
NG数字が N と同じ場合について、正しい判定が行われていませんでした。リジャッジを行いました。
あなたは、このゲームが、目標達成可能なゲームとなっているか調べたいです。
目標達成可能な場合はYES、そうでない場合はNOと出力してください。

```
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<list>
#include<cmath>
#include<map>
using namespace std;
using ll = long long;
const int INF = 1e9;
#define rep(i,n)for(int i=0;i<n;++i)
#define p pair<int,int>
int main() {
	int N, a, b, c;
	cin >> N >> a >> b >> c;
	bool can = true;
	vector<int>X;
	X.push_back(a);
	X.push_back(b);
	X.push_back(c);
	if (N == a || N == b || N == c) {
		cout << "NO" << endl;
		return 0;
	}
	for (int i = 0; i < 100; ++i) {
		for (int j = 0; j < 3; ++j) {
			if (N - 3 == X[j])
				can = false;
		}
		if (can) {
			N -= 3;
			continue;
		}
		can = true;
		for (int j = 0; j < 3; ++j) {
			if (N - 2 == X[j]) {
				can = false;
			}
		}
		if (can) {
			N -= 2;
			continue;
		}
		can = true;
		for (int j = 0; j < 3; ++j) {
			if (N - 1 == X[j]) {
				can = false;
			}
		}
		if (can) {
			N -= 1;
			continue;
		}
		if (!can) {
			cout << "NO" << endl;
			return 0;
		}
	}
	if (N > 0) {
		cout << "NO" << endl;
	}
	else {
		cout << "YES" << endl;
	}


	return 0;
}
```
普通に解くver
可能な限り大きい数字から引いていく。

```
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<list>
#include<cmath>
#include<map>
using namespace std;
using ll = long long;
const int INF = 1e9;
#define rep(i,n)for(int i=0;i<n;++i)
#define p pair<int,int>
int main() {
	int N, a, b, c;
	cin >> N;
	cin >> a >> b >> c;
	int dp[310];
	for (int i = 0; i < 311; ++i) {
		dp[i] = INF;
	}
	dp[N] = 0;
	for (int i = N; i >= 0; --i) {
		if (i == a || i == b || i == c) {
			continue;
		}
		for (int j = 1; j <= 3; ++j) {
			dp[i - j] = min(dp[i] + 1, dp[i - j]);
		}
	}
	if (dp[0] <= 100)cout << "YES" << endl;
	else cout << "NO" << endl;
	return 0;
}
```
dp
dp[X]はXにするまでの最小回数
機能制限されている iOS デバイスでファミリー共有された App をダウンロードする

主に子ども向けにペアレントコントロールする目的で機能制限している iOS デバイス向けの設定。

「設定」→「一般」→「機能制限」で以下を許可する

 - App のインストール
 - アカウントの変更

App のインストールは、iCloud の設定※で「承認と購入のリクエスト」をオンにしておくことで勝手に購入されること避けられるけど、アカウントの変更は勝手にサインアウトされてしまうことがあり得る。App のインストール時に一時的に許可して、インストール後に戻してあげるしかないかなあ。

※macOS の場合は「設定」→「iCloud」→「ファミリーを管理」→対象のアカウント
※2018-09-18 「機能制限」は iOS 12 から「スクリーンタイム」変更された。別記事を起こす予定。
Vue.jsでもお手軽にアコーディオンを導入したい！

## 動機
Vue.js大好き！ですが、毎回面倒なのがアコーディオンの実装。

他の方が作ったコンポーネントもたくさんあげられているのですが、ページ内に複数のアコーディオンを設置したい場合に、いちいちjs側をいじる必要があるものがほとんどです。（本来そうあるべき、なのかもしれませんが…）
エンジニアさんはjs、デザイナーさんはhtml側などと気軽に分担して書けるのは、Vue.jsの利点でもあるので、一度Vue.jsに読んでおけば複数のアコーディオンもhtml側の編集だけで対応できる実装をしました。

## 実装

### js

```javascript
var accordion = {
  data: function () {
    return {
      openedAccordions: []
    };
  },
  components: {
    accordion: {
      props: ['opened', 'duration', 'closedHeight'],
      computed: {
        innerHeight: function () {
          return this.$refs.inner.clientHeight;
        },
        maxHeight: function () {
          return this.opened ? this.innerHeight : (this.closedHeight || 0);
        },
        transitionDuration: function () {
          return this.duration || 0.5;
        },
        wrapStyle: function () {
          return {
            maxHeight: this.maxHeight + 'px',
            transitionDuration: this.transitionDuration + 's',
            transitionProperty: 'max-height',
            overflow: 'hidden',
          };
        },
      },
      template: '\
          <div :style="wrapStyle">\
            <div ref="inner">\
              <slot></slot>\
            </div>\
          </div>',
    },
  },
  methods: {
    isOpenedAccordion: function (key) {
      return this.openedAccordions.indexOf(key) !== -1;
    },
    openAccordion: function (key) {
      if (this.isOpenedAccordion(key)) return;
      return this.openedAccordions.push(key);
    },
    closeAccordion: function (key) {
      var newOpened = [];
      for (var i = 0; i < this.openedAccordions.length; i++) {
        if (this.openedAccordions[i] === key) continue;
        newOpened.push(this.openedAccordions[i]);
      };
      this.openedAccordions = newOpened;
    },
    toggleAccordion: function (key, open) {
      open = open || !this.isOpenedAccordion(key);
      return open ? this.openAccordion(key) : this.closeAccordion(key);
    },
  },
};

new Vue({
  el: '#app',
  mixins: [accordion], // mixinで読み込む
});
```

### html

```html
<div id="app">

<button @click="toggleAccordion('hoge')" :class="{opened: isOpenedAccordion('hoge')}">
  <span v-if="isOpenedAccordion('hoge')">とじる</span>
  <span v-else>ひらく</span>
</button>

<accordion :opened="isOpenedAccordion('hoge')">
  じゅげむじゅげむ<br>
  ごこうのすりきれ<br>
  かいじゃりすいぎょのすいぎょうまつうんらいまつふうらいまつ<br>
  くうねるところにすむところ<br>
  やぶらこうじのぶらこうじ<br>
  ぱいぽぱいぽぱいぽのしゅーりんがん<br>
  しゅーりんがんのぐーりんだい<br>
  ぐーりんだいのぽんぽこぴーのぽんぽこなのちょうきゅうめいのちょうすけ
  <button @click="closeAccordion('hoge')">とじる</button>
</accordion>

</div>
```

こんな感じで書いておくと、 `<accordion>` タグに囲まれた部分が、ボタンにより閉じたり開いたりできます。
ちなみに、 `hoge` の部分を変えてアコーディオンを増やしていけば、複数アコーディオンにも対応できます。

## プロパティ

### 速度

`<accordion>` に `duration`属性を指定すると、アコーディオンの表示の時間を10秒に設定できます。

```html
<accordion duration="10"> // 10秒かけて開く
```

### 閉じた時の見えている領域

`<accordion>` に `closed-height`属性を指定すると、アコーディオンが閉じた時にも見えている領域を作ることができます。
複数の投稿を最初の１つだけ見せて、もっと見るボタンに使ったりもできそうですね。

```html
<accordion closed-height="100"> // 100pxだけ最初から表示
```

## やってみて

- 普段ES6でばかり書いていますが、今回は他の方がコピペしてそのままブラウザで読んでも使えるような書き方でがんばりました。ES6の構文使えないのつらたん…
- mixinなので、ファイル分けて `export` / `import` してもよいかもしれません。
- Vue.jsだいすき！
CpawCTF - Question7 [Reversing] Can you execute

##CpawCTF - Question7 [Reversing] Can you execute

拡張子がないファイルを貰ってこのファイルを実行しろと言われたが、
どうしたら実行出来るのだろうか。 

この場合、UnixやLinuxのとあるコマンドを使ってファイルの種類を調べて、
適切なOSで実行するのが一般的らしいが… 
問題ファイル：`exec_me`

これは拡張子不明のファイルになっています。
このファイルにウイルスがある可能性もあるので、
むやみに開かず、VM上で作業するのがよい

```
#ターミナル
~$ ls -l
-rw-r--r--@ 1 blueneonlightuk  staff  8556  9 15 13:28 exec_me
```

ファイルのパーミッション変更はコマンド実行で可能。
```
cdmod モード　ファイル名
```

|（数字）モード|（アルファベット)モード|権限  |
|:-----------:|:------------:|:-----------:|
| 4  | r|       読み取り |
| 2    |   w    |   書き込み|
| 1 | x       |   実行 |

```
cdmod 764　ファイル名
```

なら、7(所有者)  6(所有グループ)  4(その他)

所有者：「読み取り」「書き込み」「実行」

所有グループ：「読み取り」「書き込み」

その他：「読み取り」

が権限付与


さて、ファイルの実行を許可してからもう一度実行してみます。

```
./exec_me: cannot execute binary file
```
......は？
実行できませんでした。

ggるとMacOSはUNIXをベースにしたOSでLinuxとは別物なんですね。
ということはLinuxベースのOSを使える環境を用意する必要があるようです。

仮想マシンで行う必要があるようなので以下。
ggっていたら同じような状況の方がいました。

＜参考＞
https://qiita.com/Yuzunosuke/items/630c65001b5117fef0f0

この問題は仮想マシンをきちんと用意したら追記します。
YOLOv3で動画入力時最終フレームの処理後AttributeErrorが出る時の対処法

#はじめに
本記事は<a href=http://arkouji.cocolog-nifty.com/blog/2018/07/yolo-v3-keras22.html>こちら</a>でYOLOv3+Tensorflow+Kerasの環境構築を行っていた際につまづいた点について書きます。

##目的

```python:qiita.py
python yolo_video.py --input hoge1.mp4 --output hoge2.mp4
```
を実行し、うまく処理が続いたと思っていたところ最後にやってきたエラー…そう、

```python:qiita.py
Traceback (most recent call last):
  File "yolo_video.py", line 75, in <module>
    detect_video(YOLO(**vars(FLAGS)), FLAGS.input, FLAGS.output)
  File "C:\Users\Shota\OneDrive\Workplace\keras-yolo3-master\yolo.py", line 191, in detect_video
    image = Image.fromarray(frame)
  File "C:\Anaconda3\envs\keras\lib\site-packages\PIL\Image.py", line 2453, in fromarray
    arr = obj.__array_interface__
AttributeError: 'NoneType' object has no attribute '__array_interface__'
```
これを解決します。

##解決方法
最終フレーム（の後？）だけ変数frameがNoneType型になるみたいなので、その時の例外処理を書きたせば良いと思いました。
yolo.pyの190行目の次の行に

```python:qiita.py
if type(frame) == type(None): break
```
を挟むことで、強引にループを抜けたところ、最後までプログラムが動いてくれて、出力動画を得られました。

##ところで
メインの処理は今回ハマったところであるdetect_video関数だと思うのですが、この中のwhileループを抜ける手段が配布されたプログラムのままだとキーボード入力"q"しかないので、他の人は全員エラーが出る前にqを押しているのかなーと思ったり。
CpawCTF - Question20 [Crypto] Block Cipher

##CpawCTF - Question20 [Crypto] Block Cipher


###与えられたC言語のソースコードを読み解いて復号してフラグを手にれましょう。 

暗号文：cpaw{ruoYced_ehpigniriks_i_llrg_stae} 

`crypto100.c`

```
**#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[]){
  int i;
  int j;
  int key = atoi(argv[2]);
  const char* flag = argv[1];
  printf("cpaw{");
  for(i = key - 1; i <= strlen(flag); i+=key) 
  for(j = i; j>= i - key + 1; j--)
  printf("%c", flag[j]);
  printf("}");
  return 0;
}
**
```
まあ、とりあえずターミナルで実行してみよ

```
$gcc cypto100.c   //コンパイル
$./a.out ruoYced_ehpigniriks_i_llrg_stae  //実行
Segmentation fault: 11

```
これは11行目でエラーが起こっているらしい
（C初心者すぎて一旦ここで詰まった）


***


そもそもブロック暗号とはなにかというのが曖昧（ブロックに分けて処理する、代表的なのはDES,TripleDESなどらしい）だったので、
シーザー暗号とブロック暗号の違いでggると...

>[暗号アルゴリズムについて/CIC株式会社](https://www.cics.co.jp/column/08.html)
>
-シーザー暗号：文字を置き換える
>
-ブロック暗号：文字を並び替える

らしい

***

プログラム読まないとだめそうなので、

１つずつggりながらcの勉強と思ってやっていきます。


name         | Description     |
--------------------|------------------|-----------------------
argc  | argument count（引数の個数）  |  
argv      | argument vector（引数の配列） | <del>Much wow</del>   |
atoi | 整数値の文字列型データをint型に変換する関数(ファイルから内容を読み込んだ際に数値データを文字列として認識するのが通常らしく、計算処理につかえない状態からint型に変換する方法)    | <u>So doge</u>  
const|定数である（その変数の値を変更してはいけない）ということを示す修飾子。宣言の型名の部分の前か後につける|
strlen|文字列の長さをバイトで返す


引数につかっている、char*も不思議なので調べる。

[bioinfomatics](https://bi.biopapyrus.jp/cpp/syntax/string.html)

>C 言語では、文字を取り扱う場合に、char 型を利用する。char 型の変数のサイズは 1 バイトと決められているので、1 つの変数には 1 文字しか保存できない。


```
char a = 'D';

char b = 'N';

char c = 'A';

printf("%c%c%c\n", a, b, c);
```

まじか！

>複数個の文字からなる文字列の場合は、char 型の配列を利用する。この場合、配列のサイズは、変数を宣言するときに決める必要がある。char 型の配列に文字列を格納する場合、文字列の最後にヌル文字 \0 を入れる必要がある。次のようにダブルクオーテーションマークで変数を作成する場合は、自動的にヌル文字が文字列の終端に挿入されるが、シングルクオーテーションマークの場合は自動的に挿入されない。

```
char str1[] = "DNA";
char str2[] = {'R', 'N', 'A', '\0'};

    printf("%s\n", str1);
    printf("%lu\n", sizeof(str1));

    printf("%s\n", str2);
    printf("%lu\n", sizeof(str1));

```
そして本題のchar*型

*は「ポインター」のことだそう。
配列の引数にニュアンスが似ているけれども、以下サイトを見ると、少々構造が違う（ポインタに1加算するとデータ型ひとかたまり分加算されるなど）
以下サイトでわかりやすく説明されていました。

[超初心者向けプログラミング入門：ポインタの活用例１](https://programming.pc-note.net/c/pointer3.html)

[超初心者向けプログラミング入門：ポインタの活用例２、メリットデメリット](https://programming.pc-note.net/c/pointer4.html)

***

本題に戻る。

argv[0]:a.out

argv[1]:暗号文

argb[2]:なにか入れないとダメ←keyにあたる

↓

さっきのコマンドのあとにさらに数字いれればいいのでは（$~1）($~2)

↓

みため変わるな

↓
($ ~4)

あ。

***
＜追記＞

プログラムのきちんとした読み方がわかったので、ポイントを記載する。

for文が入れ子になっているので頭がこんがらがりやすいが、

たとえばkey=4だったら、
iが3で始まり、4ずつ増える。条件はiがフラグの文字数に達するまでの間。

<mark>（基本的に、はじまり→増えかた→条件で考えるとよい）</mark>

次に j は、3ではじまり、１つずつ減る。i-key+1より大きい間。つまり最初のi=3のなかだと3-4=0になるまでの間。
で、該当するのをプリント。
想像すると、3,2,1,0,(3+4たして)7,6,5,4,
と文字列をプリント。それで文字が順番に移り変わっていくようになっている。このような文字の並び替えを行なっているのでブロック暗号というのだ。
Time Machine(Mac)のバックアップ先をOpenMediaVaultに設定してみた

## はじめに
Time Machineのバックアップ先をOpenMediaVault導入済みのNASに設定してみました。
※自分用の備忘録です。

## OpenMediaVault側の設定
- 1：OpenMediaVaultのWeb管理画面へログイン
- 2： [サービス]→[Apple Filing]の一般設定を有効にする
- 3：HDDを機器に接続
- 4：[ストレージ]→[ディスク]でHDDをワイプする
- 5：[ストレージ]→[ファイルシステム]で作成を押下し、HDDのファイルシステムを作成する
- 6：[アクセス権の管理]→[共有フォルダ]でHDDに共有フォルダを設定
<img width="1679" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/278224/47014af2-12ed-d792-def5-8eee41cc8dc3.png">

- 7：[サービス]→[Apple Filing]→[共有]に6.で設定した共有フォルダを追加 ※このときにTime Machineサポートを有効化する
<img width="1677" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/278224/045fc58c-d6f0-d39a-7e1e-6ad55fb88bb2.png">
<img width="1680" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/278224/68318c0a-e776-7854-0b79-f1f4148dedd4.png">

## Mac側の設定
- 1：[システム環境設定]→[Time Machine]にアクセス
- 2：「ディスクを選択」を押下
- 3：OpenMediaVaultで設定したドライブを選択
<img width="671" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/278224/174016aa-fd5b-4b0e-933c-e1e61099ef0e.png">
Jupyter Lab のインストール、設定から動かすまで

Pythonで機械学習を学ぶために、Jupyter Lab をローカル環境に立ち上げた。そのときのメモ。

## STEP 1. インストール
anacondaをインストールする。インストールファイルは、以下のURLから手に入る。

[https://www.anaconda.com/download/#macos](https://www.anaconda.com/download/#macos)

## STEP 2. 設定ファイルの生成
以下のコマンドで`~/.jupyter/jupyter_notebook_config.py`という設定ファイルを生成する。

```
$ jupyter notebook --generate-config
```

## STEP 3. パスワード
デフォルトでは、トークン認証になっているのでパスワード認証に切り替える。まずは、以下のコマンドでパスワードを生成する。

```bash
$ jupyter notebook password
Enter password: 
Verify password: 
[NotebookPasswordApp] Wrote hashed password to /Users/username/.jupyter/jupyter_notebook_config.json

$ more /Users/username/.jupyter/jupyter_notebook_config.json
{
  "NotebookApp": {
    "password": "sha1:67c9e60bb8b6:9ffede0825894254b2e042ea597d771089e11aed"
  }
}
```

次に生成したパスワード（ハッシュ化されている）をSTEP 1.の設定ファイルに追加する。

```python
## Hashed password to use for web authentication.
#  
#  To generate, type in a python/IPython shell:
#  
#    from notebook.auth import passwd; passwd()
#  
#  The string should be of the form type:salt:hashed-password.
c.NotebookApp.password = 'sha1:67c9e60bb8b6:9ffede0825894254b2e042ea597d771089e11aed'
```

## STEP 4. その他の細かい設定
- 起動時に、Jupyter Lab が自動的に開かないようにする。

```python
## Whether to open in a browser after starting. The specific browser used is
#  platform dependent and determined by the python standard library `webbrowser`
#  module, unless it is overridden using the --browser (NotebookApp.browser)
#  configuration option.
c.NotebookApp.open_browser = False
```

- ポート番号を変更する。

```python
## The port the notebook server will listen on.
c.NotebookApp.port = 18888
```

- グラフを描画できるようにする。

```python
## DISABLED: use %pylab or %matplotlib in the notebook to enable matplotlib.
c.NotebookApp.pylab = 'disabled'
```

## STEP 5. 起動
以下のコマンドで、バックグラウンドで起動させる。

```bash
$ nohup jupyter lab &
```

プロセスを停止したい場合は、以下のようにする。

```bash
$ lsof -i:8888
$ kill -9 [process id]
```

## 感想
必要なものはanacondaが一括で提供してくれるので、Pythonで機械学習を学ぶ環境はかなり簡単に手に入ることがわかった。ただ各種の設定などは少し手間がかかったので共有しようと思った。

## 参考
- [Running a notebook server](https://jupyter-notebook.readthedocs.io/en/stable/public_server.html)
ダイソープラレール＊２＋Obnizで作るIoTリモコンカー

#概要
ダイソーで販売している電車（プチ電車シリーズ）を２つ使用してリモコンカーを作りました。プログラミング教室、勉強会等で低予算でラジコンを作りたい場合におススメです。
![ezgif-4-b5fccf7a37.gif](https://qiita-image-store.s3.amazonaws.com/0/181708/d8c99b71-3b39-7584-60a9-96d9784e7c7d.gif)
![KIMG3695.JPG](https://qiita-image-store.s3.amazonaws.com/0/181708/286e593c-64d4-7e3a-b236-69d080f9231d.jpeg)
#作り方
**1.これを２つ用意します**
![KIMG3691.JPG](https://qiita-image-store.s3.amazonaws.com/0/181708/846c53f7-381f-6a77-4cf9-12d4c8f81946.jpeg)
**2.モーターの端子にコードを直接ハンダ付けします**
![KIMG3692.JPG](https://qiita-image-store.s3.amazonaws.com/0/181708/b4261c36-b75a-c9d0-df0e-87109534ce3f.jpeg)
**3.スイッチの穴からコードを出します**
![KIMG3693.JPG](https://qiita-image-store.s3.amazonaws.com/0/181708/a7a5165d-9290-5a3d-8dcd-d28631160d08.jpeg)
**4.内側の車輪のゴムを外して、2台をゴムで縛ります**
私はホットボンドでしっかりくっつけました
**重要：内側の車輪のゴムは外します（でないと旋回できません）**
![uragawa.JPG](https://qiita-image-store.s3.amazonaws.com/0/181708/ca719458-bf0f-2414-67b0-9da191b9dca9.jpeg)
**5.Obnizにコード、モバイルバッテリーをつなげます**
![KIMG3694.JPG](https://qiita-image-store.s3.amazonaws.com/0/181708/ec26e5bb-909f-33da-f7cc-909b9db08c02.jpeg)
**6.コードはObniz本家のサンプルコードをそのまま使用します**
[Obnizキッズプロジェクト。ラジコン](https://obniz.io/explore/42)
**7.スマホから操作して遊びます**
![ezgif-4-e78b3ff029.gif](https://qiita-image-store.s3.amazonaws.com/0/181708/e5f63335-99c6-fd09-1bb8-5ad4cba0ed29.gif)

#感想
奥さんから
「普通のラジコンと何が違うの？（また訳の分からんもの作って・・・）」
と聞かれて
「ネットワークに繋がってさえいれば、地球の裏側からでも操作できるんだよ！！！すごくない？？」
と答えたが奥さんの反応は劇薄でした(^_^;
**目的は二の次。手段を楽しもう！そのうち何かに繋がるさ！**
#参考サイト
[Obnizキッズプロジェクト。ラジコン](https://obniz.io/explore/42)
django-adminで構成したページのレスポンスヘッダを弄りたい

django-adminって便利ですよね。
（まぁ昨今のフレームワークなら大体は似たような機能はあるんですが）Modelをえいやーと渡してあげればあら不思議、あっという間にCRUDな画面の完成です。

なんですが、全てを自動的に作ってくれるおかげでレスポンスのヘッダを弄れないという問題が……
いやまぁ普通は弄ることなんてないんですが。

# 対応策を考える

```admin_sample.py
from django.contrib import admin

@admin.register(Hoge)
class HogeAdmin(admin.ModelAdmin):
   # なんか色々と続く
```

とまぁ、Hogeを操作したいな〜と思ったらこういう感じになってると思うんですね。
レスポンスヘッダを設定する場所がない:innocent:

ので、Djangoのmiddleware機構を使って頑張るしかないかな？と。
レスポンスを返す前に処理を入れられるので、そこでヘッダを操作してやれば……行けるはず！

# ミドルウェアを作る

```no_cache_middleware.py
class NoCacheMiddleware(object):
    def __init(self):
        pass

    def process_response(self, request, response):
        if not response.has_header("Cache-Control"):
            response["Cache-Control"] = "no-cache, no-store, must-revalidate"

        return response
```

キャッシュさせたくない！　とかであればこんな感じでしょうか。
特定のURLだけとかであれば、request変数でif文を入れて判定させてあげるとして……

```settings.py
MIDDLEWARE_CLASSES = [
   # なんか色々
   'hogehoge.no_cache_middleware.NoCacheMiddleware',
]
```

後は設定から、今回作成してあげたミドルウェアを読み込ませるようにしてあげればオーケー！

という訳で無事にレスポンスヘッダーを弄れるようになりました。