Alvah  Mills

Alvah Mills

1654898400

A Plug-in That Can Call Native APP to Open Files with String Result

open_file_safe

A plug-in that can call native APP to open files with string result in flutter, support iOS(DocumentInteraction) / android(intent) / PC(ffi) / web(dart:html)

Note:

This package is same as open_file, but .apk file type is not supported. Thus, android.permission.REQUEST_INSTALL_PACKAGES permission is removed.

Usage

To use this plugin, add open_file_safe as a dependency in your pubspec.yaml file.

dependencies:
  #androidx
  open_file_safe: ^lastVersion
  #support
  #open_file_safe: ^1.3.0

Example

import 'package:open_file_safe/open_file_safe.dart';

OpenFile.open("/sdcard/example.txt");
//OpenFile.open("/sdcard/example.txt", type: "text/plain", uti: "public.plain-text");

Support

android

{
            {".3gp",    "video/3gpp"},
            {".torrent","application/x-bittorrent"},
            {".kml",    "application/vnd.google-earth.kml+xml"},
            {".gpx",    "application/gpx+xml"},
            {".csv",    "application/vnd.ms-excel"},
            {".asf",    "video/x-ms-asf"},
            {".avi",    "video/x-msvideo"},
            {".bin",    "application/octet-stream"},
            {".bmp",    "image/bmp"},
            {".c",      "text/plain"},
            {".class",  "application/octet-stream"},
            {".conf",   "text/plain"},
            {".cpp",    "text/plain"},
            {".doc",    "application/msword"},
            {".docx",   "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},
            {".xls",    "application/vnd.ms-excel"},
            {".xlsx",   "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},
            {".exe",    "application/octet-stream"},
            {".gif",    "image/gif"},
            {".gtar",   "application/x-gtar"},
            {".gz",     "application/x-gzip"},
            {".h",      "text/plain"},
            {".htm",    "text/html"},
            {".html",   "text/html"},
            {".jar",    "application/java-archive"},
            {".java",   "text/plain"},
            {".jpeg",   "image/jpeg"},
            {".jpg",    "image/jpeg"},
            {".js",     "application/x-javascript"},
            {".log",    "text/plain"},
            {".m3u",    "audio/x-mpegurl"},
            {".m4a",    "audio/mp4a-latm"},
            {".m4b",    "audio/mp4a-latm"},
            {".m4p",    "audio/mp4a-latm"},
            {".m4u",    "video/vnd.mpegurl"},
            {".m4v",    "video/x-m4v"},
            {".mov",    "video/quicktime"},
            {".mp2",    "audio/x-mpeg"},
            {".mp3",    "audio/x-mpeg"},
            {".mp4",    "video/mp4"},
            {".mpc",    "application/vnd.mpohun.certificate"},
            {".mpe",    "video/mpeg"},
            {".mpeg",   "video/mpeg"},
            {".mpg",    "video/mpeg"},
            {".mpg4",   "video/mp4"},
            {".mpga",   "audio/mpeg"},
            {".msg",    "application/vnd.ms-outlook"},
            {".ogg",    "audio/ogg"},
            {".pdf",    "application/pdf"},
            {".png",    "image/png"},
            {".pps",    "application/vnd.ms-powerpoint"},
            {".ppt",    "application/vnd.ms-powerpoint"},
            {".pptx",   "application/vnd.openxmlformats-officedocument.presentationml.presentation"},
            {".prop",   "text/plain"},
            {".rc",     "text/plain"},
            {".rmvb",   "audio/x-pn-realaudio"},
            {".rtf",    "application/rtf"},
            {".sh",     "text/plain"},
            {".tar",    "application/x-tar"},
            {".tgz",    "application/x-compressed"},
            {".txt",    "text/plain"},
            {".wav",    "audio/x-wav"},
            {".wma",    "audio/x-ms-wma"},
            {".wmv",    "audio/x-ms-wmv"},
            {".wps",    "application/vnd.ms-works"},
            {".xml",    "text/plain"},
            {".z",      "application/x-compress"},
            {".zip",    "application/x-zip-compressed"},
            {"",        "*/*"}
}

Not supported file types in android:

{
     {".apk",    "application/vnd.android.package-archive"},
}

when Conflict with other plugins about FileProvider, add code below in your /android/app/src/main/AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          package="xxx.xxx.xxxxx">
    <application>
        ...
        <provider
                android:name="androidx.core.content.FileProvider"
                android:authorities="${applicationId}.fileProvider"
                android:exported="false"
                android:grantUriPermissions="true"
                tools:replace="android:authorities">
            <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/filepaths"
                    tools:replace="android:resource" />
        </provider>
    </application>
</manifest>

when Android dependency 'com.android.support:appcompat-v7' has different version for the compile error, add code below in your /android/build.gradle

subprojects {
    project.configurations.all {
        resolutionStrategy.eachDependency { details ->
            if (details.requested.group == 'com.android.support'
                    && !details.requested.name.contains('multidex') ) {
                details.useVersion "27.1.1"
            }
        }
    }
}

IOS with UTI (DocumentInteraction Auto)

{
            {".rtf",    "public.rtf"},
            {".txt",    "public.plain-text"},
            {".html",   "public.html"},
            {".htm",    "public.html"},
            {".xml",    "public.xml"},
            {".tar",    "public.tar-archive"},
            {".gz",     "org.gnu.gnu-zip-archive"},
            {".gzip",   "org.gnu.gnu-zip-archive"},
            {".tgz",    "org.gnu.gnu-zip-tar-archive"},
            {".jpg",    "public.jpeg"},
            {".jpeg",   "public.jpeg"},
            {".png",    "public.png"},
            {".avi",    "public.avi"},
            {".mpg",    "public.mpeg"},
            {".mpeg",   "public.mpeg"},
            {".mp4",    "public.mpeg-4"},
            {".3gpp",   "public.3gpp"},
            {".3gp",    "public.3gpp"},
            {".mp3",    "public.mp3"},
            {".zip",    "com.pkware.zip-archive"},
            {".gif",    "com.compuserve.gif"},
            {".bmp",    "com.microsoft.bmp"},
            {".ico",    "com.microsoft.ico"},
            {".doc",    "com.microsoft.word.doc"},
            {".xls",    "com.microsoft.excel.xls"},
            {".ppt",    "com.microsoft.powerpoint.​ppt"},
            {".wav",    "com.microsoft.waveform-​audio"},
            {".wm",     "com.microsoft.windows-​media-wm"},
            {".wmv",    "com.microsoft.windows-​media-wmv"},
            {".pdf",    "com.adobe.pdf"}
}

Use this package as a library

Depend on it

Run this command:

With Flutter:

 $ flutter pub add open_file_safe

This will add a line like this to your package's pubspec.yaml (and run an implicit flutter pub get):

dependencies:
  open_file_safe: ^3.2.3

Alternatively, your editor might support flutter pub get. Check the docs for your editor to learn more.

Import it

Now in your Dart code, you can use:

import 'package:open_file_safe/open_file_safe.dart';

example/lib/main.dart

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:open_file_safe/open_file_safe.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  var _openResult = 'Unknown';

  Future<void> openFile() async {
    final filePath = '/storage/emulated/0/image.png';
    final result = await OpenFile.open(filePath);

    setState(() {
      _openResult = "type=${result.type}  message=${result.message}";
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('open result: $_openResult\n'),
              TextButton(
                child: Text('Tap to open file'),
                onPressed: openFile,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

Author: arkatech-ir
Source code: https://github.com/arkatech-ir/open_file_safe
License: BSD-3-Clause license

#dart #flutter 

A Plug-in That Can Call Native APP to Open Files with String Result

Go-openproject: Go Client Library for OpenProject

OpenProject Go Client Library

Go client library for OpenProject

Usage examples

Single work-package request

Basic work-package retrieval (Single work-package with ID 36353 from community.openproject.org) Please check examples folder for different use-cases.

import (
    "fmt"
    openproj "github.com/manuelbcd/go-openproject"
)

func main() {
    client, _ := openproj.NewClient(nil, "https://community.openproject.org/")
    wpResponse, _, err := client.WorkPackage.Get("36353", nil)
    if err != nil {
        panic(err)
    }

    // Output specific fields from response
    fmt.Printf("\n\nSubject: %s \nDescription: %s\n\n", wpResponse.Subject, wpResponse.Description.Raw)
}

Create a work package

Create a single work package

package main

import (
    "fmt"
    "strings"

    openproj "github.com/manuelbcd/go-openproject"
)

func main() {
    client, err := openproj.NewClient(nil, "https://youropenproject.url")
    if err != nil {
        fmt.Printf("\nerror: %v\n", err)
        return
    }

    i := openproj.WorkPackage{
        Subject: "This is my test work package",
        Description: &openproj.WPDescription{
            Format: "textile",
            Raw:    "This is just a demo workpackage description",
        },
    }

    wpResponse, _, err := client.WorkPackage.Create(&i, "demo-project")
    if err != nil {
        panic(err)
    }

    // Output specific fields from response
    fmt.Printf("\n\nSubject: %s \nDescription: %s\n\n", wpResponse.Subject, wpResponse.Description.Raw)
}

Supported objects

EndpointGET singleGET manyPOSTPUTDELETE
Attachments (Info):heavy_check_mark::heavy_check_mark:implementing-pending
Attachments (Download):heavy_check_mark:----
Categories:heavy_check_mark::heavy_check_mark:---
Documentsimplementing----
Projects:heavy_check_mark::heavy_check_mark::heavy_check_mark:pendingpending
Queries:heavy_check_mark::heavy_check_mark::heavy_check_mark:-:heavy_check_mark:
Schemaspending    
Statuses:heavy_check_mark::heavy_check_mark:pendingpendingpending
Users:heavy_check_mark::heavy_check_mark::heavy_check_mark: :heavy_check_mark:
Wiki Pages:heavy_check_mark:pendingpendingpendingpending
WorkPackages:heavy_check_mark::heavy_check_mark::heavy_check_mark: :heavy_check_mark:

API doc

https://docs.openproject.org/api

Thanks

Thanks Wieland, Oliver and OpenProject team for your support.

Thank you very much Andy Grunwald for the idea and your base code.

Inspired in Go Jira library

Author: Manuelbcd
Source Code: https://github.com/manuelbcd/go-openproject 
License: MIT license

#go #golang #open

Go-openproject: Go Client Library for OpenProject
伊藤  直子

伊藤 直子

1649363700

ReactNativeの国際化とローカリゼーション

国際化(i18n)は、さまざまな文化、地域、言語に適応できるアプリケーションを構築するプロセスです。

ただし、ローカリゼーション(l10n)には、ユーザーが指定したロケールまたは言語への変換が含まれ、国際化によって可能になります。

アプリをローカライズするということは、複数の言語と地域をサポートするようにアプリを構築し、より幅広いユーザーがアプリにアクセスして使用できるようにすることを意味します。

モバイルアプリの開発では、ローカリゼーションはユーザーのデバイスから言語とロケールを取得し(これはユーザーのジオロケーションとは異なります)、それに応じて適応するようにソフトウェアを作成します。

expo-localizationアプリケーションのローカライズは一般的に難しい場合がありますが、との助けを借りて、i18n-jsローカリゼーションをExpoおよびベアReactNativeアプリに実装する方法を学習します。

要件

このチュートリアルを開始する前に、次のものがあることを確認してください。

expo-localizationまた、 SDKとは別に、react-native-localizeのようなライブラリを使用することもできます。ただし、このツールボックスはReact Nativeのみをサポートし、ネイティブモジュールであるため、Expoから排出せずにExpoアプリをサポートしません。

一緒に働くexpo-localization

expo-localizationSDKを使用すると、ユーザーのネイティブデバイスのロケールデータにアクセスできます。isoCurrencyCodesこれには、ユーザーのデバイスでサポートされているすべての通貨コードの配列を返すtimezone定数や、デバイスのタイムゾーンを返す定数が含まれます。

expo-localizationそれでは、とを使用してExpoアプリをローカライズすることから始めましょうi18n-js

Expoアプリの作成

開始するには、ExpoCLIを使用してExpoアプリを生成しましょう。新しいターミナルを開き、次のコマンドを実行してExpoアプリを生成します。

expo init name-of-your-app

空のテンプレートを選択します。これにより、開始するために必要な最小限の依存関係が得られます。

アプリを開くには、新しく作成したアプリのルートに移動し、それに応じて次のコマンドを実行します。

# For iOS
yarn ios
# or
npm run ios

# For Android
yarn android
# or
yarn android

このコマンドは、次の画面を出力します。

依存関係のインストール

expo-localizationExpoアプリを生成したので、アプリディレクトリに移動した後、i18n-js依存関係としてインストールできます。

次のいずれかのコマンドを実行して、両方のパッケージをインストールします。

yarn add expo-localization i18n-js
#or
npm i expo-localization i18n-js

アプリのテキストを抽出して一元化する

アプリをローカライズする際の重要なステップは、ユーザーが操作するテキストを抽出して一元化することです。これにより、デバイスのロケールに基づいて、条件付きでユーザーにテキストをレンダリングできます。

まず、i18n/supportedLanguages.js;でファイルを作成します。これは、コードではなく、ユーザーが操作するすべてのテキストを配置する場所です。

このチュートリアルでは、アプリは英語、中国語、スペイン語の3つの言語をサポートします。次のコード行を追加することで、キーと値のペアのJavaScriptオブジェクトを作成します。各言語には同じキーがありますが、値は異なります。

const en = {
  welcome: 'Internationalization and Localization in React Native',
  signoutBtn: 'Sign out',
  signOutAlertTitle: 'Cancel',
  signOutAlertMess: 'Are you sure you want to sign out?',
  confirm: 'Okay',
  resetBtn: 'Reset password',
};
const zh = {
  welcome: 'React Native 中的国际化和本地化',
  signoutBtn: '登出',
  signOutAlertTitle: '取消',
  signOutAlertMess: '您确定要退出吗?',
  confirm: '好的',
  resetBtn: '重设密码',
};
const es = {
  welcome: 'Internacionalización y localización en React Native',
  signoutBtn: 'desconectar',
  signOutAlertTitle: 'Cancelar',
  signOutAlertMess: '¿Estás segura de que quieres cerrar sesión?',
  confirm: 'Okey',
  resetBtn: 'Restablecer la contraseña',
};
export { zh, en, es };

後で、これらの異なる言語をインポートして、現在の文字列をユーザーのロケールのテキストを表すキーの値に置き換えます。

ユーザーのデバイスロケールの取得

expo-localizationSDKは、デバイスの言語コードにアクセスする定数を呼び出すことにより、ユーザーのデバイスロケールを提供しますlocale

国際化機能の追加

最近インストールした2つのパッケージと言語構成ファイルをインポートして、国際化機能を追加しましょう。

import * as Localization from 'expo-localization';
import i18n from 'i18n-js';
import { zh, en, es } from './i18n/supportedLanguages';

ステートメントの後importに、次のコード行を追加します。

i18n.fallbacks = true;
i18n.translations = { en, zh, es };
i18n.locale = Localization.locale;

を指定することによりi18n.fallbacks = true、ロケールフォールバック機能を有効にします。これは、たとえば、「パスワードのリセット」のテキストがスペイン語で指定されていない場合、テキストはデフォルトの言語にフォールバックすることを意味します。

設定i18n.translations = { en, zh, es }は、アプリでサポートする言語のキーと値のペアを指定します。

また、をi18n.locale = Localization.locale使用して、ユーザーのデバイス設定に基づいてアプリのロケールを設定しています。

アプリテキストのローカライズi18n-js

ローカライズされたテキストをアプリに取り込むには、i18n.t()関数を呼び出し、翻訳するキーを文字列として渡す必要があります。

welcomeアプリのテキストをローカライズしたいとします。以下を追加できます。

>// jsx
<Text>{i18n.t('welcome')}</Text>

これによりwelcome、ユーザーのデバイスのロケールに基づいてインポートした構成オブジェクトのキーの値がわかります。

Welcomeデバイスのキーが英語に設定されています。

Welcomeデバイスのキーが中国語に設定されています。

iOSシミュレーターでデバイスのローカリゼーションをデモンストレーションするには、デバイス設定を開き、 [一般] >[言語と地域] >[ iPhone言語]に移動します。中国語またはスペイン語を選択して、選択した言語に従ってテキストが条件付きでどのようにレンダリングされるかを確認します。

Android iOSエミュレーターで、[メニュー] >[設定] >[言語とキーボード] > [ロケールの選択]を開きます。

ロケールを選択すると、iOSシミュレーターでローカライズされた最終的なExpoアプリは次のようになります。

デバイス設定に移動せずにデバイスのロケールを変更する場合は、に変更i18n.locale = Localization.localei18n.locale ='es'て、アプリのローカライズ版をスペイン語またはアプリがサポートする言語コードで取得できます。

これはテストのみを目的としていることに注意してください。

BareReactNativeアプリ

新しいReactNativeプロジェクトの生成

ベアのReactNativeアプリの使用を開始するには、次のコマンドを使用してReactNativeプロジェクトを生成しましょう。

npx react-native init ReactNativeLocalize

これにより、空のReact Nativeプロジェクトが生成され、必要なすべての依存関係がインストールされます。

アプリを開くには、新しく作成したアプリのルートに移動し、それに応じて次のコマンドを実行します。

# To start Metro
npx react-native start

#open a new terminal and run:
npx react-native run-android
# or
react-native run-ios

ベアのReactNativeアプリでexpo-localizationSDKを一緒に使用する方法を見てみましょう。開始するには、ベアReact Nativeプロジェクトに次の依存関係を18n-js使用してパッケージをインストールし、構成します。react-native-unimodules

yarn add react-native-unimodules
yarn add pod-install

#or

npm install react-native-unimodules
npx pod-install

次に、iOSおよびAndroid用のアプリにこれらの追加構成に従います。

これで、必要な依存関係をインストールできます。次のいずれかのコマンドを実行して、両方のパッケージをインストールします。

yarn add expo-localization i18n-js
#or
npm i expo-localization i18n-js

インストール後、Expoアプリで使用したのと同じ手順に従って、ベアReactNativeアプリをローカライズします。

expo-localizationこれは、 SDKとを使用したローカライズされたベアReactNativeアプリの動作デモです18n-js

結論

国際化により、 ExpoとベアReactNativeアプリを簡単にローカライズできました。expo-localizationi18n-js国際化ライブラリを使用して、関数を使用して両方のアプリのテキストのローカライズ版をレンダリングしましたi18n.t()

ExpoおよびベアReactNativeプロジェクトのこのチュートリアルで使用される完全なコードは、GitHubで入手できます。 

出典:https ://blog.logrocket.com/internationalization-and-localization-in-react-native/

#reactnative #i18n 

ReactNativeの国際化とローカリゼーション

Internacionalización Y Localización En React Native

La internacionalización, o i18n, es el proceso de creación de aplicaciones que pueden adaptarse a diferentes culturas, regiones e idiomas.

Sin embargo, la localización, o l10n, implica la traducción a un lugar o idioma especificado por el usuario y es posible gracias a la internacionalización.

Localizar una aplicación significa crearla para admitir varios idiomas y regiones, lo que hace que la aplicación sea accesible y utilizable para una gama más amplia de usuarios.

En el desarrollo de aplicaciones móviles, la localización obtiene el idioma y la configuración regional del dispositivo de un usuario, que no es lo mismo que la geolocalización de un usuario, y escribe el software para que se adapte en consecuencia.

Localizar una aplicación puede ser un desafío en general, pero con la ayuda de expo-localizationy i18n-jsaprenderemos cómo implementar la localización en una aplicación Expo y React Native.

Requisitos

Asegúrese de tener lo siguiente antes de comenzar este tutorial:

Además, además del expo-localizationSDK, también podemos usar una biblioteca como react-native-localize . Pero esta caja de herramientas solo es compatible con React Native y no es compatible con las aplicaciones de Expo sin expulsar de Expo porque es un módulo nativo.

Trabajando conexpo-localization

El expo-localizationSDK nos brinda acceso a los datos de configuración regional del dispositivo nativo de un usuario, incluida la isoCurrencyCodesconstante, que devuelve una matriz de todos los códigos de moneda admitidos en el dispositivo del usuario, y la timezoneconstante, que devuelve la zona horaria del dispositivo.

Ahora, comencemos localizando una aplicación Expo con expo-localizationy i18n-js.

Creación de una aplicación Expo

Para comenzar, generemos una aplicación Expo usando Expo CLI. Abra una nueva terminal y ejecute el siguiente comando para generar una aplicación Expo:

expo init name-of-your-app

Seleccione una plantilla en blanco. Esto nos da las dependencias mínimas que necesitamos para empezar.

Para abrir la aplicación, navegue hasta la raíz de nuestra aplicación recién creada y ejecute el siguiente comando en consecuencia:

# For iOS
yarn ios
# or
npm run ios

# For Android
yarn android
# or
yarn android

El comando muestra la siguiente pantalla:

Instalación de dependencias

Ahora que hemos generado una aplicación Expo, podemos instalar expo-localizationy i18n-jscomo dependencias después de navegar al directorio de la aplicación.

Ejecute cualquiera de los siguientes comandos para instalar ambos paquetes:

yarn add expo-localization i18n-js
#or
npm i expo-localization i18n-js

Extraer y centralizar el texto de la aplicación

Un paso importante en la localización de nuestra aplicación es extraer y centralizar el texto con el que los usuarios interactuarán en un archivo separado. Esto nos permite mostrar texto de forma condicional a nuestros usuarios en función de la configuración regional de su dispositivo.

Primero, crea un archivo en i18n/supportedLanguages.js; aquí es donde queremos colocar todo el texto con el que interactúa el usuario que no es código.

En este tutorial, nuestra aplicación admitirá tres idiomas: inglés, chino y español. Al agregar las siguientes líneas de código, creamos un objeto JavaScript de pares clave-valor. Cada idioma tiene la misma clave, pero los valores son diferentes:

const en = {
  welcome: 'Internationalization and Localization in React Native',
  signoutBtn: 'Sign out',
  signOutAlertTitle: 'Cancel',
  signOutAlertMess: 'Are you sure you want to sign out?',
  confirm: 'Okay',
  resetBtn: 'Reset password',
};
const zh = {
  welcome: 'React Native 中的国际化和本地化',
  signoutBtn: '登出',
  signOutAlertTitle: '取消',
  signOutAlertMess: '您确定要退出吗?',
  confirm: '好的',
  resetBtn: '重设密码',
};
const es = {
  welcome: 'Internacionalización y localización en React Native',
  signoutBtn: 'desconectar',
  signOutAlertTitle: 'Cancelar',
  signOutAlertMess: '¿Estás segura de que quieres cerrar sesión?',
  confirm: 'Okey',
  resetBtn: 'Restablecer la contraseña',
};
export { zh, en, es };

Posteriormente, importaremos estos diferentes idiomas para reemplazar la cadena actual con el valor de la clave que representa el texto de la configuración regional del usuario.

Obtener la configuración regional del dispositivo del usuario

El expo-localizationSDK nos proporciona la configuración regional del dispositivo del usuario llamando a la localeconstante, que accede al código de idioma del dispositivo.

Agregar funcionalidad de internacionalización

Importemos los dos paquetes que instalamos recientemente y nuestro archivo de configuración de idioma para agregar la funcionalidad de internacionalización:

import * as Localization from 'expo-localization';
import i18n from 'i18n-js';
import { zh, en, es } from './i18n/supportedLanguages';

Después de las importdeclaraciones, agregue la siguiente línea de código:

i18n.fallbacks = true;
i18n.translations = { en, zh, es };
i18n.locale = Localization.locale;

Al especificar i18n.fallbacks = true, habilitamos la función de reserva de configuración regional. Esto significa, por ejemplo, que si no especificamos cuál es el texto de “Restablecer contraseña” en español, el texto volverá al idioma predeterminado.

La configuración i18n.translations = { en, zh, es }especifica los pares clave-valor de los idiomas que queremos admitir en nuestra aplicación.

Y, con i18n.locale = Localization.locale, estamos configurando la configuración regional de nuestra aplicación en función de la configuración del dispositivo del usuario.

Localizar el texto de la aplicación coni18n-js

Para obtener el texto localizado en la aplicación, debemos llamar a la i18n.t()función y pasar la clave que queremos traducir como una cadena.

Digamos que queremos localizar el welcometexto de nuestra aplicación. Podemos agregar lo siguiente:

>// jsx
<Text>{i18n.t('welcome')}</Text>

Esto nos da el valor de la welcomeclave en nuestro objeto de configuración que importamos en función de la configuración regional del dispositivo del usuario.

Welcomeclave del dispositivo configurada en inglés.

Welcomeclave del dispositivo establecida en chino.

Para demostrar la localización de un dispositivo en un simulador de iOS, abra la configuración del dispositivo y vaya a General > Idioma y región > Idioma del iPhone . Seleccione chino o español para ver cómo se representará condicionalmente el texto según el idioma seleccionado.

En un emulador de Android iOS, abra Menú > Configuración > Idioma y teclado > Seleccionar configuración regional .

Con la configuración regional seleccionada, la aplicación Expo localizada final en un simulador de iOS tiene el siguiente aspecto:

Si queremos cambiar la configuración regional del dispositivo sin entrar en la configuración del dispositivo, podemos cambiar i18n.locale = Localization.localepara i18n.locale ='es'obtener la versión localizada de la aplicación en español o cualquier código de idioma que admita la aplicación.

Tenga en cuenta que esto es solo para fines de prueba.

Aplicación Bare React Native

Generando un nuevo proyecto React Native

Para comenzar con nuestra aplicación React Native, generemos un proyecto React Native usando el siguiente comando:

npx react-native init ReactNativeLocalize

Esto generará un proyecto React Native vacío e instalará todas las dependencias necesarias.

Para abrir la aplicación, navegue hasta la raíz de nuestra aplicación recién creada y ejecute el siguiente comando en consecuencia:

# To start Metro
npx react-native start

#open a new terminal and run:
npx react-native run-android
# or
react-native run-ios

Veamos cómo podemos usar el expo-localizationSDK junto con 18n-jsuna aplicación React Native simple. Para comenzar, instale y configure el react-native-unimodulespaquete con las siguientes dependencias en nuestro proyecto React Native:

yarn add react-native-unimodules
yarn add pod-install

#or

npm install react-native-unimodules
npx pod-install

A continuación, siga estas configuraciones adicionales a la aplicación para iOS y Android .

Ahora, podemos instalar las dependencias necesarias. Ejecute cualquiera de los siguientes comandos para instalar ambos paquetes:

yarn add expo-localization i18n-js
#or
npm i expo-localization i18n-js

Después de la instalación, siga los mismos pasos que usamos en nuestra aplicación Expo para localizar la aplicación React Native.

Aquí hay una demostración de trabajo de una aplicación React Native simple localizada con expo-localizationSDK y 18n-js.

Conclusión

Con la internacionalización , localizamos fácilmente una aplicación Expo y React Native . Al usar expo-localizationy la i18n-jsbiblioteca de internacionalización, representamos una versión localizada del texto de ambas aplicaciones usando la i18n.t()función.

El código completo utilizado en este tutorial para el proyecto Expo y React Native está disponible en GitHub. 

Fuente: https://blog.logrocket.com/internationalization-and-localization-in-react-native/ 

#reactnative #i18n 

Internacionalización Y Localización En React Native

7つの有名なiOSオープンソースアプリ

あなたがソフトウェア開発者であれば、コミュニティがより良く、より簡単なコードを書くのを助けるために喜んで人々によって与えられた、GitHubでたくさんのライブラリやコード例を見つけることができることをよく知っています。

これらのコードは、スタンドアロンソフトウェアの完全な部分になるまで、またはアプリ全体になり、iOSアプリケーションを参照している場合は、作成者がAppStoreで公開することを決定するまで成長し始めることがありました。

代わりに、明確にするために、プロジェクト全体(つまり、多くの全国的なCovid追跡アプリ)をすべての人に公開する必要があります。これにより、公開コードリポジトリが作成され、コードをすべての人が参照できるようになります。

このようなことが起こったとき、私たち開発者にとって、おそらくまったく異なるスタイルでコーディングしている、他の誰かが作成した完全なアプリコードを研究する絶好の機会です。これは、コーディングを改善し、研究し、学習する絶好の機会です。知識は力であることを忘れないでください。

今日の記事では、AppStoreで入手できる7つの有名なアプリのコードを紹介します。

 

Firefox:プライベートで安全なブラウザ

Firefoxは、コードの75%以上、最新のUI、テスト、およびM1プロセッサのサポートのためにSwiftで記述されています。

リポジトリ:https ://github.com/mozilla-mobile/firefox-ios

 

Simplenote

私たちの言語のコードの95%を備えたとても素敵なアプリ。その中にはたくさんのクールなものがあります。デバイスのキーチェーンエンクレーブにユーザーの情報を表示KeychainManagerするための優れた実装については、クラスで略奪してください。PropertyWrapper

リポジトリ:https ://github.com/automattic/simplenote-ios

 

キックスターター

Swiftで書かれたコードの99.7%という息を呑むような価値を持つものは、おそらく最もiOS指向のアプリの1つです。すべてのUIはUIKitでコード化されており、iPad用にも開発されています。興味がある場合は、Androidリポジトリへのリンクも見つけることができます。

リポジトリ:https ://github.com/kickstarter/ios-oss

 

VLC for Mobile

あなたはおそらくこのアプリを数え切れないほどの時間使用してきました…まあ、それは内部にあるものを見て、そして多分あなたが望むものを変える時です。悲しいことに、コードの6.4%だけが私たちの母国語であり、ええと…悲しいことに、それはすべてObjective-Cにあります…ごめんなさい。

リポジトリ:https ://github.com/videolan/vlc

 

公式KodiRemote

Kodiは、受賞歴のあるホームシアター/メディアセンターソフトウェアであり、デジタルメディアのエンターテインメントハブです。その美しいインターフェースと強力なスキニングエンジンにより、Android、BSD、Linux、macOS、iOS、およびWindowsで利用できます。私たちの世界からのコードはごくわずかです…Objective-Cではわずか1.4%です。

リポジトリ:https ://github.com/xbmc/xbmc

 

ウィキペディア

何かを学ぶ時が来たら、ウィキペディアの時です!Swiftのコードの62.5%、Objective-Cの27.5%。ウィジェットもあるので、それらを実装する方法を学ぶことができます。

リポジトリ:https ://github.com/wikimedia/wikipedia-ios

 

WordPress —ウェブサイトビルダー

あなたがあなたのブログを管理する必要があるならば、まあこれはあなたが必要とするアプリです。ほとんどすべてのコードはSwiftとObjective-Cで書かれています。このプロジェクトを使用するには、WordPress.comAPIクレデンシャルを作成する必要があります。

リポジトリ:https ://github.com/wordpress-mobile/WordPress-iOS

あなたがこの記事を気に入ってくれたことを願っています。もしあなたがそれをたたいてください、そしてあなたがミディアムメンバーでないなら、それに参加することを検討してください。私の紹介リンクを使用すると、より良い記事を書くのに役立ちます

コーディングをお楽しみください!    

リンク:https ://medium.com/@alessandromanilii/7-famous-ios-open-source-apps-11a0c1ddfd69

#ios  #open 

7つの有名なiOSオープンソースアプリ
Saul  Alaniz

Saul Alaniz

1644782400

7 Famosas Aplicaciones De Código Abierto De IOS

Si es un desarrollador de software, sabe muy bien que puede encontrar muchas bibliotecas o ejemplos de código en GitHub, proporcionados por personas dispuestas a ayudar a la comunidad a escribir un código mejor y más fácil.

A veces, esos códigos comenzaron a crecer hasta convertirse en piezas completas de software independiente, o incluso en aplicaciones completas, y los autores deciden publicarlas en la AppStore, si se refiere a las aplicaciones de iOS.

A veces, en cambio, todo el proyecto, por motivos de claridad (es decir, las muchas aplicaciones nacionales de seguimiento de Covid), debe estar abierto a todos para que se cree un repositorio de código público y el código esté disponible para que todos lo consulten.

Cuando suceden estas cosas, es una gran oportunidad para que los desarrolladores estudiemos el código completo de una aplicación creado por otra persona, probablemente codificando con un estilo totalmente diferente. Esta es realmente una gran oportunidad para mejorar, estudiar y aprender a codificar cada vez mejor... ¡recuerda que el conocimiento es poder !

En el artículo de hoy, te presentaré el código de 7 aplicaciones famosas, todas disponibles en la AppStore.

 

Firefox: Navegador privado y seguro

Firefox está escrito en Swift para más del 75 % del código, interfaz de usuario moderna, pruebas y soporte para procesadores M1.

Repositorio: https://github.com/mozilla-mobile/firefox-ios

 

nota simple

Una aplicación muy agradable con el 95% del código en nuestros idiomas. Un montón de cosas interesantes en él. Tome un botín en la clase KeychainManagerpara una buena implementación de PropertyWrapperla información de un usuario en el enclave del llavero del dispositivo.

Repositorio: https://github.com/automattic/simplenote-ios

 

Pedal de arranque

Con un valor impresionante del 99,7% del código escrito en Swift, es quizás una de las aplicaciones más orientadas a iOS del lote. Toda la interfaz de usuario está codificada en UIKit y también está desarrollada para iPad. Si está interesado, también puede encontrar el enlace al repositorio de Android.

Repositorio: https://github.com/kickstarter/ios-oss

 

VLC para móviles

Probablemente hayas usado esta aplicación durante innumerables horas... bueno, es hora de echar un vistazo a lo que hay debajo del capó y tal vez cambiar algo que te gustaría. Lamentablemente, solo el 6,4 % del código está en nuestro idioma nativo y, lamentablemente, todo está en Objective-C... Lo siento.

Repositorio: https://github.com/videolan/vlc

 

Control remoto oficial de Kodi

Kodi es un galardonado software de cine en casa/centro multimedia y centro de entretenimiento para medios digitales. Con su hermosa interfaz y su poderoso motor de skinning, está disponible para Android, BSD, Linux, macOS, iOS y Windows. Solo una pequeña cantidad de código es de nuestro mundo... solo un 1,4% en Objective-C.

Repositorio: https://github.com/xbmc/xbmc

 

Wikipedia

Cuando llega el momento de aprender algo, ¡es el momento de Wikipedia! 62,5% de código en Swift y 27,5% en Objective-C. También tiene un Widget para que puedas aprender cómo implementarlos.

Repositorio: https://github.com/wikimedia/wikipedia-ios

 

WordPress — Creador de sitios web

Si necesitas administrar tu blog, pues esta es la aplicación que necesitas. Casi todo el código está escrito en Swift y Objective-C. Para utilizar este proyecto, debe crear credenciales API de WordPress.com.

Repositorio: https://github.com/wordpress-mobile/WordPress-iOS

Espero que te haya gustado este artículo, si es así, aplaude y no eres miembro de Medium, considera unirte. Usar mi enlace de referencia me ayudará a escribir cada vez mejores artículos.

¡Disfruta de tu codificación!    

Enlace: https://medium.com/@alessandromanilii/7-famous-ios-open-source-apps-11a0c1ddfd69

#ios #open 

7 Famosas Aplicaciones De Código Abierto De IOS
Saul  Alaniz

Saul Alaniz

1644686760

5 Herramientas De Código Abierto Para Crear Canalizaciones De ML

ML no se trata solo de entrenar un clasificador de K-means en datos de Iris en un cuaderno Jupyter . Es posible que desee entrenar toneladas de datos mediante un modelo de aprendizaje automático complejo en presencia de una infraestructura de alto nivel . Ahora bien, esto no se puede hacer con una sola herramienta. ¡Necesitamos una colección de ellos!

Con el aumento del interés por crear canalizaciones de aprendizaje automático de extremo a extremo listas para la producción, ha habido una demanda cada vez mayor de utilizar el conjunto de herramientas adecuado que podría escalar más rápido y que se está desarrollando activamente.

En este artículo, hablaré sobre 5 herramientas de código abierto que encontré y usé, que podrían ayudarlo en varias etapas de la creación de canalizaciones de ML.

 

1. vuelo

GitHub . documentos _ Comunidad

Implementaciones actuales: Spotify, Lyft, Freenome, GoJek, etc.

Para implementar ML de nivel de producción con alta velocidad de desarrollo y sin la molestia de la infraestructura, necesitamos una plataforma que pueda ayudar con el aspecto operativo de ML . Precisamente, necesitamos una plataforma que facilite la colaboración entre equipos, maneje ejecuciones repetitivas de código sin agotar los recursos, respalde a los científicos de datos a quienes no les gusta intervenir en los aspectos de la infraestructura, sea escalable y confiable, y la lista podría continuar.

volar

Flyte facilita la creación de flujos de trabajo simultáneos, escalables y mantenibles para el aprendizaje automático y los datos...

flyte.org

 

Flyte es una plataforma de automatización de flujos de trabajo que ayuda a automatizar procesos críticos de aprendizaje automático y datos. Facilita el entrenamiento distribuido, no tiene un punto único de falla, proporciona linaje de datos y simplifica la rampa para arrancar la infraestructura. Ya no necesita preocuparse por manejar las operaciones de ML con Flyte.

Captura de pantalla de FlyteConsole de blog.flyte.org

Comenzar con Flyte es bastante simple; tenga Docker, Python, Git instalado, ejecute un par de comandos, ¡y listo!

¿Cómo implementar? Todas las guías de implementación y las mejores prácticas se compilan en la sección de implementación de los documentos . Algunas implementaciones pueden necesitar experiencia en Kubernetes y sus herramientas relacionadas.

 

2. Grandes expectativas

GitHub . documentos _ Comunidad

Implementaciones actuales: GitHub, Calm, Agero, Civis, etc.

Los datos no siempre son como esperamos que sean. La validación de datos es crucial todo el tiempo para garantizar que los datos se vean como queremos. Great Expectations ayuda a lograr exactamente lo mismo: garantizar la calidad de los datos antes de que comience el proceso real, ya sea modelado o análisis.

Great Expectations hace esto a través de " expectativas ", que son las afirmaciones de los datos. Estas son las suites donde tenemos que describir lo que esperamos de los datos. Alternativamente, las expectativas se pueden generar usando un “ perfilador de datos ”. No he probado esta función a fondo, ¡pero seguro que parece prometedora!

Después de definir la configuración y las expectativas requeridas, Great Expectations valida los datos y arroja los resultados. Para mejorar los resultados de la validación de datos, Great Expectations ofrece " documentos de datos ", una interfaz de usuario fácil de usar para ver qué salió mal.

Captura de pantalla de documentos de datos de docs.greatexpectations.io

¿Cómo implementar? Las guías de implementación se incluyen en los documentos. Tiene algunas integraciones en funcionamiento; sin embargo, la implementación independiente no debería ser demasiado difícil.

 

3. Fiesta

GitHub . documentos _ Comunidad

Implementaciones actuales: GoJek, Shopify, Salesforce, IBM, etc.

Feast es una tienda de características . En ML, puede haber muchas funciones si el conjunto de datos es enorme. Una tienda de funciones es útil para administrar y producir funciones, lograr coherencia entre la capacitación y el servicio de datos y realizar un seguimiento de las versiones y el linaje de las funciones. Feast publicó un artículo completo titulado ¿Qué es una tienda de funciones? si desea profundizar en el concepto de tienda de características.

Fiesta de la arquitectura ( Fuente )

Uno interactúa con el almacén de funciones principalmente durante el entrenamiento y la inferencia. En primer lugar, las definiciones de funciones deben definirse y registrarse, los datos de entrenamiento se pueden generar utilizando la tienda de funciones, las funciones deben materializarse de una tienda fuera de línea a una tienda en línea y, por último, las funciones más recientes de la tienda en línea se pueden usar para la inferencia. .

¿Cómo implementar? Hay una guía detallada para implementar Feast en producción. La implementación requiere que se implemente la automatización para simplificar el uso en el futuro.

 

4. Horovod

GitHub . Documentos

Si los modelos de aprendizaje profundo (DL) no funcionan bien durante el entrenamiento con una sola GPU, es posible que necesitemos muchos de ellos para distribuir la carga de trabajo a fin de acelerar el proceso. Horovod es un marco de entrenamiento distribuido para TensorFlow, Keras, PyTorch y Apache MXNet. Facilita el escalado a miles de GPU, incluso cuando el código es compatible con una sola GPU (por supuesto, el código debe usar las API de Horovod).

La principal ventaja de Horovod es que funciona con múltiples bibliotecas DL: elija el marco DL, llame a las API correctas y ¡listo! los resultados deben producirse en mucho menos tiempo.

Puntos de referencia de Horovod ( Fuente )

¿Cómo implementar? La guía de instalación debería ayudar a configurar el entorno. Si hay un Dockerfile, inserte todas las instrucciones de instalación con cuidado, ya sea MPI, NCCL o las variables de entorno relevantes.

 

5. Servidor de inferencia Triton

GitHub . Documentos

La inferencia es un aspecto importante de ML. Dado que estaría del lado del usuario, no podemos comprender la velocidad, tiene que ser rápido y preciso. Cuando abres Netflix, obtienes recomendaciones de películas sobre la marcha. ¡Imagina la velocidad con la que se tienen que generar las predicciones y la cantidad de usuarios que podrían estar accediendo a Netflix al mismo tiempo! Eso podría ser un número bastante grande, ¿no?

El servidor de "inferencia" Triton de NVIDIA puede simplificar la implementación de una amplia gama de modelos que pertenecen a varios marcos y escalar con facilidad. Puede ejecutarse simultáneamente en varias GPU y ofrece una gran cantidad de funciones.

¿De qué está hecho Tritón? ( Fuente )

Para ejecutar Triton, extraiga una imagen de Docker preexistente e inicie el contenedor que, a su vez, activa el servidor.

¿Cómo implementar? Para implementar Triton con Kubernetes y Helm, existen guías de GCP , AWS y NVIDIA FleetCommand . Un proyecto de código abierto llamado transformer-deploy proporciona un servidor de inferencia de CPU/GPU listo para usar basado en NVIDIA Triton para modelos de transformador Hugging Face para simplificar el proceso de implementación.

¡Gracias por leer! Hágame saber las herramientas que utiliza para crear canalizaciones de aprendizaje automático.   

Vea más en: https://betterprogramming.pub/5-open-source-tools-that-can-help-you-build-ml-pipelines-with-ease-46eb5d4c3488

#machine-learning #open 

5 Herramientas De Código Abierto Para Crear Canalizaciones De ML

簡単にMLパイプラインを構築するのに役立つ5つのオープンソースツール

MLは、JupyterノートブックのアイリスデータでK-means分類器をトレーニングすることだけではありません。ハイエンドインフラストラクチャが存在する場合、複雑なMLモデルを使用して大量のデータをトレーニングすることをお勧めします。現在、これは単一のツールでは実行できません。それらのコレクションが必要です!

本番環境に対応したエンドツーエンドのMLパイプラインを構築することへの関心が急上昇しているため、より高速に拡張できる適切なツールセットを使用する需要が高まっており、積極的に開発されています。

この記事では、私が見つけて使用した5つのオープンソースツールについて説明します。これらのツールは、MLパイプラインの構築の複数の段階で役立ちます。

 

1.フロート

GitHubドキュメントコミュニティ

現在の展開:Spotify、Lyft、Freenome、GoJekなど。

開発速度が速く、インフラストラクチャの手間をかけに本番環境グレードのMLをデプロイするには、 MLの運用面に役立つプラットフォームが必要です。正確には、チーム間のコラボレーションを促進し、リソースを使い果たすことなくコードの繰り返し実行を処理し、インフラストラクチャの側面に介入することを好まないデータサイエンティストのそばにあり、スケーラブルで信頼できるプラットフォームが必要です。

浮く

Flyteを使用すると、機械学習とデータの並行、スケーラブル、および保守可能なワークフローを簡単に作成できます…

flyte.org

 

Flyteは、重要なMLおよびデータパイプラインの自動化を支援するワークフロー自動化プラットフォームです。分散トレーニングが容易になり、単一障害点がなく、データ系統が提供され、インフラストラクチャをブートストラップするためのランプが簡素化されます。FlyteでMLのOpsを処理することを心配する必要はもうありません。

blog.flyte.orgのFlyteConsolescreengrab

Flyteの使用を開始するのは非常に簡単です。Docker、Python、Gitをインストールし、いくつかのコマンドを実行すれば、準備は完了です。

展開する方法は?すべての導入ガイドとベストプラクティスは、ドキュメントの導入セクションにまとめられています。いくつかのデプロイでは、Kubernetesとそれに関連するツールの専門知識が必要になる場合があります。

 

2.大きな期待

GitHubドキュメントコミュニティ

現在の展開:GitHub、Calm、Agero、Civisなど。

データは、必ずしも私たちが期待するものとは限りません。データの検証は、データが希望どおりに表示されることを保証するために常に重要です。大きな期待は、まったく同じことを達成するのに役立ちます。モデリングであれ分析であれ、実際のプロセスが始まる前にデータ品質を保証します。

Great Expectationsは、データのアサーションである「 expectations 」を通じてこれを行います。これらは、データに期待することを説明する必要があるスイートです。または、「データプロファイラー」を使用して期待値を生成することもできます。私はこの機能を徹底的にテストしていませんが、確かに有望に見えます!

必要な構成と期待値を定義した後、Great Expectationsはデータ検証を行い、結果を破棄します。データ検証の結果を向上させるために、Great Expectationsは「データドキュメント」を提供しています。これは、何が悪かったのかを表示するための使いやすいUIです。

docs.greatexpectations.ioからのデータドキュメントスクリーングラブ

展開する方法は?導入ガイドはドキュメントに含まれています。いくつかの統合が稼働しています。ただし、スタンドアロン展開はそれほど難しくないはずです。

 

3.ごちそう

GitHubドキュメントコミュニティ

現在の展開:GoJek、Shopify、Salesforce、IBMなど。

饗宴特徴的な鉱石です。MLでは、データセットが巨大な場合、多くの機能が存在する可能性があります。機能ストアは、機能の管理と生産、データのトレーニングと提供の間の一貫性の実現、機能のバージョンと系統の追跡に役立ちます。Feastは、「フィーチャーストアとは」というタイトルの包括的な記事を公開しました。機能ストアの概念を深く掘り下げたい場合。

饗宴の建築(出典

1つは、主にトレーニングと推論中に機能ストアと対話します。まず、機能定義を定義して登録し、機能ストアを使用してトレーニングデータを生成し、機能をオフラインからオンラインストアに具体化する必要があります。最後に、オンラインストアの最新機能を推論に使用できます。 。

展開する方法は?Feastを本番環境にデプロイするため 詳細なガイドがあります。展開では、将来の使用を簡素化するために自動化を導入する必要があります。

 

4.ホロボッド

GitHubドキュメント

単一のGPUを使用したトレーニング中にディープラーニング(DL)モデルがうまく機能しない場合は、プロセスを高速化するために、ワークロードを分散するために多くのモデルが必要になる場合があります。Horovodは、TensorFlow、Keras、PyTorch、ApacheMXNetの分散トレーニングフレームワークです。コードがシングルGPU互換の場合でも、数千のGPUに簡単に拡張できます(もちろん、コードはHorovod APIを使用する必要があります)。

Horovodの主な利点は、複数のDLライブラリで動作することです。DLフレームワークを選択し、適切なAPIを呼び出して、出来上がりです。結果ははるかに短い時間で生成されるはずです。

Horovodベンチマーク(出典

展開する方法は?インストールガイドは、環境のセットアップに役立ちます。Dockerfileがある場合は、MPI、NCCL、または関連する環境変数など、すべてのインストール手順を慎重に挿入します。

 

5.Triton推論サーバー

GitHubドキュメント

推論はMLの重要な側面です。ユーザー向けであるため、速度で構成することはできません。高速で正確である必要があります。Netflixを開くと、その場でおすすめの映画を入手できます。予測を生成する速度と、同時にNetflixにアクセスする可能性のあるユーザーの数を想像してみてください。それはかなり大きな数字かもしれませんね。

NVIDIAのTriton「推論」サーバーは、さまざまなフレームワークに属する幅広いモデルの展開を簡素化し、簡単に拡張できます。複数のGPUで同時に実行でき、多数の機能を提供します。

トリトンは何でできていますか?(出典

Tritonを実行するには、既存のDockerイメージをプルし、コンテナーを起動してサーバーを起動します。

展開する方法は?KubernetesとHelmを使用してTritonをデプロイするには、GCPAWS、およびNVIDIAFleetCommandガイドがあります。トランスフォーマーデプロイと呼ばれるオープンソースプロジェクトは、NVIDIA Triton for HuggingFaceトランスフォーマーモデルに基づく既製のCPU / GPU推論サーバーを提供して、デプロイメントプロセスを簡素化します。

読んでくれてありがとう!MLパイプラインの構築に使用するツールを教えてください。   

詳細については、https ://betterprogramming.pub/5-open-source-tools-that-c​​an-help-you-build-ml-pipelines-with-ease-46eb5d4c3488をご覧ください。

#pipeline  #open 

簡単にMLパイプラインを構築するのに役立つ5つのオープンソースツール

Introduction to Algorithms: Linear Sorting

Introduction to Algorithms: Linear Sorting

This builds on the lecture on improving find times and discusses how to achieve a faster sort. Direct access array sorts, tuple sorts, counting sorts, and radix sorts are discussed.

#spring #open #algorithms

Introduction to Algorithms: Linear Sorting

Create an Open Graph image generator with Node.js

When I first encountered Open Graph (OG) images, I thought they were simply a decorative protocol that comes when we share links. It didn’t take long for me to realize that OG images have a lot of impact on generally any resource or website that’s shared on public platforms.

When the image is combined with title and description metadata, they provide quick information about the resource shared. For instance, when we share a link on Twitter, the metadata is parsed and a preview card generates.

On a quick glance, the preview card provides information about the resource shared even before visiting the link. Now, if no metadata is available, no preview generates, and the link gets truncated, leaving no useful information about the resource.

However, creating OG images for many pages or blogs is time-consuming. A better approach would be to have a few templates designed for respective categories and dynamically create the images with a simple image generator service.

In this post, we will set up a simple server with the /ogimage endpoint that responds with dynamically generated images from provided query parameters. The primary objective is to reduce the manual effort when creating OG images.

For the sake of this post, we will use Node.js and Express to set up the server and use a couple of npm packages to handle the dynamic image generation. Please feel free to use the tools that suit your preferences.

So, without further ado, let’s get started…

What is Open Graph?

Let’s first understand what the OG protocol is. According to opg.me, “The Open Graph protocol enables any web page to become a rich object in a social graph. It provides enough information to richly represent any web page within the social graph.”

Individual pieces of information that are socially shareable are defined via meta tags. These tags are then grouped by the OG mechanism to provide a preview of the shared resource on social media.

 

In this post, we will focus more on og:image to learn more about the other meta tags (such as og:title or og:description) and the Open Graph protocol itself, please refer to this insightful article.

Below are the steps required to build a Node.js powered OG image generator:

  1. Setting up the ogimage endpoint
  2. Creating an image template
  3. Generating an image with Puppeteer
  4. Saving and serving the image as a response

Setting up the ogimage endpoint

To begin, let’s create a simple Node.js and Express app with a single GET endpoint, /ogimage. All the data that goes into ogimage is from query parameters from the URL:

# Create a new directory and cd into it
mkdir og-imager
cd og-imager

# initialize npm
npm init
# or use "npm init -y" to initialize with default values

# add express
npm install express

Next, create an index.js file and add the below snippet. This imports and initializes an Express app, sets up a GET /ogimage endpoint, and listens for requests:

// Import and initialize the express app
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;

// setup GET endpoint
app.get('/ogimage', (req, res) => {
  res.send('OG Imager!');
});

// Listen for requests
app.listen(port, () => {
  console.log(`app listening at ${port}`)
});

We can now add the start script to package.json to start the app. Use nodemon for local development purposes to autoreload the Node server when changes are made:

# add nodemon as dev-dependency
npm install nodemon -D# add start scripts
"scripts": {
  "start": "node index.js",
  "dev": "nodemon index.js"
},

Start the server (npm run start/npm run dev) and we should see the OG Imager! on the browser when http://localhost:3000/ogimage loads.

Creating an image template

An image template is a simple HTML markup with a few placeholders and CSS to style. The placeholders are in Handlebars syntax, {{placeholder}}, but we will discuss this more in the next section.

In simpler terms, we want to create a simple HTML page and capture the page as an image with respective dimensions. Below is the markup for an example template that we can use. Please feel free to modify the HTML and CSS as you see fit for your own blogs/apps:

const templateHTML = `
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <style>{{styles}}</style>
  </head>
  <body id="body">
    <main>
      <div class='logo'>
        {{#if logoUrl}}
          <img src="{{logoUrl}}" alt="logo" />
        {{else}}
          <span>Example Logo</span>
        {{/if}}
      </div>
      <div class="title">{{title}}</div>
      <div>
        {{#if tags}}
          <ul class="tags">
          {{#each tags}}
            <li class="tag-item">#{{this}}</li>
          {{/each}}
          </ul>
        {{/if}}
        {{#if path}}
          <p class="path">{{path}}</p>
        {{/if}}
      </div>
    </main>
  </body>
</html>
`;

Now, let’s add the styles for the template. Similar to HTML, the CSS will have placeholders for dynamic content, such as a background image or title font size:

const templateStyles = `
@font-face {
  font-family: Source Code Pro;
  src: url(https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@500&display=swap);
}
* {
  box-sizing: border-box;
}
:root {
  font-size: 16px;
  font-family: Source Code Pro, monospace;
}
body {
  padding: 2.5rem;
  height: 90vh;
  background: #042f7d;
  {{#if bgUrl}}
  background-image: url({{bgUrl}});
  background-position: center;
  background-repeat: no-repeat;
  background-size: cover;
  {{else}}
  background: linear-gradient(to right, #042f7d, #007eff);
  color: #00ffae;
  {{/if}}
}
main {
  height: 100%;
  width: 100%;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}
.logo {
  width: 15rem;
  height: 3rem;
}
.logo img {
  width: 100%;
  height: 100%;
}
.logo span {
  font-size: 2rem;
  color: yellow;
  font-style: italic;
  text-decoration: wavy;
  font-variant: unicase;
}
.title {
  font-size: {{fontSize}};
  text-transform: capitalize;
  margin: 0.25rem 0;
  font-weight: bold;
}
.tags {
  display: flex;
  list-style-type: none;
  padding-left: 0;
  color: #ff00d2;
  font-size: 1.5rem;
}
.tag-item {
  margin-right: 0.5rem;
}
.path {
  color: #6dd6ff;
  font-size: 1.25rem;
}
`;

Now that we have the template ready, the next step is to generate an image from it.

Generating an image with Puppeteer

To generate an image from an HTML template on a server, spin up a headless browser to load a page with the HTML and CSS from a template on the desired viewport dimensions. Then, the loaded page is captured and saved/served as an image.

We will use Puppeteer to spin up the headless browser and take a screenshot of a page loaded from the template we created above. We will also need Handlebars to compile the templated HTML and CSS and replace placeholders with dynamic values:

npm install puppeteer handlebars

Compile templated HTML with Handlebars

Before launching the browser and capturing the page, let’s compile the template HTML that must be loaded into the page:

const Handlebars = require("handlebars");

// Get dynamic font size for title depending on its length
function getFontSize(title="") {
  if (!title || typeof title !== 'string') return "";
  const titleLength = title.length;
  if (titleLength > 55) return "2.75rem";
  if (titleLength > 35) return "3.25rem";
  if (titleLength > 25) return "4.25rem";
  return "4.75rem";
}

// compile templateStyles
const compiledStyles = Handlebars.compile(templateStyles)({
  bgUrl: req.query.bgUrl,
  fontSize: getFontSize(req.query.title),
});

// compile templateHTML
const compiledHTML = Handlebars.compile(templateHTML)({
  logoUrl: req.query.logoUrl,
  title: req.query.title,
  tags: req.query.tags,
  path: req.query.path,
  styles: compiledStyles,
});

Note that Handlebars will escape unsafe HTML. So, passing the query string value directly is safe as long as our placeholders are with {{double-stash}}. The resulting HTML and styles will have the dynamic values that a query string receives.

Load HTML and capture with Puppeteer

Next up is to spin up the browser and take a screenshot of the page with Puppeteer. Puppeteer sets the viewport to 800x600 by default (at the time of writing this article). However, this can be overridden by the defaultViewport property sent with launching the method:

 const puppeteer = require('puppeteer');
// ...
app.get('/ogimage', async (req, res) => { // Note the async
  // ...
  const browser = await puppeteer.launch({
    headless: true,
    args: ["--no-sandbox"],
    defaultViewport: {
      width: 1200,
      height: 630,
    }
  });
  const page = await browser.newPage();
  // ...
});

1200x630 are the most common dimensions for OG images. The viewport size can also be dynamically controlled by using page.setViewport to set values from request parameters:

await page.setViewport({ width: Number(req.query.width), height: Number(req.query.height) });

Next, set the compiled HTML as page content and wait until there are zero network requests for at least 500ms by setting waitUntil property to networkidle0. This wait ensures all images and content loads:

 await page.setContent(compiledHTML, { waitUntil: 'networkidle0' });

Wait a minute, setting networkidle0 means it will wait 500ms every time. How do we fix this?

In pursuit of the answer, I landed on a framework for building Open Graph images from GitHub.

In the article, Jason Etcovitch writes, “We changed waitUntil to domcontentloaded to ensure that the HTML had finished being parsed, then passed a custom function to page.evaluate.

“This [runs] in the context of the page itself, but pipes the return value to the outer context. This meant that we could listen for image load events and pause execution until the Promises have been resolved.”

The below snippet is directly taken from this blog post to fix this issue:

 // Set the content to our rendered HTML
 await page.setContent(compiledHTML, { waitUntil: "domcontentloaded" });

 // Wait until all images and fonts have loaded
 await page.evaluate(async () => {
   const selectors = Array.from(document.querySelectorAll("img"));
   await Promise.all([
     document.fonts.ready,
     ...selectors.map((img) => {
       // Image has already finished loading, let’s see if it worked
       if (img.complete) {
         // Image loaded and has presence
         if (img.naturalHeight !== 0) return;
         // Image failed, so it has no height
         throw new Error("Image failed to load");
       }
       // Image hasn’t loaded yet, added an event listener to know when it does
       return new Promise((resolve, reject) => {
         img.addEventListener("load", resolve);
         img.addEventListener("error", reject);
       });
     }),
   ]);
 });

So, we can take a screenshot of the body element (the visible content wrapper) on the loaded page with page.screenshot and send the omitBackground: true property to ignore the browser background, only taking a screenshot of the loaded content.

However, if there is no background property set, the resulting screenshot will have a transparent background rather than the white browser default background:

const element = await page.$('#body');
const image = await element.screenshot({ omitBackground: true });  
await browser.close();

And that’s it; we have an image generated and one last step is to serve the image.

Save/serve the image as a response

To save/serve the image, we must first set the Content-Type header to indicate that the ogimage endpoint responds with an image so no additional logic is required to handle the response.

We can directly use the endpoint as an image URL and set the Cache-Control headers for caching purposes:

app.get('/ogimage', (req, res) => {
  // Compile Template HTML & CSS with Handlebars
  .....
  // Load the template and take a screenshot with Puppeteer
  .....

  res.writeHead(200, {
    'Content-Type': 'image/png',
    'Cache-Control': `immutable, no-transform, s-max-age=2592000, max-age=2592000` // 30 days cache
  });
  res.end(image);
});

To load the image preview locally, open your browser and visit the ogimage endpoint at localhost:3000/ogimage with query parameters. This sends a GET request to the service and displays the image response in the browser:

http://localhost:3000/ogimage?title=Open%20Graph%20Image%20Generator%20with%20NodeJS&tags[]=nodejs&tags[]=og-image&path=blog.yourdomain.com/open-graph-image-generator-with-nodejs

The image preview looks something like below:

And here is the final code:

// index.js
const express = require('express');
const puppeteer = require('puppeteer');
const Handlebars = require("handlebars");

const app = express();
const port = process.env.PORT || 3000;

const templateStyles = `...`;

const templateHTML = `...`;

// Get dynamic font size for title depending on its length
function getFontSize(title="") {
  if (!title || typeof title !== 'string') return "";
  const titleLength = title.length;
  if (titleLength > 55) return "2.75rem";
  if (titleLength > 35) return "3.25rem";
  if (titleLength > 25) return "4.25rem";
  return "4.75rem";
}

app.get('/ogimage', async (req, res) => {
  // compiled styles
  const compiledStyles = Handlebars.compile(templateStyles)({
    bgUrl: req.query.bgUrl,
    fontSize: getFontSize(req.query.title),
  });
  // compiled HTML
  const compiledHTML = Handlebars.compile(templateHTML)({
    logoUrl: req.query.logoUrl,
    title: req.query.title,
    tags: req.query.tags,
    path: req.query.path,
    styles: compiledStyles,
  });
  // Launch Headless browser and capture creenshot
  const browser = await puppeteer.launch({
    headless: true,
    args: ["--no-sandbox"],
    defaultViewport: {
      width: 1200,
      height: 630,
    }
  });
  const page = await browser.newPage();
  // Set the content to our rendered HTML
  await page.setContent(compiledHTML, { waitUntil: "domcontentloaded" });  
  // Wait until all images and fonts have loaded
  await page.evaluate(async () => {
    const selectors = Array.from(document.querySelectorAll("img"));
    await Promise.all([
      document.fonts.ready,
     ...selectors.map((img) => {
        // Image has already finished loading, let’s see if it worked
        if (img.complete) {
          // Image loaded and has presence
          if (img.naturalHeight !== 0) return;
          // Image failed, so it has no height
          throw new Error("Image failed to load");
        }
        // Image hasn’t loaded yet, added an event listener to know when it does
        return new Promise((resolve, reject) => {
          img.addEventListener("load", resolve);
          img.addEventListener("error", reject);
        });
      }),
    ]);
  });

  const element = await page.$('#body');
  const image = await element.screenshot({ omitBackground: true });  
  await browser.close();

  res.writeHead(200, { 'Content-Type': 'image/png', 'Cache-Control': `immutable, no-transform, s-max-age=2592000, max-age=2592000` });
  res.end(image);
})

app.listen(port, () => {
  console.log(`app listening at ${port}`)
});

You can also find the complete code on GitHub. Feel free to fork it and extend beyond the template to fit your needs.

A good tip for development is to comment out the Puppeteer and Content-Type header code followed by sending the compiledHTML in response instead of the generated image, res.status(200).send(compiledHTML):

// compiled HTML
  const compiledHTML = ...;

  // Comment out puppeteer, browser, page stuff
  // const browser = ...;
  // ...
  // await browser.close();

  // instead of image as response, send compiledHTML itself
  // res.writeHead(200, { 'Content-Type': 'image/png', 'Cache-Control': `immutable, no-transform, s-max-age=2592000, max-age=2592000` });
  // res.end(image);
  res.status(200).send(compiledHTML);

This bypasses image generation and renders the resulting HTML in your browser for a faster development process by quickly iterating on the UI for the template(s).

Linking in the meta tag

To link within the meta tags, add the meta image tags with the dynamic URL as content. This URL will resolve to an image in the preview when loaded.

og:image is the primary meta tag for the OG image. You can also add Twitter, Instagram, and any other social media-specific tags along with your target platforms:

<meta property=”og:image” content=”https://{{your_domain.com}}/ogimage?title=Open%20Graph%20Image%20Generator%20with%20NodeJS&tags[]=nodejs&tags[]=og-image&path=blog.yourdomain.com/open-graph-image-generator-with-nodejs&logoUrl={{your_logo_url}}”>

Note that you may need to URL escape the query string; you can use encodeURI.

Conclusion

There we go, we have our own OG image generator service that dynamically creates images for each page/blog post.

You can also pick the pieces (templates, Handlebars compilation, Puppeteer screenshot) of this service to put together a serverless function or use it as a utility during the build process in any frontend app.

This post is one of many approaches to achieve this. In general, the context remains the same; it’s the syntax/language that changes 😛.

Furthermore, the generated image can be stored in AWS S3, GCS, or any service that suits your needs, and can serve from the storage on subsequent requests to save generation time. You can also use an in-memory cache with cache invalidation for every certain length of days.

Thank you for reading. I hope you found this post helpful, and please share it with those who might benefit from it. Ciao! 

Link: https://blog.logrocket.com/create-open-graph-image-generator-node-js/

#open #graph 

Create an Open Graph image generator with Node.js
Juana  Torphy

Juana Torphy

1636780440

Cloud, Web, and Open Source with Edidiong Asikpo

I had a chat with Edidiong Asikpo, Developer Advocate at Ambassador Labs, and one of the awesome folks building Open Source Community Africa.
We talked about how to get started with cloud and web development, overcoming common challenges and contributing to Open Source.

We had fun doing this, and I'm sure you will have as much fun watching!

 #open #cloud 

Cloud, Web, and Open Source with Edidiong Asikpo

OpenJDKを検討していますか?

今日、ソフトウェア開発チームは、機能豊富なソフトウェアをより速く、より少ない費用で顧客に提供するという、これまで以上に大きなプレッシャーにさらされています。

Oracle JDKサブスクリプションモデルが変更されたので、無料のオープンソースOpenJDKなどのオプションを検討している可能性があります。

違いの完全な比較については、以下のウェビナーをご覧ください。または、要約を読み続けてください。

なぜOpenJDKなのか?

OpenJDKは、OracleJDKのオープンソースの代替手段です。

オープンソースプロジェクトとして、パブリックコミュニティによってサポートされています。ただし、世界的に人気があるため、OpenJDKコミュニティには、個々のJDKおよびJavaの寄稿者だけでなく、Red Hat、IBM、Azul Systems、Apple、SAPなどの企業スポンサーも含まれています。

もともと、コミュニティJDKは、オープンソースで自由に再配布可能なバージョンのJavaをFedoraオペレーティングシステムのユーザーが利用できるようにするために作成されました。Oracle JDKはクローズドソースであり、パブリックソフトウェアチャネルを介して配布できなかったため、LinuxディストリビューションにバンドルできるオープンソースのJavaバージョンが必要でした。

OpenJDKはどのように開発されましたか?

元のビルドプロセスは、開発者がコンパイルするためにJDKを必要としていたこともあり、不格好で複雑でした。当時、それはSunJDKを使用することを意味していました。ただし、Sun JDKライセンスは、予備のOpenJDKパッケージの一部をプロプライエタリにし、フリーソフトウェアとして公開する資格がありませんでした。この障害を克服するために、RedHatはGNUコンポーネントを使用してブートストラップできるIcedTeaプロジェクトを立ち上げました。

2年間の開発の後、O​​penJDKはJava用のテクノロジー互換性キット(TCK)に合格しました。これは、JavaおよびOracle JDKなどのプロプライエタリJDKの適切で完全に互換性のある代替品であることを意味するため、大きなマイルストーンでした。

OpenJDKが他のJDKの基盤であるのはなぜですか?

2019年に早送りすると、OpenJDKは、OracleJDKを含むすべてのメジャーJavaリリースのアップストリームになりました。すべての新しいJava開発はOpenJDKから始まります。そして、それに対するすべての拡張機能は、Oracle JDK、Adopt OpenJDK、Azul、IBMOpenJ9などの独自のJDKバージョンに組み込まれています。

OpenJDKを自由に使用してソフトウェアを開発できますか?

プログラムがオープンで、安全で、自由に再配布できるようにするために、プロジェクトは次のことを行います。

  • GPLv2ライセンスを維持します。
  • GPLのコピーレフト要件をそのプログラムに適用することなく、テクノロジーを他のプロジェクトで使用できるようにするGPLリンク例外が含まれています。

言い換えれば、OpenJDKで構築されたソフトウェアは著作権要件の対象ではないため、誰でもイノベーションに使用できます。

OracleJDKライセンスの変更

2019年1月の時点で、Oracle Java SE 8のパブリックアップデートは、商用ライセンスなしでビジネス、商用、または本番環境で使用できなくなりました。さらに、ライセンスコストは劇的に増加しました。ライセンスがないと、ユーザーは、既知のリスクからソフトウェアを保護し、新しい機能を利用するために必要な重要な更新を受け取ることができません。

OracleJDKとOpenJDKに関するForresterの調査結果

Forresterの報告書によると、  Oracleの新しいJava SEのサブスクリプションにオプションを計量、 できるだけ早くOracleはOracleのJDKのライセンス変更を発表しましたように、多くの十分な情報開発者はすぐに彼らのJavaサポートのオプションをアップサイジング始めました。

このレポートは、開発者が尋ねている主要な質問を要約し、組織が検討する4つの選択肢の概要を示しています。

  • 引き続きOracleJavaSEを使用します。
  • OpenJDKのサポートされているビルドに移行します。
  • コミュニティモデルを採用します。
  • 何もしないでください。

Oracle JavaSEの使用を継続する

これは最も混乱が少なく、通常、最もコストのかかるオプションです。利点は、システムを移行することなく、通常どおりビジネスを進めることができることです。ただし、Oracle Java SEライセンスの料金を支払う必要があり、警告なしに将来の値上げの料金を支払う必要があります。さらに、アプリケーションの将来を制御することができなくなります。

OpenJDKに移行して商用サポートを受ける

アプリケーションをOracleJDKからOpenJDKに移行することで、大幅なコスト削減を実現できます。また、OpenJDKのすべての機能とセキュリティパッチに無料でアクセスできます。ただし、アプリケーションをOpenJDKに移行するには作業が必要です。また、Oracleサポートモデルからコミュニティサポートモデルに移行する必要があります。

組織は、OpenLogicなどの企業と契約することで、これらの課題を克服できます。OpenLogicは、組織の移行を支援するだけでなく、OpenJDKのミッションクリティカルなSLAやその他の数百のオープンソーステクノロジーを含むエンタープライズレベルのサポートオプションを提供します。そのため、OpenLogicのお客様は、OpenJDKで開発されたアプリケーションを含む、すべてのオープンソーステクノロジーについてオープンソースの専門家からエンタープライズサポートを受けることができます。

OpenJDKコミュニティモデルを採用する

また、アプリケーションをOpenJDKに移行して、エンタープライズサポート要件の完全な所有権を取得することもできます。このアプローチを評価しているチームは、アプリケーションの可用性を監視し、ソフトウェアアップデートを迅速にインストールし、質問や問題が発生したときにアプリケーションチームにオンデマンドサポートを提供するための社内リソースを確保する必要があります。このオプションはあなたに最大の自由を与えますが、それはまた最も高いリスクを持っています。

何もしないでください

このオプションを選択すると、次のことについての洞察が不足するため、重大なリスクが生じる可能性があります。

  • OracleJDKの長期的なコストへの影響。
  • OpenJDKに移行することでどれだけのお金を節約できるか。
  • OracleJDKからOpenJDKへの移行はどのようになりますか。
  • OpenJDKをサポートするために必要なリソース。

そして、この洞察がなければ、重要で戦略的な決定を迅速に行う能力を失うことになります。Forresterのレポートが「このオプションを大幅に割り引いている」のはそのためです—そして私たちもそうです。 

次のステップ

Oracle JDKからOpenJDKへの移行を検討していますか?話しましょう。 

OpenJDKの専門家が、OpenJDKへの移行を成功させるための準備を整えています。さらに、長期的なOpenJDKサポートを提供し、OpenJDKからより大きなROIを引き出すのに役立ちます。

私たちがどのようにあなたを助けることができるかを学ぶために、今日私たちのOpenJDK専門家の1人に相談してください。

リンク: https://www.openlogic.com/blog/considering-openjdk-how-decide

#open #oracle 

OpenJDKを検討していますか?

OpenJDKとOracle JDKを比較

最新のOpenJDKまたはOracleJDKを使用する必要がありますか?ここでは、OpenJDKとOracle JDKを比較し、OpenJDKとOracleJDKの最大の違いを共有します。

読んだり、最も興味のあるセクションにジャンプしたりしてください。 

Oracle Javaとは何ですか?

Javaは、もともとSun Microsystemsによって開発されたが、Oracleによって取得されたコンピュータソフトウェアと仕様のセットです。

オラクルは2019年に、Java SE8 ライセンスの課金を開始すると発表しました。そのため、多くの人がOracleJDKからOpenJDKへの切り替えを検討しています。
 

OpenJDKとOracleJDKの違いは何ですか? 

OpenJDKとOracleJDKの最大の違いは、ライセンスです。OpenJDKは、GNU General PublicLicenseを備えた完全にオープンソースのJavaです。Oracle JDKには、Oracle Binary Code LicenseAgreementに基づく商用ライセンスが必要です。しかし、サポートとコストには他にも多くの違いがあります。詳細については、読み続けてください。

2019年1月以降、企業はソフトウェアアップデートを受け取るために(Oracleから)商用ライセンスを購入する必要があります。詳細については、Oracle JavaSEサポートロードマップページを参照してください。
 

だから、ですOpenJDKのと同じOracleのJDKは?

OpenJDKのコードは、使用しているプロバイダーによって異なりますが、OracleJDKと同じです。主な違い(上記のとおり)は、OpenJDKがオープンソースのJava開発キットであるのに対し、OracleJDKはクローズドソースであるということです。 

2つの違いを理解するために、Javaの専門家に連絡して考えを聞いた。各専門家に私たちが提起した質問は次のとおりです。

  • まだサブスクリプションを購入していない、Java SE 8で実行されている本番ソフトウェアを使用している企業に何をお勧めしますか?
  • OpenJDKとOracleJDKを使用することの長所と短所は何ですか?
     

OpenJDKとOracleJDKのパフォーマンスはどうですか?

Oracle JDKのパフォーマンスは以前はOpenJDKよりも優れていましたが、現在は変化しています。OpenJDKのパフォーマンスは継続的に向上しています。OpenJDKビルドは、OpenJDKコミュニティの貢献により、より安定しています。。また、エンタープライズサポートと組み合わせると、OpenJDKのパフォーマンスは一流です。

OpenJDKを商用に使用できますか?

OpenJDKは商用ソフトウェアプロジェクトに使用できます。OpenJDKは、この点でOracleJDKの優れた代替品になる可能性があります。

[Forresterレポート] Javaサポートのオプションを比較検討する

OpenJDKとOracleJDKのどちらを選ぶか迷っていませんか?このForresterレポートでガイダンスを入手してください。

OpenJDKとOracleJDK:その他の考慮事項

以下は、Java SE 8で実行されている本番ソフトウェアを使用していて、まだサブスクリプションを購入していない企業に対する専門家の推奨事項です。

JDKのコストを考慮してください

Javaの専門家であるHeinzM。Kabutz博士は、次のように述べています。「できるだけ早くOpenJDK11に移行することをお勧めします。もし彼らがJavaSE 8を使い続ける必要があるなら、私はどの会社がそのお金に最も価値があるかを評価するでしょう。」
「ポットに行くか降りるかのどちらかです。Oracle JDK 8は、最後の無料アップデートとなる可能性が高いものを受け取り、Java 11は決して無料ではなかったので、コーナーに戻る前に計画を立ててください。OpenJDKはOracleJDKと99%同じコードであるため(取得元のプロバイダーによって異なります)、これが実際に意味するのはサポートです。」

Javaサポートのニーズを考慮してください

アーキテクト兼開発者であるBradWoodは、考慮すべき重要な質問を促します。数週間前、AdoptOpenJDKなどのプロバイダーがOracleのリリースから数日以内にOpenJDK 8u202のビルドを持っていたときに、これがうまくいくのを見ました。この種のターンアラウンドはほとんどの企業にとって問題ありません。誰かにビルドをすぐに提供することを約束するために誰かにお金を払うという温かいあいまいな感覚が必要な場合は、Azulなどの企業がOpenJDKサポートの料金をOracleよりもはるかに低く抑えています。」

今すぐOpenJDKを選択することの重要性

ソフトウェアエンジニアのGiorgosGaganis氏は、移行の緊急性について次のように述べています。延期すればするほど、最新バージョンの採用が難しくなります。多くのイノベーションがやってくるので、これは重要です。」 

チーフアーキテクトのJustinReockは、移行について次のように主張しています。オラクルからの法外なコストを回避するだけでなく、この変更を通じて、インフラストラクチャの実際の財務管理を主張できることを宣伝しているソフトウェア会社の手に負えないようにするためです。オラクルが今この一歩​​を踏み出すのに十分な勇気を持っているとしたら、彼らは後で何を乗り越えることができると信じているでしょうか?

OpenJDKまたは別のバリアントへの移行は、ほとんどの場合、リンゴからリンゴへの移行です。SDLCを最新化し、効果的なCI / CDのプロセスとインフラストラクチャを確立した場合、これは通常のリリースとそれほど変わらないように見えるはずです。回帰テストを実行する必要がありますが、移行自体は数ステップしかかかりません。

より複雑なビルドやニッチなビルドでは、設計原則に応じてコードのリファクタリングが必要になる場合がありますが、ほとんどの場合、ランタイム環境は十分に類似しているため、違いに気付くことはありません。健全な移行戦略は、常に徹底的なインベントリとリスク分析から開始する必要があります。その注意を払うと、アップグレードのロードマップがより明確になります。」 
 

Oracle JavaJDKおよびOpenJDKに関する最終的な考え

OpenJDKは変更可能であり、貢献して改善することができます。オラクルがオープンソフトウェアコミュニティから孤立し続けると、OpenJDKはKotlinと同様のプロジェクトに分岐する可能性があり、革新的な作業の大部分がそのプロジェクトに移行し、オラクルから完全に離れる可能性さえあります。

OpenJDKを使い始めたいですか?PERFORCEによるOpenLogicは、OpenJDKサポートを提供します。 

OpenJDKの専門家にご相談ください。OracleJDKからOpenJDKへの移行をお手伝いします。また、Oracleよりも優れたサポートと優れたROIにより、OpenJDKの旅に沿ってお客様をサポ​​ートできます。

リンク: https://www.openlogic.com/blog/java-experts-openjdk-vs-oracle-jdk

#java #open #oracle 

OpenJDKとOracle JDKを比較

How online grocery system has overcome the pandemic situation?

One of the many reasons that businesses and people lost interest in shopping is due to the pandemic situation, but due to safety issues many people may not step out of their homes and that is how we enter into this field of work to make it easy for normal people to shop through online.

So in this, we'll see about a website Shopurgrocery how did they overcome the crisis and still getting our work done in a transparent as well as fast manner.

How Covid-19 changed the way of grocery shopping?

When the Covid-19 started the people were frightened to come to crowded/public places, the visits to every shop has been decreased but the grocery is people's daily needs. That is the time Shopurgrocery came to know the people's needs and started to provide a platform for both business people and customers moreover this has a been a huge success till today.

This is a new way of shopping which includes:

   • No-contact delivery

   • Online payments 

   • Book from your own devices 

   • Get offers from your sellers as well as buyers

   • Access through many shops around your locality 

The online grocery system has created a good impact after Covid-19, this has made it an easy way for customers to find what they are seeking and even satisfies the retailers across our locality.

#open source grocery delivery app #grocery delivery software #online grocery delivery software #grocery ecommerce platform

How online grocery system has overcome the pandemic situation?

What is OpenDAO (OPEN) | What is OpenDAO token | What is OPEN token

The bridge between real world

assets and DeFi

OpenDAO enables real world assets such as stocks, bonds and real estate to be used meaningfully in the DeFi ecosystem via permissionless, trust minimized, transparent, secure and automated protocols.

With OpenDAO you can:

Unlock liquidity against trillions of dollars of productive assets

Democratise access to returns otherwise reserved for the world’s elite

Bring more value on-chain than there has ever been before

OpenDAO Ecosystem

Lock value.

Create value.

Mint and utilise a superior stablecoin backed by a pool of on and off-chain assets.

Open Governance

OPEN token holders own and control the OpenDAO. Token holders will eventually decide on which assets can be used as collateral for both the liquidity pools and USD minting. OPEN will also be used to incentivise actions in the OpenDAO ecosystem.

100M ! Total Open supply

50M ! Given via incentives

Lend against Real World Assets

Defi market image

Open Market is a censorship resistant money market where lenders can get a consistent rate of return with stable real world collateral in a permissionless, trust minimized manner.

How and Where to Buy Open Governance Token (OPEN) — An Easy Step by Step Guide

https://cryptobuyingtips.com/guides/how-to-buy-open-governance-token-open

About OPEN

Currently, OPEN is being ranked 814 on Coinmarketcap and has recently surged a hefty 80.14% at the time of writing.

OPEN has been listed on a number of crypto exchanges, unlike other main cryptocurrencies, it cannot be directly purchased with fiats money. However, You can still easily buy this coin by first buying Bitcoin from any large exchanges and then transfer to the exchange that offers to trade this coin, in this guide article we will walk you through in detail the steps to buy OPEN.

Step 1: Register on Coinbase

OPEN

You will have to first buy one of the major cryptocurrencies, usually either Bitcoin (BTC) or Ethereum (ETH). We will use Coinbase here as it is one of the largest crypto exchanges that accept fiat deposits. Use the link below to register at Coinbase and you will receive a free amount of $10 worth of BTC after buying $100 worth of cryptos.

Type your email and click ‘Get started’. Make sure you provide your real name as Coinbase will need it for account verification. Choose a strong password so that your account isn’t vulnerable to hackers.

You will receive a confirmation email. Open it and click on the link within. You will then be required to provide a valid mobile number to set up two-factor authentication (2FA), it is an extra layer to the security of your account and it is highly recommended that you keep this feature turned on.

Follow the next step to finish your identity verification. These steps are a bit daunting especially when you are waiting to buy an asset but just like any other financial institutions, Coinbase is regulated in most countries such as the US, the UK and the EU. You can take this as a trade-off to using a trusted platform to make your first crypto purchase. Good news is that the whole so-called Know-Your-Customers (KYC) process is now fully automated and it shouldn’t take more than 15 minutes to finish.

Step 2: Buy coins with fiat money

OPEN

Once you finished the KYC process. You will be asked to add a payment method. Here you can either choose to provide a credit/debit card or use a bank transfer. You will be charged higher fees when using cards but you will also make an instant purchase. While a bank transfer will be cheaper but slower, depending on the country of your residence, some countries will offer instant cash deposit with low fees, such as iDeal in some European countries.

OPEN

Now you are all set, click the ‘Trade’ button at the top left, choose the coin you want to buy and confirm your transaction…and congrats! You’ve just made your first crypto purchase.

Step 3: Transfer your cryptos to an Altcoin Exchange

OPEN

But we are not done yet, since OPEN is an altcoin we need to transfer our coins to an exchange that OPEN can be traded, here we will use Bilaxy as our exchange. Bilaxy is a popular exchange to trade altcoins and it has a large number of tradable altcoins pairs. Use the link below to register your new account.

Launched in Apr 2018, Bilaxy exchange is a centralized exchange registered in the Republic of Seychelles and launched in early 2018, Bilaxy exchange claims to have hundreds of thousands of traders from more than 80 countries all over the world. Bilaxy places a strong focus on liquidity for new tokens for global crypto traders. With 150+ crypto pairs, Bilaxy aims to establish a leading global trading platform that provides a broad range of trading products and services for global traders with a focus on transparency, reliability, quality execution, and client services. US-investors may not trade here. The reason for excluding US-investors are primarily regulatory reasons.

OPEN

After going through a similar process as we’ve done before with Coinbase, you will be advised to set up 2FA authentication as well, finish it as it adds extra security to your account.

Step 4: Deposit BTC to exchange

OPEN

Depends on the policies of the exchange you might be required to go through another KYC process, this should usually take you from 30 minutes to possibly a few days maximum. Though the process should be straight-forward and easy to follow. Once you’re done with it you should have full access to your exchange wallet.

OPEN

If this is your first time making a crypto deposit, the screen here may look a bit scary. But don’t worry, it’s basically simpler than making a bank transfer. At the box on the right, you will see a string of random numbers saying ‘BTC address’, this is a unique public address of your Bitcoin wallet at Bilaxy and you can receive Bitcoin by giving this address to the person to send you the funds. Since we are now transferring our previously bought bitcoin on Coinbase to this wallet, click on ‘Copy Address’ or right-click on the full address and click copy to grab this address to your clipboard.

Now head back to Coinbase, go to Portfolio page and click on Bitcoin on your asset list, then click on ‘Send’ on the right.

OPEN

Under the Recipient field, paste the wallet address in your clipboard, for security consideration you should always check if both address are matching. It is known that there are certain computer malware that would alter the content in your clipboard into another wallet address and you will be essentially sending funds to another person.

Click ‘Send’ to proceed, you should receive a confirmation email instantly, click on the confirmation link in the email and your coins are on the way to Bilaxy!

OPEN

Now go back to Bilaxy and head to your exchange wallets, don’t worry if you haven’t seen your deposit here. It is probably still being verified in the blockchain network and it should take a few minutes for your coins to arrive. Depending on the network traffic condition of the Bitcoin network, during busy times it may take even longer.

You should receive a confirmation notification from Bilaxy once your deposit has arrived. And you are now finally ready to purchase OPEN!

Step 5: Trade OPEN

OPEN

Go back to Bilaxy, then go to ‘Exchange’. Boom! What a view! The constantly flicking figures might be a bit scary, but relax, let’s get our heads around this.

OPEN

In the right column there is a search bar, now make sure “BTC” is selected as we are trading BTC to altcoin pair. Click on it and type in “OPEN”, you should see OPEN/BTC, select that pair and you should see a price chart of OPEN/BTC in the middle of the page.

Below there is a box with a green button that says “Buy OPEN”, inside of the box, choose the “Market” tab here as that is the most straight-forward type of buying orders. You can either type in your amount or choose what portion of your BTC deposit you would like to spend on buying, by clicking on the percentage buttons. When you have confirmed everything, click “Buy OPEN”. Voila! You have finally bought OPEN!

Apart from the exchange(s) above, there are a few popular crypto exchanges where they have decent daily trading volumes and a huge user base. This will ensure you will be able to sell your coins at any time and the fees will usually be lower. It is suggested that you also register on these exchanges since once OPEN gets listed there it will attract a large amount of trading volumes from the users there, that means you will be having some great trading opportunities!

Gate.io

Gate.io is an American cryptocurrency exchange that launched 2017. **As the exchange is American, US-investors can of course trade here and we recommend US traders to sign up on this exchange. **The exchange is available both in English and Chinese (the latter being very helpful for Chinese investors). Gate.io’s main selling factor is their wide selection of trading pairs. You can find most of the new altcoins here. Gate.io also demonstrates an impressive trading volume. It is almost every day one of the top 20 exchanges with the highest trading volume. The trading volume amounts to approx. USD 100 million on a daily basis. The top 10 trading pairs on Gate.io in terms of trading volume usually have USDT (Tether) as one part of the pair. So, to summarize the foregoing, Gate.io’s vast number of trading pairs and its extraordinary liquidity are both very impressive aspects of this exchange.

Sign Up on Gate.io

Binance

OPEN

Binance is a popular cryptocurrency exchange which was started in China but then moved their headquarters to the crypto-friendly Island of Malta in the EU. Binance is popular for its crypto to crypto exchange services. Binance exploded onto the scene in the mania of 2017 and has since gone on to become the top crypto exchange in the world. Unfortunately, Binance does not allow US investors so we recommend you to sign up on other exchanges we recommend on this page.

Sign Up on Binance

Would you like to earn token right now! ☞ CLICK HERE

Looking for more information…

☞ Website
☞ Explorer
☞ Social Channel
☞ Coinmarketcap

Thank for visiting and reading this article! I’m highly appreciate your actions! Please share if you liked it!

#blockchain #bitcoin #crypto #opendao #open

What is OpenDAO (OPEN) | What is OpenDAO token | What is OPEN token